Bug fixes

This commit is contained in:
Abdullah Alassaf
2024-09-29 01:52:17 +03:00
parent 8d784f1e95
commit 2fb18965f4
16 changed files with 1036 additions and 1598 deletions

View File

@ -26,8 +26,7 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
bool oneGangGroup = false; bool oneGangGroup = false;
List<DeviceModel> devicesList = []; List<DeviceModel> devicesList = [];
OneGangBloc({required this.oneGangId, required this.switchCode}) OneGangBloc({required this.oneGangId, required this.switchCode}) : super(InitialState()) {
: super(InitialState()) {
on<InitialEvent>(_fetchOneGangStatus); on<InitialEvent>(_fetchOneGangStatus);
on<OneGangUpdated>(_oneGangUpdated); on<OneGangUpdated>(_oneGangUpdated);
on<ChangeFirstSwitchStatusEvent>(_changeFirstSwitch); on<ChangeFirstSwitchStatusEvent>(_changeFirstSwitch);
@ -50,8 +49,7 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
on<GroupAllOffEvent>(_groupAllOff); on<GroupAllOffEvent>(_groupAllOff);
} }
void _fetchOneGangStatus( void _fetchOneGangStatus(InitialEvent event, Emitter<OneGangState> emit) async {
InitialEvent event, Emitter<OneGangState> emit) async {
emit(LoadingInitialState()); emit(LoadingInitialState());
try { try {
var response = await DevicesAPI.getDeviceStatus(oneGangId); var response = await DevicesAPI.getDeviceStatus(oneGangId);
@ -70,21 +68,18 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
_listenToChanges() { _listenToChanges() {
try { try {
DatabaseReference ref = DatabaseReference ref = FirebaseDatabase.instance.ref('device-status/$oneGangId');
FirebaseDatabase.instance.ref('device-status/$oneGangId');
Stream<DatabaseEvent> stream = ref.onValue; Stream<DatabaseEvent> stream = ref.onValue;
stream.listen((DatabaseEvent event) async { stream.listen((DatabaseEvent event) async {
if (_timer != null) { if (_timer != null) {
await Future.delayed(const Duration(seconds: 2)); await Future.delayed(const Duration(seconds: 2));
} }
Map<dynamic, dynamic> usersMap = Map<dynamic, dynamic> usersMap = event.snapshot.value as Map<dynamic, dynamic>;
event.snapshot.value as Map<dynamic, dynamic>;
List<StatusModel> statusList = []; List<StatusModel> statusList = [];
usersMap['status'].forEach((element) { usersMap['status'].forEach((element) {
statusList statusList.add(StatusModel(code: element['code'], value: element['value']));
.add(StatusModel(code: element['code'], value: element['value']));
}); });
deviceStatus = OneGangModel.fromJson(statusList); deviceStatus = OneGangModel.fromJson(statusList);
@ -99,8 +94,7 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
emit(UpdateState(oneGangModel: deviceStatus)); emit(UpdateState(oneGangModel: deviceStatus));
} }
void _changeFirstSwitch( void _changeFirstSwitch(ChangeFirstSwitchStatusEvent event, Emitter<OneGangState> emit) async {
ChangeFirstSwitchStatusEvent event, Emitter<OneGangState> emit) async {
emit(LoadingNewSate(oneGangModel: deviceStatus)); emit(LoadingNewSate(oneGangModel: deviceStatus));
try { try {
deviceStatus.firstSwitch = !event.value; deviceStatus.firstSwitch = !event.value;
@ -125,20 +119,17 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
} }
} }
void _changeSliding( void _changeSliding(ChangeSlidingSegment event, Emitter<OneGangState> emit) async {
ChangeSlidingSegment event, Emitter<OneGangState> emit) async {
emit(ChangeSlidingSegmentState(value: event.value)); emit(ChangeSlidingSegmentState(value: event.value));
} }
void _setCounterValue( void _setCounterValue(SetCounterValue event, Emitter<OneGangState> emit) async {
SetCounterValue event, Emitter<OneGangState> emit) async {
emit(LoadingNewSate(oneGangModel: deviceStatus)); emit(LoadingNewSate(oneGangModel: deviceStatus));
int seconds = 0; int seconds = 0;
try { try {
seconds = event.duration.inSeconds; seconds = event.duration.inSeconds;
final response = await DevicesAPI.controlDevice( final response = await DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(deviceId: oneGangId, code: event.deviceCode, value: seconds),
deviceId: oneGangId, code: event.deviceCode, value: seconds),
oneGangId); oneGangId);
if (response['success'] ?? false) { if (response['success'] ?? false) {
@ -161,8 +152,7 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
} }
} }
void _getCounterValue( void _getCounterValue(GetCounterEvent event, Emitter<OneGangState> emit) async {
GetCounterEvent event, Emitter<OneGangState> emit) async {
emit(LoadingInitialState()); emit(LoadingInitialState());
try { try {
var response = await DevicesAPI.getDeviceStatus(oneGangId); var response = await DevicesAPI.getDeviceStatus(oneGangId);
@ -251,8 +241,7 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
deviceId: oneGangId, deviceId: oneGangId,
); );
List<dynamic> jsonData = response; List<dynamic> jsonData = response;
listSchedule = listSchedule = jsonData.map((item) => ScheduleModel.fromJson(item)).toList();
jsonData.map((item) => ScheduleModel.fromJson(item)).toList();
emit(InitialState()); emit(InitialState());
} on DioException catch (e) { } on DioException catch (e) {
final errorData = e.response!.data; final errorData = e.response!.data;
@ -263,13 +252,12 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
int? getTimeStampWithoutSeconds(DateTime? dateTime) { int? getTimeStampWithoutSeconds(DateTime? dateTime) {
if (dateTime == null) return null; if (dateTime == null) return null;
DateTime dateTimeWithoutSeconds = DateTime(dateTime.year, dateTime.month, DateTime dateTimeWithoutSeconds =
dateTime.day, dateTime.hour, dateTime.minute); DateTime(dateTime.year, dateTime.month, dateTime.day, dateTime.hour, dateTime.minute);
return dateTimeWithoutSeconds.millisecondsSinceEpoch ~/ 1000; return dateTimeWithoutSeconds.millisecondsSinceEpoch ~/ 1000;
} }
Future toggleChange( Future toggleChange(ToggleScheduleEvent event, Emitter<OneGangState> emit) async {
ToggleScheduleEvent event, Emitter<OneGangState> emit) async {
try { try {
emit(LoadingInitialState()); emit(LoadingInitialState());
final response = await DevicesAPI.changeSchedule( final response = await DevicesAPI.changeSchedule(
@ -288,8 +276,7 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
} }
} }
Future deleteSchedule( Future deleteSchedule(DeleteScheduleEvent event, Emitter<OneGangState> emit) async {
DeleteScheduleEvent event, Emitter<OneGangState> emit) async {
try { try {
emit(LoadingInitialState()); emit(LoadingInitialState());
final response = await DevicesAPI.deleteSchedule( final response = await DevicesAPI.deleteSchedule(
@ -318,8 +305,7 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
// emit(ChangeSlidingSegmentState(value: 1)); // emit(ChangeSlidingSegmentState(value: 1));
// } // }
void toggleCreateSchedule( void toggleCreateSchedule(ToggleCreateScheduleEvent event, Emitter<OneGangState> emit) {
ToggleCreateScheduleEvent event, Emitter<OneGangState> emit) {
emit(LoadingInitialState()); emit(LoadingInitialState());
createSchedule = !createSchedule; createSchedule = !createSchedule;
selectedDays.clear(); selectedDays.clear();
@ -343,13 +329,12 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
selectedDays.add(event.key); selectedDays.add(event.key);
} }
emit(ChangeTimeState()); emit(ChangeTimeState());
add(ChangeSlidingSegment(value: 1)); add(const ChangeSlidingSegment(value: 1));
} }
int selectedTabIndex = 0; int selectedTabIndex = 0;
void toggleSelectedIndex( void toggleSelectedIndex(ToggleSelectedEvent event, Emitter<OneGangState> emit) {
ToggleSelectedEvent event, Emitter<OneGangState> emit) {
emit(LoadingInitialState()); emit(LoadingInitialState());
selectedTabIndex = event.index; selectedTabIndex = event.index;
emit(ChangeSlidingSegmentState(value: selectedTabIndex)); emit(ChangeSlidingSegmentState(value: selectedTabIndex));
@ -358,8 +343,7 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
List<GroupOneGangModel> groupOneGangList = []; List<GroupOneGangModel> groupOneGangList = [];
bool allSwitchesOn = true; bool allSwitchesOn = true;
void _fetchOneGangWizardStatus( void _fetchOneGangWizardStatus(InitialWizardEvent event, Emitter<OneGangState> emit) async {
InitialWizardEvent event, Emitter<OneGangState> emit) async {
emit(LoadingInitialState()); emit(LoadingInitialState());
try { try {
devicesList = []; devicesList = [];
@ -369,8 +353,7 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
HomeCubit.getInstance().selectedSpace?.id ?? '', '1G'); HomeCubit.getInstance().selectedSpace?.id ?? '', '1G');
for (int i = 0; i < devicesList.length; i++) { for (int i = 0; i < devicesList.length; i++) {
var response = var response = await DevicesAPI.getDeviceStatus(devicesList[i].uuid ?? '');
await DevicesAPI.getDeviceStatus(devicesList[i].uuid ?? '');
List<StatusModel> statusModelList = []; List<StatusModel> statusModelList = [];
for (var status in response['status']) { for (var status in response['status']) {
statusModelList.add(StatusModel.fromJson(status)); statusModelList.add(StatusModel.fromJson(status));
@ -392,16 +375,15 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
return true; return true;
}); });
} }
emit(UpdateGroupState( emit(UpdateGroupState(oneGangList: groupOneGangList, allSwitches: allSwitchesOn));
oneGangList: groupOneGangList, allSwitches: allSwitchesOn));
} catch (e) { } catch (e) {
emit(FailedState(error: e.toString())); emit(FailedState(error: e.toString()));
return; return;
} }
} }
void _changeFirstWizardSwitch(ChangeFirstWizardSwitchStatusEvent event, void _changeFirstWizardSwitch(
Emitter<OneGangState> emit) async { ChangeFirstWizardSwitchStatusEvent event, Emitter<OneGangState> emit) async {
emit(LoadingNewSate(oneGangModel: deviceStatus)); emit(LoadingNewSate(oneGangModel: deviceStatus));
try { try {
bool allSwitchesValue = true; bool allSwitchesValue = true;
@ -413,17 +395,16 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
allSwitchesValue = false; allSwitchesValue = false;
} }
}); });
// List<String> allDeviceIds =
// groupOneGangList.map((device) => device.deviceId).toList(); emit(UpdateGroupState(oneGangList: groupOneGangList, allSwitches: allSwitchesValue));
final response = await DevicesAPI.deviceController(
final response = await DevicesAPI.deviceBatchController(
code: 'switch_1', code: 'switch_1',
devicesUuid: [event.deviceId], devicesUuid: [event.deviceId],
value: !event.value, value: !event.value,
); );
emit(UpdateGroupState( if (response['failedResults'].toString() != '[]') {
oneGangList: groupOneGangList, allSwitches: allSwitchesValue));
if (!response['success']) {
add(InitialEvent(groupScreen: oneGangGroup)); add(InitialEvent(groupScreen: oneGangGroup));
} }
} catch (_) { } catch (_) {
@ -443,25 +424,16 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
emit(UpdateGroupState(oneGangList: groupOneGangList, allSwitches: true)); emit(UpdateGroupState(oneGangList: groupOneGangList, allSwitches: true));
// Get a list of all device IDs // Get a list of all device IDs
List<String> allDeviceIds = List<String> allDeviceIds = groupOneGangList.map((device) => device.deviceId).toList();
groupOneGangList.map((device) => device.deviceId).toList();
// First call for switch_1 // First call for switch_1
final response1 = await DevicesAPI.deviceController( final response = await DevicesAPI.deviceBatchController(
code: 'switch_1', // Controls first switch for all devices code: 'switch_1', // Controls first switch for all devices
devicesUuid: allDeviceIds, devicesUuid: allDeviceIds,
value: true, // true (on) or false (off) depending on the event value value: true, // true (on) or false (off) depending on the event value
); );
// Second call for switch_2
final response2 = await DevicesAPI.deviceController(
code: 'switch_2', // Controls second switch for all devices
devicesUuid: allDeviceIds,
value: true, // true (on) or false (off) depending on the event value
);
// Check if either response is unsuccessful, then reset to initial state // Check if either response is unsuccessful, then reset to initial state
if (!response1['success'] || !response2['success']) { if (response['failedResults'].toString() != '[]') {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(const InitialEvent(groupScreen: true)); add(const InitialEvent(groupScreen: true));
} }
@ -484,25 +456,17 @@ class OneGangBloc extends Bloc<OneGangEvent, OneGangState> {
emit(UpdateGroupState(oneGangList: groupOneGangList, allSwitches: false)); emit(UpdateGroupState(oneGangList: groupOneGangList, allSwitches: false));
// Get a list of all device IDs // Get a list of all device IDs
List<String> allDeviceIds = List<String> allDeviceIds = groupOneGangList.map((device) => device.deviceId).toList();
groupOneGangList.map((device) => device.deviceId).toList();
// First call for switch_1 // First call for switch_1
final response1 = await DevicesAPI.deviceController( final response = await DevicesAPI.deviceBatchController(
code: 'switch_1', // Controls first switch for all devices code: 'switch_1', // Controls first switch for all devices
devicesUuid: allDeviceIds, devicesUuid: allDeviceIds,
value: true, // true (on) or false (off) depending on the event value value: false, // true (on) or false (off) depending on the event value
);
// Second call for switch_2
final response2 = await DevicesAPI.deviceController(
code: 'switch_2', // Controls second switch for all devices
devicesUuid: allDeviceIds,
value: true, // true (on) or false (off) depending on the event value
); );
// Check if either response is unsuccessful, then reset to initial state // Check if either response is unsuccessful, then reset to initial state
if (!response1['success'] || !response2['success']) { if (response['failedResults'].toString() != '[]') {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(const InitialEvent(groupScreen: true)); add(const InitialEvent(groupScreen: true));
} }

View File

@ -25,9 +25,6 @@ class ThreeGangBloc extends Bloc<ThreeGangEvent, ThreeGangState> {
secondCountDown: 0, secondCountDown: 0,
thirdCountDown: 0); thirdCountDown: 0);
Timer? _timer; Timer? _timer;
// Timer? _firstSwitchTimer;
// Timer? _secondSwitchTimer;
// Timer? _thirdSwitchTimer;
bool threeGangGroup = false; bool threeGangGroup = false;
List<DeviceModel> devicesList = []; List<DeviceModel> devicesList = [];
@ -380,18 +377,15 @@ class ThreeGangBloc extends Bloc<ThreeGangEvent, ThreeGangState> {
final response = await Future.wait([ final response = await Future.wait([
DevicesAPI.controlDevice( DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(
deviceId: groupThreeGangList[i].deviceId, deviceId: groupThreeGangList[i].deviceId, code: 'switch_1', value: false),
code: 'switch_1', value: false),
groupThreeGangList[i].deviceId), groupThreeGangList[i].deviceId),
DevicesAPI.controlDevice( DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(
deviceId: groupThreeGangList[i].deviceId, deviceId: groupThreeGangList[i].deviceId, code: 'switch_2', value: false),
code: 'switch_2', value: false),
groupThreeGangList[i].deviceId), groupThreeGangList[i].deviceId),
DevicesAPI.controlDevice( DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(
deviceId: groupThreeGangList[i].deviceId, deviceId: groupThreeGangList[i].deviceId, code: 'switch_3', value: false),
code: 'switch_3', value: false),
groupThreeGangList[i].deviceId), groupThreeGangList[i].deviceId),
]); ]);
@ -534,7 +528,7 @@ class ThreeGangBloc extends Bloc<ThreeGangEvent, ThreeGangState> {
CustomSnackBar.displaySnackBar('Save Successfully'); CustomSnackBar.displaySnackBar('Save Successfully');
add(GetScheduleEvent()); add(GetScheduleEvent());
emit(ThreeGangSaveSchedule()); emit(ThreeGangSaveSchedule());
add(const ToggleCreateScheduleEvent(index:1 )); add(const ToggleCreateScheduleEvent(index: 1));
} else { } else {
CustomSnackBar.displaySnackBar('Please select days'); CustomSnackBar.displaySnackBar('Please select days');
} }
@ -609,38 +603,19 @@ class ThreeGangBloc extends Bloc<ThreeGangEvent, ThreeGangState> {
} }
} }
// void toggleCreateSchedule() { void toggleSelectedIndex(ToggleSelectedEvent event, Emitter<ThreeGangState> emit) {
// emit(LoadingInitialState());
// createSchedule = !createSchedule;
// selectedDays.clear();
// selectedTime = DateTime.now();
// emit(UpdateCreateScheduleState(createSchedule));
// emit(ChangeSlidingSegmentState(value: 1));
// }
// void toggleSelectedIndex(index) {
// emit(LoadingInitialState());
// selectedTabIndex = index;
// emit(ChangeSlidingSegmentState(value: selectedTabIndex));
// }
void toggleSelectedIndex( ToggleSelectedEvent event, Emitter<ThreeGangState> emit) {
emit(LoadingInitialState()); emit(LoadingInitialState());
selectedTabIndex =event.index; selectedTabIndex = event.index;
emit(ChangeSlidingSegmentState(value: selectedTabIndex)); emit(ChangeSlidingSegmentState(value: selectedTabIndex));
} }
void toggleCreateSchedule(ToggleCreateScheduleEvent event, Emitter<ThreeGangState> emit) { void toggleCreateSchedule(ToggleCreateScheduleEvent event, Emitter<ThreeGangState> emit) {
emit(LoadingInitialState()); emit(LoadingInitialState());
createSchedule = !createSchedule; createSchedule = !createSchedule;
selectedDays.clear(); selectedDays.clear();
selectedTime = DateTime.now(); selectedTime = DateTime.now();
emit(UpdateCreateScheduleState(createSchedule)); emit(UpdateCreateScheduleState(createSchedule));
} }
int selectedTabIndex = 0; int selectedTabIndex = 0;
bool toggleSchedule = true; bool toggleSchedule = true;
@ -648,80 +623,4 @@ class ThreeGangBloc extends Bloc<ThreeGangEvent, ThreeGangState> {
bool createSchedule = false; bool createSchedule = false;
List<ScheduleModel> listSchedule = []; List<ScheduleModel> listSchedule = [];
DateTime? selectedTime = DateTime.now(); DateTime? selectedTime = DateTime.now();
// void _changeFirstSwitchWizard( ChangeFirstSwitchStatusEventWizard event, Emitter<ThreeGangState> emit) async {
// emit(LoadingNewSate(threeGangModel: deviceStatus));
// try {
// bool allSwitchesValue = true;
// groupThreeGangList.forEach((element) {
// if (element.deviceId == event.deviceId) {
// element.firstSwitch = !event.value;
// }
// if (!element.firstSwitch ||
// !element.secondSwitch ||
// !element.thirdSwitch) {
// allSwitchesValue = false;
// }
// });
// emit(UpdateGroupState(
// threeGangList: groupThreeGangList, allSwitches: allSwitchesValue));
// if (_timer != null) {
// _timer!.cancel();
// }
// _timer = Timer(const Duration(milliseconds: 100), () async {
// final response = await DevicesAPI.controlDevice(
// DeviceControlModel(
// deviceId: event.deviceId ,
// code: 'switch_1',
// value: event.value),
// event.deviceId );
// if (!response['success']) {
// add(InitialEvent(groupScreen: threeGangGroup));
// }
// });
// } catch (_) {
// add(InitialEvent(groupScreen: threeGangGroup));
// }
// }
// Future<void> fetchGroupDevises(
// InitialWizardDevises event, Emitter<ThreeGangState> emit) async {
// emit(LoadingInitialState());
// devicesList = [];
// listDevises = [];
// allSwitchesOn = true;
// devicesList = await DevicesAPI.getDeviceByGroupName(
// HomeCubit.getInstance().selectedSpace?.id ?? '', '3G');
// for (int i = 0; i < devicesList.length; i++) {
// var response =
// await DevicesAPI.getDeviceStatus(devicesList[i].uuid ?? '');
// List<StatusModel> statusModelList = [];
// for (var status in response['status']) {
// statusModelList.add(StatusModel.fromJson(status));
// }
// deviceStatus = ThreeGangModel.fromJson(statusModelList);
// listDevises.add(GroupThreeGangModel(
// secondSwitch: deviceStatus.secondSwitch,
// thirdSwitch: deviceStatus.thirdSwitch,
// deviceId: devicesList[i].uuid ?? '',
// deviceName: devicesList[i].name ?? '',
// firstSwitch: deviceStatus.firstSwitch,
// ));
// }
// if (listDevises.isNotEmpty) {
// listDevises.firstWhere((element) {
// if (!element.firstSwitch) {
// allSwitchesOn = false;
// }
// return true;
// });
// }
// emit(UpdateGroupState(
// threeGangList: listDevises, allSwitches: allSwitchesOn));
// }
} }

View File

@ -35,8 +35,7 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
bool createSchedule = false; bool createSchedule = false;
List<ScheduleModel> listSchedule = []; List<ScheduleModel> listSchedule = [];
TwoGangBloc({required this.twoGangId, required this.switchCode}) TwoGangBloc({required this.twoGangId, required this.switchCode}) : super(InitialState()) {
: super(InitialState()) {
on<InitialEvent>(_fetchTwoGangStatus); on<InitialEvent>(_fetchTwoGangStatus);
on<TwoGangUpdated>(_twoGangUpdated); on<TwoGangUpdated>(_twoGangUpdated);
on<ChangeFirstSwitchStatusEvent>(_changeFirstSwitch); on<ChangeFirstSwitchStatusEvent>(_changeFirstSwitch);
@ -64,32 +63,15 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
DateTime? selectedTime = DateTime.now(); DateTime? selectedTime = DateTime.now();
// void toggleCreateSchedule() {
// emit(LoadingInitialState());
// createSchedule = !createSchedule;
// selectedDays.clear();
// selectedTime = DateTime.now();
// emit(UpdateCreateScheduleState(createSchedule));
// emit(ChangeSlidingSegmentState(value: 1));
// }
int selectedTabIndex = 0; int selectedTabIndex = 0;
// void toggleSelectedIndex(index) { void toggleSelectedIndex(ToggleSelectedEvent event, Emitter<TwoGangState> emit) {
// emit(LoadingInitialState());
// selectedTabIndex = index;
// emit(ChangeSlidingSegmentState(value: selectedTabIndex));
// }
void toggleSelectedIndex(
ToggleSelectedEvent event, Emitter<TwoGangState> emit) {
emit(LoadingInitialState()); emit(LoadingInitialState());
selectedTabIndex = event.index; selectedTabIndex = event.index;
emit(ChangeSlidingSegmentState(value: selectedTabIndex)); emit(ChangeSlidingSegmentState(value: selectedTabIndex));
} }
void toggleCreateSchedule( void toggleCreateSchedule(ToggleCreateScheduleEvent event, Emitter<TwoGangState> emit) {
ToggleCreateScheduleEvent event, Emitter<TwoGangState> emit) {
emit(LoadingInitialState()); emit(LoadingInitialState());
createSchedule = !createSchedule; createSchedule = !createSchedule;
selectedDays.clear(); selectedDays.clear();
@ -97,55 +79,17 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
emit(UpdateCreateScheduleState(createSchedule)); emit(UpdateCreateScheduleState(createSchedule));
} }
void _fetchTwoGangStatus( void _fetchTwoGangStatus(InitialEvent event, Emitter<TwoGangState> emit) async {
InitialEvent event, Emitter<TwoGangState> emit) async {
emit(LoadingInitialState()); emit(LoadingInitialState());
try { try {
twoGangGroup = event.groupScreen; var response = await DevicesAPI.getDeviceStatus(twoGangId);
if (twoGangGroup) { List<StatusModel> statusModelList = [];
devicesList = []; for (var status in response['status']) {
groupTwoGangList = []; statusModelList.add(StatusModel.fromJson(status));
allSwitchesOn = true;
devicesList = await DevicesAPI.getDeviceByGroupName(
HomeCubit.getInstance().selectedSpace?.id ?? '', '2G');
for (int i = 0; i < devicesList.length; i++) {
var response =
await DevicesAPI.getDeviceStatus(devicesList[i].uuid ?? '');
List<StatusModel> statusModelList = [];
for (var status in response['status']) {
statusModelList.add(StatusModel.fromJson(status));
}
deviceStatus = TwoGangModel.fromJson(statusModelList);
groupTwoGangList.add(GroupTwoGangModel(
deviceId: devicesList[i].uuid ?? '',
deviceName: devicesList[i].name ?? '',
firstSwitch: deviceStatus.firstSwitch,
secondSwitch: deviceStatus.secondSwitch,
));
}
if (groupTwoGangList.isNotEmpty) {
groupTwoGangList.firstWhere((element) {
if (!element.firstSwitch || !element.secondSwitch) {
allSwitchesOn = false;
}
return true;
});
}
emit(UpdateGroupState(
twoGangList: groupTwoGangList, allSwitches: allSwitchesOn));
} else {
var response = await DevicesAPI.getDeviceStatus(twoGangId);
List<StatusModel> statusModelList = [];
for (var status in response['status']) {
statusModelList.add(StatusModel.fromJson(status));
}
deviceStatus = TwoGangModel.fromJson(statusModelList);
emit(UpdateState(twoGangModel: deviceStatus));
_listenToChanges();
} }
deviceStatus = TwoGangModel.fromJson(statusModelList);
emit(UpdateState(twoGangModel: deviceStatus));
_listenToChanges();
} catch (e) { } catch (e) {
emit(FailedState(error: e.toString())); emit(FailedState(error: e.toString()));
return; return;
@ -154,21 +98,18 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
_listenToChanges() { _listenToChanges() {
try { try {
DatabaseReference ref = DatabaseReference ref = FirebaseDatabase.instance.ref('device-status/$twoGangId');
FirebaseDatabase.instance.ref('device-status/$twoGangId');
Stream<DatabaseEvent> stream = ref.onValue; Stream<DatabaseEvent> stream = ref.onValue;
stream.listen((DatabaseEvent event) async { stream.listen((DatabaseEvent event) async {
if (_timer != null) { if (_timer != null) {
await Future.delayed(const Duration(seconds: 2)); await Future.delayed(const Duration(seconds: 2));
} }
Map<dynamic, dynamic> usersMap = Map<dynamic, dynamic> usersMap = event.snapshot.value as Map<dynamic, dynamic>;
event.snapshot.value as Map<dynamic, dynamic>;
List<StatusModel> statusList = []; List<StatusModel> statusList = [];
usersMap['status'].forEach((element) { usersMap['status'].forEach((element) {
statusList statusList.add(StatusModel(code: element['code'], value: element['value']));
.add(StatusModel(code: element['code'], value: element['value']));
}); });
deviceStatus = TwoGangModel.fromJson(statusList); deviceStatus = TwoGangModel.fromJson(statusList);
@ -183,8 +124,7 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
emit(UpdateState(twoGangModel: deviceStatus)); emit(UpdateState(twoGangModel: deviceStatus));
} }
void _changeFirstSwitch( void _changeFirstSwitch(ChangeFirstSwitchStatusEvent event, Emitter<TwoGangState> emit) async {
ChangeFirstSwitchStatusEvent event, Emitter<TwoGangState> emit) async {
emit(LoadingNewSate(twoGangModel: deviceStatus)); emit(LoadingNewSate(twoGangModel: deviceStatus));
try { try {
deviceStatus.firstSwitch = !event.value; deviceStatus.firstSwitch = !event.value;
@ -195,23 +135,19 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
_timer = Timer(const Duration(milliseconds: 500), () async { _timer = Timer(const Duration(milliseconds: 500), () async {
final response = await DevicesAPI.controlDevice( final response = await DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(deviceId: twoGangId, code: 'switch_1', value: !event.value),
deviceId: twoGangGroup ? event.deviceId : twoGangId, twoGangId);
code: 'switch_1',
value: !event.value),
twoGangGroup ? event.deviceId : twoGangId);
if (!response['success']) { if (!response['success']) {
add(InitialEvent(groupScreen: twoGangGroup)); add(const InitialEvent());
} }
}); });
} catch (_) { } catch (_) {
add(InitialEvent(groupScreen: twoGangGroup)); add(const InitialEvent());
} }
} }
void _changeSecondSwitch( void _changeSecondSwitch(ChangeSecondSwitchStatusEvent event, Emitter<TwoGangState> emit) async {
ChangeSecondSwitchStatusEvent event, Emitter<TwoGangState> emit) async {
emit(LoadingNewSate(twoGangModel: deviceStatus)); emit(LoadingNewSate(twoGangModel: deviceStatus));
try { try {
deviceStatus.secondSwitch = !event.value; deviceStatus.secondSwitch = !event.value;
@ -221,18 +157,15 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
} }
_timer = Timer(const Duration(milliseconds: 500), () async { _timer = Timer(const Duration(milliseconds: 500), () async {
final response = await DevicesAPI.controlDevice( final response = await DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(deviceId: twoGangId, code: 'switch_2', value: !event.value),
deviceId: twoGangGroup ? event.deviceId : twoGangId, twoGangId);
code: 'switch_2',
value: !event.value),
twoGangGroup ? event.deviceId : twoGangId);
if (!response['success']) { if (!response['success']) {
add(InitialEvent(groupScreen: twoGangGroup)); add(const InitialEvent());
} }
}); });
} catch (_) { } catch (_) {
add(InitialEvent(groupScreen: twoGangGroup)); add(const InitialEvent());
} }
} }
@ -247,25 +180,21 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
final response = await Future.wait([ final response = await Future.wait([
DevicesAPI.controlDevice( DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(
deviceId: twoGangId, deviceId: twoGangId, code: 'switch_1', value: deviceStatus.firstSwitch),
code: 'switch_1',
value: deviceStatus.firstSwitch),
twoGangId), twoGangId),
DevicesAPI.controlDevice( DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(
deviceId: twoGangId, deviceId: twoGangId, code: 'switch_2', value: deviceStatus.secondSwitch),
code: 'switch_2',
value: deviceStatus.secondSwitch),
twoGangId), twoGangId),
]); ]);
if (response.every((element) => !element['success'])) { if (response.every((element) => !element['success'])) {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(const InitialEvent(groupScreen: false)); add(const InitialEvent());
} }
} catch (_) { } catch (_) {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(const InitialEvent(groupScreen: false)); add(const InitialEvent());
} }
} }
@ -278,101 +207,23 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
final response = await Future.wait([ final response = await Future.wait([
DevicesAPI.controlDevice( DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(
deviceId: twoGangId, deviceId: twoGangId, code: 'switch_1', value: deviceStatus.firstSwitch),
code: 'switch_1',
value: deviceStatus.firstSwitch),
twoGangId), twoGangId),
DevicesAPI.controlDevice( DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(
deviceId: twoGangId, deviceId: twoGangId, code: 'switch_2', value: deviceStatus.secondSwitch),
code: 'switch_2',
value: deviceStatus.secondSwitch),
twoGangId), twoGangId),
]); ]);
if (response.every((element) => !element['success'])) { if (response.every((element) => !element['success'])) {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(const InitialEvent(groupScreen: false)); add(const InitialEvent());
} }
} catch (_) { } catch (_) {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(const InitialEvent(groupScreen: false)); add(const InitialEvent());
} }
} }
// void _groupAllOn(GroupAllOnEvent event, Emitter<TwoGangState> emit) async {
// emit(LoadingNewSate(twoGangModel: deviceStatus));
// try {
// for (int i = 0; i < groupTwoGangList.length; i++) {
// groupTwoGangList[i].firstSwitch = true;
// groupTwoGangList[i].secondSwitch = true;
// }
// emit(UpdateGroupState(twoGangList: groupTwoGangList, allSwitches: true));
// for (int i = 0; i < groupTwoGangList.length; i++) {
// final response = await Future.wait([
// DevicesAPI.controlDevice(
// DeviceControlModel(
// deviceId: groupTwoGangList[i].deviceId,
// code: 'switch_1',
// value: true),
// groupTwoGangList[i].deviceId),
// DevicesAPI.controlDevice(
// DeviceControlModel(
// deviceId: groupTwoGangList[i].deviceId,
// code: 'switch_2',
// value: true),
// groupTwoGangList[i].deviceId),
// ]);
// if (response.every((element) => !element['success'])) {
// await Future.delayed(const Duration(milliseconds: 500));
// add(const InitialEvent(groupScreen: true));
// break;
// }
// }
// } catch (_) {
// await Future.delayed(const Duration(milliseconds: 500));
// add(const InitialEvent(groupScreen: true));
// }
// }
// void _groupAllOff(GroupAllOffEvent event, Emitter<TwoGangState> emit) async {
// emit(LoadingNewSate(twoGangModel: deviceStatus));
// try {
// for (int i = 0; i < groupTwoGangList.length; i++) {
// groupTwoGangList[i].firstSwitch = false;
// groupTwoGangList[i].secondSwitch = false;
// }
// emit(UpdateGroupState(twoGangList: groupTwoGangList, allSwitches: false));
// for (int i = 0; i < groupTwoGangList.length; i++) {
// final response = await Future.wait([
// DevicesAPI.controlDevice(
// DeviceControlModel(
// deviceId: groupTwoGangList[i].deviceId,
// code: 'switch_1',
// value: false),
// groupTwoGangList[i].deviceId),
// DevicesAPI.controlDevice(
// DeviceControlModel(
// deviceId: groupTwoGangList[i].deviceId,
// code: 'switch_2',
// value: false),
// groupTwoGangList[i].deviceId),
// ]);
// if (response.every((element) => !element['success'])) {
// await Future.delayed(const Duration(milliseconds: 500));
// add(const InitialEvent(groupScreen: true));
// break;
// }
// }
// } catch (_) {
// await Future.delayed(const Duration(milliseconds: 500));
// add(const InitialEvent(groupScreen: true));
// }
// }
void _groupAllOn(GroupAllOnEvent event, Emitter<TwoGangState> emit) async { void _groupAllOn(GroupAllOnEvent event, Emitter<TwoGangState> emit) async {
emit(LoadingNewSate(twoGangModel: deviceStatus)); emit(LoadingNewSate(twoGangModel: deviceStatus));
try { try {
@ -381,28 +232,28 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
groupTwoGangList[i].secondSwitch = true; groupTwoGangList[i].secondSwitch = true;
} }
emit(UpdateGroupState(twoGangList: groupTwoGangList, allSwitches: true)); emit(UpdateGroupState(twoGangList: groupTwoGangList, allSwitches: true));
List<String> allDeviceIds = List<String> allDeviceIds = groupTwoGangList.map((device) => device.deviceId).toList();
groupTwoGangList.map((device) => device.deviceId).toList();
final response1 = await DevicesAPI.deviceController( final response1 = await DevicesAPI.deviceBatchController(
code: 'switch_1', code: 'switch_1',
devicesUuid: allDeviceIds, devicesUuid: allDeviceIds,
value: true, value: true,
); );
final response2 = await DevicesAPI.deviceController( final response2 = await DevicesAPI.deviceBatchController(
code: 'switch_2', code: 'switch_2',
devicesUuid: allDeviceIds, devicesUuid: allDeviceIds,
value: true, value: true,
); );
if (!response1['success'] || !response2['success']) { if (response1['failedResults'].toString() != '[]' ||
response2['failedResults'].toString() != '[]') {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(const InitialEvent(groupScreen: true)); add(InitialWizardEvent());
} }
} catch (_) { } catch (_) {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(const InitialEvent(groupScreen: true)); add(InitialWizardEvent());
} }
} }
@ -416,45 +267,42 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
emit(UpdateGroupState(twoGangList: groupTwoGangList, allSwitches: false)); emit(UpdateGroupState(twoGangList: groupTwoGangList, allSwitches: false));
List<String> allDeviceIds = List<String> allDeviceIds = groupTwoGangList.map((device) => device.deviceId).toList();
groupTwoGangList.map((device) => device.deviceId).toList();
final response1 = await DevicesAPI.deviceController( final response1 = await DevicesAPI.deviceBatchController(
code: 'switch_1', code: 'switch_1',
devicesUuid: allDeviceIds, devicesUuid: allDeviceIds,
value: true, value: true,
); );
final response2 = await DevicesAPI.deviceController( final response2 = await DevicesAPI.deviceBatchController(
code: 'switch_2', code: 'switch_2',
devicesUuid: allDeviceIds, devicesUuid: allDeviceIds,
value: true, value: true,
); );
if (!response1['success'] || !response2['success']) { if (response1['failedResults'].toString() != '[]' ||
response2['failedResults'].toString() != '[]') {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(const InitialEvent(groupScreen: true)); add(InitialWizardEvent());
} }
} catch (_) { } catch (_) {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(const InitialEvent(groupScreen: true)); add(InitialWizardEvent());
} }
} }
void _changeSliding( void _changeSliding(ChangeSlidingSegment event, Emitter<TwoGangState> emit) async {
ChangeSlidingSegment event, Emitter<TwoGangState> emit) async {
emit(ChangeSlidingSegmentState(value: event.value)); emit(ChangeSlidingSegmentState(value: event.value));
} }
void _setCounterValue( void _setCounterValue(SetCounterValue event, Emitter<TwoGangState> emit) async {
SetCounterValue event, Emitter<TwoGangState> emit) async {
emit(LoadingNewSate(twoGangModel: deviceStatus)); emit(LoadingNewSate(twoGangModel: deviceStatus));
int seconds = 0; int seconds = 0;
try { try {
seconds = event.duration.inSeconds; seconds = event.duration.inSeconds;
final response = await DevicesAPI.controlDevice( final response = await DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(deviceId: twoGangId, code: event.deviceCode, value: seconds),
deviceId: twoGangId, code: event.deviceCode, value: seconds),
twoGangId); twoGangId);
if (response['success'] ?? false) { if (response['success'] ?? false) {
@ -479,8 +327,7 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
} }
} }
void _getCounterValue( void _getCounterValue(GetCounterEvent event, Emitter<TwoGangState> emit) async {
GetCounterEvent event, Emitter<TwoGangState> emit) async {
emit(LoadingInitialState()); emit(LoadingInitialState());
try { try {
add(GetScheduleEvent()); add(GetScheduleEvent());
@ -547,7 +394,7 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
selectedDays.add(event.key); selectedDays.add(event.key);
} }
emit(ChangeTimeState()); emit(ChangeTimeState());
add(ChangeSlidingSegment(value: 1)); add(const ChangeSlidingSegment(value: 1));
} }
Future<void> saveSchedule( Future<void> saveSchedule(
@ -557,7 +404,7 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
try { try {
if (selectedDays.isNotEmpty) { if (selectedDays.isNotEmpty) {
emit(LoadingInitialState()); emit(LoadingInitialState());
final response = await DevicesAPI.postSchedule( await DevicesAPI.postSchedule(
category: switchCode, category: switchCode,
deviceId: twoGangId, deviceId: twoGangId,
time: getTimeStampWithoutSeconds(selectedTime).toString(), time: getTimeStampWithoutSeconds(selectedTime).toString(),
@ -588,8 +435,7 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
deviceId: twoGangId, deviceId: twoGangId,
); );
List<dynamic> jsonData = response; List<dynamic> jsonData = response;
listSchedule = listSchedule = jsonData.map((item) => ScheduleModel.fromJson(item)).toList();
jsonData.map((item) => ScheduleModel.fromJson(item)).toList();
emit(InitialState()); emit(InitialState());
} on DioException catch (e) { } on DioException catch (e) {
final errorData = e.response!.data; final errorData = e.response!.data;
@ -600,13 +446,12 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
int? getTimeStampWithoutSeconds(DateTime? dateTime) { int? getTimeStampWithoutSeconds(DateTime? dateTime) {
if (dateTime == null) return null; if (dateTime == null) return null;
DateTime dateTimeWithoutSeconds = DateTime(dateTime.year, dateTime.month, DateTime dateTimeWithoutSeconds =
dateTime.day, dateTime.hour, dateTime.minute); DateTime(dateTime.year, dateTime.month, dateTime.day, dateTime.hour, dateTime.minute);
return dateTimeWithoutSeconds.millisecondsSinceEpoch ~/ 1000; return dateTimeWithoutSeconds.millisecondsSinceEpoch ~/ 1000;
} }
Future toggleRepeat( Future toggleRepeat(ToggleScheduleEvent event, Emitter<TwoGangState> emit) async {
ToggleScheduleEvent event, Emitter<TwoGangState> emit) async {
try { try {
emit(LoadingInitialState()); emit(LoadingInitialState());
final response = await DevicesAPI.changeSchedule( final response = await DevicesAPI.changeSchedule(
@ -625,8 +470,7 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
} }
} }
Future deleteSchedule( Future deleteSchedule(DeleteScheduleEvent event, Emitter<TwoGangState> emit) async {
DeleteScheduleEvent event, Emitter<TwoGangState> emit) async {
try { try {
emit(LoadingInitialState()); emit(LoadingInitialState());
final response = await DevicesAPI.deleteSchedule( final response = await DevicesAPI.deleteSchedule(
@ -646,8 +490,7 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
} }
} }
void _fetchTwoGangWizardStatus( void _fetchTwoGangWizardStatus(InitialWizardEvent event, Emitter<TwoGangState> emit) async {
InitialWizardEvent event, Emitter<TwoGangState> emit) async {
emit(LoadingInitialState()); emit(LoadingInitialState());
try { try {
devicesList = []; devicesList = [];
@ -657,8 +500,7 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
HomeCubit.getInstance().selectedSpace?.id ?? '', '2G'); HomeCubit.getInstance().selectedSpace?.id ?? '', '2G');
for (int i = 0; i < devicesList.length; i++) { for (int i = 0; i < devicesList.length; i++) {
var response = var response = await DevicesAPI.getDeviceStatus(devicesList[i].uuid ?? '');
await DevicesAPI.getDeviceStatus(devicesList[i].uuid ?? '');
List<StatusModel> statusModelList = []; List<StatusModel> statusModelList = [];
for (var status in response['status']) { for (var status in response['status']) {
statusModelList.add(StatusModel.fromJson(status)); statusModelList.add(StatusModel.fromJson(status));
@ -681,16 +523,15 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
return true; return true;
}); });
} }
emit(UpdateGroupState( emit(UpdateGroupState(twoGangList: groupTwoGangList, allSwitches: allSwitchesOn));
twoGangList: groupTwoGangList, allSwitches: allSwitchesOn));
} catch (e) { } catch (e) {
emit(FailedState(error: e.toString())); emit(FailedState(error: e.toString()));
return; return;
} }
} }
void _changeFirstWizardSwitch(ChangeFirstWizardSwitchStatusEvent event, void _changeFirstWizardSwitch(
Emitter<TwoGangState> emit) async { ChangeFirstWizardSwitchStatusEvent event, Emitter<TwoGangState> emit) async {
emit(LoadingNewSate(twoGangModel: deviceStatus)); emit(LoadingNewSate(twoGangModel: deviceStatus));
try { try {
bool allSwitchesValue = true; bool allSwitchesValue = true;
@ -702,26 +543,26 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
allSwitchesValue = false; allSwitchesValue = false;
} }
}); });
List<String> allDeviceIds =
groupTwoGangList.map((device) => device.deviceId).toList(); emit(UpdateGroupState(twoGangList: groupTwoGangList, allSwitches: allSwitchesValue));
final response = await DevicesAPI.deviceController(
List<String> allDeviceIds = groupTwoGangList.map((device) => device.deviceId).toList();
final response = await DevicesAPI.deviceBatchController(
code: 'switch_1', code: 'switch_1',
devicesUuid: allDeviceIds, devicesUuid: allDeviceIds,
value: !event.value, value: !event.value,
); );
emit(UpdateGroupState( if (response['failedResults'].toString() != '[]') {
twoGangList: groupTwoGangList, allSwitches: allSwitchesValue)); add(InitialWizardEvent());
if (!response['success']) {
add(InitialEvent(groupScreen: twoGangGroup));
} }
} catch (_) { } catch (_) {
add(InitialEvent(groupScreen: twoGangGroup)); add(InitialWizardEvent());
} }
} }
void _changeSecondWizardSwitch(ChangeSecondWizardSwitchStatusEvent event, void _changeSecondWizardSwitch(
Emitter<TwoGangState> emit) async { ChangeSecondWizardSwitchStatusEvent event, Emitter<TwoGangState> emit) async {
emit(LoadingNewSate(twoGangModel: deviceStatus)); emit(LoadingNewSate(twoGangModel: deviceStatus));
try { try {
bool allSwitchesValue = true; bool allSwitchesValue = true;
@ -733,22 +574,21 @@ class TwoGangBloc extends Bloc<TwoGangEvent, TwoGangState> {
allSwitchesValue = false; allSwitchesValue = false;
} }
}); });
List<String> allDeviceIds = List<String> allDeviceIds = groupTwoGangList.map((device) => device.deviceId).toList();
groupTwoGangList.map((device) => device.deviceId).toList();
final response = await DevicesAPI.deviceController( emit(UpdateGroupState(twoGangList: groupTwoGangList, allSwitches: allSwitchesValue));
final response = await DevicesAPI.deviceBatchController(
code: 'switch_2', code: 'switch_2',
devicesUuid: allDeviceIds, devicesUuid: allDeviceIds,
value: !event.value, value: !event.value,
); );
emit(UpdateGroupState(
twoGangList: groupTwoGangList, allSwitches: allSwitchesValue));
if (response['failedResults'].toString() != '[]') { if (response['failedResults'].toString() != '[]') {
add(InitialEvent(groupScreen: twoGangGroup)); add(InitialWizardEvent());
} }
} catch (_) { } catch (_) {
add(InitialEvent(groupScreen: twoGangGroup)); add(InitialWizardEvent());
} }
} }
} }

