diff --git a/assets/icons/ac_switch_ic.svg b/assets/icons/ac_switch_ic.svg
new file mode 100644
index 0000000..3ee128e
--- /dev/null
+++ b/assets/icons/ac_switch_ic.svg
@@ -0,0 +1,5 @@
+
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index c859ce0..cfff9d7 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -281,4 +281,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: cf86fcba3fb3dbd505936bc190bb0b8fe3dd2498
-COCOAPODS: 1.13.0
+COCOAPODS: 1.15.2
diff --git a/lib/features/devices/bloc/acs_bloc/acs_bloc.dart b/lib/features/devices/bloc/acs_bloc/acs_bloc.dart
index 09ec737..b8dad95 100644
--- a/lib/features/devices/bloc/acs_bloc/acs_bloc.dart
+++ b/lib/features/devices/bloc/acs_bloc/acs_bloc.dart
@@ -1,4 +1,5 @@
import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/devices/bloc/acs_bloc/acs_event.dart';
import 'package:syncrow_app/features/devices/bloc/acs_bloc/acs_state.dart';
import 'package:syncrow_app/features/devices/model/ac_model.dart';
@@ -10,34 +11,165 @@ import 'package:syncrow_app/utils/resource_manager/constants.dart';
class ACsBloc extends Bloc {
final String acId;
- late DeviceModel deviceModel;
- late AcStatusModel deviceStatus;
+ AcStatusModel deviceStatus = AcStatusModel(
+ acSwitch: true,
+ modeString: 'hot',
+ tempSet: 300,
+ currentTemp: 315,
+ fanSpeedsString: 'low',
+ childLock: false);
+ List deviceStatusList = [];
+ List devicesList = [];
+ bool allAcsPage = false;
+ bool allAcsOn = true;
+ bool allTempSame = true;
+ int globalTemp = 25;
ACsBloc({required this.acId}) : super(AcsInitialState()) {
on(_fetchAcsStatus);
+ on(_changeAcSwitch);
on(_increaseCoolTo);
on(_decreaseCoolTo);
on(_changeLockValue);
on(_changeAcMode);
on(_changeFanSpeed);
+ on(_changeAllAcSwitch);
+ on(_increaseAllTemp);
+ on(_decreaseAllTemp);
}
void _fetchAcsStatus(AcsInitial event, Emitter emit) async {
emit(AcsLoadingState());
try {
- var response = await DevicesAPI.getDeviceStatus(acId);
- List statusModelList = [];
- for (var status in response['status']) {
- statusModelList.add(StatusModel.fromJson(status));
+ allAcsPage = event.allAcs;
+ if (event.allAcs) {
+ await _getAllAcs();
+ emit(GetAllAcsStatusState(
+ allAcsStatues: deviceStatusList,
+ allAcs: devicesList,
+ allOn: allAcsOn,
+ allTempSame: allTempSame,
+ temp: globalTemp));
+ } else {
+ var response = await DevicesAPI.getDeviceStatus(acId);
+ List statusModelList = [];
+ for (var status in response['status']) {
+ statusModelList.add(StatusModel.fromJson(status));
+ }
+ deviceStatus = AcStatusModel.fromJson(statusModelList);
+ emit(GetAcStatusState(acStatusModel: deviceStatus));
}
- deviceStatus = AcStatusModel.fromJson(statusModelList);
- emit(GetAcStatusState(acStatusModel: deviceStatus));
} catch (e) {
emit(AcsFailedState(error: e.toString()));
return;
}
}
+ _getAllAcs() async {
+ deviceStatusList = [];
+ devicesList = [];
+ allAcsOn = true;
+ allTempSame = true;
+ devicesList = await DevicesAPI.getDeviceByGroupName(
+ HomeCubit.getInstance().selectedSpace?.id ?? '', 'AC');
+
+ for (int i = 0; i < devicesList.length; i++) {
+ var response = await DevicesAPI.getDeviceStatus(devicesList[i].uuid ?? '');
+ List statusModelList = [];
+ for (var status in response['status']) {
+ statusModelList.add(StatusModel.fromJson(status));
+ }
+ deviceStatusList.add(AcStatusModel.fromJson(statusModelList));
+ }
+ if (deviceStatusList.isNotEmpty) {
+ int temp = deviceStatusList[0].tempSet;
+ deviceStatusList.firstWhere((element) {
+ if (!element.acSwitch) {
+ allAcsOn = false;
+ }
+ if (element.tempSet != temp) {
+ allTempSame = false;
+ }
+
+ return true;
+ });
+ if (allTempSame) {
+ globalTemp = temp;
+ }
+ }
+ }
+
+ void _changeAcSwitch(AcSwitch event, Emitter emit) async {
+ emit(AcChangeLoading(acStatusModel: deviceStatus));
+
+ final acSwitchValue = !event.acSwitch;
+ try {
+ final response = await DevicesAPI.controlDevice(
+ DeviceControlModel(
+ deviceId: allAcsPage ? event.deviceId : acId, code: 'switch', value: acSwitchValue),
+ allAcsPage ? event.deviceId : acId);
+
+ if (response['success'] ?? false) {
+ deviceStatus.acSwitch = acSwitchValue;
+ }
+ } catch (_) {}
+ if (allAcsPage) {
+ await Future.delayed(const Duration(seconds: 1));
+ add(const AcsInitial(allAcs: true));
+ } else {
+ emit(AcModifyingState(acStatusModel: deviceStatus));
+ }
+ }
+
+ void _changeAllAcSwitch(ChangeAllSwitch event, Emitter emit) async {
+ emit(AcsLoadingState());
+ try {
+ if (deviceStatusList.length == devicesList.length) {
+ for (int i = 0; i < deviceStatusList.length; i++) {
+ await DevicesAPI.controlDevice(
+ DeviceControlModel(deviceId: devicesList[i].uuid, code: 'switch', value: event.value),
+ devicesList[i].uuid ?? '');
+ }
+ }
+ } catch (_) {}
+ await Future.delayed(const Duration(seconds: 1));
+ add(const AcsInitial(allAcs: true));
+ }
+
+ void _increaseAllTemp(IncreaseAllTemp event, Emitter emit) async {
+ emit(AcsLoadingState());
+ try {
+ double tempValue = event.value + 0.5;
+ int value = (tempValue * 10).toInt();
+ if (deviceStatusList.length == devicesList.length) {
+ for (int i = 0; i < deviceStatusList.length; i++) {
+ await DevicesAPI.controlDevice(
+ DeviceControlModel(deviceId: devicesList[i].uuid, code: 'temp_set', value: value),
+ devicesList[i].uuid ?? '');
+ }
+ }
+ } catch (_) {}
+ await Future.delayed(const Duration(seconds: 1));
+ add(const AcsInitial(allAcs: true));
+ }
+
+ void _decreaseAllTemp(DecreaseAllTemp event, Emitter emit) async {
+ emit(AcsLoadingState());
+ try {
+ double tempValue = event.value - 0.5;
+ int value = (tempValue * 10).toInt();
+ if (deviceStatusList.length == devicesList.length) {
+ for (int i = 0; i < deviceStatusList.length; i++) {
+ await DevicesAPI.controlDevice(
+ DeviceControlModel(deviceId: devicesList[i].uuid, code: 'temp_set', value: value),
+ devicesList[i].uuid ?? '');
+ }
+ }
+ } catch (_) {}
+ await Future.delayed(const Duration(seconds: 1));
+ add(const AcsInitial(allAcs: true));
+ }
+
void _changeLockValue(ChangeLock event, Emitter emit) async {
emit(AcChangeLoading(acStatusModel: deviceStatus));
@@ -59,13 +191,20 @@ class ACsBloc extends Bloc {
int value = (tempValue * 10).toInt();
try {
final response = await DevicesAPI.controlDevice(
- DeviceControlModel(deviceId: acId, code: 'temp_set', value: value), acId);
+ DeviceControlModel(
+ deviceId: allAcsPage ? event.deviceId : acId, code: 'temp_set', value: value),
+ allAcsPage ? event.deviceId : acId);
if (response['success'] ?? false) {
deviceStatus.tempSet = value;
}
} catch (_) {}
- emit(AcModifyingState(acStatusModel: deviceStatus));
+ if (allAcsPage) {
+ await Future.delayed(const Duration(seconds: 1));
+ add(const AcsInitial(allAcs: true));
+ } else {
+ emit(AcModifyingState(acStatusModel: deviceStatus));
+ }
}
void _decreaseCoolTo(DecreaseCoolToTemp event, Emitter emit) async {
@@ -75,13 +214,20 @@ class ACsBloc extends Bloc {
int value = (tempValue * 10).toInt();
try {
final response = await DevicesAPI.controlDevice(
- DeviceControlModel(deviceId: acId, code: 'temp_set', value: value), acId);
+ DeviceControlModel(
+ deviceId: allAcsPage ? event.deviceId : acId, code: 'temp_set', value: value),
+ allAcsPage ? event.deviceId : acId);
if (response['success'] ?? false) {
deviceStatus.tempSet = value;
}
} catch (_) {}
- emit(AcModifyingState(acStatusModel: deviceStatus));
+ if (allAcsPage) {
+ await Future.delayed(const Duration(seconds: 1));
+ add(const AcsInitial(allAcs: true));
+ } else {
+ emit(AcModifyingState(acStatusModel: deviceStatus));
+ }
}
void _changeAcMode(ChangeAcMode event, Emitter emit) async {
@@ -89,14 +235,23 @@ class ACsBloc extends Bloc {
final tempMode = tempModesMap[getNextItem(tempModesMap, event.tempModes)]!;
try {
final response = await DevicesAPI.controlDevice(
- DeviceControlModel(deviceId: acId, code: 'mode', value: getACModeString(tempMode)), acId);
+ DeviceControlModel(
+ deviceId: allAcsPage ? event.deviceId : acId,
+ code: 'mode',
+ value: getACModeString(tempMode)),
+ allAcsPage ? event.deviceId : acId);
if (response['success'] ?? false) {
deviceStatus.modeString = getACModeString(tempMode);
deviceStatus.acMode = AcStatusModel.getACMode(getACModeString(tempMode));
}
} catch (_) {}
- emit(AcModifyingState(acStatusModel: deviceStatus));
+ if (allAcsPage) {
+ await Future.delayed(const Duration(seconds: 1));
+ add(const AcsInitial(allAcs: true));
+ } else {
+ emit(AcModifyingState(acStatusModel: deviceStatus));
+ }
}
void _changeFanSpeed(ChangeFanSpeed event, Emitter emit) async {
@@ -104,8 +259,11 @@ class ACsBloc extends Bloc {
final fanSpeed = event.fanSpeeds;
final response = await DevicesAPI.controlDevice(
- DeviceControlModel(deviceId: acId, code: 'level', value: getNextFanSpeedKey(fanSpeed)),
- acId);
+ DeviceControlModel(
+ deviceId: allAcsPage ? event.deviceId : acId,
+ code: 'level',
+ value: getNextFanSpeedKey(fanSpeed)),
+ allAcsPage ? event.deviceId : acId);
try {
if (response['success'] ?? false) {
@@ -113,7 +271,12 @@ class ACsBloc extends Bloc {
deviceStatus.acFanSpeed = AcStatusModel.getFanSpeed(getNextFanSpeedKey(fanSpeed));
}
} catch (_) {}
- emit(AcModifyingState(acStatusModel: deviceStatus));
+ if (allAcsPage) {
+ await Future.delayed(const Duration(seconds: 1));
+ add(const AcsInitial(allAcs: true));
+ } else {
+ emit(AcModifyingState(acStatusModel: deviceStatus));
+ }
}
String getACModeString(TempModes value) {
diff --git a/lib/features/devices/bloc/acs_bloc/acs_event.dart b/lib/features/devices/bloc/acs_bloc/acs_event.dart
index b3b7ec0..806e878 100644
--- a/lib/features/devices/bloc/acs_bloc/acs_event.dart
+++ b/lib/features/devices/bloc/acs_bloc/acs_event.dart
@@ -10,40 +10,58 @@ abstract class AcsEvent extends Equatable {
class AcsLoading extends AcsEvent {}
-class AcsInitial extends AcsEvent {}
+class AcSwitch extends AcsEvent {
+ final bool acSwitch;
+ final String deviceId;
+ const AcSwitch({required this.acSwitch, this.deviceId = ''});
+
+ @override
+ List