Merge pull request #32 from SyncrowIOT/scene_bug

Scene bug
This commit is contained in:
Abdullah
2024-07-02 13:54:57 +03:00
committed by GitHub
22 changed files with 254 additions and 201 deletions

View File

@ -5,7 +5,9 @@
<application <application
android:label="syncrow_app" android:label="syncrow_app"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher"
android:allowBackup="false"
>
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"

View File

@ -274,35 +274,39 @@ class AuthCubit extends Cubit<AuthState> {
} }
getTokenAndValidate() async { getTokenAndValidate() async {
emit(AuthTokenLoading()); try {
const storage = FlutterSecureStorage(); emit(AuthTokenLoading());
final firstLaunch = const storage = FlutterSecureStorage();
await SharedPreferencesHelper.readBoolFromSP(StringsManager.firstLaunch) ?? true; final firstLaunch =
await SharedPreferencesHelper.readBoolFromSP(StringsManager.firstLaunch) ?? true;
if (firstLaunch) { if (firstLaunch) {
storage.deleteAll(); storage.deleteAll();
}
await SharedPreferencesHelper.saveBoolToSP(StringsManager.firstLaunch, false);
final value = await storage.read(key: Token.loginAccessTokenKey) ?? '';
if (value.isEmpty) {
emit(AuthTokenError(message: "Token not found"));
return;
}
final tokenData = Token.decodeToken(value);
if (tokenData.containsKey('exp')) {
final exp = tokenData['exp'] ?? 0;
final currentTime = DateTime.now().millisecondsSinceEpoch ~/ 1000;
if (currentTime < exp) {
emit(AuthTokenSuccess());
} else {
emit(AuthTokenError(message: "Token expired"));
} }
} else {
await SharedPreferencesHelper.saveBoolToSP(StringsManager.firstLaunch, false);
final value = await storage.read(key: Token.loginAccessTokenKey) ?? '';
if (value.isEmpty) {
emit(AuthTokenError(message: "Token not found"));
return;
}
final tokenData = Token.decodeToken(value);
if (tokenData.containsKey('exp')) {
final exp = tokenData['exp'] ?? 0;
final currentTime = DateTime.now().millisecondsSinceEpoch ~/ 1000;
if (currentTime < exp) {
emit(AuthTokenSuccess());
} else {
emit(AuthTokenError(message: "Token expired"));
}
} else {
emit(AuthTokenError(message: "Something went wrong"));
}
} catch (_) {
emit(AuthTokenError(message: "Something went wrong")); emit(AuthTokenError(message: "Something went wrong"));
} }
} }

View File