View File

@ -32,10 +32,9 @@ class ToggleDaySelectionEvent extends TwoGangEvent {
} }
class InitialEvent extends TwoGangEvent { class InitialEvent extends TwoGangEvent {
final bool groupScreen; const InitialEvent();
const InitialEvent({required this.groupScreen});
@override @override
List<Object> get props => [groupScreen]; List<Object> get props => [];
} }
class ChangeFirstSwitchStatusEvent extends TwoGangEvent { class ChangeFirstSwitchStatusEvent extends TwoGangEvent {
@ -49,8 +48,7 @@ class ChangeFirstSwitchStatusEvent extends TwoGangEvent {
class ChangeSecondSwitchStatusEvent extends TwoGangEvent { class ChangeSecondSwitchStatusEvent extends TwoGangEvent {
final bool value; final bool value;
final String deviceId; final String deviceId;
const ChangeSecondSwitchStatusEvent( const ChangeSecondSwitchStatusEvent({required this.value, this.deviceId = ''});
{required this.value, this.deviceId = ''});
@override @override
List<Object> get props => [value, deviceId]; List<Object> get props => [value, deviceId];
} }
@ -143,8 +141,7 @@ class InitialWizardEvent extends TwoGangEvent {}
class ChangeFirstWizardSwitchStatusEvent extends TwoGangEvent { class ChangeFirstWizardSwitchStatusEvent extends TwoGangEvent {
final bool value; final bool value;
final String deviceId; final String deviceId;
const ChangeFirstWizardSwitchStatusEvent( const ChangeFirstWizardSwitchStatusEvent({required this.value, this.deviceId = ''});
{required this.value, this.deviceId = ''});
@override @override
List<Object> get props => [value, deviceId]; List<Object> get props => [value, deviceId];
} }
@ -152,8 +149,7 @@ class ChangeFirstWizardSwitchStatusEvent extends TwoGangEvent {
class ChangeSecondWizardSwitchStatusEvent extends TwoGangEvent { class ChangeSecondWizardSwitchStatusEvent extends TwoGangEvent {
final bool value; final bool value;
final String deviceId; final String deviceId;
const ChangeSecondWizardSwitchStatusEvent( const ChangeSecondWizardSwitchStatusEvent({required this.value, this.deviceId = ''});
{required this.value, this.deviceId = ''});
@override @override
List<Object> get props => [value, deviceId]; List<Object> get props => [value, deviceId];
} }

View File

@ -34,8 +34,7 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
List<ScheduleModel> listSchedule = []; List<ScheduleModel> listSchedule = [];
DateTime? selectedTime = DateTime.now(); DateTime? selectedTime = DateTime.now();
WaterHeaterBloc({required this.whId, required this.switchCode}) WaterHeaterBloc({required this.whId, required this.switchCode}) : super(WHInitialState()) {
: super(WHInitialState()) {
on<WaterHeaterInitial>(_fetchWaterHeaterStatus); on<WaterHeaterInitial>(_fetchWaterHeaterStatus);
on<WaterHeaterSwitch>(_changeFirstSwitch); on<WaterHeaterSwitch>(_changeFirstSwitch);
on<SetCounterValue>(_setCounterValue); on<SetCounterValue>(_setCounterValue);
@ -56,10 +55,10 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
on<GroupAllOnEvent>(_groupAllOn); on<GroupAllOnEvent>(_groupAllOn);
on<GroupAllOffEvent>(_groupAllOff); on<GroupAllOffEvent>(_groupAllOff);
on<ToggleCreateCirculate>(_toggleCreateCirculate);
} }
void _fetchWaterHeaterStatus( void _fetchWaterHeaterStatus(WaterHeaterInitial event, Emitter<WaterHeaterState> emit) async {
WaterHeaterInitial event, Emitter<WaterHeaterState> emit) async {
emit(WHLoadingState()); emit(WHLoadingState());
try { try {
var response = await DevicesAPI.getDeviceStatus(whId); var response = await DevicesAPI.getDeviceStatus(whId);
@ -79,8 +78,7 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
} }
} }
void _changeFirstSwitch( void _changeFirstSwitch(WaterHeaterSwitch event, Emitter<WaterHeaterState> emit) async {
WaterHeaterSwitch event, Emitter<WaterHeaterState> emit) async {
emit(LoadingNewSate(whModel: deviceStatus)); emit(LoadingNewSate(whModel: deviceStatus));
try { try {
deviceStatus.firstSwitch = !event.whSwitch; deviceStatus.firstSwitch = !event.whSwitch;
@ -90,10 +88,7 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
} }
_timer = Timer(const Duration(milliseconds: 500), () async { _timer = Timer(const Duration(milliseconds: 500), () async {
final response = await DevicesAPI.controlDevice( final response = await DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(deviceId: whId, code: 'switch_1', value: deviceStatus.firstSwitch),
deviceId: whId,
code: 'switch_1',
value: deviceStatus.firstSwitch),
whId); whId);
if (!response['success']) { if (!response['success']) {
@ -107,16 +102,13 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
//=====================---------- timer ---------------------------------------- //=====================---------- timer ----------------------------------------
void _setCounterValue( void _setCounterValue(SetCounterValue event, Emitter<WaterHeaterState> emit) async {
SetCounterValue event, Emitter<WaterHeaterState> emit) async {
emit(LoadingNewSate(whModel: deviceStatus)); emit(LoadingNewSate(whModel: deviceStatus));
int seconds = 0; int seconds = 0;
try { try {
seconds = event.duration.inSeconds; seconds = event.duration.inSeconds;
final response = await DevicesAPI.controlDevice( final response = await DevicesAPI.controlDevice(
DeviceControlModel( DeviceControlModel(deviceId: whId, code: event.deviceCode, value: seconds), whId);
deviceId: whId, code: event.deviceCode, value: seconds),
whId);
if (response['success'] ?? false) { if (response['success'] ?? false) {
if (event.deviceCode == 'countdown_1') { if (event.deviceCode == 'countdown_1') {
@ -138,8 +130,7 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
} }
} }
void _getCounterValue( void _getCounterValue(GetCounterEvent event, Emitter<WaterHeaterState> emit) async {
GetCounterEvent event, Emitter<WaterHeaterState> emit) async {
emit(WHLoadingState()); emit(WHLoadingState());
try { try {
var response = await DevicesAPI.getDeviceStatus(whId); var response = await DevicesAPI.getDeviceStatus(whId);
@ -199,7 +190,7 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
try { try {
if (selectedDays.isNotEmpty) { if (selectedDays.isNotEmpty) {
emit(WHLoadingState()); emit(WHLoadingState());
final response = await DevicesAPI.postSchedule( await DevicesAPI.postSchedule(
category: switchCode, category: switchCode,
deviceId: whId, deviceId: whId,
time: getTimeStampWithoutSeconds(selectedTime).toString(), time: getTimeStampWithoutSeconds(selectedTime).toString(),
@ -229,8 +220,7 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
deviceId: whId, deviceId: whId,
); );
List<dynamic> jsonData = response; List<dynamic> jsonData = response;
listSchedule = listSchedule = jsonData.map((item) => ScheduleModel.fromJson(item)).toList();
jsonData.map((item) => ScheduleModel.fromJson(item)).toList();
emit(WHInitialState()); emit(WHInitialState());
} on DioException catch (e) { } on DioException catch (e) {
final errorData = e.response!.data; final errorData = e.response!.data;
@ -241,13 +231,12 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
int? getTimeStampWithoutSeconds(DateTime? dateTime) { int? getTimeStampWithoutSeconds(DateTime? dateTime) {
if (dateTime == null) return null; if (dateTime == null) return null;
DateTime dateTimeWithoutSeconds = DateTime(dateTime.year, dateTime.month, DateTime dateTimeWithoutSeconds =
dateTime.day, dateTime.hour, dateTime.minute); DateTime(dateTime.year, dateTime.month, dateTime.day, dateTime.hour, dateTime.minute);
return dateTimeWithoutSeconds.millisecondsSinceEpoch ~/ 1000; return dateTimeWithoutSeconds.millisecondsSinceEpoch ~/ 1000;
} }
Future toggleChange( Future toggleChange(ToggleScheduleEvent event, Emitter<WaterHeaterState> emit) async {
ToggleScheduleEvent event, Emitter<WaterHeaterState> emit) async {
try { try {
emit(WHLoadingState()); emit(WHLoadingState());
final response = await DevicesAPI.changeSchedule( final response = await DevicesAPI.changeSchedule(
@ -265,8 +254,7 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
} }
} }
Future deleteSchedule( Future deleteSchedule(DeleteScheduleEvent event, Emitter<WaterHeaterState> emit) async {
DeleteScheduleEvent event, Emitter<WaterHeaterState> emit) async {
try { try {
emit(WHLoadingState()); emit(WHLoadingState());
final response = await DevicesAPI.deleteSchedule( final response = await DevicesAPI.deleteSchedule(
@ -285,8 +273,7 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
} }
} }
void _toggleCreateCirculate(ToggleCreateCirculate event, Emitter<WaterHeaterState> emit) {
void toggleCreateCirculate() {
emit(WHLoadingState()); emit(WHLoadingState());
createCirculate = !createCirculate; createCirculate = !createCirculate;
selectedDays.clear(); selectedDays.clear();
@ -294,16 +281,13 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
emit(UpdateCreateScheduleState(createCirculate)); emit(UpdateCreateScheduleState(createCirculate));
} }
void toggleSelectedIndex(ToggleSelectedEvent event, Emitter<WaterHeaterState> emit) {
void toggleSelectedIndex(
ToggleSelectedEvent event, Emitter<WaterHeaterState> emit) {
emit(WHLoadingState()); emit(WHLoadingState());
selectedTabIndex = event.index; selectedTabIndex = event.index;
emit(ChangeSlidingSegmentState(value: selectedTabIndex)); emit(ChangeSlidingSegmentState(value: selectedTabIndex));
} }
void toggleCreateSchedule( void toggleCreateSchedule(ToggleCreateScheduleEvent event, Emitter<WaterHeaterState> emit) {
ToggleCreateScheduleEvent event, Emitter<WaterHeaterState> emit) {
emit(WHLoadingState()); emit(WHLoadingState());
createSchedule = !createSchedule; createSchedule = !createSchedule;
selectedDays.clear(); selectedDays.clear();
@ -327,7 +311,7 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
int selectedTabIndex = 0; int selectedTabIndex = 0;
showTime(SelectTimeEvent event, Emitter<WaterHeaterState> emit) async { showTime(SelectTimeEvent event, Emitter<WaterHeaterState> emit) async {
final TimeOfDay? timePicked = await showTimePicker( await showTimePicker(
context: event.context, context: event.context,
initialTime: TimeOfDay.now(), initialTime: TimeOfDay.now(),
builder: (context, child) { builder: (context, child) {
@ -349,15 +333,15 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
); );
} }
List<GroupWHModel> groupTwoGangList = []; List<GroupWHModel> groupWaterHeaterList = [];
bool allSwitchesOn = true; bool allSwitchesOn = true;
void _changeFirstWizardSwitch(ChangeFirstWizardSwitchStatusEvent event, void _changeFirstWizardSwitch(
Emitter<WaterHeaterState> emit) async { ChangeFirstWizardSwitchStatusEvent event, Emitter<WaterHeaterState> emit) async {
emit(LoadingNewSate(whModel: deviceStatus)); emit(LoadingNewSate(whModel: deviceStatus));
try { try {
bool allSwitchesValue = true; bool allSwitchesValue = true;
groupTwoGangList.forEach((element) { groupWaterHeaterList.forEach((element) {
if (element.deviceId == event.deviceId) { if (element.deviceId == event.deviceId) {
element.firstSwitch = !event.value; element.firstSwitch = !event.value;
} }
@ -365,89 +349,78 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
allSwitchesValue = false; allSwitchesValue = false;
} }
}); });
final response = await DevicesAPI.deviceController( emit(UpdateGroupState(twoGangList: groupWaterHeaterList, allSwitches: allSwitchesValue));
final response = await DevicesAPI.deviceBatchController(
code: 'switch_1', code: 'switch_1',
devicesUuid: [event.deviceId], devicesUuid: [event.deviceId],
value: !event.value, value: !event.value,
); );
emit(UpdateGroupState( if (response['failedResults'].toString() != '[]') {
twoGangList: groupTwoGangList, allSwitches: allSwitchesValue));
if (!response['success']) {
add(InitialWizardEvent()); add(InitialWizardEvent());
} }
} catch (_) { } catch (_) {
// add(InitialEvent(groupScreen: twoGangGroup)); add(InitialWizardEvent());
} }
} }
void _fetchWHWizardStatus( void _fetchWHWizardStatus(InitialWizardEvent event, Emitter<WaterHeaterState> emit) async {
InitialWizardEvent event, Emitter<WaterHeaterState> emit) async {
emit(WHLoadingState()); emit(WHLoadingState());
try { try {
devicesList = []; devicesList = [];
groupTwoGangList = []; groupWaterHeaterList = [];
allSwitchesOn = true; allSwitchesOn = true;
devicesList = await DevicesAPI.getDeviceByGroupName( devicesList = await DevicesAPI.getDeviceByGroupName(
HomeCubit.getInstance().selectedSpace?.id ?? '', 'WH'); HomeCubit.getInstance().selectedSpace?.id ?? '', 'WH');
for (int i = 0; i < devicesList.length; i++) { for (int i = 0; i < devicesList.length; i++) {
var response = var response = await DevicesAPI.getDeviceStatus(devicesList[i].uuid ?? '');
await DevicesAPI.getDeviceStatus(devicesList[i].uuid ?? '');
List<StatusModel> statusModelList = []; List<StatusModel> statusModelList = [];
for (var status in response['status']) { for (var status in response['status']) {
statusModelList.add(StatusModel.fromJson(status)); statusModelList.add(StatusModel.fromJson(status));
} }
deviceStatus = WHModel.fromJson(statusModelList); deviceStatus = WHModel.fromJson(statusModelList);
groupTwoGangList.add(GroupWHModel( groupWaterHeaterList.add(GroupWHModel(
deviceId: devicesList[i].uuid ?? '', deviceId: devicesList[i].uuid ?? '',
deviceName: devicesList[i].name ?? '', deviceName: devicesList[i].name ?? '',
firstSwitch: deviceStatus.firstSwitch, firstSwitch: deviceStatus.firstSwitch,
)); ));
} }
if (groupTwoGangList.isNotEmpty) { if (groupWaterHeaterList.isNotEmpty) {
groupTwoGangList.firstWhere((element) { groupWaterHeaterList.firstWhere((element) {
if (!element.firstSwitch) { if (!element.firstSwitch) {
allSwitchesOn = false; allSwitchesOn = false;
} }
return true; return true;
}); });
} }
emit(UpdateGroupState( emit(UpdateGroupState(twoGangList: groupWaterHeaterList, allSwitches: allSwitchesOn));
twoGangList: groupTwoGangList, allSwitches: allSwitchesOn));
} catch (e) { } catch (e) {
// emit(FailedState(error: e.toString())); // emit(FailedState(error: e.toString()));
return; return;
} }
} }
void _groupAllOn( void _groupAllOn(GroupAllOnEvent event, Emitter<WaterHeaterState> emit) async {
GroupAllOnEvent event, Emitter<WaterHeaterState> emit) async {
emit(LoadingNewSate(whModel: deviceStatus)); emit(LoadingNewSate(whModel: deviceStatus));
try { try {
for (int i = 0; i < groupTwoGangList.length; i++) { for (int i = 0; i < groupWaterHeaterList.length; i++) {
groupTwoGangList[i].firstSwitch = true; groupWaterHeaterList[i].firstSwitch = true;
} }
emit(UpdateGroupState(twoGangList: groupTwoGangList, allSwitches: true)); emit(UpdateGroupState(twoGangList: groupWaterHeaterList, allSwitches: true));
List<String> allDeviceIds = List<String> allDeviceIds = groupWaterHeaterList.map((device) => device.deviceId).toList();
groupTwoGangList.map((device) => device.deviceId).toList();
final response1 = await DevicesAPI.deviceController( final response = await DevicesAPI.deviceBatchController(
code: 'switch_1', code: 'switch_1',
devicesUuid: allDeviceIds, devicesUuid: allDeviceIds,
value: true, value: true,
); );
final response2 = await DevicesAPI.deviceController( if (response['failedResults'].toString() != '[]') {
code: 'switch_2',
devicesUuid: allDeviceIds,
value: true,
);
if (!response1['success'] || !response2['success']) {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(InitialWizardEvent()); add(InitialWizardEvent());
} }
@ -457,31 +430,23 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
} }
} }
void _groupAllOff( void _groupAllOff(GroupAllOffEvent event, Emitter<WaterHeaterState> emit) async {
GroupAllOffEvent event, Emitter<WaterHeaterState> emit) async {
emit(LoadingNewSate(whModel: deviceStatus)); emit(LoadingNewSate(whModel: deviceStatus));
try { try {
for (int i = 0; i < groupTwoGangList.length; i++) { for (int i = 0; i < groupWaterHeaterList.length; i++) {
groupTwoGangList[i].firstSwitch = false; groupWaterHeaterList[i].firstSwitch = false;
} }
emit(UpdateGroupState(twoGangList: groupTwoGangList, allSwitches: false)); emit(UpdateGroupState(twoGangList: groupWaterHeaterList, allSwitches: false));
List<String> allDeviceIds = List<String> allDeviceIds = groupWaterHeaterList.map((device) => device.deviceId).toList();
groupTwoGangList.map((device) => device.deviceId).toList();
final response1 = await DevicesAPI.deviceController( final response = await DevicesAPI.deviceBatchController(
code: 'switch_1', code: 'switch_1',
devicesUuid: allDeviceIds, devicesUuid: allDeviceIds,
value: true, value: false,
); );
final response2 = await DevicesAPI.deviceController( if (response['failedResults'].toString() != '[]') {
code: 'switch_2',
devicesUuid: allDeviceIds,
value: true,
);
if (!response1['success'] || !response2['success']) {
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
add(InitialWizardEvent()); add(InitialWizardEvent());
} }

View File

@ -28,7 +28,6 @@ class WaterHeaterInitial extends WaterHeaterEvent {
class WaterHeaterChangeStatus extends WaterHeaterEvent {} class WaterHeaterChangeStatus extends WaterHeaterEvent {}
class GetCounterEvent extends WaterHeaterEvent { class GetCounterEvent extends WaterHeaterEvent {
final String deviceCode; final String deviceCode;
const GetCounterEvent({required this.deviceCode}); const GetCounterEvent({required this.deviceCode});
@ -66,25 +65,27 @@ class StopTimer extends WaterHeaterEvent {}
class OnClose extends WaterHeaterEvent {} class OnClose extends WaterHeaterEvent {}
//------------------- Schedule ----------=--------- //------------------- Schedule ----------=---------
class GetScheduleEvent extends WaterHeaterEvent {} class GetScheduleEvent extends WaterHeaterEvent {}
class ScheduleSave extends WaterHeaterEvent {} class ScheduleSave extends WaterHeaterEvent {}
class ToggleScheduleEvent extends WaterHeaterEvent { class ToggleScheduleEvent extends WaterHeaterEvent {
final String id; final String id;
final bool toggle; final bool toggle;
const ToggleScheduleEvent({required this.toggle,required this.id}); const ToggleScheduleEvent({required this.toggle, required this.id});
@override @override
List<Object> get props => [toggle,id]; List<Object> get props => [toggle, id];
} }
class ToggleDaySelectionEvent extends WaterHeaterEvent {
class ToggleDaySelectionEvent extends WaterHeaterEvent {
final String key; final String key;
const ToggleDaySelectionEvent({required this.key}); const ToggleDaySelectionEvent({required this.key});
@override @override
List<Object> get props => [key]; List<Object> get props => [key];
} }
class DeleteScheduleEvent extends WaterHeaterEvent { class DeleteScheduleEvent extends WaterHeaterEvent {
final String id; final String id;
const DeleteScheduleEvent({required this.id}); const DeleteScheduleEvent({required this.id});
@ -100,7 +101,6 @@ class SelectTimeEvent extends WaterHeaterEvent {
List<Object> get props => [context, isEffective]; List<Object> get props => [context, isEffective];
} }
class ToggleSelectedEvent extends WaterHeaterEvent { class ToggleSelectedEvent extends WaterHeaterEvent {
final int index; final int index;
const ToggleSelectedEvent({required this.index}); const ToggleSelectedEvent({required this.index});
@ -108,7 +108,6 @@ class ToggleSelectedEvent extends WaterHeaterEvent {
List<Object> get props => [index]; List<Object> get props => [index];
} }
class ToggleCreateScheduleEvent extends WaterHeaterEvent { class ToggleCreateScheduleEvent extends WaterHeaterEvent {
final int index; final int index;
const ToggleCreateScheduleEvent({required this.index}); const ToggleCreateScheduleEvent({required this.index});
@ -116,28 +115,25 @@ class ToggleCreateScheduleEvent extends WaterHeaterEvent {
List<Object> get props => [index]; List<Object> get props => [index];
} }
class ToggleCreateCirculateEvent extends WaterHeaterEvent {
class ToggleCreateCirculateEvent extends WaterHeaterEvent {
final int index; final int index;
const ToggleCreateCirculateEvent({required this.index}); const ToggleCreateCirculateEvent({required this.index});
@override @override
List<Object> get props => [index]; List<Object> get props => [index];
} }
class InitialWizardEvent extends WaterHeaterEvent {} class InitialWizardEvent extends WaterHeaterEvent {}
class ChangeFirstWizardSwitchStatusEvent extends WaterHeaterEvent { class ChangeFirstWizardSwitchStatusEvent extends WaterHeaterEvent {
final bool value; final bool value;
final String deviceId; final String deviceId;
const ChangeFirstWizardSwitchStatusEvent( const ChangeFirstWizardSwitchStatusEvent({required this.value, this.deviceId = ''});
{required this.value, this.deviceId = ''});
@override @override
List<Object> get props => [value, deviceId]; List<Object> get props => [value, deviceId];
} }
class GroupAllOnEvent extends WaterHeaterEvent {} class GroupAllOnEvent extends WaterHeaterEvent {}
class GroupAllOffEvent extends WaterHeaterEvent {} class GroupAllOffEvent extends WaterHeaterEvent {}
class ToggleCreateCirculate extends WaterHeaterEvent {}

View File

@ -3,9 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/one_gang_bloc/one_gang_bloc.dart'; import 'package:syncrow_app/features/devices/bloc/one_gang_bloc/one_gang_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/one_gang_bloc/one_gang_state.dart'; import 'package:syncrow_app/features/devices/bloc/one_gang_bloc/one_gang_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/group_one_gang_model.dart';
import 'package:syncrow_app/features/devices/model/one_gang_model.dart'; import 'package:syncrow_app/features/devices/model/one_gang_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/one_gang/one_gang_list.dart';
import 'package:syncrow_app/features/devices/view/widgets/one_gang/one_gang_timer_screen.dart'; import 'package:syncrow_app/features/devices/view/widgets/one_gang/one_gang_timer_screen.dart';
import 'package:syncrow_app/features/devices/view/widgets/three_gang/gang_switch.dart'; import 'package:syncrow_app/features/devices/view/widgets/three_gang/gang_switch.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart'; import 'package:syncrow_app/features/shared_widgets/default_container.dart';
@ -22,9 +20,8 @@ class OneGangScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocProvider( return BlocProvider(
create: (context) => create: (context) => OneGangBloc(switchCode: 'switch_1', oneGangId: device?.uuid ?? '')
OneGangBloc(switchCode: 'switch_1', oneGangId: device?.uuid ?? '') ..add(const InitialEvent(groupScreen: false)),
..add(const InitialEvent(groupScreen: false)),
child: BlocBuilder<OneGangBloc, OneGangState>( child: BlocBuilder<OneGangBloc, OneGangState>(
builder: (context, state) { builder: (context, state) {
OneGangModel oneGangModel = OneGangModel( OneGangModel oneGangModel = OneGangModel(
@ -32,164 +29,135 @@ class OneGangScreen extends StatelessWidget {
firstCountDown: 0, firstCountDown: 0,
); );
List<GroupOneGangModel> groupOneGangModel = [];
bool allSwitchesOn = false;
if (state is LoadingNewSate) { if (state is LoadingNewSate) {
oneGangModel = state.oneGangModel; oneGangModel = state.oneGangModel;
} else if (state is UpdateState) { } else if (state is UpdateState) {
oneGangModel = state.oneGangModel; oneGangModel = state.oneGangModel;
} else if (state is UpdateGroupState) {
groupOneGangModel = state.oneGangList;
allSwitchesOn = state.allSwitches;
} }
return state is LoadingInitialState return state is LoadingInitialState
? const Center( ? const Center(
child: DefaultContainer( child:
width: 50, DefaultContainer(width: 50, height: 50, child: CircularProgressIndicator()),
height: 50,
child: CircularProgressIndicator()),
) )
: device == null : RefreshIndicator(
? OneGangList( onRefresh: () async {
oneGangList: groupOneGangModel, BlocProvider.of<OneGangBloc>(context)
allSwitches: allSwitchesOn) .add(InitialEvent(groupScreen: device != null ? false : true));
: RefreshIndicator( },
onRefresh: () async { child: ListView(
BlocProvider.of<OneGangBloc>(context).add(InitialEvent( children: [
groupScreen: device != null ? false : true)); SizedBox(
}, height: MediaQuery.of(context).size.height,
child: ListView( child: Column(
children: [ mainAxisAlignment: MainAxisAlignment.center,
SizedBox( crossAxisAlignment: CrossAxisAlignment.stretch,
height: MediaQuery.of(context).size.height, children: [
child: Column( const Expanded(child: SizedBox.shrink()),
mainAxisAlignment: MainAxisAlignment.center, Expanded(
crossAxisAlignment: CrossAxisAlignment.stretch, child: Row(
children: [ mainAxisAlignment: MainAxisAlignment.spaceAround,
const Expanded(child: SizedBox.shrink()), crossAxisAlignment: CrossAxisAlignment.center,
Expanded( children: [
child: Row( Column(
mainAxisAlignment:
MainAxisAlignment.spaceAround,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [ children: [
Column( GangSwitch(
children: [ threeGangSwitch: device!,
GangSwitch( value: oneGangModel.firstSwitch,
threeGangSwitch: device!, action: () {
value: oneGangModel.firstSwitch, BlocProvider.of<OneGangBloc>(context).add(
action: () { ChangeFirstSwitchStatusEvent(
BlocProvider.of<OneGangBloc>( value: oneGangModel.firstSwitch));
context) },
.add( ),
ChangeFirstSwitchStatusEvent( const SizedBox(height: 20),
value: oneGangModel const SizedBox(
.firstSwitch)); width: 70,
}, child: BodySmall(
), text: " Entrance Light",
const SizedBox(height: 20), fontColor: ColorsManager.textPrimaryColor,
const SizedBox( textAlign: TextAlign.center,
width: 70, ),
child: BodySmall(
text: " Entrance Light",
fontColor: ColorsManager
.textPrimaryColor,
textAlign: TextAlign.center,
),
),
],
), ),
], ],
), ),
), ],
Center( ),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
Column(
mainAxisSize: MainAxisSize.min,
children: [
Card(
elevation: 3,
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(100),
),
child: GestureDetector(
onTap: () {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context,
animation1,
animation2) =>
TimerScheduleScreen(
switchCode:
'switch_1',
device: device!,
deviceCode:
'countdown_1',
)));
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius:
BorderRadius.circular(
100),
),
),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius:
BorderRadius.circular(
100),
),
child: Center(
child: Icon(
Icons.access_time,
color: ColorsManager
.primaryColorWithOpacity,
size: 25,
),
),
),
],
),
),
),
const SizedBox(height: 10),
BodySmall(
text: "Timer",
style: context.bodyMedium.copyWith(
color: ColorsManager
.textPrimaryColor,
),
),
],
),
],
),
),
Expanded(child: SizedBox())
],
), ),
), Center(
], child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Column(
mainAxisSize: MainAxisSize.min,
children: [
Card(
elevation: 3,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100),
),
child: GestureDetector(
onTap: () {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder:
(context, animation1, animation2) =>
TimerScheduleScreen(
switchCode: 'switch_1',
device: device!,
deviceCode: 'countdown_1',
)));
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(100),
),
),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
),
child: Center(
child: Icon(
Icons.access_time,
color: ColorsManager.primaryColorWithOpacity,
size: 25,
),
),
),
],
),
),
),
const SizedBox(height: 10),
BodySmall(
text: "Timer",
style: context.bodyMedium.copyWith(
color: ColorsManager.textPrimaryColor,
),
),
],
),
],
),
),
Expanded(child: SizedBox())
],
),
), ),
); ],
),
);
}, },
), ),
); );

View File

@ -5,7 +5,6 @@ import 'package:syncrow_app/features/devices/bloc/one_gang_bloc/one_gang_event.d
import 'package:syncrow_app/features/devices/bloc/one_gang_bloc/one_gang_state.dart'; import 'package:syncrow_app/features/devices/bloc/one_gang_bloc/one_gang_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/group_one_gang_model.dart'; import 'package:syncrow_app/features/devices/model/group_one_gang_model.dart';
import 'package:syncrow_app/features/devices/model/one_gang_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/one_gang/one_gang_list.dart'; import 'package:syncrow_app/features/devices/view/widgets/one_gang/one_gang_list.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.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/default_scaffold.dart';
@ -22,30 +21,19 @@ class OneGangWizard extends StatelessWidget {
return DefaultScaffold( return DefaultScaffold(
child: BlocProvider( child: BlocProvider(
create: (context) => create: (context) =>
OneGangBloc(switchCode: '', oneGangId: device?.uuid ?? '') OneGangBloc(switchCode: '', oneGangId: device?.uuid ?? '')..add(InitialWizardEvent()),
..add(InitialWizardEvent()),
child: BlocBuilder<OneGangBloc, OneGangState>( child: BlocBuilder<OneGangBloc, OneGangState>(
builder: (context, state) { builder: (context, state) {
OneGangModel oneGangModel = OneGangModel(
firstSwitch: false,
firstCountDown: 0,
);
bool allSwitchesOn = false; bool allSwitchesOn = false;
if (state is LoadingNewSate) { if (state is UpdateGroupState) {
oneGangModel = state.oneGangModel;
} else if (state is UpdateState) {
oneGangModel = state.oneGangModel;
} else if (state is UpdateGroupState) {
groupOneGangModel = state.oneGangList; groupOneGangModel = state.oneGangList;
allSwitchesOn = state.allSwitches; allSwitchesOn = state.allSwitches;
} }
return state is LoadingInitialState return state is LoadingInitialState
? const Center( ? const Center(
child: DefaultContainer( child:
width: 50, DefaultContainer(width: 50, height: 50, child: CircularProgressIndicator()),
height: 50,
child: CircularProgressIndicator()),
) )
: OneGangList( : OneGangList(
oneGangList: groupOneGangModel, oneGangList: groupOneGangModel,

View File

@ -4,11 +4,9 @@ import 'package:syncrow_app/features/devices/bloc/three_gang_bloc/three_gang_blo
import 'package:syncrow_app/features/devices/bloc/three_gang_bloc/three_gang_event.dart'; import 'package:syncrow_app/features/devices/bloc/three_gang_bloc/three_gang_event.dart';
import 'package:syncrow_app/features/devices/bloc/three_gang_bloc/three_gang_state.dart'; import 'package:syncrow_app/features/devices/bloc/three_gang_bloc/three_gang_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/group_three_gang_model.dart';
import 'package:syncrow_app/features/devices/model/three_gang_model.dart'; import 'package:syncrow_app/features/devices/model/three_gang_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/three_gang/gang_switch.dart'; import 'package:syncrow_app/features/devices/view/widgets/three_gang/gang_switch.dart';
import 'package:syncrow_app/features/devices/view/widgets/three_gang/schedule_screen.dart'; import 'package:syncrow_app/features/devices/view/widgets/three_gang/schedule_screen.dart';
import 'package:syncrow_app/features/devices/view/widgets/three_gang/three_gang_list.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart'; import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart'; import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
import 'package:syncrow_app/utils/context_extension.dart'; import 'package:syncrow_app/utils/context_extension.dart';
@ -22,9 +20,7 @@ class ThreeGangScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocProvider( return BlocProvider(
create: (context) => ThreeGangBloc( create: (context) => ThreeGangBloc(switchCode: '', threeGangId: device?.uuid ?? '')
switchCode: '',
threeGangId: device?.uuid ?? '')
..add(InitialEvent(groupScreen: device != null ? false : true)), ..add(InitialEvent(groupScreen: device != null ? false : true)),
child: BlocBuilder<ThreeGangBloc, ThreeGangState>( child: BlocBuilder<ThreeGangBloc, ThreeGangState>(
builder: (context, state) { builder: (context, state) {
@ -36,360 +32,354 @@ class ThreeGangScreen extends StatelessWidget {
secondCountDown: 0, secondCountDown: 0,
thirdCountDown: 0); thirdCountDown: 0);
List<GroupThreeGangModel> groupThreeGangModel = [];
bool allSwitchesOn = false;
if (state is LoadingNewSate) { if (state is LoadingNewSate) {
threeGangModel = state.threeGangModel; threeGangModel = state.threeGangModel;
} else if (state is UpdateState) { } else if (state is UpdateState) {
threeGangModel = state.threeGangModel; threeGangModel = state.threeGangModel;
} else if (state is UpdateGroupState) {
groupThreeGangModel = state.threeGangList;
allSwitchesOn = state.allSwitches;
} }
return state is LoadingInitialState return state is LoadingInitialState
? const Center( ? const Center(
child: child:
DefaultContainer(width: 50, height: 50, child: CircularProgressIndicator()), DefaultContainer(width: 50, height: 50, child: CircularProgressIndicator()),
) : RefreshIndicator( )
onRefresh: () async { : RefreshIndicator(
BlocProvider.of<ThreeGangBloc>(context) onRefresh: () async {
.add(InitialEvent(groupScreen: device != null ? false : true)); BlocProvider.of<ThreeGangBloc>(context)
}, .add(InitialEvent(groupScreen: device != null ? false : true));
child: ListView( },
children: [ child: ListView(
SizedBox( children: [
height: MediaQuery.of(context).size.height, SizedBox(
child: Column( height: MediaQuery.of(context).size.height,
mainAxisAlignment: MainAxisAlignment.center, child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisAlignment: MainAxisAlignment.center,
children: [ crossAxisAlignment: CrossAxisAlignment.stretch,
const Expanded(child: SizedBox.shrink()), children: [
Expanded( const Expanded(child: SizedBox.shrink()),
child: Row( Expanded(
mainAxisAlignment: MainAxisAlignment.spaceAround, child: Row(
crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Column(
children: [ children: [
Column( GangSwitch(
children: [ threeGangSwitch: device!,
GangSwitch( value: threeGangModel.firstSwitch,
threeGangSwitch: device!, action: () {
value: threeGangModel.firstSwitch, BlocProvider.of<ThreeGangBloc>(context).add(
action: () { ChangeFirstSwitchStatusEvent(
BlocProvider.of<ThreeGangBloc>(context).add( value: threeGangModel.firstSwitch));
ChangeFirstSwitchStatusEvent( },
value: threeGangModel.firstSwitch)); // control: DeviceControlModel(
}, // deviceId: device.uuid,
// control: DeviceControlModel( // // code: 'switch_1',
// deviceId: device.uuid, // code: device.status[0].code,
// // code: 'switch_1', // // value: true,
// code: device.status[0].code, // value: device.status[0].value,
// // value: true, // ),
// value: device.status[0].value,
// ),
),
const SizedBox(height: 20),
const SizedBox(
width: 70,
child: BodySmall(
text: "Bedside Light",
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
],
), ),
Column( const SizedBox(height: 20),
children: [ const SizedBox(
GangSwitch( width: 70,
threeGangSwitch: device!, child: BodySmall(
value: threeGangModel.secondSwitch, text: "Bedside Light",
action: () { fontColor: ColorsManager.textPrimaryColor,
BlocProvider.of<ThreeGangBloc>(context).add( textAlign: TextAlign.center,
ChangeSecondSwitchStatusEvent( ),
value: threeGangModel.secondSwitch));
},
// control: DeviceControlModel(
// // deviceId: 'bfe10693d4fd263206ocq9',
// // code: 'switch_2',
// // value: true,
// deviceId: device.uuid,
// code: device.status[1].code,
// value: device.status[1].value,
// ),
),
const SizedBox(height: 20),
const SizedBox(
width: 70,
child: BodySmall(
text: "Ceiling Light",
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
],
),
Column(
children: [
GangSwitch(
threeGangSwitch: device!,
value: threeGangModel.thirdSwitch,
action: () {
BlocProvider.of<ThreeGangBloc>(context).add(
ChangeThirdSwitchStatusEvent(
value: threeGangModel.thirdSwitch));
},
),
const SizedBox(height: 20),
const SizedBox(
width: 70,
child: BodySmall(
text: "Spotlight",
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
],
), ),
], ],
), ),
), Column(
Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Column( GangSwitch(
mainAxisSize: MainAxisSize.min, threeGangSwitch: device!,
children: [ value: threeGangModel.secondSwitch,
Card( action: () {
elevation: 3, BlocProvider.of<ThreeGangBloc>(context).add(
shape: RoundedRectangleBorder( ChangeSecondSwitchStatusEvent(
borderRadius: BorderRadius.circular(100), value: threeGangModel.secondSwitch));
), },
child: GestureDetector( // control: DeviceControlModel(
onTap: () { // // deviceId: 'bfe10693d4fd263206ocq9',
// DevicesCubit.getInstance().deviceControl( // // code: 'switch_2',
// DeviceControlModel( // // value: true,
// deviceId: device.uuid, // deviceId: device.uuid,
// code: 'switch_1', // code: device.status[1].code,
// value: true, // value: device.status[1].value,
// ), // ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_2',
// value: true,
// ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_3',
// value: true,
// ),
// device.uuid!,
// );
BlocProvider.of<ThreeGangBloc>(context)
.add(AllOnEvent());
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(100),
),
),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
),
child: Center(
child: BodySmall(
text: "On",
style: context.bodyMedium.copyWith(
color: ColorsManager
.primaryColorWithOpacity,
fontWeight: FontWeight.bold),
),
),
),
],
),
),
),
const SizedBox(height: 10),
BodySmall(
text: "All On",
style: context.bodyMedium.copyWith(
color: ColorsManager.textPrimaryColor,
),
),
],
), ),
const SizedBox(height: 20),
const SizedBox( const SizedBox(
width: 20, width: 70,
child: BodySmall(
text: "Ceiling Light",
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
), ),
Column( ],
mainAxisSize: MainAxisSize.min, ),
children: [ Column(
Card( children: [
elevation: 3, GangSwitch(
shape: RoundedRectangleBorder( threeGangSwitch: device!,
borderRadius: BorderRadius.circular(100), value: threeGangModel.thirdSwitch,
), action: () {
child: GestureDetector( BlocProvider.of<ThreeGangBloc>(context).add(
onTap: () { ChangeThirdSwitchStatusEvent(
Navigator.push( value: threeGangModel.thirdSwitch));
context, },
PageRouteBuilder( ),
pageBuilder: const SizedBox(height: 20),
(context, animation1, animation2) => const SizedBox(
ScheduleScreen( width: 70,
device: device!, child: BodySmall(
))); text: "Spotlight",
}, fontColor: ColorsManager.textPrimaryColor,
child: Stack( textAlign: TextAlign.center,
alignment: Alignment.center, ),
children: [ ),
Container( ],
width: 60, ),
height: 60, ],
decoration: BoxDecoration( ),
color: Colors.grey[300], ),
borderRadius: BorderRadius.circular(100), Center(
), child: Row(
), mainAxisAlignment: MainAxisAlignment.center,
Container( crossAxisAlignment: CrossAxisAlignment.center,
width: 40, children: [
height: 40, Column(
decoration: BoxDecoration( mainAxisSize: MainAxisSize.min,
color: Colors.white, children: [
borderRadius: BorderRadius.circular(100), Card(
), elevation: 3,
child: Center( shape: RoundedRectangleBorder(
child: Icon( borderRadius: BorderRadius.circular(100),
Icons.access_time, ),
child: GestureDetector(
onTap: () {
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_1',
// value: true,
// ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_2',
// value: true,
// ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_3',
// value: true,
// ),
// device.uuid!,
// );
BlocProvider.of<ThreeGangBloc>(context)
.add(AllOnEvent());
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(100),
),
),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
),
child: Center(
child: BodySmall(
text: "On",
style: context.bodyMedium.copyWith(
color: color:
ColorsManager.primaryColorWithOpacity, ColorsManager.primaryColorWithOpacity,
size: 25, fontWeight: FontWeight.bold),
),
),
), ),
], ),
), ),
), ],
), ),
const SizedBox(height: 10), ),
BodySmall(
text: "Timer",
style: context.bodyMedium.copyWith(
color: ColorsManager.textPrimaryColor,
),
),
],
), ),
const SizedBox( const SizedBox(height: 10),
width: 20, BodySmall(
), text: "All On",
Column( style: context.bodyMedium.copyWith(
mainAxisSize: MainAxisSize.min, color: ColorsManager.textPrimaryColor,
children: [ ),
Card(
elevation: 3,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100),
),
child: GestureDetector(
onTap: () {
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_1',
// value: false,
// ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_2',
// value: false,
// ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_3',
// value: false,
// ),
// device.uuid!,
// );
BlocProvider.of<ThreeGangBloc>(context)
.add(AllOffEvent());
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(100),
),
),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
),
child: Center(
child: BodySmall(
text: "Off",
style: context.bodyMedium.copyWith(
color: ColorsManager
.primaryColorWithOpacity,
fontWeight: FontWeight.bold),
),
),
),
],
),
),
),
const SizedBox(height: 10),
BodySmall(
text: "All Off",
style: context.bodyMedium.copyWith(
color: ColorsManager.textPrimaryColor,
),
),
],
), ),
], ],
), ),
), const SizedBox(
Expanded(child: SizedBox()) width: 20,
], ),
Column(
mainAxisSize: MainAxisSize.min,
children: [
Card(
elevation: 3,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100),
),
child: GestureDetector(
onTap: () {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder:
(context, animation1, animation2) =>
ScheduleScreen(
device: device!,
)));
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(100),
),
),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
),
child: Center(
child: Icon(
Icons.access_time,
color: ColorsManager.primaryColorWithOpacity,
size: 25,
),
),
),
],
),
),
),
const SizedBox(height: 10),
BodySmall(
text: "Timer",
style: context.bodyMedium.copyWith(
color: ColorsManager.textPrimaryColor,
),
),
],
),
const SizedBox(
width: 20,
),
Column(
mainAxisSize: MainAxisSize.min,
children: [
Card(
elevation: 3,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100),
),
child: GestureDetector(
onTap: () {
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_1',
// value: false,
// ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_2',
// value: false,
// ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_3',
// value: false,
// ),
// device.uuid!,
// );
BlocProvider.of<ThreeGangBloc>(context)
.add(AllOffEvent());
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(100),
),
),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
),
child: Center(
child: BodySmall(
text: "Off",
style: context.bodyMedium.copyWith(
color:
ColorsManager.primaryColorWithOpacity,
fontWeight: FontWeight.bold),
),
),
),
],
),
),
),
const SizedBox(height: 10),
BodySmall(
text: "All Off",
style: context.bodyMedium.copyWith(
color: ColorsManager.textPrimaryColor,
),
),
],
),
],
),
), ),
), Expanded(child: SizedBox())
], ],
),
), ),
); ],
),
);
}, },
), ),
); );

