diff --git a/lib/pages/visitor_password/bloc/visitor_password_bloc.dart b/lib/pages/visitor_password/bloc/visitor_password_bloc.dart index 6dc20cfd..c5ee3259 100644 --- a/lib/pages/visitor_password/bloc/visitor_password_bloc.dart +++ b/lib/pages/visitor_password/bloc/visitor_password_bloc.dart @@ -21,7 +21,6 @@ import 'package:syncrow_web/utils/snack_bar.dart'; class VisitorPasswordBloc extends Bloc { - VisitorPasswordBloc() : super(VisitorPasswordInitial()) { on(selectUsageFrequency); on(_onFetchDevice); @@ -87,6 +86,9 @@ class VisitorPasswordBloc SelectTimeVisitorPassword event, Emitter emit, ) async { + // Ensure expirationTimeTimeStamp has a value + effectiveTimeTimeStamp ??= DateTime.now().millisecondsSinceEpoch ~/ 1000; + final DateTime? picked = await showDatePicker( context: event.context, initialDate: DateTime.now(), @@ -94,86 +96,124 @@ class VisitorPasswordBloc lastDate: DateTime.now().add(const Duration(days: 5095)), ); - if (picked != null) { - final TimeOfDay? timePicked = await showTimePicker( - context: event.context, - initialTime: TimeOfDay.now(), - builder: (context, child) { - return Theme( - data: ThemeData.light().copyWith( - colorScheme: const ColorScheme.light( - primary: ColorsManager.primaryColor, - onSurface: Colors.black, - ), - buttonTheme: const ButtonThemeData( - colorScheme: ColorScheme.light( - primary: Colors.green, - ), - ), + if (picked == null) return; + + final TimeOfDay? timePicked = await showTimePicker( + context: event.context, + initialTime: TimeOfDay.now(), + builder: (context, child) { + return Theme( + data: ThemeData.light().copyWith( + colorScheme: const ColorScheme.light( + primary: ColorsManager.primaryColor, + onSurface: Colors.black, ), - child: child!, - ); - }, - ); - - if (timePicked != null) { - final selectedDateTime = DateTime( - picked.year, - picked.month, - picked.day, - timePicked.hour, - timePicked.minute, + ), + child: child!, ); + }, + ); - final selectedTimestamp = - selectedDateTime.millisecondsSinceEpoch ~/ 1000; + if (timePicked == null) return; - if (event.isStart) { - if (expirationTimeTimeStamp != null && - selectedTimestamp > expirationTimeTimeStamp!) { - CustomSnackBar.displaySnackBar( + final selectedDateTime = DateTime( + picked.year, + picked.month, + picked.day, + timePicked.hour, + timePicked.minute, + ); + final selectedTimestamp = selectedDateTime.millisecondsSinceEpoch ~/ 1000; + final currentTimestamp = DateTime.now().millisecondsSinceEpoch ~/ 1000; + + if (event.isStart) { + // START TIME VALIDATION + if (expirationTimeTimeStamp != null && + selectedTimestamp > expirationTimeTimeStamp!) { + await showDialog( + context: event.context, + builder: (context) => AlertDialog( + title: const Text( 'Effective Time cannot be later than Expiration Time.', - ); - return; - } - if(selectedTimestamp < DateTime.now().millisecondsSinceEpoch ~/ 1000) { - if(selectedTimestamp < DateTime.now().millisecondsSinceEpoch ~/ 1000) { - await showDialog( - context: event.context, - builder: (context) => AlertDialog( - title: const Text('Effective Time cannot be earlier than current time.'), - actionsAlignment: MainAxisAlignment.center, - content: - FilledButton( - onPressed: () { - Navigator.of(event.context).pop(); - add(SelectTimeVisitorPassword(context: event.context, isStart: true, isRepeat: false)); - }, - child: const Text('OK'), - ), - - ), - ); - } - return; - } - effectiveTimeTimeStamp = selectedTimestamp; - startTimeAccess = selectedDateTime.toString().split('.').first; - } else { - if (effectiveTimeTimeStamp != null && - selectedTimestamp < effectiveTimeTimeStamp!) { - CustomSnackBar.displaySnackBar( - 'Expiration Time cannot be earlier than Effective Time.', - ); - return; - } - expirationTimeTimeStamp = selectedTimestamp; - endTimeAccess = selectedDateTime.toString().split('.').first; - } - emit(ChangeTimeState()); - emit(VisitorPasswordInitial()); + ), + actionsAlignment: MainAxisAlignment.center, + content: FilledButton( + onPressed: () { + Navigator.of(event.context).pop(); + add(SelectTimeVisitorPassword( + context: event.context, + isStart: true, + isRepeat: false, + )); + }, + child: const Text('OK'), + ), + ), + ); + return; } + + if (selectedTimestamp < currentTimestamp) { + await showDialog( + context: event.context, + builder: (context) => AlertDialog( + title: const Text( + 'Effective Time cannot be earlier than current time.', + ), + actionsAlignment: MainAxisAlignment.center, + content: FilledButton( + onPressed: () { + Navigator.of(event.context).pop(); + add(SelectTimeVisitorPassword( + context: event.context, + isStart: true, + isRepeat: false, + )); + }, + child: const Text('OK'), + ), + ), + ); + return; + } + + // Save effective time + effectiveTimeTimeStamp = selectedTimestamp; + startTimeAccess = selectedDateTime.toString().split('.').first; + } else { + // END TIME VALIDATION + if (effectiveTimeTimeStamp != null && + selectedTimestamp < effectiveTimeTimeStamp!) { + await showDialog( + context: event.context, + builder: (context) => AlertDialog( + title: const Text( + 'Expiration Time cannot be earlier than Effective Time.', + ), + actionsAlignment: MainAxisAlignment.center, + content: FilledButton( + onPressed: () { + Navigator.of(event.context).pop(); + add(SelectTimeVisitorPassword( + context: event.context, + isStart: false, + isRepeat: false, + )); + }, + child: const Text('OK'), + ), + ), + ); + return; + } + + // Save expiration time + expirationTimeTimeStamp = selectedTimestamp; + endTimeAccess = selectedDateTime.toString().split('.').first; } + + emit(ChangeTimeState()); + emit(VisitorPasswordInitial()); } bool toggleRepeat( @@ -213,7 +253,7 @@ class VisitorPasswordBloc FetchDevice event, Emitter emit) async { try { emit(DeviceLoaded()); - final projectUuid = await ProjectManager.getProjectUUID() ?? ''; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; data = await AccessMangApi().fetchDoorLockDeviceList(projectUuid); emit(TableLoaded(data));