diff --git a/assets/icons/closed_door.svg b/assets/icons/closed_door.svg
new file mode 100644
index 00000000..9cbf40dc
--- /dev/null
+++ b/assets/icons/closed_door.svg
@@ -0,0 +1,135 @@
+
diff --git a/assets/icons/door_delay.svg b/assets/icons/door_delay.svg
new file mode 100644
index 00000000..49dbbaef
--- /dev/null
+++ b/assets/icons/door_delay.svg
@@ -0,0 +1,29 @@
+
diff --git a/assets/icons/opened_door.svg b/assets/icons/opened_door.svg
new file mode 100644
index 00000000..386a66f1
--- /dev/null
+++ b/assets/icons/opened_door.svg
@@ -0,0 +1,104 @@
+
diff --git a/assets/icons/records.svg b/assets/icons/records.svg
new file mode 100644
index 00000000..9e316afd
--- /dev/null
+++ b/assets/icons/records.svg
@@ -0,0 +1,18 @@
+
diff --git a/lib/pages/device_managment/garage_door/bloc/garage_door_bloc.dart b/lib/pages/device_managment/garage_door/bloc/garage_door_bloc.dart
index da93a137..10ccbca4 100644
--- a/lib/pages/device_managment/garage_door/bloc/garage_door_bloc.dart
+++ b/lib/pages/device_managment/garage_door/bloc/garage_door_bloc.dart
@@ -8,6 +8,7 @@ import 'package:syncrow_web/pages/device_managment/garage_door/bloc/garage_door_
import 'package:syncrow_web/pages/device_managment/garage_door/models/garage_door_model.dart';
import 'package:syncrow_web/pages/device_managment/water_heater/models/schedule_entry.dart';
import 'package:syncrow_web/pages/device_managment/water_heater/models/schedule_model.dart';
+import 'package:syncrow_web/pages/device_managment/water_heater/models/water_heater_status_model.dart';
import 'package:syncrow_web/services/devices_mang_api.dart';
import 'package:syncrow_web/utils/format_date_time.dart';
@@ -39,27 +40,29 @@ class GarageDoorBloc extends Bloc {
var response = await DevicesManagementApi().getDeviceStatus(event.deviceId);
deviceStatus = GarageDoorStatusModel.fromJson(deviceId, response.status);
emit(GarageDoorLoadedState(status: deviceStatus));
- // _listenToChanges();
} catch (e) {
emit(GarageDoorErrorState(message: e.toString()));
}
}
void _toggleGarageDoor(ToggleGarageDoorEvent event, Emitter emit) async {
- emit(GarageDoorLoadingNewState(garageDoorModel: deviceStatus));
- deviceStatus = deviceStatus.copyWith(isOpen: event.isOpen);
+ final oldValue = deviceStatus.switch1;
+ _updateLocalValue('switch_1', event.isOpen);
emit(GarageDoorLoadedState(status: deviceStatus));
- await _runDeBouncer(
+ final success = await _runDeBouncer(
deviceId: event.deviceId,
- code: event.code,
+ code: 'switch_1',
value: event.isOpen,
+ oldValue: oldValue,
emit: emit,
isBatch: false,
);
+ if (!success) {
+ _revertValue('switch_1', oldValue, emit);
+ }
}
Future _addSchedule(AddGarageDoorScheduleEvent event, Emitter emit) async {
- emit(GarageDoorLoadingState());
try {
ScheduleEntry newSchedule = ScheduleEntry(
category: event.category,
@@ -67,23 +70,20 @@ class GarageDoorBloc extends Bloc {
function: Status(code: 'switch_1', value: event.functionOn),
days: ScheduleModel.convertSelectedDaysToStrings(event.selectedDays),
);
-
bool success = await DevicesManagementApi().addScheduleRecord(newSchedule, deviceId);
-
if (success) {
- add(FetchGarageDoorSchedulesEvent(deviceId: deviceId, category: event.category));
+ add(FetchGarageDoorSchedulesEvent(deviceId: deviceId, category: 'switch_1'));
} else {
- emit(GarageDoorErrorState(message: 'Failed to add schedule.'));
+ emit(GarageDoorLoadedState(status: deviceStatus));
}
} catch (e) {
- emit(GarageDoorErrorState(message: e.toString()));
+ emit(GarageDoorLoadedState(status: deviceStatus));
}
}
Future _updateSchedule(UpdateGarageDoorScheduleEvent event, Emitter emit) async {
- emit(GarageDoorLoadingState());
try {
- final updatedSchedules = deviceStatus.schedules.map((schedule) {
+ final updatedSchedules = deviceStatus.schedules?.map((schedule) {
if (schedule.scheduleId == event.scheduleId) {
return schedule.copyWith(
function: Status(code: 'switch_1', value: event.functionOn),
@@ -92,57 +92,61 @@ class GarageDoorBloc extends Bloc {
}
return schedule;
}).toList();
-
bool success = await DevicesManagementApi().updateScheduleRecord(
enable: event.enable,
uuid: deviceStatus.uuid,
scheduleId: event.scheduleId,
);
-
if (success) {
deviceStatus = deviceStatus.copyWith(schedules: updatedSchedules);
emit(GarageDoorLoadedState(status: deviceStatus));
} else {
- emit(GarageDoorErrorState(message: 'Failed to update schedule.'));
+ emit(GarageDoorLoadedState(status: deviceStatus));
}
} catch (e) {
- emit(GarageDoorErrorState(message: e.toString()));
+ emit(GarageDoorLoadedState(status: deviceStatus));
}
}
Future _deleteSchedule(DeleteGarageDoorScheduleEvent event, Emitter emit) async {
- emit(GarageDoorLoadingState());
try {
bool success = await DevicesManagementApi().deleteScheduleRecord(deviceStatus.uuid, event.scheduleId);
-
if (success) {
final updatedSchedules =
- deviceStatus.schedules.where((schedule) => schedule.scheduleId != event.scheduleId).toList();
+ deviceStatus.schedules?.where((schedule) => schedule.scheduleId != event.scheduleId).toList();
deviceStatus = deviceStatus.copyWith(schedules: updatedSchedules);
emit(GarageDoorLoadedState(status: deviceStatus));
} else {
- emit(GarageDoorErrorState(message: 'Failed to delete schedule.'));
+ emit(GarageDoorLoadedState(status: deviceStatus));
}
} catch (e) {
- emit(GarageDoorErrorState(message: e.toString()));
+ emit(GarageDoorLoadedState(status: deviceStatus));
}
}
Future _fetchSchedules(FetchGarageDoorSchedulesEvent event, Emitter emit) async {
- emit(GarageDoorLoadingState());
+ emit(ScheduleGarageLoadingState());
try {
List schedules =
await DevicesManagementApi().getDeviceSchedules(deviceStatus.uuid, event.category);
-
deviceStatus = deviceStatus.copyWith(schedules: schedules);
- emit(GarageDoorLoadedState(status: deviceStatus));
+ emit(
+ GarageDoorLoadedState(
+ status: deviceStatus,
+ scheduleMode: ScheduleModes.schedule,
+ ),
+ );
} catch (e) {
- emit(GarageDoorErrorState(message: 'Failed to fetch schedules.'));
+ emit(
+ GarageDoorLoadedState(
+ status: deviceStatus,
+ scheduleMode: ScheduleModes.schedule,
+ ),
+ );
}
}
void _increaseDelay(IncreaseGarageDoorDelayEvent event, Emitter emit) async {
- emit(GarageDoorLoadingNewState(garageDoorModel: deviceStatus));
try {
deviceStatus = deviceStatus.copyWith(delay: deviceStatus.delay + Duration(minutes: 10));
emit(GarageDoorLoadedState(status: deviceStatus));
@@ -152,7 +156,6 @@ class GarageDoorBloc extends Bloc {
}
void _decreaseDelay(DecreaseGarageDoorDelayEvent event, Emitter emit) async {
- emit(GarageDoorLoadingNewState(garageDoorModel: deviceStatus));
try {
if (deviceStatus.delay.inMinutes > 10) {
deviceStatus = deviceStatus.copyWith(delay: deviceStatus.delay - Duration(minutes: 10));
@@ -175,14 +178,14 @@ class GarageDoorBloc extends Bloc {
if (currentState is GarageDoorLoadedState) {
List updatedDays = List.from(currentState.selectedDays);
updatedDays[event.dayIndex] = event.isSelected;
- emit(currentState.copyWith(selectedDays: updatedDays));
+ emit(currentState.copyWith(selectedDays: updatedDays, selectedTime: currentState.selectedTime));
}
}
Future _updateFunctionOn(UpdateFunctionOnEvent event, Emitter emit) async {
final currentState = state;
if (currentState is GarageDoorLoadedState) {
- emit(currentState.copyWith(functionOn: event.functionOn));
+ emit(currentState.copyWith(functionOn: event.functionOn, selectedTime: currentState.selectedTime));
}
}
@@ -201,7 +204,7 @@ class GarageDoorBloc extends Bloc {
Future _fetchRecords(FetchGarageDoorRecordsEvent event, Emitter emit) async {
emit(GarageDoorReportsLoadingState());
try {
- final DeviceReport records = await DevicesManagementApi.getDeviceReports(event.deviceId, 'code_for_records');
+ final DeviceReport records = await DevicesManagementApi.getDeviceReports(event.deviceId, 'switch_1');
emit(GarageDoorReportsState(deviceReport: records));
} catch (e) {
emit(GarageDoorReportsFailedState(error: e.toString()));
@@ -212,43 +215,68 @@ class GarageDoorBloc extends Bloc {
emit(GarageDoorLoadedState(status: deviceStatus));
}
- Future _runDeBouncer({
+ Future _runDeBouncer({
required dynamic deviceId,
required String code,
required dynamic value,
+ required dynamic oldValue,
required Emitter emit,
required bool isBatch,
}) async {
- late String id;
- if (deviceId is List) {
- id = deviceId.first;
- } else {
- id = deviceId;
- }
-
- if (_timer != null) {
- _timer!.cancel();
- }
- _timer = Timer(const Duration(seconds: 1), () async {
- try {
- late bool response;
- if (isBatch) {
- response = await DevicesManagementApi().deviceBatchControl(deviceId, code, value);
- } else {
- response = await DevicesManagementApi().deviceControl(deviceId, Status(code: code, value: value));
- }
-
- if (!response) {
- add(GarageDoorInitialEvent(id));
- } else if (response == true && code == 'scene') {
- emit(GarageDoorLoadingState());
- await Future.delayed(const Duration(seconds: 1));
- add(GarageDoorInitialEvent(id));
- }
- } catch (_) {
- await Future.delayed(const Duration(milliseconds: 500));
- add(GarageDoorInitialEvent(id));
+ try {
+ late bool status;
+ await Future.delayed(const Duration(milliseconds: 500));
+ if (isBatch) {
+ status = await DevicesManagementApi().deviceBatchControl(deviceId, code, value);
+ } else {
+ status = await DevicesManagementApi().deviceControl(deviceId, Status(code: code, value: value));
}
- });
+
+ if (!status) {
+ _revertValue(code, oldValue, emit);
+ return false;
+ } else {
+ return true;
+ }
+ } catch (e) {
+ _revertValue(code, oldValue, emit);
+ return false;
+ }
+ }
+
+ void _revertValue(String code, dynamic oldValue, Emitter emit) {
+ switch (code) {
+ case 'switch_1':
+ if (oldValue is bool) {
+ deviceStatus = deviceStatus.copyWith(switch1: oldValue);
+ }
+ break;
+ // Add other cases if needed
+ default:
+ break;
+ }
+ if (state is GarageDoorLoadedState) {
+ final currentState = state as GarageDoorLoadedState;
+ emit(currentState.copyWith(status: deviceStatus));
+ }
+ }
+
+ void _updateLocalValue(String code, dynamic value) {
+ switch (code) {
+ case 'switch_1':
+ if (value is bool) {
+ deviceStatus = deviceStatus.copyWith(switch1: value);
+ }
+ break;
+ // Add other cases if needed
+ default:
+ break;
+ }
+ }
+
+ @override
+ Future close() {
+ _timer?.cancel();
+ return super.close();
}
}
diff --git a/lib/pages/device_managment/garage_door/bloc/garage_door_state.dart b/lib/pages/device_managment/garage_door/bloc/garage_door_state.dart
index 24b07618..6f3a2320 100644
--- a/lib/pages/device_managment/garage_door/bloc/garage_door_state.dart
+++ b/lib/pages/device_managment/garage_door/bloc/garage_door_state.dart
@@ -4,7 +4,6 @@ import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:syncrow_web/pages/device_managment/all_devices/models/device_reports.dart';
import 'package:syncrow_web/pages/device_managment/garage_door/models/garage_door_model.dart';
-import 'package:syncrow_web/pages/device_managment/water_heater/models/schedule_model.dart';
import 'package:syncrow_web/pages/device_managment/water_heater/models/water_heater_status_model.dart';
abstract class GarageDoorState extends Equatable {
@@ -20,7 +19,6 @@ class GarageDoorLoadingState extends GarageDoorState {}
class GarageDoorLoadedState extends GarageDoorState {
final GarageDoorStatusModel status;
- final List? schedules;
final Duration? delay;
final DeviceReport? records;
final List selectedDays;
@@ -31,7 +29,6 @@ class GarageDoorLoadedState extends GarageDoorState {
const GarageDoorLoadedState({
required this.status,
- this.schedules,
this.delay,
this.records,
this.selectedDays = const [false, false, false, false, false, false, false],
@@ -44,7 +41,6 @@ class GarageDoorLoadedState extends GarageDoorState {
@override
List