View File

@ -5,7 +5,6 @@ import 'package:syncrow_app/features/devices/bloc/three_gang_bloc/three_gang_eve
import 'package:syncrow_app/features/devices/bloc/three_gang_bloc/three_gang_state.dart'; import 'package:syncrow_app/features/devices/bloc/three_gang_bloc/three_gang_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/group_three_gang_model.dart'; import 'package:syncrow_app/features/devices/model/group_three_gang_model.dart';
import 'package:syncrow_app/features/devices/model/three_gang_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/three_gang/three_gang_list.dart'; import 'package:syncrow_app/features/devices/view/widgets/three_gang/three_gang_list.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.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/default_scaffold.dart';
@ -19,36 +18,21 @@ class ThreeGangWizard extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return DefaultScaffold( return DefaultScaffold(
child: BlocProvider( child: BlocProvider(
create: (context) => create: (context) => ThreeGangBloc(switchCode: '', threeGangId: device?.uuid ?? '')
ThreeGangBloc(switchCode: '', threeGangId: device?.uuid ?? '') ..add(InitialEvent(groupScreen: device != null ? false : true)),
..add(InitialEvent(groupScreen: device != null ? false : true)),
child: BlocBuilder<ThreeGangBloc, ThreeGangState>( child: BlocBuilder<ThreeGangBloc, ThreeGangState>(
builder: (context, state) { builder: (context, state) {
ThreeGangModel threeGangModel = ThreeGangModel(
firstSwitch: false,
secondSwitch: false,
thirdSwitch: false,
firstCountDown: 0,
secondCountDown: 0,
thirdCountDown: 0);
List<GroupThreeGangModel> groupThreeGangModel = []; List<GroupThreeGangModel> groupThreeGangModel = [];
bool allSwitchesOn = false; bool allSwitchesOn = false;
if (state is LoadingNewSate) { if (state is UpdateGroupState) {
threeGangModel = state.threeGangModel;
} else if (state is UpdateState) {
threeGangModel = state.threeGangModel;
} else if (state is UpdateGroupState) {
groupThreeGangModel = state.threeGangList; groupThreeGangModel = state.threeGangList;
allSwitchesOn = state.allSwitches; allSwitchesOn = state.allSwitches;
} }
return state is LoadingInitialState return state is LoadingInitialState
? const Center( ? const Center(
child: DefaultContainer( child:
width: 50, DefaultContainer(width: 50, height: 50, child: CircularProgressIndicator()),
height: 50,
child: CircularProgressIndicator()),
) )
: ThreeGangList( : ThreeGangList(
threeGangList: groupThreeGangModel, threeGangList: groupThreeGangModel,

View File

@ -4,10 +4,8 @@ import 'package:syncrow_app/features/devices/bloc/two_gang_bloc/two_gang_bloc.da
import 'package:syncrow_app/features/devices/bloc/two_gang_bloc/two_gang_event.dart'; import 'package:syncrow_app/features/devices/bloc/two_gang_bloc/two_gang_event.dart';
import 'package:syncrow_app/features/devices/bloc/two_gang_bloc/two_gang_state.dart'; import 'package:syncrow_app/features/devices/bloc/two_gang_bloc/two_gang_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/group_two_gang_model.dart';
import 'package:syncrow_app/features/devices/model/two_gang_model.dart'; import 'package:syncrow_app/features/devices/model/two_gang_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/three_gang/gang_switch.dart'; import 'package:syncrow_app/features/devices/view/widgets/three_gang/gang_switch.dart';
import 'package:syncrow_app/features/devices/view/widgets/two_gang/two_gang_list.dart';
import 'package:syncrow_app/features/devices/view/widgets/two_gang/two_schedule_screen.dart'; import 'package:syncrow_app/features/devices/view/widgets/two_gang/two_schedule_screen.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart'; import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart'; import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
@ -23,7 +21,7 @@ class TwoGangScreen extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocProvider( return BlocProvider(
create: (context) => TwoGangBloc(switchCode: switchCode ?? '', twoGangId: device?.uuid ?? '') create: (context) => TwoGangBloc(switchCode: switchCode ?? '', twoGangId: device?.uuid ?? '')
..add(InitialEvent(groupScreen: device != null ? false : true)), ..add(const InitialEvent()),
child: BlocBuilder<TwoGangBloc, TwoGangState>( child: BlocBuilder<TwoGangBloc, TwoGangState>(
builder: (context, state) { builder: (context, state) {
TwoGangModel twoGangModel = TwoGangModel( TwoGangModel twoGangModel = TwoGangModel(
@ -33,304 +31,292 @@ class TwoGangScreen extends StatelessWidget {
secondCountDown: 0, secondCountDown: 0,
); );
List<GroupTwoGangModel> groupTwoGangModel = [];
bool allSwitchesOn = false;
if (state is LoadingNewSate) { if (state is LoadingNewSate) {
twoGangModel = state.twoGangModel; twoGangModel = state.twoGangModel;
} else if (state is UpdateState) { } else if (state is UpdateState) {
twoGangModel = state.twoGangModel; twoGangModel = state.twoGangModel;
} else if (state is UpdateGroupState) {
groupTwoGangModel = state.twoGangList;
allSwitchesOn = state.allSwitches;
} }
return state is LoadingInitialState return state is LoadingInitialState
? const Center( ? const Center(
child: child:
DefaultContainer(width: 50, height: 50, child: CircularProgressIndicator()), DefaultContainer(width: 50, height: 50, child: CircularProgressIndicator()),
) )
: device == null : RefreshIndicator(
? TwoGangList( onRefresh: () async {
twoGangList: groupTwoGangModel, BlocProvider.of<TwoGangBloc>(context).add(const InitialEvent());
allSwitches: allSwitchesOn, },
) child: ListView(
: RefreshIndicator( children: [
onRefresh: () async { SizedBox(
BlocProvider.of<TwoGangBloc>(context) height: MediaQuery.of(context).size.height,
.add(InitialEvent(groupScreen: device != null ? false : true)); child: Column(
}, mainAxisAlignment: MainAxisAlignment.center,
child: ListView( crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
SizedBox( const Expanded(child: SizedBox.shrink()),
height: MediaQuery.of(context).size.height, Expanded(
child: Column( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
const Expanded(child: SizedBox.shrink()), Column(
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Column( GangSwitch(
children: [ threeGangSwitch: device!,
GangSwitch( value: twoGangModel.firstSwitch,
threeGangSwitch: device!, action: () {
value: twoGangModel.firstSwitch, BlocProvider.of<TwoGangBloc>(context).add(
action: () { ChangeFirstSwitchStatusEvent(
BlocProvider.of<TwoGangBloc>(context).add( value: twoGangModel.firstSwitch));
ChangeFirstSwitchStatusEvent( },
value: twoGangModel.firstSwitch));
},
),
const SizedBox(height: 20),
const SizedBox(
width: 77,
child: BodySmall(
text: "Cove Light",
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
],
), ),
Column( const SizedBox(height: 20),
children: [ const SizedBox(
GangSwitch( width: 77,
threeGangSwitch: device!, child: BodySmall(
value: twoGangModel.secondSwitch, text: "Cove Light",
action: () { fontColor: ColorsManager.textPrimaryColor,
BlocProvider.of<TwoGangBloc>(context).add( textAlign: TextAlign.center,
ChangeSecondSwitchStatusEvent( ),
value: twoGangModel.secondSwitch));
},
),
const SizedBox(height: 20),
const SizedBox(
width: 77,
child: BodySmall(
text: "Chandelier",
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
),
],
), ),
], ],
), ),
), Column(
Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Column( GangSwitch(
mainAxisSize: MainAxisSize.min, threeGangSwitch: device!,
children: [ value: twoGangModel.secondSwitch,
Card( action: () {
elevation: 3, BlocProvider.of<TwoGangBloc>(context).add(
shape: RoundedRectangleBorder( ChangeSecondSwitchStatusEvent(
borderRadius: BorderRadius.circular(100), value: twoGangModel.secondSwitch));
), },
child: GestureDetector(
onTap: () {
BlocProvider.of<TwoGangBloc>(context)
.add(AllOnEvent());
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(100),
),
),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
),
child: Center(
child: BodySmall(
text: "On",
style: context.bodyMedium.copyWith(
color: ColorsManager
.primaryColorWithOpacity,
fontWeight: FontWeight.bold),
),
),
),
],
),
),
),
const SizedBox(height: 10),
BodySmall(
text: "All On",
style: context.bodyMedium.copyWith(
color: ColorsManager.textPrimaryColor,
),
),
],
), ),
const SizedBox(height: 20),
const SizedBox( const SizedBox(
width: 20, width: 77,
child: BodySmall(
text: "Chandelier",
fontColor: ColorsManager.textPrimaryColor,
textAlign: TextAlign.center,
),
), ),
Column( ],
mainAxisSize: MainAxisSize.min, ),
children: [ ],
Card( ),
elevation: 3, ),
shape: RoundedRectangleBorder( Center(
borderRadius: BorderRadius.circular(100), child: Row(
), mainAxisAlignment: MainAxisAlignment.center,
child: GestureDetector( crossAxisAlignment: CrossAxisAlignment.center,
onTap: () { children: [
Navigator.push( Column(
context, mainAxisSize: MainAxisSize.min,
PageRouteBuilder( children: [
pageBuilder: Card(
(context, animation1, animation2) => elevation: 3,
TwoGangScheduleScreen( shape: RoundedRectangleBorder(
device: device!, borderRadius: BorderRadius.circular(100),
))); ),
}, child: GestureDetector(
child: Stack( onTap: () {
alignment: Alignment.center, BlocProvider.of<TwoGangBloc>(context).add(AllOnEvent());
children: [ },
Container( child: Stack(
width: 60, alignment: Alignment.center,
height: 60, children: [
decoration: BoxDecoration( Container(
color: Colors.grey[300], width: 60,
borderRadius: BorderRadius.circular(100), height: 60,
), decoration: BoxDecoration(
), color: Colors.grey[300],
Container( borderRadius: BorderRadius.circular(100),
width: 40, ),
height: 40, ),
decoration: BoxDecoration( Container(
color: Colors.white, width: 40,
borderRadius: BorderRadius.circular(100), height: 40,
), decoration: BoxDecoration(
child: Center( color: Colors.white,
child: Icon( borderRadius: BorderRadius.circular(100),
Icons.access_time, ),
child: Center(
child: BodySmall(
text: "On",
style: context.bodyMedium.copyWith(
color: color:
ColorsManager.primaryColorWithOpacity, ColorsManager.primaryColorWithOpacity,
size: 25, fontWeight: FontWeight.bold),
),
),
), ),
], ),
), ),
), ],
), ),
const SizedBox(height: 10), ),
BodySmall(
text: "Timer",
style: context.bodyMedium.copyWith(
color: ColorsManager.textPrimaryColor,
),
),
],
), ),
const SizedBox( const SizedBox(height: 10),
width: 20, BodySmall(
), text: "All On",
Column( style: context.bodyMedium.copyWith(
mainAxisSize: MainAxisSize.min, color: ColorsManager.textPrimaryColor,
children: [ ),
Card(
elevation: 3,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100),
),
child: GestureDetector(
onTap: () {
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_1',
// value: false,
// ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_2',
// value: false,
// ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_3',
// value: false,
// ),
// device.uuid!,
// );
BlocProvider.of<TwoGangBloc>(context)
.add(AllOffEvent());
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(100),
),
),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
),
child: Center(
child: BodySmall(
text: "Off",
style: context.bodyMedium.copyWith(
color: ColorsManager
.primaryColorWithOpacity,
fontWeight: FontWeight.bold),
),
),
),
],
),
),
),
const SizedBox(height: 10),
BodySmall(
text: "All Off",
style: context.bodyMedium.copyWith(
color: ColorsManager.textPrimaryColor,
),
),
],
), ),
], ],
), ),
), const SizedBox(
Expanded(child: SizedBox()) width: 20,
], ),
Column(
mainAxisSize: MainAxisSize.min,
children: [
Card(
elevation: 3,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100),
),
child: GestureDetector(
onTap: () {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder:
(context, animation1, animation2) =>
TwoGangScheduleScreen(
device: device!,
)));
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(100),
),
),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
),
child: Center(
child: Icon(
Icons.access_time,
color: ColorsManager.primaryColorWithOpacity,
size: 25,
),
),
),
],
),
),
),
const SizedBox(height: 10),
BodySmall(
text: "Timer",
style: context.bodyMedium.copyWith(
color: ColorsManager.textPrimaryColor,
),
),
],
),
const SizedBox(
width: 20,
),
Column(
mainAxisSize: MainAxisSize.min,
children: [
Card(
elevation: 3,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100),
),
child: GestureDetector(
onTap: () {
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_1',
// value: false,
// ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_2',
// value: false,
// ),
// device.uuid!,
// );
// DevicesCubit.getInstance().deviceControl(
// DeviceControlModel(
// deviceId: device.uuid,
// code: 'switch_3',
// value: false,
// ),
// device.uuid!,
// );
BlocProvider.of<TwoGangBloc>(context)
.add(AllOffEvent());
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(100),
),
),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
),
child: Center(
child: BodySmall(
text: "Off",
style: context.bodyMedium.copyWith(
color:
ColorsManager.primaryColorWithOpacity,
fontWeight: FontWeight.bold),
),
),
),
],
),
),
),
const SizedBox(height: 10),
BodySmall(
text: "All Off",
style: context.bodyMedium.copyWith(
color: ColorsManager.textPrimaryColor,
),
),
],
),
],
),
), ),
), Expanded(child: SizedBox())
], ],
),
), ),
); ],
),
);
}, },
), ),
); );