@ -25,11 +25,10 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
static List<DevicesCategoryModel>? allCategories; static List<DevicesCategoryModel>? allCategories;
Future<void> _onFetchAllDevices( Future<void> _onFetchAllDevices(FetchAllDevices event, Emitter<DeviceManagerState> emit) async {
FetchAllDevices event, Emitter<DeviceManagerState> emit) async {
emit(state.copyWith(loading: true)); emit(state.copyWith(loading: true));
try { try {
final allDevices = await HomeManagementAPI.fetchDevicesByUserId(); final allDevices = await HomeManagementAPI.fetchDevicesByUnitId();
emit(state.copyWith(devices: allDevices, loading: false)); emit(state.copyWith(devices: allDevices, loading: false));
} catch (e) { } catch (e) {
emit(state.copyWith(error: e.toString(), loading: false)); emit(state.copyWith(error: e.toString(), loading: false));
@ -47,16 +46,14 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
} }
} }
void _onSelectCategory( void _onSelectCategory(SelectCategory event, Emitter<DeviceManagerState> emit) {
SelectCategory event, Emitter<DeviceManagerState> emit) {
for (var i = 0; i < allCategories!.length; i++) { for (var i = 0; i < allCategories!.length; i++) {
allCategories![i].isSelected = i == event.index; allCategories![i].isSelected = i == event.index;
} }
emit(state.copyWith(categoryChanged: true)); emit(state.copyWith(categoryChanged: true));
} }
void _onUnselectAllCategories( void _onUnselectAllCategories(UnselectAllCategories event, Emitter<DeviceManagerState> emit) {
UnselectAllCategories event, Emitter<DeviceManagerState> emit) {
for (var category in allCategories!) { for (var category in allCategories!) {
category.isSelected = false; category.isSelected = false;
} }
@ -100,8 +97,7 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
_updateDevicesStatus(category, emit); _updateDevicesStatus(category, emit);
} }
void _onTurnOnOffDevice( void _onTurnOnOffDevice(TurnOnOffDevice event, Emitter<DeviceManagerState> emit) {
TurnOnOffDevice event, Emitter<DeviceManagerState> emit) {
var device = event.device; var device = event.device;
device.isOnline = !device.isOnline!; device.isOnline = !device.isOnline!;
DevicesCategoryModel category = allCategories!.firstWhere((category) { DevicesCategoryModel category = allCategories!.firstWhere((category) {
@ -124,8 +120,7 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
emit(state.copyWith(categoryChanged: true)); // Set category changed state emit(state.copyWith(categoryChanged: true)); // Set category changed state
} }
void _updateDevicesStatus( void _updateDevicesStatus(DevicesCategoryModel category, Emitter<DeviceManagerState> emit) {
DevicesCategoryModel category, Emitter<DeviceManagerState> emit) {
if (category.devices != null && category.devices!.isNotEmpty) { if (category.devices != null && category.devices!.isNotEmpty) {
bool? tempStatus = category.devices![0].isOnline; bool? tempStatus = category.devices![0].isOnline;
for (var device in category.devices!) { for (var device in category.devices!) {
@ -145,8 +140,7 @@ class DeviceManagerBloc extends Bloc<DeviceManagerEvent, DeviceManagerState> {
try { try {
final deviceFunctions = await DevicesAPI.deviceFunctions(event.deviceId); final deviceFunctions = await DevicesAPI.deviceFunctions(event.deviceId);
emit(state.copyWith( emit(state.copyWith(functionsLoading: false, deviceFunctions: deviceFunctions));
functionsLoading: false, deviceFunctions: deviceFunctions));
} catch (e) { } catch (e) {
emit(state.copyWith(functionsLoading: false, error: e.toString())); emit(state.copyWith(functionsLoading: false, error: e.toString()));
} }

View File

@ -30,8 +30,7 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
List<SceneStaticFunction> tempTasksList = []; List<SceneStaticFunction> tempTasksList = [];
final Map<String, dynamic> selectedValues = {}; final Map<String, dynamic> selectedValues = {};
FutureOr<void> _onAddSceneTask( FutureOr<void> _onAddSceneTask(AddTaskEvent event, Emitter<CreateSceneState> emit) {
AddTaskEvent event, Emitter<CreateSceneState> emit) {
final copyList = List<SceneStaticFunction>.from(tempTasksList); final copyList = List<SceneStaticFunction>.from(tempTasksList);
tasksList.addAll(copyList); tasksList.addAll(copyList);
tempTasksList.clear(); tempTasksList.clear();
@ -87,16 +86,16 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
} }
emit(TempHoldSceneTask(tempTasksList: tempTasksList)); emit(TempHoldSceneTask(tempTasksList: tempTasksList));
emit(AddSceneTask(tasksList: tasksList));
} }
FutureOr<void> _selectedValue( FutureOr<void> _selectedValue(SelectedValueEvent event, Emitter<CreateSceneState> emit) {
SelectedValueEvent event, Emitter<CreateSceneState> emit) {
selectedValues[event.code] = event.value; selectedValues[event.code] = event.value;
emit(SelectedTaskValueState(value: event.value)); emit(SelectedTaskValueState(value: event.value));
emit(AddSceneTask(tasksList: tasksList));
} }
FutureOr<void> _removeTaskById( FutureOr<void> _removeTaskById(RemoveTaskByIdEvent event, Emitter<CreateSceneState> emit) {
RemoveTaskByIdEvent event, Emitter<CreateSceneState> emit) {
emit(CreateSceneLoading()); emit(CreateSceneLoading());
for (var element in tasksList) { for (var element in tasksList) {
@ -116,6 +115,8 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
tempTasksList.remove(element); tempTasksList.remove(element);
emit(TempHoldSceneTask(tempTasksList: tempTasksList)); emit(TempHoldSceneTask(tempTasksList: tempTasksList));
emit(AddSceneTask(tasksList: tasksList));
break; break;
} }
} }
@ -141,8 +142,7 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
} }
} }
FutureOr<void> _clearTaskList( FutureOr<void> _clearTaskList(ClearTaskListEvent event, Emitter<CreateSceneState> emit) {
ClearTaskListEvent event, Emitter<CreateSceneState> emit) {
tasksList.clear(); tasksList.clear();
emit(AddSceneTask(tasksList: tasksList)); emit(AddSceneTask(tasksList: tasksList));
} }
@ -154,8 +154,8 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
try { try {
final response = await SceneApi.getSceneDetails(event.sceneId); final response = await SceneApi.getSceneDetails(event.sceneId);
if (response.id.isNotEmpty) { if (response.id.isNotEmpty) {
tasksList = List<SceneStaticFunction>.from(getTaskListFunctionsFromApi( tasksList =
actions: response.actions, deviceId: response.id)); List<SceneStaticFunction>.from(getTaskListFunctionsFromApi(actions: response.actions));
emit(AddSceneTask( emit(AddSceneTask(
tasksList: tasksList, tasksList: tasksList,
)); ));
@ -167,11 +167,11 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
} }
} }
FutureOr<void> _clearTempTaskList( FutureOr<void> _clearTempTaskList(ClearTempTaskListEvent event, Emitter<CreateSceneState> emit) {
ClearTempTaskListEvent event, Emitter<CreateSceneState> emit) {
tempTasksList.clear(); tempTasksList.clear();
selectedValues.clear(); selectedValues.clear();
emit(TempHoldSceneTask(tempTasksList: tempTasksList)); emit(TempHoldSceneTask(tempTasksList: tempTasksList));
emit(AddSceneTask(tasksList: tempTasksList));
} }
FutureOr<void> _removeFromSelectedValueById( FutureOr<void> _removeFromSelectedValueById(
@ -179,16 +179,15 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
if (selectedValues.containsKey(event.code)) { if (selectedValues.containsKey(event.code)) {
selectedValues.remove(event.code); selectedValues.remove(event.code);
emit(const SelectedTaskValueState(value: null)); emit(const SelectedTaskValueState(value: null));
emit(AddSceneTask(tasksList: tasksList));
} }
} }
FutureOr<void> _deleteScene( FutureOr<void> _deleteScene(DeleteSceneEvent event, Emitter<CreateSceneState> emit) async {
DeleteSceneEvent event, Emitter<CreateSceneState> emit) async {
emit(DeleteSceneLoading()); emit(DeleteSceneLoading());
try { try {
final response = await SceneApi.deleteScene( final response = await SceneApi.deleteScene(sceneId: event.sceneId, unitUuid: event.unitUuid);
sceneId: event.sceneId, unitUuid: event.unitUuid);
if (response == true) { if (response == true) {
emit(const DeleteSceneSuccess(true)); emit(const DeleteSceneSuccess(true));
} else { } else {

View File

@ -8,8 +8,6 @@ sealed class CreateSceneEvent extends Equatable {
} }
class AddTaskEvent extends CreateSceneEvent { class AddTaskEvent extends CreateSceneEvent {
final bool updateTaskListFromTemp;
const AddTaskEvent({required this.updateTaskListFromTemp});
@override @override
List<Object> get props => []; List<Object> get props => [];
} }

View File

@ -18,15 +18,18 @@ class SceneBloc extends Bloc<SceneEvent, SceneState> {
emit(SceneLoading()); emit(SceneLoading());
try { try {
final scenes = await SceneApi.getScenesByUnitId(event.unitId); if (event.unitId.isNotEmpty) {
emit(SceneLoaded(scenes)); final scenes = await SceneApi.getScenesByUnitId(event.unitId);
emit(SceneLoaded(scenes));
} else {
const SceneError(message: '');
}
} catch (e) { } catch (e) {
emit(const SceneError(message: 'Something went wrong')); emit(const SceneError(message: 'Something went wrong'));
} }
} }
Future<void> _onSceneTrigger( Future<void> _onSceneTrigger(SceneTrigger event, Emitter<SceneState> emit) async {
SceneTrigger event, Emitter<SceneState> emit) async {
final currentState = state; final currentState = state;
if (currentState is SceneLoaded) { if (currentState is SceneLoaded) {
emit(SceneLoaded(currentState.scenes, loadingSceneId: event.sceneId)); emit(SceneLoaded(currentState.scenes, loadingSceneId: event.sceneId));

View File

@ -15,7 +15,8 @@ import 'package:syncrow_app/utils/context_extension.dart';
mixin SceneLogicHelper { mixin SceneLogicHelper {
bool isOnlyDelayOrDelayLast(List<SceneStaticFunction> tasks) { bool isOnlyDelayOrDelayLast(List<SceneStaticFunction> tasks) {
final lastTask = tasks.last; final lastTask = tasks.last;
return tasks.every((task) => task.code == 'delay') || lastTask.code == 'delay'; return tasks.every((task) => task.code == 'delay') ||
lastTask.code == 'delay';
} }
void handleSaveButtonPress( void handleSaveButtonPress(
@ -44,14 +45,14 @@ mixin SceneLogicHelper {
tasks.length, tasks.length,
(index) { (index) {
final task = tasks[index]; final task = tasks[index];
if (task.code == 'delay') { if (task.deviceId == 'delay') {
return CreateSceneAction( return CreateSceneAction(
entityId: tasks[index].deviceId, entityId: tasks[index].deviceId,
actionExecutor: 'delay', actionExecutor: 'delay',
executorProperty: CreateSceneExecutorProperty( executorProperty: CreateSceneExecutorProperty(
functionCode: task.code, functionCode: '',
functionValue: task.operationalValues.first.value, functionValue: '',
delaySeconds: 0, delaySeconds: task.functionValue,
), ),
); );
} }
@ -60,7 +61,7 @@ mixin SceneLogicHelper {
actionExecutor: 'device_issue', actionExecutor: 'device_issue',
executorProperty: CreateSceneExecutorProperty( executorProperty: CreateSceneExecutorProperty(
functionCode: task.code, functionCode: task.code,
functionValue: task.operationalValues.first.value, functionValue: task.functionValue,
delaySeconds: 0, delaySeconds: 0,
), ),
); );
@ -121,7 +122,8 @@ mixin SceneLogicHelper {
); );
} else { } else {
return AlertDialogCountdown( return AlertDialogCountdown(
durationValue: listOfSceneStaticFunction[index].functionValue ?? taskItem.functionValue, durationValue: listOfSceneStaticFunction[index].functionValue ??
taskItem.functionValue,
functionValue: taskItem.functionValue, functionValue: taskItem.functionValue,
function: listOfSceneStaticFunction[index], function: listOfSceneStaticFunction[index],
); );

View File

@ -458,11 +458,6 @@ mixin SceneOperationsDataHelper {
icon: Assets.assetsAcPower, description: "ON", value: true), icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue( SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false), icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
SceneOperationalValue(
icon: Assets.assetsSceneRefresh,
description: "Reverse Switch",
value: null,
),
], ],
), ),
SceneStaticFunction( SceneStaticFunction(
@ -477,11 +472,6 @@ mixin SceneOperationsDataHelper {
icon: Assets.assetsAcPower, description: "ON", value: true), icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue( SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false), icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
SceneOperationalValue(
icon: Assets.assetsSceneRefresh,
description: "Reverse Switch",
value: null,
),
], ],
), ),
SceneStaticFunction( SceneStaticFunction(
@ -496,11 +486,6 @@ mixin SceneOperationsDataHelper {
icon: Assets.assetsAcPower, description: "ON", value: true), icon: Assets.assetsAcPower, description: "ON", value: true),
SceneOperationalValue( SceneOperationalValue(
icon: Assets.assetsAcPowerOFF, description: "OFF", value: false), icon: Assets.assetsAcPowerOFF, description: "OFF", value: false),
SceneOperationalValue(
icon: Assets.assetsSceneRefresh,
description: "Reverse Switch",
value: null,
),
], ],
), ),
SceneStaticFunction( SceneStaticFunction(
@ -660,20 +645,42 @@ mixin SceneOperationsDataHelper {
]; ];
} }
///////&************ END of get function with icons for device *************&&////////
///
///
List<SceneStaticFunction> getTaskListFunctionsFromApi({ List<SceneStaticFunction> getTaskListFunctionsFromApi({
required List<Action> actions, required List<Action> actions,
required String deviceId,
}) { }) {
List<SceneStaticFunction> functions = []; List<SceneStaticFunction> functions = [];
for (var action in actions) { for (var action in actions) {
if (action.entityId == 'delay') {
functions.add(
SceneStaticFunction(
deviceId: action.entityId,
deviceName: 'delay',
deviceIcon: Assets.delay,
icon: Assets.delay,
operationName: 'delay',
functionValue: action.executorProperty.delaySeconds,
code: '',
operationalValues: [
SceneOperationalValue(
icon: '',
description: "",
value: action.executorProperty.delaySeconds,
),
],
),
);
}
ExecutorProperty executorProperty = action.executorProperty; ExecutorProperty executorProperty = action.executorProperty;
switch (executorProperty.functionCode) { switch (executorProperty.functionCode) {
case 'sensitivity': case 'sensitivity':
functions.add( functions.add(
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Presence Sensor', deviceName: 'Presence Sensor',
deviceIcon: Assets.assetsIconsSensors, deviceIcon: Assets.assetsIconsSensors,
icon: Assets.assetsSensitivityFunction, icon: Assets.assetsSensitivityFunction,
@ -738,7 +745,7 @@ mixin SceneOperationsDataHelper {
case 'normal_open_switch': case 'normal_open_switch':
functions.add( functions.add(
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'WIFI LOCK PRO', deviceName: 'WIFI LOCK PRO',
deviceIcon: Assets.assetsIconsDoorLock, deviceIcon: Assets.assetsIconsDoorLock,
icon: Assets.assetsIconsDoorLock, icon: Assets.assetsIconsDoorLock,
@ -760,7 +767,7 @@ mixin SceneOperationsDataHelper {
case 'far_detection': case 'far_detection':
functions.add( functions.add(
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Human Presence Sensor', deviceName: 'Human Presence Sensor',
deviceIcon: Assets.assetsIconsSensors, deviceIcon: Assets.assetsIconsSensors,
icon: Assets.assetsFarDetection, icon: Assets.assetsFarDetection,
@ -823,7 +830,7 @@ mixin SceneOperationsDataHelper {
case 'motion_sensitivity_value': case 'motion_sensitivity_value':
functions.add( functions.add(
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Human Presence Sensor', deviceName: 'Human Presence Sensor',
deviceIcon: Assets.assetsIconsSensors, deviceIcon: Assets.assetsIconsSensors,
icon: Assets.assetsMotionDetection, icon: Assets.assetsMotionDetection,
@ -863,7 +870,7 @@ mixin SceneOperationsDataHelper {
case 'motionless_sensitivity': case 'motionless_sensitivity':
functions.add( functions.add(
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Human Presence Sensor', deviceName: 'Human Presence Sensor',
deviceIcon: Assets.assetsIconsSensors, deviceIcon: Assets.assetsIconsSensors,
icon: Assets.assetsMotionlessDetection, icon: Assets.assetsMotionlessDetection,
@ -908,7 +915,7 @@ mixin SceneOperationsDataHelper {
case 'indicator': case 'indicator':
functions.add( functions.add(
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Human Presence Sensor', deviceName: 'Human Presence Sensor',
deviceIcon: Assets.assetsIconsSensors, deviceIcon: Assets.assetsIconsSensors,
icon: Assets.assetsIndicator, icon: Assets.assetsIndicator,
@ -930,7 +937,7 @@ mixin SceneOperationsDataHelper {
case 'presence_time': case 'presence_time':
functions.add( functions.add(
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Human Presence Sensor', deviceName: 'Human Presence Sensor',
deviceIcon: Assets.assetsIconsSensors, deviceIcon: Assets.assetsIconsSensors,
icon: Assets.assetsNobodyTime, icon: Assets.assetsNobodyTime,
@ -946,7 +953,7 @@ mixin SceneOperationsDataHelper {
case 'switch_alarm_sound': case 'switch_alarm_sound':
functions.add( functions.add(
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Multi-Mode Gateway Z-W-B', deviceName: 'Multi-Mode Gateway Z-W-B',
deviceIcon: Assets.assetsIconsGateway, deviceIcon: Assets.assetsIconsGateway,
icon: Assets.assetsSwitchAlarmSound, icon: Assets.assetsSwitchAlarmSound,
@ -970,7 +977,7 @@ mixin SceneOperationsDataHelper {
case 'master_state': case 'master_state':
functions.add( functions.add(
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Multi-Mode Gateway Z-W-B', deviceName: 'Multi-Mode Gateway Z-W-B',
deviceIcon: Assets.assetsIconsGateway, deviceIcon: Assets.assetsIconsGateway,
icon: Assets.assetsMasterState, icon: Assets.assetsMasterState,
@ -995,7 +1002,7 @@ mixin SceneOperationsDataHelper {
case 'factory_reset': case 'factory_reset':
functions.add( functions.add(
SceneStaticFunction( SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Multi-Mode Gateway Z-W-B', deviceName: 'Multi-Mode Gateway Z-W-B',
deviceIcon: Assets.assetsIconsGateway, deviceIcon: Assets.assetsIconsGateway,
icon: Assets.assetsFactoryReset, icon: Assets.assetsFactoryReset,
@ -1018,7 +1025,7 @@ mixin SceneOperationsDataHelper {
break; break;
case 'switch_1': case 'switch_1':
functions.add(SceneStaticFunction( functions.add(SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: '3 Gang Button Switch L-L', deviceName: '3 Gang Button Switch L-L',
deviceIcon: Assets.assetsIcons3GangSwitch, deviceIcon: Assets.assetsIcons3GangSwitch,
icon: Assets.assetsAcPower, icon: Assets.assetsAcPower,
@ -1045,7 +1052,7 @@ mixin SceneOperationsDataHelper {
break; break;
case 'switch_2': case 'switch_2':
functions.add(SceneStaticFunction( functions.add(SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: '3 Gang Button Switch L-L', deviceName: '3 Gang Button Switch L-L',
deviceIcon: Assets.assetsIcons3GangSwitch, deviceIcon: Assets.assetsIcons3GangSwitch,
icon: Assets.assetsAcPower, icon: Assets.assetsAcPower,
@ -1069,7 +1076,7 @@ mixin SceneOperationsDataHelper {
break; break;
case 'switch_3': case 'switch_3':
functions.add(SceneStaticFunction( functions.add(SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: '3 Gang Button Switch L-L', deviceName: '3 Gang Button Switch L-L',
deviceIcon: Assets.assetsIcons3GangSwitch, deviceIcon: Assets.assetsIcons3GangSwitch,
icon: Assets.assetsAcPower, icon: Assets.assetsAcPower,
@ -1093,7 +1100,7 @@ mixin SceneOperationsDataHelper {
break; break;
case 'countdown_1': case 'countdown_1':
functions.add(SceneStaticFunction( functions.add(SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: '3 Gang Button Switch L-L', deviceName: '3 Gang Button Switch L-L',
deviceIcon: Assets.assetsIcons3GangSwitch, deviceIcon: Assets.assetsIcons3GangSwitch,
icon: Assets.assetsLightCountdown, icon: Assets.assetsLightCountdown,
@ -1107,7 +1114,7 @@ mixin SceneOperationsDataHelper {
break; break;
case 'countdown_2': case 'countdown_2':
functions.add(SceneStaticFunction( functions.add(SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: '3 Gang Button Switch L-L', deviceName: '3 Gang Button Switch L-L',
deviceIcon: Assets.assetsIcons3GangSwitch, deviceIcon: Assets.assetsIcons3GangSwitch,
icon: Assets.assetsLightCountdown, icon: Assets.assetsLightCountdown,
@ -1121,7 +1128,7 @@ mixin SceneOperationsDataHelper {
break; break;
case 'countdown_3': case 'countdown_3':
functions.add(SceneStaticFunction( functions.add(SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: '3 Gang Button Switch L-L', deviceName: '3 Gang Button Switch L-L',
deviceIcon: Assets.assetsIcons3GangSwitch, deviceIcon: Assets.assetsIcons3GangSwitch,
icon: Assets.assetsLightCountdown, icon: Assets.assetsLightCountdown,
@ -1135,7 +1142,7 @@ mixin SceneOperationsDataHelper {
break; break;
case 'switch': case 'switch':
functions.add(SceneStaticFunction( functions.add(SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Smart AC Thermostat - Grey - Model A', deviceName: 'Smart AC Thermostat - Grey - Model A',
deviceIcon: Assets.assetsIconsAC, deviceIcon: Assets.assetsIconsAC,
icon: Assets.assetsAcPower, icon: Assets.assetsAcPower,
@ -1158,14 +1165,14 @@ mixin SceneOperationsDataHelper {
break; break;
case 'temp_set': case 'temp_set':
functions.add(SceneStaticFunction( functions.add(SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Smart AC Thermostat - Grey - Model A', deviceName: 'Smart AC Thermostat - Grey - Model A',
deviceIcon: Assets.assetsIconsAC, deviceIcon: Assets.assetsIconsAC,
icon: Assets.assetsTempreture, icon: Assets.assetsTempreture,
operationName: 'Set Temperature', operationName: 'Set Temperature',
code: 'temp_set', code: 'temp_set',
functionValue: executorProperty.functionValue != null functionValue: executorProperty.functionValue != null
? ((executorProperty.functionValue / 10) as double).toInt() ? ((executorProperty.functionValue! / 10) as double).toInt()
: null, : null,
operationalValues: [ operationalValues: [
SceneOperationalValue( SceneOperationalValue(
@ -1178,7 +1185,7 @@ mixin SceneOperationsDataHelper {
break; break;
case 'mode': case 'mode':
functions.add(SceneStaticFunction( functions.add(SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Smart AC Thermostat - Grey - Model A', deviceName: 'Smart AC Thermostat - Grey - Model A',
deviceIcon: Assets.assetsIconsAC, deviceIcon: Assets.assetsIconsAC,
icon: Assets.assetsFreezing, icon: Assets.assetsFreezing,
@ -1206,7 +1213,7 @@ mixin SceneOperationsDataHelper {
break; break;
case 'level': case 'level':
functions.add(SceneStaticFunction( functions.add(SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Smart AC Thermostat - Grey - Model A', deviceName: 'Smart AC Thermostat - Grey - Model A',
deviceIcon: Assets.assetsIconsAC, deviceIcon: Assets.assetsIconsAC,
icon: Assets.assetsFanSpeed, icon: Assets.assetsFanSpeed,
@ -1239,7 +1246,7 @@ mixin SceneOperationsDataHelper {
break; break;
case 'child_lock': case 'child_lock':
functions.add(SceneStaticFunction( functions.add(SceneStaticFunction(
deviceId: deviceId, deviceId: action.entityId,
deviceName: 'Smart AC Thermostat - Grey - Model A', deviceName: 'Smart AC Thermostat - Grey - Model A',
deviceIcon: Assets.assetsIconsAC, deviceIcon: Assets.assetsIconsAC,
icon: Assets.assetsChildLock, icon: Assets.assetsChildLock,
@ -1267,6 +1274,11 @@ mixin SceneOperationsDataHelper {
return functions; return functions;
} }
///// END of get fucntion for once device based on the CODE ***** ///////
///
///
///
List<SceneStaticFunction> getOperationsForOneFunction({ List<SceneStaticFunction> getOperationsForOneFunction({
required String deviceId, required String deviceId,
required SceneStaticFunction taskItem, required SceneStaticFunction taskItem,

View File

@ -183,9 +183,9 @@ class CreateSceneExecutorProperty {
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {
'functionCode': functionCode, if (functionCode.isNotEmpty == true) 'functionCode': functionCode,
'functionValue': functionValue, if (functionValue != '') 'functionValue': functionValue,
'delaySeconds': delaySeconds, if (delaySeconds > 0) 'delaySeconds': delaySeconds,
}; };
} }

View File

@ -81,8 +81,8 @@ class ExecutorProperty {
factory ExecutorProperty.fromJson(Map<String, dynamic> json) => factory ExecutorProperty.fromJson(Map<String, dynamic> json) =>
ExecutorProperty( ExecutorProperty(
functionCode: json["functionCode"] ?? '', functionCode: json["functionCode"] ?? '',
functionValue: json["functionValue"], functionValue: json["functionValue"] ?? '',
delaySeconds: json["delaySeconds"], delaySeconds: json["delaySeconds"] ?? 0,
); );
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {

View File

@ -46,9 +46,7 @@ class DeviceFunctionsView extends StatelessWidget
actions: [ actions: [
TextButton( TextButton(
onPressed: () { onPressed: () {
context context.read<CreateSceneBloc>().add(AddTaskEvent());
.read<CreateSceneBloc>()
.add(const AddTaskEvent(updateTaskListFromTemp: true));
Navigator.popUntil(context, (route) { Navigator.popUntil(context, (route) {
return route.settings.name == Routes.sceneTasksRoute; return route.settings.name == Routes.sceneTasksRoute;
}); });
@ -62,7 +60,19 @@ class DeviceFunctionsView extends StatelessWidget
], ],
leading: TextButton( leading: TextButton(
onPressed: () { onPressed: () {
context.read<CreateSceneBloc>().add(const ClearTaskListEvent()); final selectedValue =
context.read<CreateSceneBloc>().selectedValues;
for (var element in device.functions) {
if (selectedValue.containsKey(element.code)) {
context
.read<CreateSceneBloc>()
.add(RemoveTempTaskByIdEvent(code: element.code!));
context
.read<CreateSceneBloc>()
.add(RemoveFromSelectedValueById(code: element.code!));
}
}
Navigator.pop(context); Navigator.pop(context);
}, },
child: BodyMedium( child: BodyMedium(
@ -123,6 +133,7 @@ class DeviceFunctionsView extends StatelessWidget
final functionValues = context final functionValues = context
.read<CreateSceneBloc>() .read<CreateSceneBloc>()
.selectedValues[functions[index].code]; .selectedValues[functions[index].code];
context.customAlertDialog( context.customAlertDialog(
alertBody: functions[index].code == 'temp_set' alertBody: functions[index].code == 'temp_set'
? AlertDialogTemperatureBody( ? AlertDialogTemperatureBody(
@ -154,6 +165,9 @@ class DeviceFunctionsView extends StatelessWidget
final selectedValue = context final selectedValue = context
.read<CreateSceneBloc>() .read<CreateSceneBloc>()
.selectedValues[functions[index].code]; .selectedValues[functions[index].code];
if (selectedValue == null) {
return;
}
context context
.read<CreateSceneBloc>() .read<CreateSceneBloc>()
.add(TempHoldSceneTasksEvent( .add(TempHoldSceneTasksEvent(
@ -174,22 +188,22 @@ class DeviceFunctionsView extends StatelessWidget
final tempTaskList = context final tempTaskList = context
.read<CreateSceneBloc>() .read<CreateSceneBloc>()
.tempTasksList; .tempTasksList;
if (tempTaskList.isEmpty) { // if (tempTaskList.isEmpty) {
context // context
.read<CreateSceneBloc>() // .read<CreateSceneBloc>()
.add(const ClearTempTaskListEvent()); // .add(const ClearTempTaskListEvent());
} else { // } else {
for (var element in tempTaskList) { for (var element in tempTaskList) {
if (element.code == functions[index].code) { if (element.code == functions[index].code) {
context.read<CreateSceneBloc>().add( context.read<CreateSceneBloc>().add(
RemoveTempTaskByIdEvent( RemoveTempTaskByIdEvent(
code: functions[index].code)); code: functions[index].code));
context.read<CreateSceneBloc>().add( context.read<CreateSceneBloc>().add(
RemoveFromSelectedValueById( RemoveFromSelectedValueById(
code: functions[index].code)); code: functions[index].code));
}
} }
} }
//}
Navigator.pop(context); Navigator.pop(context);
}, },
); );

View File

@ -33,11 +33,14 @@ class SceneTasksView extends StatelessWidget {
SizedBox( SizedBox(
width: 40, width: 40,
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: sceneSettings.sceneName.isEmpty
context.customBottomSheet( ? null
child: DeleteBottomSheetContent(sceneId: sceneSettings.sceneId), : () {
); context.customBottomSheet(
}, child: DeleteBottomSheetContent(
sceneId: sceneSettings.sceneId),
);
},
child: SvgPicture.asset( child: SvgPicture.asset(
Assets.assetsIconsSettings, Assets.assetsIconsSettings,
colorFilter: const ColorFilter.mode( colorFilter: const ColorFilter.mode(

View File

@ -7,6 +7,7 @@ import 'package:syncrow_app/features/scene/bloc/scene_bloc/scene_event.dart';
import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_grid_view.dart'; import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_grid_view.dart';
import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_header.dart'; import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_header.dart';
import 'package:syncrow_app/features/shared_widgets/create_unit.dart'; import 'package:syncrow_app/features/shared_widgets/create_unit.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/utils/context_extension.dart'; import 'package:syncrow_app/utils/context_extension.dart';
@ -16,8 +17,8 @@ class SceneView extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocProvider( return BlocProvider(
create: (BuildContext context) => SceneBloc() create: (BuildContext context) =>
..add(LoadScenes(HomeCubit.getInstance().selectedSpace!.id!)), SceneBloc()..add(LoadScenes(HomeCubit.getInstance().selectedSpace?.id ?? '')),
child: BlocBuilder<CreateSceneBloc, CreateSceneState>( child: BlocBuilder<CreateSceneBloc, CreateSceneState>(
builder: (context, state) { builder: (context, state) {
if (state is DeleteSceneSuccess) { if (state is DeleteSceneSuccess) {
@ -26,12 +27,17 @@ class SceneView extends StatelessWidget {
.add(LoadScenes(HomeCubit.getInstance().selectedSpace!.id!)); .add(LoadScenes(HomeCubit.getInstance().selectedSpace!.id!));
} }
} }
if (state is CreateSceneWithTasks) {
if (state.success == true) {
BlocProvider.of<SceneBloc>(context)
.add(LoadScenes(HomeCubit.getInstance().selectedSpace!.id!));
}
}
return BlocListener<SceneBloc, SceneState>( return BlocListener<SceneBloc, SceneState>(
listener: (context, state) { listener: (context, state) {
if (state is SceneTriggerSuccess) { if (state is SceneTriggerSuccess) {
context.showCustomSnackbar( context.showCustomSnackbar(
message: message: 'Scene ${state.sceneName} triggered successfully!');
'Scene ${state.sceneName} triggered successfully!');
} }
}, },
child: HomeCubit.getInstance().spaces?.isEmpty ?? true child: HomeCubit.getInstance().spaces?.isEmpty ?? true
@ -55,12 +61,22 @@ class SceneView extends StatelessWidget {
); );
} }
if (state is SceneLoaded) { if (state is SceneLoaded) {
return Expanded( if (state.scenes.isNotEmpty) {
child: SceneGrid( return Expanded(
scenes: state.scenes, child: SceneGrid(
loadingSceneId: state.loadingSceneId, scenes: state.scenes,
), loadingSceneId: state.loadingSceneId,
); ),
);
} else {
return const Expanded(
child: Center(
child: BodyMedium(
text: 'No scenes have been added yet',
),
),
);
}
} }
return const SizedBox(); return const SizedBox();

View File

@ -61,7 +61,10 @@ class _AlertDialogCountdownState extends State<AlertDialogCountdown> {
durationInSeconds = newDuration.inSeconds; durationInSeconds = newDuration.inSeconds;
}); });
context.read<CreateSceneBloc>().add(SelectedValueEvent( context.read<CreateSceneBloc>().add(SelectedValueEvent(
value: newDuration.inSeconds, code: widget.function.code)); value: newDuration.inSeconds,
code: widget.function.deviceId == 'delay'
? 'delay'
: widget.function.code));
}, },
), ),
); );

View File

@ -29,9 +29,10 @@ class _AlertDialogFunctionsOperationsBodyState
didChangeDependencies() { didChangeDependencies() {
super.didChangeDependencies(); super.didChangeDependencies();
final tempTaskList = context.read<CreateSceneBloc>().tempTasksList; final tempTaskList = context.read<CreateSceneBloc>().tempTasksList;
if (tempTaskList.isEmpty) {
context.read<CreateSceneBloc>().add(const ClearTempTaskListEvent());
} else if (tempTaskList.isNotEmpty) {
if (tempTaskList.isNotEmpty) {
for (var element in tempTaskList) { for (var element in tempTaskList) {
if (element.code == widget.functions[widget.index].code) { if (element.code == widget.functions[widget.index].code) {
groupValue = element.functionValue; groupValue = element.functionValue;

View File

@ -95,7 +95,7 @@ class CustomBottomSheetWidget extends StatelessWidget {
deviceName: 'Delay The Action', deviceName: 'Delay The Action',
icon: '', icon: '',
operationName: 'Delay The Action', operationName: 'Delay The Action',
code: 'delay', code: '',
functionValue: 0, functionValue: 0,
operationalValues: [ operationalValues: [
SceneOperationalValue(icon: '', value: 0), SceneOperationalValue(icon: '', value: 0),
@ -111,11 +111,11 @@ class CustomBottomSheetWidget extends StatelessWidget {
title: functions[0].operationName, title: functions[0].operationName,
onConfirm: () { onConfirm: () {
final selectedValue = final selectedValue =
context.read<CreateSceneBloc>().selectedValues[functions[0].code]; context.read<CreateSceneBloc>().selectedValues['delay'];
context.read<CreateSceneBloc>().add(TempHoldSceneTasksEvent( context.read<CreateSceneBloc>().add(TempHoldSceneTasksEvent(
deviceControlModel: DeviceControlModel( deviceControlModel: DeviceControlModel(
deviceId: 'delay', deviceId: '',
code: functions[0].code, code: '',
value: selectedValue, value: selectedValue,
), ),
deviceId: 'delay', deviceId: 'delay',
@ -124,27 +124,26 @@ class CustomBottomSheetWidget extends StatelessWidget {
deviceName: 'Delay The Action', deviceName: 'Delay The Action',
uniqueId: functions[0].uniqueCustomId, uniqueId: functions[0].uniqueCustomId,
)); ));
context context.read<CreateSceneBloc>().add(AddTaskEvent());
.read<CreateSceneBloc>() Navigator.pop(context);
.add(const AddTaskEvent(updateTaskListFromTemp: true));
Navigator.pop(context); Navigator.pop(context);
}, },
onDismiss: () { onDismiss: () {
final tempTaskList = context.read<CreateSceneBloc>().tempTasksList; final tempTaskList = context.read<CreateSceneBloc>().tempTasksList;
if (tempTaskList.isEmpty) { // if (tempTaskList.isNotEmpty) {
context.read<CreateSceneBloc>().add(const ClearTempTaskListEvent()); // context.read<CreateSceneBloc>().add(const ClearTempTaskListEvent());
} else { // } else {
for (var element in tempTaskList) { for (var element in tempTaskList) {
if (element.code == functions[0].code) { if (element.code == functions[0].code) {
context context
.read<CreateSceneBloc>() .read<CreateSceneBloc>()
.add(RemoveTempTaskByIdEvent(code: functions[0].code)); .add(RemoveTempTaskByIdEvent(code: functions[0].code));
context context
.read<CreateSceneBloc>() .read<CreateSceneBloc>()
.add(RemoveFromSelectedValueById(code: functions[0].code)); .add(RemoveFromSelectedValueById(code: functions[0].code));
}
} }
} }
// }
Navigator.pop(context); Navigator.pop(context);
}, },
); );

View File

@ -45,7 +45,6 @@ class _CreateSceneSaveButtonState extends State<CreateSceneSaveButton>
if (state.success == true) { if (state.success == true) {
Navigator.pop(context); Navigator.pop(context);
Navigator.pop(context); Navigator.pop(context);
context.showCustomSnackbar( context.showCustomSnackbar(
message: 'Scene created successfully', message: 'Scene created successfully',
icon: const Icon( icon: const Icon(
@ -123,7 +122,7 @@ class _CreateSceneSaveButtonState extends State<CreateSceneSaveButton>
), ),
isLoading: state is CreateSceneLoading, isLoading: state is CreateSceneLoading,
child: BodyLarge( child: BodyLarge(
text: 'Save', text: widget.sceneName.isNotEmpty ? 'Update' : 'Save',
style: context.bodyLarge.copyWith(color: Colors.white), style: context.bodyLarge.copyWith(color: Colors.white),
), ),
); );

View File

@ -33,7 +33,8 @@ class ThenAddedTasksContainer extends StatelessWidget
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
String operationValue = ''; String operationValue = '';
if (taskItem.code.contains('countdown')) { if (taskItem.code.contains('countdown') ||
taskItem.deviceId.contains('delay')) {
final functionValue = final functionValue =
taskItem.functionValue ?? taskItem.operationalValues.first.value; taskItem.functionValue ?? taskItem.operationalValues.first.value;
final duration = final duration =

View File

@ -55,6 +55,7 @@ class ThenDefaultContainer extends StatelessWidget {
if (state is CreateSceneLoading) { if (state is CreateSceneLoading) {
return const Center(child: LinearProgressIndicator()); return const Center(child: LinearProgressIndicator());
} }
if (state is AddSceneTask) { if (state is AddSceneTask) {
final taskLists = state.tasksList; final taskLists = state.tasksList;
if (taskLists.isNotEmpty) { if (taskLists.isNotEmpty) {

View File

@ -9,8 +9,7 @@ abstract class ApiEndpoints {
static const String deleteUser = '$baseUrl/authentication/user/delete/{id}'; static const String deleteUser = '$baseUrl/authentication/user/delete/{id}';
static const String sendOtp = '$baseUrl/authentication/user/send-otp'; static const String sendOtp = '$baseUrl/authentication/user/send-otp';
static const String verifyOtp = '$baseUrl/authentication/user/verify-otp'; static const String verifyOtp = '$baseUrl/authentication/user/verify-otp';
static const String forgetPassword = static const String forgetPassword = '$baseUrl/authentication/user/forget-password';
'$baseUrl/authentication/user/forget-password';
////////////////////////////////////// Spaces /////////////////////////////////////// ////////////////////////////////////// Spaces ///////////////////////////////////////
@ -20,12 +19,10 @@ abstract class ApiEndpoints {
static const String addCommunityToUser = '$baseUrl/community/user'; static const String addCommunityToUser = '$baseUrl/community/user';
//GET //GET
static const String communityByUuid = '$baseUrl/community/{communityUuid}'; static const String communityByUuid = '$baseUrl/community/{communityUuid}';
static const String communityChild = static const String communityChild = '$baseUrl/community/child/{communityUuid}';
'$baseUrl/community/child/{communityUuid}';
static const String communityUser = '$baseUrl/community/user/{userUuid}'; static const String communityUser = '$baseUrl/community/user/{userUuid}';
//PUT //PUT
static const String renameCommunity = static const String renameCommunity = '$baseUrl/community/rename/{communityUuid}';
'$baseUrl/community/rename/{communityUuid}';
///Building Module ///Building Module
//POST //POST
@ -34,12 +31,10 @@ abstract class ApiEndpoints {
//GET //GET
static const String buildingByUuid = '$baseUrl/building/{buildingUuid}'; static const String buildingByUuid = '$baseUrl/building/{buildingUuid}';
static const String buildingChild = '$baseUrl/building/child/{buildingUuid}'; static const String buildingChild = '$baseUrl/building/child/{buildingUuid}';
static const String buildingParent = static const String buildingParent = '$baseUrl/building/parent/{buildingUuid}';
'$baseUrl/building/parent/{buildingUuid}';
static const String buildingUser = '$baseUrl/building/user/{userUuid}'; static const String buildingUser = '$baseUrl/building/user/{userUuid}';
//PUT //PUT
static const String renameBuilding = static const String renameBuilding = '$baseUrl/building/rename/{buildingUuid}';
'$baseUrl/building/rename/{buildingUuid}';
///Floor Module ///Floor Module
//POST //POST
@ -62,8 +57,7 @@ abstract class ApiEndpoints {
static const String unitChild = '$baseUrl/unit/child/'; static const String unitChild = '$baseUrl/unit/child/';
static const String unitParent = '$baseUrl/unit/parent/{unitUuid}'; static const String unitParent = '$baseUrl/unit/parent/{unitUuid}';
static const String unitUser = '$baseUrl/unit/user/'; static const String unitUser = '$baseUrl/unit/user/';
static const String invitationCode = static const String invitationCode = '$baseUrl/unit/{unitUuid}/invitation-code';
'$baseUrl/unit/{unitUuid}/invitation-code';
static const String verifyInvitationCode = '$baseUrl/unit/user/verify-code'; static const String verifyInvitationCode = '$baseUrl/unit/user/verify-code';
//PUT //PUT
@ -86,8 +80,7 @@ abstract class ApiEndpoints {
static const String controlGroup = '$baseUrl/group/control'; static const String controlGroup = '$baseUrl/group/control';
//GET //GET
static const String groupBySpace = '$baseUrl/group/{unitUuid}'; static const String groupBySpace = '$baseUrl/group/{unitUuid}';
static const String devicesByGroupName = static const String devicesByGroupName = '$baseUrl/group/{unitUuid}/devices/{groupName}';
'$baseUrl/group/{unitUuid}/devices/{groupName}';
static const String groupByUuid = '$baseUrl/group/{groupUuid}'; static const String groupByUuid = '$baseUrl/group/{groupUuid}';
//DELETE //DELETE
@ -99,19 +92,16 @@ abstract class ApiEndpoints {
static const String addDeviceToRoom = '$baseUrl/device/room'; static const String addDeviceToRoom = '$baseUrl/device/room';
static const String addDeviceToGroup = '$baseUrl/device/group'; static const String addDeviceToGroup = '$baseUrl/device/group';
static const String controlDevice = '$baseUrl/device/{deviceUuid}/control'; static const String controlDevice = '$baseUrl/device/{deviceUuid}/control';
static const String firmwareDevice = static const String firmwareDevice = '$baseUrl/device/{deviceUuid}/firmware/{firmwareVersion}';
'$baseUrl/device/{deviceUuid}/firmware/{firmwareVersion}';
static const String getDevicesByUserId = '$baseUrl/device/user/{userId}'; static const String getDevicesByUserId = '$baseUrl/device/user/{userId}';
static const String getDevicesByUnitId = '$baseUrl/device/unit/{unitUuid}';
//GET //GET
static const String deviceByRoom = '$baseUrl/device/room'; static const String deviceByRoom = '$baseUrl/device/room';
static const String deviceByUuid = '$baseUrl/device/{deviceUuid}'; static const String deviceByUuid = '$baseUrl/device/{deviceUuid}';
static const String deviceFunctions = static const String deviceFunctions = '$baseUrl/device/{deviceUuid}/functions';
'$baseUrl/device/{deviceUuid}/functions'; static const String gatewayApi = '$baseUrl/device/gateway/{gatewayUuid}/devices';
static const String gatewayApi = static const String deviceFunctionsStatus = '$baseUrl/device/{deviceUuid}/functions/status';
'$baseUrl/device/gateway/{gatewayUuid}/devices';
static const String deviceFunctionsStatus =
'$baseUrl/device/{deviceUuid}/functions/status';
///Device Permission Module ///Device Permission Module
//POST //POST
@ -119,16 +109,14 @@ abstract class ApiEndpoints {
//GET //GET
static const String devicePermissionList = '$baseUrl/device-permission/list'; static const String devicePermissionList = '$baseUrl/device-permission/list';
//PUT //PUT
static const String editDevicePermission = static const String editDevicePermission = '$baseUrl/device-permission/edit/{userId}';
'$baseUrl/device-permission/edit/{userId}';
static const String assignDeviceToRoom = '$baseUrl/device/room'; static const String assignDeviceToRoom = '$baseUrl/device/room';
/// Scene API //////////////////// /// Scene API ////////////////////
/// POST /// POST
static const String createScene = '$baseUrl/scene/tap-to-run'; static const String createScene = '$baseUrl/scene/tap-to-run';
static const String triggerScene = static const String triggerScene = '$baseUrl/scene/tap-to-run/trigger/{sceneId}';
'$baseUrl/scene/tap-to-run/trigger/{sceneId}';
/// GET /// GET
static const String getUnitScenes = '$baseUrl/scene/tap-to-run/{unitUuid}'; static const String getUnitScenes = '$baseUrl/scene/tap-to-run/{unitUuid}';
@ -139,8 +127,7 @@ abstract class ApiEndpoints {
static const String updateScene = '$baseUrl/scene/tap-to-run/{sceneId}'; static const String updateScene = '$baseUrl/scene/tap-to-run/{sceneId}';
/// DELETE /// DELETE
static const String deleteScene = static const String deleteScene = '$baseUrl/scene/tap-to-run/{unitUuid}/{sceneId}';
'$baseUrl/scene/tap-to-run/{unitUuid}/{sceneId}';
//////////////////////Door Lock ////////////////////// //////////////////////Door Lock //////////////////////
//online //online

View File

@ -1,4 +1,5 @@
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/auth/model/user_model.dart'; import 'package:syncrow_app/features/auth/model/user_model.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/services/api/api_links_endpoints.dart'; import 'package:syncrow_app/services/api/api_links_endpoints.dart';
@ -23,6 +24,20 @@ class HomeManagementAPI {
return list; return list;
} }
static Future<List<DeviceModel>> fetchDevicesByUnitId() async {
List<DeviceModel> list = [];
await _httpService.get(
path: ApiEndpoints.getDevicesByUnitId
.replaceAll("{unitUuid}", HomeCubit.getInstance().selectedSpace?.id ?? ''),
showServerMessage: false,
expectedResponseModel: (json) {
json.forEach((value) {
list.add(DeviceModel.fromJson(value));
});
});
return list;
}
static Future<Map<String, dynamic>> assignDeviceToRoom(Map<String, String> body) async { static Future<Map<String, dynamic>> assignDeviceToRoom(Map<String, String> body) async {
try { try {
final response = await _httpService.put( final response = await _httpService.put(

View File

@ -5,7 +5,7 @@ description: This is the mobile application project, developed with Flutter for
# pub.dev using `flutter pub publish`. This is preferred for private packages. # pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: "none" # Remove this line if you wish to publish to pub.dev publish_to: "none" # Remove this line if you wish to publish to pub.dev
version: 1.0.8+9 version: 1.0.0+10
environment: environment:
sdk: ">=3.0.6 <4.0.0" sdk: ">=3.0.6 <4.0.0"