diff --git a/assets/functions_icons/ac_air.svg b/assets/functions_icons/ac_air.svg
new file mode 100644
index 00000000..3c4fff0d
--- /dev/null
+++ b/assets/functions_icons/ac_air.svg
@@ -0,0 +1,67 @@
+
diff --git a/assets/functions_icons/ac_device.svg b/assets/functions_icons/ac_device.svg
new file mode 100644
index 00000000..d5fbe2a6
--- /dev/null
+++ b/assets/functions_icons/ac_device.svg
@@ -0,0 +1,15 @@
+
diff --git a/assets/functions_icons/ac_sun.svg b/assets/functions_icons/ac_sun.svg
new file mode 100644
index 00000000..33c7e01a
--- /dev/null
+++ b/assets/functions_icons/ac_sun.svg
@@ -0,0 +1,16 @@
+
diff --git a/lib/pages/device_managment/ac/bloc/ac_bloc.dart b/lib/pages/device_managment/ac/bloc/ac_bloc.dart
index 86b48d52..e36043f1 100644
--- a/lib/pages/device_managment/ac/bloc/ac_bloc.dart
+++ b/lib/pages/device_managment/ac/bloc/ac_bloc.dart
@@ -1,16 +1,31 @@
-
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_event.dart';
import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_state.dart';
+import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart';
+import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart';
import 'package:syncrow_web/services/devices_mang_api.dart';
-
class AcBloc extends Bloc {
+ AcStatusModel deviceStatus = AcStatusModel(
+ uuid: '',
+ acSwitch: true,
+ modeString: 'hot',
+ tempSet: 300,
+ currentTemp: 315,
+ fanSpeedsString: 'low',
+ childLock: false,
+ );
AcBloc() : super(AcsInitialState()) {
on(_onFetchAcStatus);
-
+ on(_onAcControl);
+ on(_changeAcSwitch);
+ on(_increaseCoolTo);
+ on(_decreaseCoolTo);
+ on(_changeLockValue);
+ on(_changeAcMode);
+ on(_changeFanSpeed);
}
FutureOr _onFetchAcStatus(
@@ -18,11 +33,121 @@ class AcBloc extends Bloc {
emit(AcsLoadingState());
try {
final status =
- await DevicesManagementApi().getDeviceStatus(event.deviceId);
- emit(ACStatusLoaded(status));
+ await DevicesManagementApi().getDeviceStatus(event.deviceId);
+ deviceStatus = AcStatusModel.fromJson(status.productUuid, status.status);
+ emit(ACStatusLoaded(deviceStatus));
} catch (e) {
- emit(AcsFailedState( error: e.toString()));
+ emit(AcsFailedState(error: e.toString()));
}
}
+ FutureOr _onAcControl(AcControl event, Emitter emit) async {
+ final oldValue = _getValueByCode(event.code);
+
+ _updateLocalValue(event.code, event.value);
+ emit(ACStatusLoaded(deviceStatus));
+
+ try {
+ final status = Status(code: event.code, value: event.value);
+ final response =
+ await DevicesManagementApi().deviceControl(event.deviceId, status);
+
+ if (!response) {
+ _updateLocalValue(event.code, oldValue);
+ emit(ACStatusLoaded(deviceStatus));
+ emit(AcsFailedState(error: 'Failed to control the device.'));
+ }
+ } catch (e) {
+ _updateLocalValue(event.code, oldValue);
+ emit(ACStatusLoaded(deviceStatus));
+ emit(AcsFailedState(error: 'Error controlling the device: $e'));
+ }
+ }
+
+ void _updateLocalValue(String code, dynamic value) {
+ switch (code) {
+ case 'switch':
+ deviceStatus.acSwitch = value;
+ break;
+ case 'temp_set':
+ deviceStatus.tempSet = value;
+ break;
+ case 'mode':
+ deviceStatus.modeString = value;
+ deviceStatus.acMode = AcStatusModel.getACMode(value);
+ break;
+ case 'level':
+ deviceStatus.fanSpeedsString = value;
+ deviceStatus.acFanSpeed = AcStatusModel.getFanSpeed(value);
+ break;
+ case 'child_lock':
+ deviceStatus.childLock = value;
+ break;
+ default:
+ break;
+ }
+ }
+
+ dynamic _getValueByCode(String code) {
+ switch (code) {
+ case 'switch':
+ return deviceStatus.acSwitch;
+ case 'temp_set':
+ return deviceStatus.tempSet;
+ case 'mode':
+ return deviceStatus.modeString;
+ case 'level':
+ return deviceStatus.fanSpeedsString;
+ case 'child_lock':
+ return deviceStatus.childLock;
+ default:
+ return null;
+ }
+ }
+
+ FutureOr _changeAcSwitch(AcSwitch event, Emitter emit) async {
+ final newValue = !event.acSwitch;
+ add(AcControl(deviceId: event.deviceId, code: 'switch', value: newValue));
+ }
+
+ FutureOr _increaseCoolTo(
+ IncreaseCoolToTemp event, Emitter emit) async {
+ final newValue = (event.value * 10).toInt() + 5;
+ if (_isValidTemperature(newValue)) {
+ add(AcControl(
+ deviceId: event.deviceId, code: 'temp_set', value: newValue));
+ }
+ }
+
+ FutureOr _decreaseCoolTo(
+ DecreaseCoolToTemp event, Emitter emit) async {
+ final newValue = (event.value * 10).toInt() - 5;
+ if (_isValidTemperature(newValue)) {
+ add(AcControl(
+ deviceId: event.deviceId, code: 'temp_set', value: newValue));
+ }
+ }
+
+ FutureOr _changeLockValue(
+ ChangeLock event, Emitter emit) async {
+ final newValue = !event.lockBool;
+ add(AcControl(
+ deviceId: event.deviceId, code: 'child_lock', value: newValue));
+ }
+
+ FutureOr _changeAcMode(
+ ChangeAcMode event, Emitter emit) async {
+ final newValue = AcStatusModel.getACMode(event.tempModes.name);
+ add(AcControl(deviceId: event.deviceId, code: 'mode', value: newValue));
+ }
+
+ FutureOr _changeFanSpeed(
+ ChangeFanSpeed event, Emitter emit) async {
+ final newValue = AcStatusModel.getFanSpeed(event.fanSpeeds.name);
+ add(AcControl(deviceId: event.deviceId, code: 'level', value: newValue));
+ }
+
+ bool _isValidTemperature(int value) {
+ return value >= 200 && value <= 300;
+ }
}
diff --git a/lib/pages/device_managment/ac/bloc/ac_event.dart b/lib/pages/device_managment/ac/bloc/ac_event.dart
index cf1a1312..026bba8f 100644
--- a/lib/pages/device_managment/ac/bloc/ac_event.dart
+++ b/lib/pages/device_managment/ac/bloc/ac_event.dart
@@ -1,6 +1,5 @@
-
-
import 'package:equatable/equatable.dart';
+import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart';
sealed class AcsEvent extends Equatable {
const AcsEvent();
@@ -21,12 +20,74 @@ class AcFetchDeviceStatus extends AcsEvent {
class AcControl extends AcsEvent {
final String deviceId;
final String code;
- final bool value;
+ final dynamic value;
- const AcControl(
- {required this.deviceId, required this.code, required this.value});
+ const AcControl({
+ required this.deviceId,
+ required this.code,
+ required this.value,
+ });
@override
List