View File

@ -1,16 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/two_gang_bloc/two_gang_bloc.dart'; import 'package:syncrow_app/features/devices/bloc/two_gang_bloc/two_gang_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/two_gang_bloc/two_gang_event.dart';
import 'package:syncrow_app/features/devices/bloc/two_gang_bloc/two_gang_state.dart'; import 'package:syncrow_app/features/devices/bloc/two_gang_bloc/two_gang_state.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/group_two_gang_model.dart'; import 'package:syncrow_app/features/devices/model/group_two_gang_model.dart';
import 'package:syncrow_app/features/devices/model/two_gang_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/two_gang/two_gang_list.dart'; import 'package:syncrow_app/features/devices/view/widgets/two_gang/two_gang_list.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.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/default_scaffold.dart';
import '../../../bloc/two_gang_bloc/two_gang_event.dart';
class TwoGangWizard extends StatelessWidget { class TwoGangWizard extends StatelessWidget {
const TwoGangWizard({super.key, this.device}); const TwoGangWizard({super.key, this.device});
@ -23,32 +21,19 @@ class TwoGangWizard extends StatelessWidget {
return DefaultScaffold( return DefaultScaffold(
child: BlocProvider( child: BlocProvider(
create: (context) => create: (context) =>
TwoGangBloc(switchCode: '', twoGangId: device?.uuid ?? '') TwoGangBloc(switchCode: '', twoGangId: device?.uuid ?? '')..add(InitialWizardEvent()),
..add(InitialWizardEvent()),
child: BlocBuilder<TwoGangBloc, TwoGangState>( child: BlocBuilder<TwoGangBloc, TwoGangState>(
builder: (context, state) { builder: (context, state) {
TwoGangModel twoGangModel = TwoGangModel(
firstSwitch: false,
secondSwitch: false,
firstCountDown: 0,
secondCountDown: 0,
);
bool allSwitchesOn = false; bool allSwitchesOn = false;
if (state is LoadingNewSate) { if (state is UpdateGroupState) {
twoGangModel = state.twoGangModel;
} else if (state is UpdateState) {
twoGangModel = state.twoGangModel;
} else if (state is UpdateGroupState) {
groupTwoGangModel = state.twoGangList; groupTwoGangModel = state.twoGangList;
allSwitchesOn = state.allSwitches; allSwitchesOn = state.allSwitches;
} }
return state is LoadingInitialState return state is LoadingInitialState
? const Center( ? const Center(
child: DefaultContainer( child:
width: 50, DefaultContainer(width: 50, height: 50, child: CircularProgressIndicator()),
height: 50,
child: CircularProgressIndicator()),
) )
: TwoGangList( : TwoGangList(
twoGangList: groupTwoGangModel, twoGangList: groupTwoGangModel,

View File

@ -25,10 +25,7 @@ class WHTimerScheduleScreen extends StatelessWidget {
final String deviceCode; final String deviceCode;
final String switchCode; final String switchCode;
const WHTimerScheduleScreen( const WHTimerScheduleScreen(
{required this.device, {required this.device, required this.deviceCode, required this.switchCode, super.key});
required this.deviceCode,
required this.switchCode,
super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -38,10 +35,9 @@ class WHTimerScheduleScreen extends StatelessWidget {
statusBarIconBrightness: Brightness.light, statusBarIconBrightness: Brightness.light,
), ),
child: BlocProvider( child: BlocProvider(
create: (context) => create: (context) => WaterHeaterBloc(switchCode: switchCode, whId: device.uuid ?? '')
WaterHeaterBloc(switchCode: switchCode, whId: device.uuid ?? '') ..add(GetCounterEvent(deviceCode: deviceCode))
..add(GetCounterEvent(deviceCode: deviceCode)) ..add(GetScheduleEvent()),
..add(GetScheduleEvent()),
child: BlocBuilder<WaterHeaterBloc, WaterHeaterState>( child: BlocBuilder<WaterHeaterBloc, WaterHeaterState>(
builder: (context, state) { builder: (context, state) {
final waterHeaterBloc = BlocProvider.of<WaterHeaterBloc>(context); final waterHeaterBloc = BlocProvider.of<WaterHeaterBloc>(context);
@ -87,9 +83,8 @@ class WHTimerScheduleScreen extends StatelessWidget {
? IconButton( ? IconButton(
onPressed: () { onPressed: () {
// waterHeaterBloc.toggleCreateSchedule(); // waterHeaterBloc.toggleCreateSchedule();
waterHeaterBloc.add( waterHeaterBloc
const ToggleCreateScheduleEvent( .add(const ToggleCreateScheduleEvent(index: 1));
index: 1));
}, },
icon: const Icon(Icons.add), icon: const Icon(Icons.add),
) )
@ -104,7 +99,7 @@ class WHTimerScheduleScreen extends StatelessWidget {
: waterHeaterBloc.selectedTabIndex == 2 : waterHeaterBloc.selectedTabIndex == 2
? IconButton( ? IconButton(
onPressed: () { onPressed: () {
waterHeaterBloc.toggleCreateCirculate(); waterHeaterBloc.add(ToggleCreateCirculate());
}, },
icon: const Icon(Icons.add), icon: const Icon(Icons.add),
) )
@ -120,8 +115,7 @@ class WHTimerScheduleScreen extends StatelessWidget {
decoration: const ShapeDecoration( decoration: const ShapeDecoration(
color: ColorsManager.onPrimaryColor, color: ColorsManager.onPrimaryColor,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all( borderRadius: BorderRadius.all(Radius.circular(30)),
Radius.circular(30)),
), ),
), ),
child: TabBar( child: TabBar(
@ -130,49 +124,34 @@ class WHTimerScheduleScreen extends StatelessWidget {
labelPadding: EdgeInsets.zero, labelPadding: EdgeInsets.zero,
onTap: (value) { onTap: (value) {
if (value == 0) { if (value == 0) {
if (waterHeaterBloc.createSchedule == if (waterHeaterBloc.createSchedule == true) {
true) {
// waterHeaterBloc // waterHeaterBloc
// .toggleCreateSchedule(); // .toggleCreateSchedule();
waterHeaterBloc.add( waterHeaterBloc
const ToggleCreateScheduleEvent( .add(const ToggleCreateScheduleEvent(index: 1));
index: 1));
} }
waterHeaterBloc.add( waterHeaterBloc.add(ToggleSelectedEvent(index: value));
ToggleSelectedEvent(
index: value));
// waterHeaterBloc // waterHeaterBloc
// .toggleSelectedIndex(value); // .toggleSelectedIndex(value);
} else if (value == 2) { } else if (value == 2) {
if (waterHeaterBloc.createCirculate == if (waterHeaterBloc.createCirculate == true) {
true) { waterHeaterBloc
waterHeaterBloc.add( .add(ToggleCreateCirculateEvent(index: value));
ToggleCreateCirculateEvent(
index: value));
// waterHeaterBloc // waterHeaterBloc
// .toggleCreateCirculate(); // .toggleCreateCirculate();
} }
waterHeaterBloc.add( waterHeaterBloc.add(ToggleSelectedEvent(index: value));
ToggleSelectedEvent(
index: value));
// waterHeaterBloc // waterHeaterBloc
// .toggleSelectedIndex(value); // .toggleSelectedIndex(value);
} else { } else {
if (waterHeaterBloc.createSchedule == if (waterHeaterBloc.createSchedule == true) {
true) { waterHeaterBloc.add(ToggleSelectedEvent(index: value));
waterHeaterBloc.add(
ToggleSelectedEvent(
index: value));
// waterHeaterBloc // waterHeaterBloc
// .toggleCreateSchedule(); // .toggleCreateSchedule();
} }
waterHeaterBloc.createCirculate = waterHeaterBloc.createCirculate = false;
false; waterHeaterBloc.createSchedule = false;
waterHeaterBloc.createSchedule = waterHeaterBloc.add(ToggleSelectedEvent(index: value));
false;
waterHeaterBloc.add(
ToggleSelectedEvent(
index: value));
// waterHeaterBloc // waterHeaterBloc
// .toggleSelectedIndex(value); // .toggleSelectedIndex(value);
} }
@ -183,39 +162,31 @@ class WHTimerScheduleScreen extends StatelessWidget {
indicator: const ShapeDecoration( indicator: const ShapeDecoration(
color: ColorsManager.slidingBlueColor, color: ColorsManager.slidingBlueColor,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all( borderRadius: BorderRadius.all(Radius.circular(20)),
Radius.circular(20)),
), ),
), ),
isScrollable: false, isScrollable: false,
labelColor: Colors labelColor: Colors.white, // Text color when selected
.white, // Text color when selected unselectedLabelColor:
unselectedLabelColor: ColorsManager ColorsManager.blackColor, // Text color when not selected
.blackColor, // Text color when not selected
tabs: [ tabs: [
Tab( Tab(
icon: Padding( icon: Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(top: 10.0),
top: 10.0),
child: SvgPicture.asset( child: SvgPicture.asset(
Assets.scheduleTimeIcon, Assets.scheduleTimeIcon,
color: waterHeaterBloc color: waterHeaterBloc.selectedTabIndex == 0
.selectedTabIndex ==
0
? Colors.white ? Colors.white
: ColorsManager : ColorsManager
.blackColor, // Change icon color based on selectedIndex .blackColor, // Change icon color based on selectedIndex
), ),
), ),
child: Container( child: Container(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(vertical: 5),
vertical: 5),
child: BodySmall( child: BodySmall(
text: 'Countdown', text: 'Countdown',
style: context.bodySmall.copyWith( style: context.bodySmall.copyWith(
color: waterHeaterBloc color: waterHeaterBloc.selectedTabIndex == 0
.selectedTabIndex ==
0
? Colors.white ? Colors.white
: ColorsManager : ColorsManager
.blackColor, // Text color based on selectedTabIndex .blackColor, // Text color based on selectedTabIndex
@ -227,26 +198,20 @@ class WHTimerScheduleScreen extends StatelessWidget {
), ),
Tab( Tab(
icon: Padding( icon: Padding(
padding: padding: const EdgeInsets.only(top: 10),
const EdgeInsets.only(top: 10),
child: SvgPicture.asset( child: SvgPicture.asset(
Assets.scheduleCelenderIcon, Assets.scheduleCelenderIcon,
color: waterHeaterBloc color: waterHeaterBloc.selectedTabIndex == 1
.selectedTabIndex ==
1
? Colors.white ? Colors.white
: ColorsManager.blackColor, : ColorsManager.blackColor,
), ),
), ),
child: Container( child: Container(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(vertical: 5),
vertical: 5),
child: Text( child: Text(
'Schedule', 'Schedule',
style: context.bodySmall.copyWith( style: context.bodySmall.copyWith(
color: waterHeaterBloc color: waterHeaterBloc.selectedTabIndex == 1
.selectedTabIndex ==
1
? Colors.white ? Colors.white
: ColorsManager.blackColor, : ColorsManager.blackColor,
fontSize: 12, fontSize: 12,
@ -257,26 +222,20 @@ class WHTimerScheduleScreen extends StatelessWidget {
), ),
Tab( Tab(
icon: Padding( icon: Padding(
padding: padding: const EdgeInsets.only(top: 10),
const EdgeInsets.only(top: 10),
child: SvgPicture.asset( child: SvgPicture.asset(
Assets.scheduleCirculateIcon, Assets.scheduleCirculateIcon,
color: waterHeaterBloc color: waterHeaterBloc.selectedTabIndex == 2
.selectedTabIndex ==
2
? Colors.white ? Colors.white
: ColorsManager.blackColor, : ColorsManager.blackColor,
), ),
), ),
child: Container( child: Container(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(vertical: 5),
vertical: 5),
child: Text( child: Text(
'Circulate', 'Circulate',
style: context.bodySmall.copyWith( style: context.bodySmall.copyWith(
color: waterHeaterBloc color: waterHeaterBloc.selectedTabIndex == 2
.selectedTabIndex ==
2
? Colors.white ? Colors.white
: ColorsManager.blackColor, : ColorsManager.blackColor,
fontSize: 12, fontSize: 12,
@ -287,26 +246,20 @@ class WHTimerScheduleScreen extends StatelessWidget {
), ),
Tab( Tab(
icon: Padding( icon: Padding(
padding: padding: const EdgeInsets.only(top: 10),
const EdgeInsets.only(top: 10),
child: SvgPicture.asset( child: SvgPicture.asset(
Assets.scheduleInchingIcon, Assets.scheduleInchingIcon,
color: waterHeaterBloc color: waterHeaterBloc.selectedTabIndex == 3
.selectedTabIndex ==
3
? Colors.white ? Colors.white
: ColorsManager.blackColor, : ColorsManager.blackColor,
), ),
), ),
child: Container( child: Container(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(vertical: 5),
vertical: 5),
child: Text( child: Text(
'Inching', 'Inching',
style: context.bodySmall.copyWith( style: context.bodySmall.copyWith(
color: waterHeaterBloc color: waterHeaterBloc.selectedTabIndex == 3
.selectedTabIndex ==
3
? Colors.white ? Colors.white
: ColorsManager.blackColor, : ColorsManager.blackColor,
fontSize: 12, fontSize: 12,
@ -325,106 +278,75 @@ class WHTimerScheduleScreen extends StatelessWidget {
Center( Center(
child: Container( child: Container(
child: Column( child: Column(
mainAxisAlignment: mainAxisAlignment: MainAxisAlignment.center,
MainAxisAlignment.center,
children: [ children: [
countNum > 0 countNum > 0
? BodyLarge( ? BodyLarge(
text: _formatDuration( text: _formatDuration(countNum),
countNum), fontColor: ColorsManager.slidingBlueColor,
fontColor: ColorsManager
.slidingBlueColor,
fontSize: 40, fontSize: 40,
) )
: CupertinoTimerPicker( : CupertinoTimerPicker(
mode: mode: CupertinoTimerPickerMode.hm,
CupertinoTimerPickerMode
.hm,
onTimerDurationChanged: onTimerDurationChanged:
(Duration (Duration newDuration) {
newDuration) {
duration = newDuration; duration = newDuration;
}, },
), ),
GestureDetector( GestureDetector(
onTap: () { onTap: () {
if (state if (state is LoadingNewSate) {
is LoadingNewSate) {
return; return;
} }
if (countNum > 0) { if (countNum > 0) {
waterHeaterBloc.add( waterHeaterBloc.add(SetCounterValue(
SetCounterValue( deviceCode: deviceCode,
deviceCode: duration: Duration.zero));
deviceCode, } else if (duration != Duration.zero) {
duration: Duration waterHeaterBloc.add(SetCounterValue(
.zero)); deviceCode: deviceCode,
} else if (duration != duration: duration));
Duration.zero) {
waterHeaterBloc.add(
SetCounterValue(
deviceCode:
deviceCode,
duration:
duration));
} }
}, },
child: SvgPicture.asset( child: SvgPicture.asset(countNum > 0
countNum > 0 ? Assets.pauseIcon
? Assets.pauseIcon : Assets.playIcon)),
: Assets.playIcon)),
], ],
), ),
), ),
), ),
SizedBox( SizedBox(
child: waterHeaterBloc.createSchedule == child: waterHeaterBloc.createSchedule == true
true
? CreateSchedule( ? CreateSchedule(
onToggleChanged: (bool isOn) { onToggleChanged: (bool isOn) {
waterHeaterBloc waterHeaterBloc.toggleSchedule = isOn;
.toggleSchedule = isOn;
}, },
onDateTimeChanged: onDateTimeChanged: (DateTime dateTime) {
(DateTime dateTime) { waterHeaterBloc.selectedTime = dateTime;
waterHeaterBloc.selectedTime =
dateTime;
}, },
days: waterHeaterBloc.days, days: waterHeaterBloc.days,
selectDays: (List<String> selectDays: (List<String> selectedDays) {
selectedDays) { waterHeaterBloc.selectedDays = selectedDays;
waterHeaterBloc.selectedDays =
selectedDays;
}, },
) )
: Padding( : Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(top: 10),
top: 10),
child: Column( child: Column(
children: [ children: [
Expanded( Expanded(
child: ScheduleListView( child: ScheduleListView(
listSchedule: listSchedule: waterHeaterBloc
waterHeaterBloc .listSchedule, // Pass the schedule list here
.listSchedule, // Pass the schedule list here onDismissed: (scheduleId) {
onDismissed: waterHeaterBloc.listSchedule.removeWhere(
(scheduleId) { (schedule) =>
waterHeaterBloc schedule.scheduleId ==
.listSchedule scheduleId);
.removeWhere(
(schedule) =>
schedule
.scheduleId ==
scheduleId);
waterHeaterBloc.add( waterHeaterBloc.add(
DeleteScheduleEvent( DeleteScheduleEvent(id: scheduleId));
id: scheduleId));
}, },
onToggleSchedule: onToggleSchedule: (scheduleId, isEnabled) {
(scheduleId, waterHeaterBloc.add(ToggleScheduleEvent(
isEnabled) {
waterHeaterBloc.add(
ToggleScheduleEvent(
id: scheduleId, id: scheduleId,
toggle: isEnabled, toggle: isEnabled,
)); ));
@ -437,56 +359,39 @@ class WHTimerScheduleScreen extends StatelessWidget {
), ),
Center( Center(
child: Column( child: Column(
crossAxisAlignment: crossAxisAlignment: CrossAxisAlignment.center,
CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [ children: [
waterHeaterBloc.createCirculate == waterHeaterBloc.createCirculate == true
true
? CirculateWidget( ? CirculateWidget(
endDuration: () { endDuration: () {
waterHeaterBloc.add( waterHeaterBloc.add(SelectTimeEvent(
SelectTimeEvent( context: context, isEffective: false));
context: context,
isEffective:
false));
}, },
startDuration: () { startDuration: () {
waterHeaterBloc.add( waterHeaterBloc.add(SelectTimeEvent(
SelectTimeEvent( context: context, isEffective: false));
context: context,
isEffective:
false));
}, },
isStartEndTime: true, isStartEndTime: true,
startTime: DateTime.now(), startTime: DateTime.now(),
endTime: DateTime.now(), endTime: DateTime.now(),
days: waterHeaterBloc.days, days: waterHeaterBloc.days,
selectedDays: [], selectedDays: [],
onToggleStartEndTime: onToggleStartEndTime: (c) {},
(c) {},
onTimeChanged: (x, f) {}, onTimeChanged: (x, f) {},
onDaySelected: (p0) {}, onDaySelected: (p0) {},
) )
: CirculateListView( : CirculateListView(
listSchedule: [], // Pass the schedule list here listSchedule: [], // Pass the schedule list here
onDismissed: (scheduleId) { onDismissed: (scheduleId) {
waterHeaterBloc.listSchedule.removeWhere(
(schedule) =>
schedule.scheduleId == scheduleId);
waterHeaterBloc waterHeaterBloc
.listSchedule .add(DeleteScheduleEvent(id: scheduleId));
.removeWhere((schedule) =>
schedule
.scheduleId ==
scheduleId);
waterHeaterBloc.add(
DeleteScheduleEvent(
id: scheduleId));
}, },
onToggleSchedule: onToggleSchedule: (scheduleId, isEnabled) {
(scheduleId, waterHeaterBloc.add(ToggleScheduleEvent(
isEnabled) {
waterHeaterBloc.add(
ToggleScheduleEvent(
id: scheduleId, id: scheduleId,
toggle: isEnabled, toggle: isEnabled,
)); ));

View File

@ -5,7 +5,6 @@ import 'package:syncrow_app/features/devices/bloc/water_heater_bloc/water_heater
import 'package:syncrow_app/features/devices/bloc/water_heater_bloc/water_heater_state.dart'; import 'package:syncrow_app/features/devices/bloc/water_heater_bloc/water_heater_state.dart';
import 'package:syncrow_app/features/devices/model/GroupWHModel.dart'; import 'package:syncrow_app/features/devices/model/GroupWHModel.dart';
import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart';
import 'package:syncrow_app/features/devices/model/water_heater.dart';
import 'package:syncrow_app/features/devices/view/widgets/water_heater/wh_list.dart'; import 'package:syncrow_app/features/devices/view/widgets/water_heater/wh_list.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.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/default_scaffold.dart';
@ -22,30 +21,19 @@ class WHWizard extends StatelessWidget {
return DefaultScaffold( return DefaultScaffold(
child: BlocProvider( child: BlocProvider(
create: (context) => create: (context) =>
WaterHeaterBloc(switchCode: '', whId: device?.uuid ?? '') WaterHeaterBloc(switchCode: '', whId: device?.uuid ?? '')..add(InitialWizardEvent()),
..add(InitialWizardEvent()),
child: BlocBuilder<WaterHeaterBloc, WaterHeaterState>( child: BlocBuilder<WaterHeaterBloc, WaterHeaterState>(
builder: (context, state) { builder: (context, state) {
WHModel whModel = WHModel(
firstSwitch: false,
firstCountDown: 0,
);
bool allSwitchesOn = false; bool allSwitchesOn = false;
if (state is LoadingNewSate) { if (state is UpdateGroupState) {
whModel = state.whModel;
} else if (state is UpdateState) {
whModel = state.whModel;
} else if (state is UpdateGroupState) {
groupModel = state.twoGangList; groupModel = state.twoGangList;
allSwitchesOn = state.allSwitches; allSwitchesOn = state.allSwitches;
} }
return state is WHLoadingState return state is WHLoadingState
? const Center( ? const Center(
child: DefaultContainer( child:
width: 50, DefaultContainer(width: 50, height: 50, child: CircularProgressIndicator()),
height: 50,
child: CircularProgressIndicator()),
) )
: WHList( : WHList(
whList: groupModel, whList: groupModel,

View File

@ -81,8 +81,7 @@ abstract class ApiEndpoints {
static const String controlGroup = '/group/control'; static const String controlGroup = '/group/control';
//GET //GET
static const String groupBySpace = '/group/{unitUuid}'; static const String groupBySpace = '/group/{unitUuid}';
static const String devicesByGroupName = static const String devicesByGroupName = '/group/{unitUuid}/devices/{groupName}';
'/group/{unitUuid}/devices/{groupName}';
static const String groupByUuid = '/group/{groupUuid}'; static const String groupByUuid = '/group/{groupUuid}';
//DELETE //DELETE
@ -94,8 +93,7 @@ abstract class ApiEndpoints {
static const String addDeviceToRoom = '/device/room'; static const String addDeviceToRoom = '/device/room';
static const String addDeviceToGroup = '/device/group'; static const String addDeviceToGroup = '/device/group';
static const String controlDevice = '/device/{deviceUuid}/control'; static const String controlDevice = '/device/{deviceUuid}/control';
static const String firmwareDevice = static const String firmwareDevice = '/device/{deviceUuid}/firmware/{firmwareVersion}';
'/device/{deviceUuid}/firmware/{firmwareVersion}';
static const String getDevicesByUserId = '/device/user/{userId}'; static const String getDevicesByUserId = '/device/user/{userId}';
static const String getDevicesByUnitId = '/device/unit/{unitUuid}'; static const String getDevicesByUnitId = '/device/unit/{unitUuid}';
static const String openDoorLock = '/door-lock/open/{doorLockUuid}'; static const String openDoorLock = '/door-lock/open/{doorLockUuid}';
@ -105,8 +103,7 @@ abstract class ApiEndpoints {
static const String deviceByUuid = '/device/{deviceUuid}'; static const String deviceByUuid = '/device/{deviceUuid}';
static const String deviceFunctions = '/device/{deviceUuid}/functions'; static const String deviceFunctions = '/device/{deviceUuid}/functions';
static const String gatewayApi = '/device/gateway/{gatewayUuid}/devices'; static const String gatewayApi = '/device/gateway/{gatewayUuid}/devices';
static const String deviceFunctionsStatus = static const String deviceFunctionsStatus = '/device/{deviceUuid}/functions/status';
'/device/{deviceUuid}/functions/status';
///Device Permission Module ///Device Permission Module
//POST //POST
@ -131,29 +128,24 @@ abstract class ApiEndpoints {
static const String getUnitAutomation = '/automation/{unitUuid}'; static const String getUnitAutomation = '/automation/{unitUuid}';
static const String getAutomationDetails = static const String getAutomationDetails = '/automation/details/{automationId}';
'/automation/details/{automationId}';
/// PUT /// PUT
static const String updateScene = '/scene/tap-to-run/{sceneId}'; static const String updateScene = '/scene/tap-to-run/{sceneId}';
static const String updateAutomation = '/automation/{automationId}'; static const String updateAutomation = '/automation/{automationId}';
static const String updateAutomationStatus = static const String updateAutomationStatus = '/automation/status/{automationId}';
'/automation/status/{automationId}';
/// DELETE /// DELETE
static const String deleteScene = '/scene/tap-to-run/{unitUuid}/{sceneId}'; static const String deleteScene = '/scene/tap-to-run/{unitUuid}/{sceneId}';
static const String deleteAutomation = static const String deleteAutomation = '/automation/{unitUuid}/{automationId}';
'/automation/{unitUuid}/{automationId}';
//////////////////////Door Lock ////////////////////// //////////////////////Door Lock //////////////////////
//online //online
static const String addTemporaryPassword = static const String addTemporaryPassword = '/door-lock/temporary-password/online/{doorLockUuid}';
'/door-lock/temporary-password/online/{doorLockUuid}'; static const String getTemporaryPassword = '/door-lock/temporary-password/online/{doorLockUuid}';
static const String getTemporaryPassword =
'/door-lock/temporary-password/online/{doorLockUuid}';
//one-time offline //one-time offline
static const String addOneTimeTemporaryPassword = static const String addOneTimeTemporaryPassword =
@ -185,11 +177,11 @@ abstract class ApiEndpoints {
'/door-lock/temporary-password/online/{doorLockUuid}/{passwordId}'; '/door-lock/temporary-password/online/{doorLockUuid}/{passwordId}';
static const String saveSchedule = '/schedule/{deviceUuid}'; static const String saveSchedule = '/schedule/{deviceUuid}';
static const String getSchedule = static const String getSchedule = '/schedule/{deviceUuid}?category={category}';
'/schedule/{deviceUuid}?category={category}';
static const String changeSchedule = '/schedule/enable/{deviceUuid}'; static const String changeSchedule = '/schedule/enable/{deviceUuid}';
static const String deleteSchedule = '/schedule/{deviceUuid}/{scheduleId}'; static const String deleteSchedule = '/schedule/{deviceUuid}/{scheduleId}';
static const String reportLogs = static const String reportLogs =
'/device/report-logs/{deviceUuid}?code={code}&startTime={startTime}&endTime={endTime}'; '/device/report-logs/{deviceUuid}?code={code}&startTime={startTime}&endTime={endTime}';
static const String controlBatch = '/device/control/batch'; static const String controlBatch = '/device/control/batch';
static const String statusBatch = '/device/status/batch';
} }

View File

@ -72,8 +72,7 @@ class DevicesAPI {
static Future<Map<String, dynamic>> getDeviceStatus(String deviceId) async { static Future<Map<String, dynamic>> getDeviceStatus(String deviceId) async {
final response = await _httpService.get( final response = await _httpService.get(
path: ApiEndpoints.deviceFunctionsStatus path: ApiEndpoints.deviceFunctionsStatus.replaceAll('{deviceUuid}', deviceId),
.replaceAll('{deviceUuid}', deviceId),
showServerMessage: false, showServerMessage: false,
expectedResponseModel: (json) { expectedResponseModel: (json) {
return json; return json;
@ -83,9 +82,7 @@ class DevicesAPI {
} }
static Future<Map<String, dynamic>> renamePass( static Future<Map<String, dynamic>> renamePass(
{required String name, {required String name, required String doorLockUuid, required String passwordId}) async {
required String doorLockUuid,
required String passwordId}) async {
final response = await _httpService.put( final response = await _httpService.put(
path: ApiEndpoints.renamePassword path: ApiEndpoints.renamePassword
.replaceAll('{doorLockUuid}', doorLockUuid) .replaceAll('{doorLockUuid}', doorLockUuid)
@ -110,8 +107,7 @@ class DevicesAPI {
return response; return response;
} }
static Future<List<DeviceModel>> getDeviceByGroupName( static Future<List<DeviceModel>> getDeviceByGroupName(String unitId, String groupName) async {
String unitId, String groupName) async {
final response = await _httpService.get( final response = await _httpService.get(
path: ApiEndpoints.devicesByGroupName path: ApiEndpoints.devicesByGroupName
.replaceAll('{unitUuid}', unitId) .replaceAll('{unitUuid}', unitId)
@ -150,8 +146,7 @@ class DevicesAPI {
return response; return response;
} }
static Future<List<DeviceModel>> getDevicesByGatewayId( static Future<List<DeviceModel>> getDevicesByGatewayId(String gatewayId) async {
String gatewayId) async {
final response = await _httpService.get( final response = await _httpService.get(
path: ApiEndpoints.gatewayApi.replaceAll('{gatewayUuid}', gatewayId), path: ApiEndpoints.gatewayApi.replaceAll('{gatewayUuid}', gatewayId),
showServerMessage: false, showServerMessage: false,
@ -173,8 +168,7 @@ class DevicesAPI {
String deviceId, String deviceId,
) async { ) async {
final response = await _httpService.get( final response = await _httpService.get(
path: ApiEndpoints.getTemporaryPassword path: ApiEndpoints.getTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
.replaceAll('{doorLockUuid}', deviceId),
showServerMessage: false, showServerMessage: false,
expectedResponseModel: (json) { expectedResponseModel: (json) {
return json; return json;
@ -185,8 +179,7 @@ class DevicesAPI {
static Future getOneTimePasswords(String deviceId) async { static Future getOneTimePasswords(String deviceId) async {
final response = await _httpService.get( final response = await _httpService.get(
path: ApiEndpoints.getOneTimeTemporaryPassword path: ApiEndpoints.getOneTimeTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
.replaceAll('{doorLockUuid}', deviceId),
showServerMessage: false, showServerMessage: false,
expectedResponseModel: (json) { expectedResponseModel: (json) {
return json; return json;
@ -197,8 +190,7 @@ class DevicesAPI {
static Future getTimeLimitPasswords(String deviceId) async { static Future getTimeLimitPasswords(String deviceId) async {
final response = await _httpService.get( final response = await _httpService.get(
path: ApiEndpoints.getMultipleTimeTemporaryPassword path: ApiEndpoints.getMultipleTimeTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
.replaceAll('{doorLockUuid}', deviceId),
showServerMessage: false, showServerMessage: false,
expectedResponseModel: (json) { expectedResponseModel: (json) {
return json; return json;
@ -223,12 +215,10 @@ class DevicesAPI {
"invalidTime": invalidTime, "invalidTime": invalidTime,
}; };
if (scheduleList != null) { if (scheduleList != null) {
body["scheduleList"] = body["scheduleList"] = scheduleList.map((schedule) => schedule.toJson()).toList();
scheduleList.map((schedule) => schedule.toJson()).toList();
} }
final response = await _httpService.post( final response = await _httpService.post(
path: ApiEndpoints.addTemporaryPassword path: ApiEndpoints.addTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
.replaceAll('{doorLockUuid}', deviceId),
body: body, body: body,
showServerMessage: false, showServerMessage: false,
expectedResponseModel: (json) => json, expectedResponseModel: (json) => json,
@ -239,8 +229,7 @@ class DevicesAPI {
static Future generateOneTimePassword({deviceId}) async { static Future generateOneTimePassword({deviceId}) async {
try { try {
final response = await _httpService.post( final response = await _httpService.post(
path: ApiEndpoints.addOneTimeTemporaryPassword path: ApiEndpoints.addOneTimeTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
.replaceAll('{doorLockUuid}', deviceId),
showServerMessage: false, showServerMessage: false,
expectedResponseModel: (json) { expectedResponseModel: (json) {
return json; return json;
@ -252,12 +241,10 @@ class DevicesAPI {
} }
} }
static Future generateMultiTimePassword( static Future generateMultiTimePassword({deviceId, effectiveTime, invalidTime}) async {
{deviceId, effectiveTime, invalidTime}) async {
try { try {
final response = await _httpService.post( final response = await _httpService.post(
path: ApiEndpoints.addMultipleTimeTemporaryPassword path: ApiEndpoints.addMultipleTimeTemporaryPassword.replaceAll('{doorLockUuid}', deviceId),
.replaceAll('{doorLockUuid}', deviceId),
showServerMessage: true, showServerMessage: true,
body: {"effectiveTime": effectiveTime, "invalidTime": invalidTime}, body: {"effectiveTime": effectiveTime, "invalidTime": invalidTime},
expectedResponseModel: (json) { expectedResponseModel: (json) {
@ -379,28 +366,33 @@ class DevicesAPI {
return response; return response;
} }
static Future deviceBatchController({
static Future deviceController({
List<String>? devicesUuid, List<String>? devicesUuid,
String? code, String? code,
bool? value, bool? value,
}) async { }) async {
try { final response = await _httpService.post(
final response = await _httpService.post( path: ApiEndpoints.controlBatch,
path: ApiEndpoints.controlBatch, body: {"devicesUuid": devicesUuid, "code": code, "value": value},
body: {"devicesUuid": devicesUuid, "code": code, "value": value}, showServerMessage: true,
showServerMessage: true, expectedResponseModel: (json) {
expectedResponseModel: (json) { return json;
print('json-=-=-=-=-=--=${json}'); },
return json; );
}, return response;
);
return response;
} catch (e) {
rethrow;
}
} }
static Future deviceBatchStatus({
List<String>? devicesUuid,
}) async {
final response = await _httpService.get(
path: ApiEndpoints.statusBatch,
queryParameters: {"devicesUuid": devicesUuid},
showServerMessage: false,
expectedResponseModel: (json) {
return json;
},
);
return response;
}
} }