diff --git a/lib/features/devices/bloc/smart_door_bloc/smart_door_bloc.dart b/lib/features/devices/bloc/smart_door_bloc/smart_door_bloc.dart index 35fd6d5..b384ad4 100644 --- a/lib/features/devices/bloc/smart_door_bloc/smart_door_bloc.dart +++ b/lib/features/devices/bloc/smart_door_bloc/smart_door_bloc.dart @@ -3,6 +3,7 @@ import 'package:day_picker/model/day_in_week.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:intl/intl.dart'; +import 'package:pin_code_fields/pin_code_fields.dart'; import 'package:syncrow_app/features/devices/bloc/smart_door_bloc/smart_door_event.dart'; import 'package:syncrow_app/features/devices/bloc/smart_door_bloc/smart_door_state.dart'; import 'package:syncrow_app/features/devices/model/device_control_model.dart'; @@ -11,6 +12,7 @@ import 'package:syncrow_app/features/devices/model/status_model.dart'; import 'package:syncrow_app/features/devices/model/create_temporary_password_model.dart'; import 'package:syncrow_app/features/devices/model/temporary_password_model.dart'; import 'package:syncrow_app/services/api/devices_api.dart'; +import 'package:syncrow_app/utils/helpers/snack_bar.dart'; class SmartDoorBloc extends Bloc { final String deviceId; @@ -22,7 +24,8 @@ class SmartDoorBloc extends Bloc { on(getTemporaryPasswords); on(_updateLock); } - void _fetchSmartDoorStatus(InitialEvent event, Emitter emit) async { + void _fetchSmartDoorStatus( + InitialEvent event, Emitter emit) async { try { emit(LoadingInitialState()); var response = await DevicesAPI.getDeviceStatus(deviceId); @@ -38,21 +41,25 @@ class SmartDoorBloc extends Bloc { } } - void getTemporaryPasswords(InitialPasswordsPage event, Emitter emit) async { + void getTemporaryPasswords( + InitialPasswordsPage event, Emitter emit) async { try { emit(LoadingInitialState()); - pageType=event.type!; - var response = await DevicesAPI.getTemporaryPasswords(deviceId,pageType); + pageType = event.type!; + var response = await DevicesAPI.getTemporaryPasswords(deviceId, pageType); if (response is List) { - temporaryPasswords = response.map((item) => TemporaryPassword.fromJson(item)).toList(); + temporaryPasswords = + response.map((item) => TemporaryPassword.fromJson(item)).toList(); } else if (response is Map && response.containsKey('data')) { - temporaryPasswords = (response['data'] as List).map((item) => TemporaryPassword.fromJson(item)).toList(); + temporaryPasswords = (response['data'] as List) + .map((item) => TemporaryPassword.fromJson(item)) + .toList(); } else { throw Exception("Unexpected response format"); } - emit(TemporaryPasswordsLoadedState( temporaryPassword: temporaryPasswords!)); + emit(TemporaryPasswordsLoadedState( + temporaryPassword: temporaryPasswords!)); } catch (e) { - print(e); emit(FailedState(errorMessage: e.toString())); } } @@ -61,15 +68,15 @@ class SmartDoorBloc extends Bloc { TextEditingController passwordNameController = TextEditingController(); String effectiveTime = 'Select Time'; int? effectiveTimeTimeStamp; - String expirationTime ='Select Time'; + String expirationTime = 'Select Time'; int? expirationTimeTimeStamp; bool repeat = false; bool isStartEndTime = true; List? selectedDay; DateTime? startTime; DateTime? endTime; - List? temporaryPasswords=[]; - List? oneTimePasswords=[]; + List? temporaryPasswords = []; + List? oneTimePasswords = []; changeTime(val, isStartEndTime) { emit(LoadingInitialState()); @@ -95,7 +102,6 @@ class SmartDoorBloc extends Bloc { return isStartEndTime; } - void _updateLock(UpdateLockEvent event, Emitter emit) async { emit(LoadingNewSate(smartDoorModel: deviceStatus)); try { @@ -123,7 +129,8 @@ class SmartDoorBloc extends Bloc { emit(GeneratePasswordState()); } - Future selectTime(BuildContext context, {required bool isEffective}) async { + Future selectTime(BuildContext context, + {required bool isEffective}) async { final DateTime? picked = await showDatePicker( context: context, initialDate: DateTime.now(), @@ -144,18 +151,24 @@ class SmartDoorBloc extends Bloc { timePicked.minute, ); if (isEffective) { - if (expirationTimeTimeStamp != null && selectedDateTime.millisecondsSinceEpoch > expirationTimeTimeStamp!) { - _showSnackBar(context, 'Effective Time cannot be later than Expiration Time.'); + if (expirationTimeTimeStamp != null && + selectedDateTime.millisecondsSinceEpoch > + expirationTimeTimeStamp!) { + _showSnackBar(context, + 'Effective Time cannot be later than Expiration Time.'); } else { effectiveTime = selectedDateTime.toString(); - effectiveTimeTimeStamp = selectedDateTime.millisecondsSinceEpoch; + effectiveTimeTimeStamp = selectedDateTime.millisecondsSinceEpoch; } } else { - if (effectiveTimeTimeStamp != null && selectedDateTime.millisecondsSinceEpoch < effectiveTimeTimeStamp!) { - _showSnackBar(context, 'Expiration Time cannot be earlier than Effective Time.'); + if (effectiveTimeTimeStamp != null && + selectedDateTime.millisecondsSinceEpoch < + effectiveTimeTimeStamp!) { + _showSnackBar(context, + 'Expiration Time cannot be earlier than Effective Time.'); } else { expirationTime = selectedDateTime.toString(); - expirationTimeTimeStamp = selectedDateTime.millisecondsSinceEpoch; + expirationTimeTimeStamp = selectedDateTime.millisecondsSinceEpoch; } } emit(TimeSelectedState()); @@ -163,11 +176,10 @@ class SmartDoorBloc extends Bloc { } } - Future savePassword(BuildContext context) async { if (_validateInputs(context)) return; try { - emit(LoadingInitialState()); + emit(LoadingSaveState()); var response = await DevicesAPI.createPassword( pageType: pageType, deviceId: deviceId, @@ -175,7 +187,7 @@ class SmartDoorBloc extends Bloc { invalidTime: expirationTimeTimeStamp.toString(), name: passwordNameController.text, password: passwordController.text, - scheduleList: [ + scheduleList: [ if (repeat) Schedule( effectiveTime: getTimeOnly(startTime), @@ -183,24 +195,22 @@ class SmartDoorBloc extends Bloc { workingDay: selectedDay!, ), ], - ); - add(InitialPasswordsPage(type: pageType)); - emit(TemporaryPasswordsLoadedState(temporaryPassword: temporaryPasswords!)); - Navigator.pop(context); - Navigator.pop(context); + ).then((value)async { + add(InitialPasswordsPage(type: pageType)); + },); + CustomSnackBar.displaySnackBar('Save Successfully'); + emit(SaveState()); } catch (e) { emit(FailedState(errorMessage: 'Failed to save password: $e')); } } - void deletePassword(BuildContext context, passwordId) async { try { emit(LoadingInitialState()); var response = await DevicesAPI.deletePassword( - deviceId: deviceId, - passwordId: passwordId - ).then((value) async { + deviceId: deviceId, passwordId: passwordId) + .then((value) async { add(InitialPasswordsPage(type: pageType)); }); } catch (e) { @@ -208,9 +218,7 @@ class SmartDoorBloc extends Bloc { } } - bool _validateInputs(BuildContext context) { - if (passwordController.text.isEmpty) { _showSnackBar(context, 'Password required'); return true; @@ -227,7 +235,8 @@ class SmartDoorBloc extends Bloc { _showSnackBar(context, 'Select expiration time'); return true; } - if(repeat==true&&(endTime==null||startTime==null||selectedDay==null)){ + if (repeat == true && + (endTime == null || startTime == null || selectedDay == null)) { _showSnackBar(context, 'Start Time and End time and the days required '); return true; } @@ -246,7 +255,7 @@ class SmartDoorBloc extends Bloc { List days = [ DayInWeek("S", dayKey: 'Sun'), DayInWeek("M", dayKey: 'Mon'), - DayInWeek("T", dayKey: 'Tue'), + DayInWeek("T", dayKey: 'Tue'), DayInWeek("W", dayKey: 'Wed'), DayInWeek("T", dayKey: 'Thu'), DayInWeek("F", dayKey: 'Fri'), diff --git a/lib/features/devices/bloc/smart_door_bloc/smart_door_state.dart b/lib/features/devices/bloc/smart_door_bloc/smart_door_state.dart index a672a06..473a768 100644 --- a/lib/features/devices/bloc/smart_door_bloc/smart_door_state.dart +++ b/lib/features/devices/bloc/smart_door_bloc/smart_door_state.dart @@ -45,6 +45,8 @@ class IsStartEndState extends SmartDoorState{} class changeStartTimeState extends SmartDoorState{} class changeEndTimeState extends SmartDoorState{} class changeTimeState extends SmartDoorState{} +class SaveState extends SmartDoorState{} +class LoadingSaveState extends SmartDoorState{} class TemporaryPasswordsLoadedState extends SmartDoorState{ final List temporaryPassword; const TemporaryPasswordsLoadedState({required this.temporaryPassword}); diff --git a/lib/features/devices/view/widgets/smart_door/create_temporary_password.dart b/lib/features/devices/view/widgets/smart_door/create_temporary_password.dart index 28aa889..c804f7a 100644 --- a/lib/features/devices/view/widgets/smart_door/create_temporary_password.dart +++ b/lib/features/devices/view/widgets/smart_door/create_temporary_password.dart @@ -4,25 +4,27 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:pin_code_fields/pin_code_fields.dart'; import 'package:syncrow_app/features/devices/bloc/smart_door_bloc/smart_door_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/smart_door_bloc/smart_door_event.dart'; import 'package:syncrow_app/features/devices/bloc/smart_door_bloc/smart_door_state.dart'; import 'package:syncrow_app/features/shared_widgets/default_container.dart'; import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; +import 'package:syncrow_app/utils/resource_manager/font_manager.dart'; import 'package:time_picker_spinner/time_picker_spinner.dart'; class CreateTemporaryPassword extends StatelessWidget { final String? deviceId; + final String? type; - const CreateTemporaryPassword({super.key,this.deviceId}); - + const CreateTemporaryPassword({super.key,this.deviceId, this.type}); @override Widget build(BuildContext context) { return BlocProvider( create: (BuildContext context) => SmartDoorBloc(deviceId: deviceId!), child: BlocConsumer( listener: (context, state) { - print(state); if (state is FailedState) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( @@ -31,18 +33,30 @@ class CreateTemporaryPassword extends StatelessWidget { ), ); } - - - }, builder: (context, state) { + }, + builder: (context, state) { return DefaultScaffold( - title: 'Create Password', - actions: [ - TextButton( - onPressed: () { - BlocProvider.of(context).savePassword(context); - }, - child: const Text('Save')) - ], + appBar: AppBar( + backgroundColor: Colors.transparent, + centerTitle: true, + title: const BodyLarge( + text: 'Create Password' , + fontColor: ColorsManager.primaryColor, + fontWeight: FontsManager.bold, + ), + leading: IconButton(onPressed: () { + Navigator.of(context).pop('UpdatePage'); + }, icon: Icon(Icons.arrow_back)), + actions: [ + TextButton( + onPressed: () { + BlocProvider.of(context).savePassword(context); + SmartDoorBloc(deviceId: deviceId!).add(InitialPasswordsPage(type:type )); + }, + child: const Text('Save')) + ], + ), + child: state is LoadingInitialState? const Center(child: CircularProgressIndicator()): SingleChildScrollView( child: @@ -70,7 +84,8 @@ class CreateTemporaryPassword extends StatelessWidget { children: [ Expanded( child: PinCodeTextField( - keyboardType: TextInputType.phone, + autoDisposeControllers: false, + keyboardType: TextInputType.phone, length: 7, enabled: true, obscureText: false, diff --git a/lib/features/devices/view/widgets/smart_door/view_temporary_password.dart b/lib/features/devices/view/widgets/smart_door/view_temporary_password.dart index 8dede56..1675e56 100644 --- a/lib/features/devices/view/widgets/smart_door/view_temporary_password.dart +++ b/lib/features/devices/view/widgets/smart_door/view_temporary_password.dart @@ -24,6 +24,7 @@ class ViewTemporaryPassword extends StatelessWidget { SmartDoorBloc(deviceId: deviceId!)..add(InitialPasswordsPage(type:type )), child: BlocConsumer( listener: (context, state) { + print('=======4${state}'); if (state is FailedState) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( @@ -33,21 +34,25 @@ class ViewTemporaryPassword extends StatelessWidget { ); } }, builder: (context, state) { + final smartDoorBloc = BlocProvider.of(context); + return DefaultScaffold( title: 'Passwords', actions: [ IconButton( onPressed: () { Navigator.of(context).push(MaterialPageRoute( - builder: (context) => - CreateTemporaryPassword(deviceId: deviceId), - )); + builder: (context) => CreateTemporaryPassword(deviceId: deviceId, type: type), + )).then((result) { + if (result != null) { + smartDoorBloc.add(InitialPasswordsPage(type:type )); } + }); + }, icon: const Icon(Icons.add)) ], child: Builder( builder: (context) { - final smartDoorBloc = BlocProvider.of(context); return state is LoadingInitialState ? const Center(child: CircularProgressIndicator()) : Center( diff --git a/lib/features/menu/view/widgets/manage_home/manage_home_view.dart b/lib/features/menu/view/widgets/manage_home/manage_home_view.dart index eeb59ce..7704659 100644 --- a/lib/features/menu/view/widgets/manage_home/manage_home_view.dart +++ b/lib/features/menu/view/widgets/manage_home/manage_home_view.dart @@ -30,7 +30,8 @@ class ManageHomeView extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, - children: List.generate( + children: + List.generate( spaces.length, (index) { if (index == spaces.length - 1) {