diff --git a/lib/pages/device_managment/door_lock/bloc/door_lock_bloc.dart b/lib/pages/device_managment/door_lock/bloc/door_lock_bloc.dart index f83ced1a..f6cebe4d 100644 --- a/lib/pages/device_managment/door_lock/bloc/door_lock_bloc.dart +++ b/lib/pages/device_managment/door_lock/bloc/door_lock_bloc.dart @@ -1,5 +1,3 @@ -// ignore_for_file: invalid_use_of_visible_for_testing_member - import 'dart:async'; import 'package:firebase_database/firebase_database.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -16,45 +14,38 @@ class DoorLockBloc extends Bloc { DoorLockBloc({required this.deviceId}) : super(DoorLockInitial()) { on(_onFetchDeviceStatus); - //on(_onDoorLockControl); on(_updateLock); on(_onFactoryReset); on(_onStatusUpdated); } - _listenToChanges(deviceId) { + void _listenToChanges(String deviceId) { try { - DatabaseReference ref = - FirebaseDatabase.instance.ref('device-status/$deviceId'); - Stream stream = ref.onValue; + final ref = FirebaseDatabase.instance.ref('device-status/$deviceId'); + ref.onValue.listen((event) { + final data = event.snapshot.value; + if (data is Map) { + final statusData = data['status'] as List? ?? []; + final statusList = statusData.map((item) { + return Status(code: item['code'], value: item['value']); + }).toList(); - stream.listen((DatabaseEvent event) { - Map usersMap = - event.snapshot.value as Map; - - List statusList = []; - usersMap['status'].forEach((element) { - statusList - .add(Status(code: element['code'], value: element['value'])); - }); - - deviceStatus = - DoorLockStatusModel.fromJson(usersMap['productUuid'], statusList); - if (!isClosed) { - add(StatusUpdated(deviceStatus)); + final model = + DoorLockStatusModel.fromJson(data['productUuid'], statusList); + if (!isClosed) { + add(StatusUpdated(model)); + } } }); } catch (_) {} } void _onStatusUpdated(StatusUpdated event, Emitter emit) { - emit(DoorLockStatusLoading()); - deviceStatus = event.deviceStatus; emit(DoorLockStatusLoaded(deviceStatus)); } - FutureOr _onFetchDeviceStatus( + Future _onFetchDeviceStatus( DoorLockFetchStatus event, Emitter emit) async { emit(DoorLockStatusLoading()); try { @@ -63,14 +54,13 @@ class DoorLockBloc extends Bloc { deviceStatus = DoorLockStatusModel.fromJson(event.deviceId, status.status); _listenToChanges(event.deviceId); - emit(DoorLockStatusLoaded(deviceStatus)); } catch (e) { emit(DoorLockControlError(e.toString())); } } - FutureOr _updateLock( + Future _updateLock( UpdateLockEvent event, Emitter emit) async { final oldValue = deviceStatus.normalOpenSwitch; deviceStatus = deviceStatus.copyWith(normalOpenSwitch: !oldValue); @@ -78,7 +68,6 @@ class DoorLockBloc extends Bloc { try { final response = await DevicesManagementApi.openDoorLock(deviceId); - if (!response) { _revertValueAndEmit(deviceId, 'normal_open_switch', oldValue, emit); } @@ -88,35 +77,8 @@ class DoorLockBloc extends Bloc { } } - Future _runDebounce({ - required String deviceId, - required String code, - required dynamic value, - required dynamic oldValue, - required Emitter emit, - }) async { - if (_timer != null) { - _timer!.cancel(); - } - _timer = Timer(const Duration(seconds: 1), () async { - try { - final response = await DevicesManagementApi() - .deviceControl(deviceId, Status(code: code, value: value)); - if (!response) { - _revertValueAndEmit(deviceId, code, oldValue, emit); - } - } catch (e) { - _revertValueAndEmit(deviceId, code, oldValue, emit); - } - }); - } - - void _revertValueAndEmit( - String deviceId, - String code, - dynamic oldValue, - Emitter emit, - ) { + void _revertValueAndEmit(String deviceId, String code, dynamic oldValue, + Emitter emit) { _updateLocalValue(code, oldValue); emit(DoorLockStatusLoaded(deviceStatus)); emit(const DoorLockControlError('Failed to control the device.')); @@ -124,34 +86,23 @@ class DoorLockBloc extends Bloc { void _updateLocalValue(String code, dynamic value) { switch (code) { - case 'reverse_lock': - if (value is bool) { - deviceStatus = deviceStatus.copyWith(reverseLock: value); - } - break; case 'normal_open_switch': if (value is bool) { deviceStatus = deviceStatus.copyWith(normalOpenSwitch: value); } break; + case 'reverse_lock': + if (value is bool) { + deviceStatus = deviceStatus.copyWith(reverseLock: value); + } + break; default: break; } emit(DoorLockStatusLoaded(deviceStatus)); } - dynamic _getValueByCode(String code) { - switch (code) { - case 'reverse_lock': - return deviceStatus.reverseLock; - case 'normal_open_switch': - return deviceStatus.normalOpenSwitch; - default: - return null; - } - } - - FutureOr _onFactoryReset( + Future _onFactoryReset( DoorLockFactoryReset event, Emitter emit) async { emit(DoorLockStatusLoading()); try { diff --git a/lib/pages/device_managment/door_lock/widget/door_button.dart b/lib/pages/device_managment/door_lock/widget/door_button.dart index e8e3066e..c1ac7bc0 100644 --- a/lib/pages/device_managment/door_lock/widget/door_button.dart +++ b/lib/pages/device_managment/door_lock/widget/door_button.dart @@ -8,7 +8,7 @@ import 'package:syncrow_web/pages/device_managment/door_lock/models/door_lock_st import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; -class DoorLockButton extends StatefulWidget { +class DoorLockButton extends StatelessWidget { const DoorLockButton({ super.key, required this.doorLock, @@ -18,70 +18,28 @@ class DoorLockButton extends StatefulWidget { final AllDevicesModel doorLock; final DoorLockStatusModel smartDoorModel; - @override - State createState() => - _DoorLockButtonState(smartDoorModel: smartDoorModel); -} - -class _DoorLockButtonState extends State - with SingleTickerProviderStateMixin { - late AnimationController _animationController; - late Animation _animation; - DoorLockStatusModel smartDoorModel; - - _DoorLockButtonState({required this.smartDoorModel}); - - @override - void initState() { - super.initState(); - _animationController = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 500), - ); - _animation = Tween(begin: 0, end: 1).animate(_animationController) - ..addListener(() { - setState(() {}); - }); - - if (smartDoorModel.unlockRequest > 0) { - _animationController.reverse(from: 1); - } - } - - @override - void didUpdateWidget(covariant DoorLockButton oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.smartDoorModel.normalOpenSwitch != - widget.smartDoorModel.normalOpenSwitch) { - setState(() { - smartDoorModel = widget.smartDoorModel; - }); - - if (smartDoorModel.unlockRequest > 0) { - _animationController.forward(from: 0); - } else { - _animationController.reverse(from: 1); - } - } - } - - @override - void dispose() { - _animationController.dispose(); - super.dispose(); + double _calculateProgress() { + final value = smartDoorModel.unlockRequest; + if (value <= 0 || value > 30) return 0; + return value / 30.0; } @override Widget build(BuildContext context) { + final progress = _calculateProgress(); + final isEnabled = smartDoorModel.unlockRequest > 0; + return SizedBox( width: 255, height: 255, child: InkWell( - onTap: () { - _animationController.forward(from: 0); - BlocProvider.of(context) - .add(UpdateLockEvent(value: !smartDoorModel.normalOpenSwitch)); - }, + onTap: isEnabled + ? () { + BlocProvider.of(context).add( + UpdateLockEvent(value: !smartDoorModel.normalOpenSwitch), + ); + } + : null, child: Container( width: 255, height: 255, @@ -115,15 +73,16 @@ class _DoorLockButtonState extends State ), ), ), - SizedBox.expand( - child: CircularProgressIndicator( - value: _animation.value, - strokeWidth: 8, - backgroundColor: Colors.transparent, - valueColor: const AlwaysStoppedAnimation( - ColorsManager.primaryColor), + if (progress > 0) + SizedBox.expand( + child: CircularProgressIndicator( + value: progress, + strokeWidth: 8, + backgroundColor: Colors.transparent, + valueColor: const AlwaysStoppedAnimation( + ColorsManager.primaryColor), + ), ), - ), ], ), ),