From 769be41855849cbcbfd77234c9ba71a0bcf96d2b Mon Sep 17 00:00:00 2001 From: mohammad Date: Sun, 27 Oct 2024 17:16:37 +0300 Subject: [PATCH 1/4] con setting --- .../bloc/create_scene/create_scene_bloc.dart | 111 ++++-- .../bloc/create_scene/create_scene_event.dart | 2 + .../bloc/create_scene/create_scene_state.dart | 5 + lib/features/scene/model/icon_model.dart | 39 ++ .../scene/model/scene_details_model.dart | 1 + .../scene/view/scene_auto_settings.dart | 363 +++++++++++++++--- lib/services/api/api_links_endpoints.dart | 1 + lib/services/api/scene_api.dart | 18 + pubspec.yaml | 2 +- 9 files changed, 454 insertions(+), 88 deletions(-) create mode 100644 lib/features/scene/model/icon_model.dart diff --git a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart index 0a52b02..b21ef5c 100644 --- a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart +++ b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart @@ -10,6 +10,7 @@ import 'package:syncrow_app/features/scene/enum/operation_dialog_type.dart'; import 'package:syncrow_app/features/scene/helper/scene_operations_data_helper.dart'; import 'package:syncrow_app/features/scene/model/create_automation_model.dart'; import 'package:syncrow_app/features/scene/model/create_scene_model.dart'; +import 'package:syncrow_app/features/scene/model/icon_model.dart'; import 'package:syncrow_app/features/scene/model/scene_static_function.dart'; import 'package:syncrow_app/navigation/navigation_service.dart'; import 'package:syncrow_app/services/api/scene_api.dart'; @@ -36,6 +37,7 @@ class CreateSceneBloc extends Bloc on(_selectConditionRule); on(_sceneTypeEvent); on(_onEffectiveTimeEvent); + on(_fetchIconScene); } CreateSceneEnum sceneType = CreateSceneEnum.none; @@ -53,7 +55,8 @@ class CreateSceneBloc extends Bloc String conditionRule = 'or'; EffectiveTime? effectiveTime; - FutureOr _onAddSceneTask(AddTaskEvent event, Emitter emit) { + FutureOr _onAddSceneTask( + AddTaskEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { final copyList = List.from(automationTempTasksList); @@ -88,7 +91,8 @@ class CreateSceneBloc extends Bloc } } - void addToTempTaskList(TempHoldSceneTasksEvent event, Emitter emit) { + void addToTempTaskList( + TempHoldSceneTasksEvent event, Emitter emit) { emit(CreateSceneLoading()); bool updated = false; @@ -173,7 +177,8 @@ class CreateSceneBloc extends Bloc )); } - void addToTempAutomationTaskList(TempHoldSceneTasksEvent event, Emitter emit) { + void addToTempAutomationTaskList( + TempHoldSceneTasksEvent event, Emitter emit) { emit(CreateSceneLoading()); bool updated = false; for (var element in automationTempTasksList) { @@ -195,8 +200,10 @@ class CreateSceneBloc extends Bloc ], comparator: automationComparatorValues[element.code], ); - automationTempTasksList[automationTempTasksList.indexOf(element)] = updatedElement; - automationSelectedValues[updatedElement.code] = event.deviceControlModel.value; + automationTempTasksList[automationTempTasksList.indexOf(element)] = + updatedElement; + automationSelectedValues[updatedElement.code] = + event.deviceControlModel.value; updated = true; break; } @@ -216,10 +223,12 @@ class CreateSceneBloc extends Bloc icon: '', ), ], - comparator: automationComparatorValues[event.deviceControlModel.code] ?? '==', + comparator: + automationComparatorValues[event.deviceControlModel.code] ?? '==', ); automationTempTasksList.add(newElement); - automationSelectedValues[newElement.code] = event.deviceControlModel.value; + automationSelectedValues[newElement.code] = + event.deviceControlModel.value; } emit(AddSceneTask( tasksList: tasksList, @@ -228,7 +237,8 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _selectedValue(SelectedValueEvent event, Emitter emit) { + FutureOr _selectedValue( + SelectedValueEvent event, Emitter emit) { if (event.isAutomation == true) { automationSelectedValues[event.code] = event.value; automationComparatorValues[event.code] = event.comparator ?? '=='; @@ -265,7 +275,8 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _removeTaskById(RemoveTaskByIdEvent event, Emitter emit) { + FutureOr _removeTaskById( + RemoveTaskByIdEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { for (var element in automationTasksList) { @@ -338,7 +349,8 @@ class CreateSceneBloc extends Bloc : await SceneApi.createScene(event.createSceneModel!); } else if (event.createAutomationModel != null) { response = event.updateScene - ? await SceneApi.updateAutomation(event.createAutomationModel!, event.sceneId) + ? await SceneApi.updateAutomation( + event.createAutomationModel!, event.sceneId) : await SceneApi.createAutomation(event.createAutomationModel!); } @@ -350,12 +362,14 @@ class CreateSceneBloc extends Bloc automationTempTasksList.clear(); automationSelectedValues.clear(); automationComparatorValues.clear(); - effectiveTime = EffectiveTime(start: '00:00', end: '23:59', loops: '1111111'); + effectiveTime = + EffectiveTime(start: '00:00', end: '23:59', loops: '1111111'); sceneType = CreateSceneEnum.none; conditionRule = 'or'; emit(const CreateSceneWithTasks(success: true)); - CustomSnackBar.greenSnackBar( - event.updateScene ? 'Scene updated successfully' : 'Scene created successfully'); + CustomSnackBar.greenSnackBar(event.updateScene + ? 'Scene updated successfully' + : 'Scene created successfully'); } else { emit(const CreateSceneError(message: 'Something went wrong')); } @@ -369,7 +383,8 @@ class CreateSceneBloc extends Bloc } } - FutureOr _clearTaskList(ClearTaskListEvent event, Emitter emit) { + FutureOr _clearTaskList( + ClearTaskListEvent event, Emitter emit) { emit(CreateSceneLoading()); automationTasksList.clear(); tasksList.clear(); @@ -392,7 +407,8 @@ class CreateSceneBloc extends Bloc automationTempTasksList.clear(); automationSelectedValues.clear(); automationComparatorValues.clear(); - effectiveTime = EffectiveTime(start: '00:00', end: '23:59', loops: '1111111'); + effectiveTime = + EffectiveTime(start: '00:00', end: '23:59', loops: '1111111'); sceneType = CreateSceneEnum.none; conditionRule = 'or'; @@ -401,10 +417,14 @@ class CreateSceneBloc extends Bloc : await SceneApi.getSceneDetails(event.sceneId); if (response.id.isNotEmpty) { if (event.isAutomation) { - automationTasksList = List.from(getTaskListFunctionsFromApi( - actions: [], isAutomation: true, conditions: response.conditions)); + automationTasksList = List.from( + getTaskListFunctionsFromApi( + actions: [], + isAutomation: true, + conditions: response.conditions)); tasksList = List.from( - getTaskListFunctionsFromApi(actions: response.actions, isAutomation: false)); + getTaskListFunctionsFromApi( + actions: response.actions, isAutomation: false)); conditionRule = response.decisionExpr ?? conditionRule; @@ -417,11 +437,13 @@ class CreateSceneBloc extends Bloc : EffectiveTime(start: '00:00', end: '23:59', loops: '1111111'); // Set the days directly from the API response - BlocProvider.of(NavigationService.navigatorKey.currentContext!) + BlocProvider.of( + NavigationService.navigatorKey.currentContext!) .add(SetDays(response.effectiveTime?.loops ?? '1111111')); // Set Custom Time and reset days first - BlocProvider.of(NavigationService.navigatorKey.currentContext!) + BlocProvider.of( + NavigationService.navigatorKey.currentContext!) .add(SetCustomTime(effectiveTime!.start, effectiveTime!.end)); emit(AddSceneTask( @@ -431,7 +453,8 @@ class CreateSceneBloc extends Bloc )); } else { tasksList = List.from( - getTaskListFunctionsFromApi(actions: response.actions, isAutomation: false)); + getTaskListFunctionsFromApi( + actions: response.actions, isAutomation: false)); emit(AddSceneTask( tasksList: tasksList, condition: conditionRule, @@ -445,12 +468,35 @@ class CreateSceneBloc extends Bloc } } + ///scene/icon + /// +List iconModel = []; + +FutureOr _fetchIconScene( + SceneIconEvent event, Emitter emit) async { + emit(CreateSceneLoading()); + try { + final response = await SceneApi.getIcon(); + + // Parse the response as a List of IconModel + iconModel = (response as List) + .map((iconJson) => IconModel.fromJson(iconJson as Map)) + .toList(); + + emit(CreateSceneLoaded(iconModel)); // Ensure this state is defined to handle the loaded list + } catch (e) { + emit(const CreateSceneError(message: 'Something went wrong')); + } +} + + String _getDayFromIndex(int index) { const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; return days[index]; } - FutureOr _clearTempTaskList(ClearTempTaskListEvent event, Emitter emit) { + FutureOr _clearTempTaskList( + ClearTempTaskListEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { automationTempTasksList.clear(); @@ -494,13 +540,17 @@ class CreateSceneBloc extends Bloc } } - FutureOr _deleteScene(DeleteSceneEvent event, Emitter emit) async { + FutureOr _deleteScene( + DeleteSceneEvent event, Emitter emit) async { emit(DeleteSceneLoading()); try { - final response = sceneType.name == CreateSceneEnum.deviceStatusChanges.name - ? await SceneApi.deleteAutomation(automationId: event.sceneId, unitUuid: event.unitUuid) - : await SceneApi.deleteScene(sceneId: event.sceneId, unitUuid: event.unitUuid); + final response = + sceneType.name == CreateSceneEnum.deviceStatusChanges.name + ? await SceneApi.deleteAutomation( + automationId: event.sceneId, unitUuid: event.unitUuid) + : await SceneApi.deleteScene( + sceneId: event.sceneId, unitUuid: event.unitUuid); if (response == true) { emit(const DeleteSceneSuccess(true)); } else { @@ -511,7 +561,8 @@ class CreateSceneBloc extends Bloc } } - FutureOr _updateTaskValue(UpdateTaskEvent event, Emitter emit) { + FutureOr _updateTaskValue( + UpdateTaskEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { for (var i = 0; i < automationTasksList.length; i++) { @@ -547,7 +598,8 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _selectConditionRule(SelectConditionEvent event, Emitter emit) { + FutureOr _selectConditionRule( + SelectConditionEvent event, Emitter emit) { emit(CreateSceneInitial()); if (event.condition.contains('any')) { conditionRule = 'or'; @@ -562,7 +614,8 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _sceneTypeEvent(SceneTypeEvent event, Emitter emit) { + FutureOr _sceneTypeEvent( + SceneTypeEvent event, Emitter emit) { // emit(CreateSceneInitial()); if (event.type == CreateSceneEnum.tabToRun) { diff --git a/lib/features/scene/bloc/create_scene/create_scene_event.dart b/lib/features/scene/bloc/create_scene/create_scene_event.dart index 74046bd..bdff773 100644 --- a/lib/features/scene/bloc/create_scene/create_scene_event.dart +++ b/lib/features/scene/bloc/create_scene/create_scene_event.dart @@ -183,3 +183,5 @@ class EffectiveTimePeriodEvent extends CreateSceneEvent { final EffectiveTime period; const EffectiveTimePeriodEvent(this.period); } + +class SceneIconEvent extends CreateSceneEvent {} diff --git a/lib/features/scene/bloc/create_scene/create_scene_state.dart b/lib/features/scene/bloc/create_scene/create_scene_state.dart index 4108738..d3e95c6 100644 --- a/lib/features/scene/bloc/create_scene/create_scene_state.dart +++ b/lib/features/scene/bloc/create_scene/create_scene_state.dart @@ -84,3 +84,8 @@ class SceneTypeState extends CreateSceneState { final CreateSceneEnum type; const SceneTypeState(this.type); } + +class CreateSceneLoaded extends CreateSceneState { + final List iconModels; + CreateSceneLoaded(this.iconModels); +} diff --git a/lib/features/scene/model/icon_model.dart b/lib/features/scene/model/icon_model.dart new file mode 100644 index 0000000..70f15e8 --- /dev/null +++ b/lib/features/scene/model/icon_model.dart @@ -0,0 +1,39 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +class IconModel { + final String uuid; + final DateTime createdAt; + final DateTime updatedAt; + final String iconBase64; + + IconModel({ + required this.uuid, + required this.createdAt, + required this.updatedAt, + required this.iconBase64, + }); + + // Method to decode the icon from Base64 and return as Uint8List + Uint8List get iconBytes => base64Decode(iconBase64); + + // Factory constructor to create an instance from JSON + factory IconModel.fromJson(Map json) { + return IconModel( + uuid: json['uuid'] as String, + createdAt: DateTime.parse(json['createdAt'] as String), + updatedAt: DateTime.parse(json['updatedAt'] as String), + iconBase64: json['icon'] as String, + ); + } + + // Method to convert an instance back to JSON + Map toJson() { + return { + 'uuid': uuid, + 'createdAt': createdAt.toIso8601String(), + 'updatedAt': updatedAt.toIso8601String(), + 'icon': iconBase64, + }; + } +} diff --git a/lib/features/scene/model/scene_details_model.dart b/lib/features/scene/model/scene_details_model.dart index 646b3b1..bd1e87c 100644 --- a/lib/features/scene/model/scene_details_model.dart +++ b/lib/features/scene/model/scene_details_model.dart @@ -53,6 +53,7 @@ class SceneDetailsModel { "name": name, "status": status, "type": type, + "actions": List.from(actions.map((x) => x.toJson())), "conditions": conditions != null ? List.from(conditions!.map((x) => x.toJson())) diff --git a/lib/features/scene/view/scene_auto_settings.dart b/lib/features/scene/view/scene_auto_settings.dart index af9db38..f61a881 100644 --- a/lib/features/scene/view/scene_auto_settings.dart +++ b/lib/features/scene/view/scene_auto_settings.dart @@ -1,13 +1,15 @@ +import 'dart:typed_data'; + +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart'; import 'package:syncrow_app/features/scene/enum/create_scene_enum.dart'; -import 'package:syncrow_app/features/scene/view/scene_tasks_view.dart'; -import 'package:syncrow_app/features/scene/widgets/effective_period_setting/effective_period_bottom_sheet.dart'; -import 'package:syncrow_app/features/scene/widgets/scene_list_tile.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/utils/context_extension.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; class SceneAutoSettings extends StatelessWidget { @@ -24,69 +26,314 @@ class SceneAutoSettings extends StatelessWidget { final sceneName = sceneSettings['sceneName'] as String? ?? ''; return DefaultScaffold( - title: 'Settings', - padding: EdgeInsets.zero, - leading: IconButton( - onPressed: () { - Navigator.of(context).pop(); - }, - icon: const Icon( - Icons.arrow_back_ios, - )), - child: SizedBox( - height: MediaQuery.sizeOf(context).height, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 16), - child: DefaultContainer( + title: 'Settings', + padding: EdgeInsets.zero, + leading: IconButton( + onPressed: () { + Navigator.of(context).pop(); + }, + icon: const Icon( + Icons.arrow_back_ios, + )), + child: BlocProvider( + create: (BuildContext context) => + CreateSceneBloc()..add(SceneIconEvent()), + child: BlocBuilder( + builder: (context, state) { + return SizedBox( + height: MediaQuery.sizeOf(context).height, child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, children: [ - const SizedBox( - height: 8, - ), - Visibility( - visible: isAutomation, - child: SceneListTile( - padding: const EdgeInsets.symmetric( - horizontal: 16, vertical: 8), - titleString: "Effective Period", - trailingWidget: - const Icon(Icons.arrow_forward_ios_rounded), - onPressed: () { - context.customBottomSheet( - child: const EffectPeriodBottomSheetContent(), - ); - }, + DefaultContainer( + child: Padding( + padding: const EdgeInsets.only( + top: 10, left: 10, right: 10, bottom: 10), + child: Column( + children: [ + InkWell( + onTap: () { + showDialog( + context: context, + builder: (context) { + return SecondDialog( + WidgetList: BlocBuilder( + builder: (context, state) { + if (state is CreateSceneLoading) { + return CircularProgressIndicator(); + } else if (state is CreateSceneLoaded) { + return Container( + height: 100, + width: 100, + child: ListView.builder( + itemCount: + state.iconModels.length, + itemBuilder: (context, index) { + final iconModel = + state.iconModels[index]; + return Image.memory( + iconModel.iconBytes); + }, + ), + ); + } else if (state is CreateSceneError) { + return Text(state.message); + } else { + return Container(); + } + }, + ), + cancelTab: () { + Navigator.of(context).pop(); + }, + confirmTab: (v) { + Navigator.of(context).pop(); + }, + title: 'Icons', + onTapLabel1: (selected) {}, + ); + }, + ); + }, + child: const Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + BodyMedium(text: 'Icons'), + Icon( + Icons.arrow_forward_ios_outlined, + color: ColorsManager.textGray, + size: 15, + ) + ], + ), + ), + const SizedBox( + height: 5, + ), + const Divider( + color: ColorsManager.graysColor, + ), + const SizedBox( + height: 5, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const BodyMedium(text: 'Show on devices page'), + Container( + width: 100, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + height: 30, + width: 1, + color: ColorsManager.graysColor, + ), + Transform.scale( + scale: .8, + child: CupertinoSwitch( + value: true, + onChanged: (value) {}, + applyTheme: true, + ), + ), + ], + ), + ) + ], + ), + const SizedBox( + height: 5, + ), + const Divider( + color: ColorsManager.graysColor, + ), + SizedBox( + height: 5, + ), + const Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + //Cloud + BodyMedium(text: 'Executed by'), + Text('Cloud', + style: TextStyle( + color: ColorsManager.textGray, + )), + ], + ), + ], ), + )), + // Padding( + // padding: const EdgeInsets.symmetric(vertical: 16), + // child: DefaultContainer( + // child: Column( + // mainAxisSize: MainAxisSize.min, + // mainAxisAlignment: MainAxisAlignment.start, + // children: [ + // const SizedBox( + // height: 8, + // ), + // Visibility( + // visible: isAutomation, + // child: SceneListTile( + // padding: const EdgeInsets.symmetric( + // horizontal: 16, vertical: 8), + // titleString: "Effective Period", + // trailingWidget: + // const Icon(Icons.arrow_forward_ios_rounded), + // onPressed: () { + // context.customBottomSheet( + // child: const EffectPeriodBottomSheetContent(), + // ); + // }, + // ), + // ), + // Visibility( + // visible: sceneName.isNotEmpty && isAutomation, + // child: SizedBox( + // width: context.width * 0.9, + // child: const Divider( + // color: ColorsManager.greyColor, + // ), + // ), + // ), + // Visibility( + // visible: sceneName.isNotEmpty, + // child: DeleteBottomSheetContent( + // isAutomation: isAutomation, + // sceneId: sceneId, + // ), + // ), + // const SizedBox( + // height: 16, + // ), + // ], + // ), + // ), + // ), + ], + ), + ); + }))); + } +} + +class SecondDialog extends StatefulWidget { + final String title; + Widget WidgetList; + final Function(String)? onTapLabel1; + final Function()? cancelTab; + final Function(int selectedSecond)? confirmTab; + + SecondDialog({ + required this.WidgetList, + required this.title, + this.onTapLabel1, + required this.cancelTab, + required this.confirmTab, + }); + + @override + _SecondDialogState createState() => _SecondDialogState(); +} + +class _SecondDialogState extends State { + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + contentPadding: EdgeInsets.zero, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox( + height: 10, + ), + BodyLarge( + text: widget.title, + fontWeight: FontWeight.w700, + fontColor: ColorsManager.primaryColor, + fontSize: 16, + ), + const Padding( + padding: EdgeInsets.only(left: 15, right: 15), + child: Divider( + color: ColorsManager.textGray, + ), + ), + Expanded(child: widget.WidgetList), + Row( + children: [ + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + right: BorderSide( + color: ColorsManager.textGray, + width: 0.5, ), - Visibility( - visible: sceneName.isNotEmpty && isAutomation, - child: SizedBox( - width: context.width * 0.9, - child: const Divider( - color: ColorsManager.greyColor, + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: SizedBox( + child: InkWell( + onTap: widget.cancelTab, + child: const Padding( + padding: EdgeInsets.all(15), + child: Center( + child: Text( + 'Cancel', + style: TextStyle( + color: ColorsManager.textGray, + fontSize: 14, + fontWeight: FontWeight.w400), + ), ), ), ), - Visibility( - visible: sceneName.isNotEmpty, - child: DeleteBottomSheetContent( - isAutomation: isAutomation, - sceneId: sceneId, - ), - ), - const SizedBox( - height: 16, - ), - ], + ), ), ), - ), - ], - ), + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + left: BorderSide( + color: ColorsManager.textGray, + width: 0.5, + ), + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: InkWell( + onTap: () {}, + child: const Padding( + padding: EdgeInsets.all(15), + child: Center( + child: Text( + 'Confirm', + style: TextStyle( + color: ColorsManager.primaryColor, + fontSize: 14, + fontWeight: FontWeight.w400), + ), + ), + )), + )) + ], + ) + ], ), ); } diff --git a/lib/services/api/api_links_endpoints.dart b/lib/services/api/api_links_endpoints.dart index 422d312..dfdb653 100644 --- a/lib/services/api/api_links_endpoints.dart +++ b/lib/services/api/api_links_endpoints.dart @@ -128,6 +128,7 @@ abstract class ApiEndpoints { static const String getUnitScenes = '/scene/tap-to-run/{unitUuid}'; static const String getScene = '/scene/tap-to-run/details/{sceneId}'; + static const String getIconScene = '/scene/icon'; static const String getUnitAutomation = '/automation/{unitUuid}'; diff --git a/lib/services/api/scene_api.dart b/lib/services/api/scene_api.dart index e26920c..bfe3e1b 100644 --- a/lib/services/api/scene_api.dart +++ b/lib/services/api/scene_api.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:syncrow_app/features/scene/model/create_automation_model.dart'; import 'package:syncrow_app/features/scene/model/create_scene_model.dart'; import 'package:syncrow_app/features/scene/model/scene_details_model.dart'; @@ -147,6 +149,22 @@ class SceneApi { } } + static Future getIcon() async { + try { + final response = await _httpService.get( + path: ApiEndpoints.getIconScene, + showServerMessage: false, + expectedResponseModel: (json) { + log(json); + return json; + }, + ); + return response; + } catch (e) { + rethrow; + } + } + //update Scene static updateScene(CreateSceneModel createSceneModel, String sceneId) async { try { diff --git a/pubspec.yaml b/pubspec.yaml index a7270f2..7a9778c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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. publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: 1.0.5+31 +version: 1.0.5+33 environment: sdk: ">=3.0.6 <4.0.0" From 7fed2f17af6b01c4ffdb9f1230108f42ecaf48f7 Mon Sep 17 00:00:00 2001 From: mohammad Date: Sun, 27 Oct 2024 17:21:13 +0300 Subject: [PATCH 2/4] icon_settings --- .../bloc/create_scene/create_scene_bloc.dart | 33 +++++++++---------- .../scene/view/scene_auto_settings.dart | 2 -- lib/services/api/scene_api.dart | 3 -- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart index b21ef5c..59cd89e 100644 --- a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart +++ b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart @@ -470,25 +470,24 @@ class CreateSceneBloc extends Bloc ///scene/icon /// -List iconModel = []; + List iconModel = []; -FutureOr _fetchIconScene( - SceneIconEvent event, Emitter emit) async { - emit(CreateSceneLoading()); - try { - final response = await SceneApi.getIcon(); - - // Parse the response as a List of IconModel - iconModel = (response as List) - .map((iconJson) => IconModel.fromJson(iconJson as Map)) - .toList(); - - emit(CreateSceneLoaded(iconModel)); // Ensure this state is defined to handle the loaded list - } catch (e) { - emit(const CreateSceneError(message: 'Something went wrong')); + FutureOr _fetchIconScene( + SceneIconEvent event, Emitter emit) async { + emit(CreateSceneLoading()); + try { + final response = await SceneApi.getIcon(); + iconModel = (response as List) + .map((iconJson) => + IconModel.fromJson(iconJson as Map)) + .toList(); + print(iconModel[0].iconBase64.toString()); + emit(CreateSceneLoaded( + iconModel)); // Ensure this state is defined to handle the loaded list + } catch (e) { + emit(const CreateSceneError(message: 'Something went wrong')); + } } -} - String _getDayFromIndex(int index) { const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; diff --git a/lib/features/scene/view/scene_auto_settings.dart b/lib/features/scene/view/scene_auto_settings.dart index f61a881..2b47ec2 100644 --- a/lib/features/scene/view/scene_auto_settings.dart +++ b/lib/features/scene/view/scene_auto_settings.dart @@ -63,8 +63,6 @@ class SceneAutoSettings extends StatelessWidget { return CircularProgressIndicator(); } else if (state is CreateSceneLoaded) { return Container( - height: 100, - width: 100, child: ListView.builder( itemCount: state.iconModels.length, diff --git a/lib/services/api/scene_api.dart b/lib/services/api/scene_api.dart index bfe3e1b..13511a5 100644 --- a/lib/services/api/scene_api.dart +++ b/lib/services/api/scene_api.dart @@ -133,9 +133,6 @@ class SceneApi { rethrow; } } - - //getScene - static Future getSceneDetails(String sceneId) async { try { final response = await _httpService.get( From 20fdfdde877718fcdfe91db25ede6155b23f4558 Mon Sep 17 00:00:00 2001 From: mohammad Date: Sun, 27 Oct 2024 17:21:35 +0300 Subject: [PATCH 3/4] icon_settings --- lib/features/scene/bloc/create_scene/create_scene_bloc.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart index 59cd89e..b4b55ba 100644 --- a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart +++ b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart @@ -468,8 +468,6 @@ class CreateSceneBloc extends Bloc } } - ///scene/icon - /// List iconModel = []; FutureOr _fetchIconScene( @@ -482,8 +480,7 @@ class CreateSceneBloc extends Bloc IconModel.fromJson(iconJson as Map)) .toList(); print(iconModel[0].iconBase64.toString()); - emit(CreateSceneLoaded( - iconModel)); // Ensure this state is defined to handle the loaded list + emit(CreateSceneLoaded(iconModel)); } catch (e) { emit(const CreateSceneError(message: 'Something went wrong')); } From 3d56f33ec3d95db5d25012115b43f47caf72d84c Mon Sep 17 00:00:00 2001 From: Abdullah Alassaf Date: Mon, 28 Oct 2024 16:45:59 +0300 Subject: [PATCH 4/4] Implemented tab to run setting --- assets/icons/automation_ic.svg | 23 + lib/features/app_layout/bloc/home_cubit.dart | 3 + .../devices/view/widgets/scene_listview.dart | 15 +- .../bloc/create_scene/create_scene_bloc.dart | 186 ++++--- .../bloc/create_scene/create_scene_event.dart | 31 +- .../bloc/create_scene/create_scene_state.dart | 18 +- .../scene/bloc/scene_bloc/scene_bloc.dart | 21 +- .../scene/bloc/scene_bloc/scene_event.dart | 8 +- .../scene/helper/scene_logic_helper.dart | 11 +- .../scene/model/create_scene_model.dart | 35 +- .../scene/model/scene_details_model.dart | 63 ++- lib/features/scene/model/scenes_model.dart | 28 +- .../scene/view/scene_auto_settings.dart | 493 ++++++++---------- lib/features/scene/view/scene_view.dart | 63 +-- .../widgets/alert_dialogs/icons_dialog.dart | 111 ++++ .../widgets/scene_view_widget/scene_item.dart | 40 +- lib/generated/assets.dart | 238 +++------ lib/services/api/scene_api.dart | 65 +-- 18 files changed, 734 insertions(+), 718 deletions(-) create mode 100644 assets/icons/automation_ic.svg create mode 100644 lib/features/scene/widgets/alert_dialogs/icons_dialog.dart diff --git a/assets/icons/automation_ic.svg b/assets/icons/automation_ic.svg new file mode 100644 index 0000000..a655eb5 --- /dev/null +++ b/assets/icons/automation_ic.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/features/app_layout/bloc/home_cubit.dart b/lib/features/app_layout/bloc/home_cubit.dart index 3e85cdc..29773da 100644 --- a/lib/features/app_layout/bloc/home_cubit.dart +++ b/lib/features/app_layout/bloc/home_cubit.dart @@ -370,6 +370,9 @@ class HomeCubit extends Cubit { .add(const SmartSceneClearEvent()); BlocProvider.of(NavigationService.navigatorKey.currentState!.context) .add(ResetEffectivePeriod()); + NavigationService.navigatorKey.currentContext! + .read() + .add(const ClearTabToRunSetting()); }, ), IconButton( diff --git a/lib/features/devices/view/widgets/scene_listview.dart b/lib/features/devices/view/widgets/scene_listview.dart index 63b770f..4fa2031 100644 --- a/lib/features/devices/view/widgets/scene_listview.dart +++ b/lib/features/devices/view/widgets/scene_listview.dart @@ -40,13 +40,10 @@ class SceneListview extends StatelessWidget { sceneName: scene.name, ), ); - context - .read() - .add(const SmartSceneClearEvent()); + context.read().add(const SmartSceneClearEvent()); - BlocProvider.of(context).add( - FetchSceneTasksEvent( - sceneId: scene.id, isAutomation: false)); + BlocProvider.of(context) + .add(FetchSceneTasksEvent(sceneId: scene.id, isAutomation: false)); /// the state to set the scene type must be after the fetch BlocProvider.of(context) @@ -59,11 +56,13 @@ class SceneListview extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.all(8.0), - child: Image.asset( + child: Image.memory( height: 32, width: 32, - Assets.assetsIconsLogo, + scene.iconInBytes, fit: BoxFit.fill, + errorBuilder: (context, error, stackTrace) => Image.asset( + height: 32, width: 32, fit: BoxFit.fill, Assets.assetsIconsLogo), ), ), Expanded( diff --git a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart index b4b55ba..024faf4 100644 --- a/lib/features/scene/bloc/create_scene/create_scene_bloc.dart +++ b/lib/features/scene/bloc/create_scene/create_scene_bloc.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_app/features/devices/model/device_control_model.dart'; @@ -38,6 +37,9 @@ class CreateSceneBloc extends Bloc on(_sceneTypeEvent); on(_onEffectiveTimeEvent); on(_fetchIconScene); + on(_iconSelected); + on(_showInDeviceClicked); + on(_clearTabToRunSetting); } CreateSceneEnum sceneType = CreateSceneEnum.none; @@ -54,9 +56,11 @@ class CreateSceneBloc extends Bloc final Map automationComparatorValues = {}; String conditionRule = 'or'; EffectiveTime? effectiveTime; + List iconModelList = []; + String selectedIcon = ''; + bool showInDeviceScreen = false; - FutureOr _onAddSceneTask( - AddTaskEvent event, Emitter emit) { + FutureOr _onAddSceneTask(AddTaskEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { final copyList = List.from(automationTempTasksList); @@ -91,8 +95,7 @@ class CreateSceneBloc extends Bloc } } - void addToTempTaskList( - TempHoldSceneTasksEvent event, Emitter emit) { + void addToTempTaskList(TempHoldSceneTasksEvent event, Emitter emit) { emit(CreateSceneLoading()); bool updated = false; @@ -177,8 +180,7 @@ class CreateSceneBloc extends Bloc )); } - void addToTempAutomationTaskList( - TempHoldSceneTasksEvent event, Emitter emit) { + void addToTempAutomationTaskList(TempHoldSceneTasksEvent event, Emitter emit) { emit(CreateSceneLoading()); bool updated = false; for (var element in automationTempTasksList) { @@ -200,10 +202,8 @@ class CreateSceneBloc extends Bloc ], comparator: automationComparatorValues[element.code], ); - automationTempTasksList[automationTempTasksList.indexOf(element)] = - updatedElement; - automationSelectedValues[updatedElement.code] = - event.deviceControlModel.value; + automationTempTasksList[automationTempTasksList.indexOf(element)] = updatedElement; + automationSelectedValues[updatedElement.code] = event.deviceControlModel.value; updated = true; break; } @@ -223,12 +223,10 @@ class CreateSceneBloc extends Bloc icon: '', ), ], - comparator: - automationComparatorValues[event.deviceControlModel.code] ?? '==', + comparator: automationComparatorValues[event.deviceControlModel.code] ?? '==', ); automationTempTasksList.add(newElement); - automationSelectedValues[newElement.code] = - event.deviceControlModel.value; + automationSelectedValues[newElement.code] = event.deviceControlModel.value; } emit(AddSceneTask( tasksList: tasksList, @@ -237,8 +235,7 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _selectedValue( - SelectedValueEvent event, Emitter emit) { + FutureOr _selectedValue(SelectedValueEvent event, Emitter emit) { if (event.isAutomation == true) { automationSelectedValues[event.code] = event.value; automationComparatorValues[event.code] = event.comparator ?? '=='; @@ -275,8 +272,7 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _removeTaskById( - RemoveTaskByIdEvent event, Emitter emit) { + FutureOr _removeTaskById(RemoveTaskByIdEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { for (var element in automationTasksList) { @@ -349,8 +345,7 @@ class CreateSceneBloc extends Bloc : await SceneApi.createScene(event.createSceneModel!); } else if (event.createAutomationModel != null) { response = event.updateScene - ? await SceneApi.updateAutomation( - event.createAutomationModel!, event.sceneId) + ? await SceneApi.updateAutomation(event.createAutomationModel!, event.sceneId) : await SceneApi.createAutomation(event.createAutomationModel!); } @@ -362,14 +357,14 @@ class CreateSceneBloc extends Bloc automationTempTasksList.clear(); automationSelectedValues.clear(); automationComparatorValues.clear(); - effectiveTime = - EffectiveTime(start: '00:00', end: '23:59', loops: '1111111'); + selectedIcon = ''; + showInDeviceScreen = false; + effectiveTime = EffectiveTime(start: '00:00', end: '23:59', loops: '1111111'); sceneType = CreateSceneEnum.none; conditionRule = 'or'; emit(const CreateSceneWithTasks(success: true)); - CustomSnackBar.greenSnackBar(event.updateScene - ? 'Scene updated successfully' - : 'Scene created successfully'); + CustomSnackBar.greenSnackBar( + event.updateScene ? 'Scene updated successfully' : 'Scene created successfully'); } else { emit(const CreateSceneError(message: 'Something went wrong')); } @@ -383,8 +378,7 @@ class CreateSceneBloc extends Bloc } } - FutureOr _clearTaskList( - ClearTaskListEvent event, Emitter emit) { + FutureOr _clearTaskList(ClearTaskListEvent event, Emitter emit) { emit(CreateSceneLoading()); automationTasksList.clear(); tasksList.clear(); @@ -395,6 +389,19 @@ class CreateSceneBloc extends Bloc )); } + FutureOr _clearTabToRunSetting(ClearTabToRunSetting event, Emitter emit) { + emit(CreateSceneLoading()); + selectedIcon = ''; + showInDeviceScreen = false; + emit(AddSceneTask( + tasksList: tasksList, + automationTasksList: automationTasksList, + condition: conditionRule, + showInDevice: showInDeviceScreen, + selectedIcon: selectedIcon, + iconModels: iconModelList)); + } + FutureOr _fetchSceneTasks( FetchSceneTasksEvent event, Emitter emit) async { emit(CreateSceneLoading()); @@ -407,8 +414,9 @@ class CreateSceneBloc extends Bloc automationTempTasksList.clear(); automationSelectedValues.clear(); automationComparatorValues.clear(); - effectiveTime = - EffectiveTime(start: '00:00', end: '23:59', loops: '1111111'); + selectedIcon = ''; + showInDeviceScreen = false; + effectiveTime = EffectiveTime(start: '00:00', end: '23:59', loops: '1111111'); sceneType = CreateSceneEnum.none; conditionRule = 'or'; @@ -417,14 +425,10 @@ class CreateSceneBloc extends Bloc : await SceneApi.getSceneDetails(event.sceneId); if (response.id.isNotEmpty) { if (event.isAutomation) { - automationTasksList = List.from( - getTaskListFunctionsFromApi( - actions: [], - isAutomation: true, - conditions: response.conditions)); + automationTasksList = List.from(getTaskListFunctionsFromApi( + actions: [], isAutomation: true, conditions: response.conditions)); tasksList = List.from( - getTaskListFunctionsFromApi( - actions: response.actions, isAutomation: false)); + getTaskListFunctionsFromApi(actions: response.actions, isAutomation: false)); conditionRule = response.decisionExpr ?? conditionRule; @@ -437,28 +441,31 @@ class CreateSceneBloc extends Bloc : EffectiveTime(start: '00:00', end: '23:59', loops: '1111111'); // Set the days directly from the API response - BlocProvider.of( - NavigationService.navigatorKey.currentContext!) + BlocProvider.of(NavigationService.navigatorKey.currentContext!) .add(SetDays(response.effectiveTime?.loops ?? '1111111')); // Set Custom Time and reset days first - BlocProvider.of( - NavigationService.navigatorKey.currentContext!) + BlocProvider.of(NavigationService.navigatorKey.currentContext!) .add(SetCustomTime(effectiveTime!.start, effectiveTime!.end)); emit(AddSceneTask( - automationTasksList: automationTasksList, - tasksList: tasksList, - condition: conditionRule, - )); + automationTasksList: automationTasksList, + tasksList: tasksList, + condition: conditionRule, + iconModels: iconModelList, + selectedIcon: selectedIcon, + showInDevice: showInDeviceScreen)); } else { tasksList = List.from( - getTaskListFunctionsFromApi( - actions: response.actions, isAutomation: false)); + getTaskListFunctionsFromApi(actions: response.actions, isAutomation: false)); + selectedIcon = response.icon!; + showInDeviceScreen = response.showInDevice!; emit(AddSceneTask( - tasksList: tasksList, - condition: conditionRule, - )); + tasksList: tasksList, + condition: conditionRule, + iconModels: iconModelList, + selectedIcon: selectedIcon, + showInDevice: showInDeviceScreen)); } } else { emit(const CreateSceneError(message: 'Something went wrong')); @@ -468,19 +475,52 @@ class CreateSceneBloc extends Bloc } } - List iconModel = []; - - FutureOr _fetchIconScene( - SceneIconEvent event, Emitter emit) async { + FutureOr _fetchIconScene(SceneIconEvent event, Emitter emit) async { emit(CreateSceneLoading()); try { - final response = await SceneApi.getIcon(); - iconModel = (response as List) - .map((iconJson) => - IconModel.fromJson(iconJson as Map)) - .toList(); - print(iconModel[0].iconBase64.toString()); - emit(CreateSceneLoaded(iconModel)); + iconModelList = await SceneApi.getIcon(); + emit(AddSceneTask( + tasksList: tasksList, + automationTasksList: automationTasksList, + condition: conditionRule, + showInDevice: showInDeviceScreen, + selectedIcon: selectedIcon, + iconModels: iconModelList)); + } catch (e) { + emit(const CreateSceneError(message: 'Something went wrong')); + } + } + + FutureOr _iconSelected(IconSelected event, Emitter emit) async { + try { + if (event.confirmSelection) { + selectedIcon = event.iconId; + } + emit(CreateSceneLoading()); + emit(AddSceneTask( + tasksList: tasksList, + automationTasksList: automationTasksList, + showInDevice: showInDeviceScreen, + condition: conditionRule, + selectedIcon: event.iconId, + iconModels: iconModelList)); + } catch (e) { + emit(const CreateSceneError(message: 'Something went wrong')); + } + } + + FutureOr _showInDeviceClicked( + ShowOnDeviceClicked event, Emitter emit) async { + try { + emit(CreateSceneLoading()); + showInDeviceScreen = event.value; + emit(AddSceneTask( + tasksList: tasksList, + automationTasksList: automationTasksList, + condition: conditionRule, + selectedIcon: selectedIcon, + iconModels: iconModelList, + showInDevice: showInDeviceScreen)); } catch (e) { emit(const CreateSceneError(message: 'Something went wrong')); } @@ -491,8 +531,7 @@ class CreateSceneBloc extends Bloc return days[index]; } - FutureOr _clearTempTaskList( - ClearTempTaskListEvent event, Emitter emit) { + FutureOr _clearTempTaskList(ClearTempTaskListEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { automationTempTasksList.clear(); @@ -536,17 +575,13 @@ class CreateSceneBloc extends Bloc } } - FutureOr _deleteScene( - DeleteSceneEvent event, Emitter emit) async { + FutureOr _deleteScene(DeleteSceneEvent event, Emitter emit) async { emit(DeleteSceneLoading()); try { - final response = - sceneType.name == CreateSceneEnum.deviceStatusChanges.name - ? await SceneApi.deleteAutomation( - automationId: event.sceneId, unitUuid: event.unitUuid) - : await SceneApi.deleteScene( - sceneId: event.sceneId, unitUuid: event.unitUuid); + final response = sceneType.name == CreateSceneEnum.deviceStatusChanges.name + ? await SceneApi.deleteAutomation(automationId: event.sceneId, unitUuid: event.unitUuid) + : await SceneApi.deleteScene(sceneId: event.sceneId, unitUuid: event.unitUuid); if (response == true) { emit(const DeleteSceneSuccess(true)); } else { @@ -557,8 +592,7 @@ class CreateSceneBloc extends Bloc } } - FutureOr _updateTaskValue( - UpdateTaskEvent event, Emitter emit) { + FutureOr _updateTaskValue(UpdateTaskEvent event, Emitter emit) { emit(CreateSceneLoading()); if (event.isAutomation == true) { for (var i = 0; i < automationTasksList.length; i++) { @@ -594,8 +628,7 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _selectConditionRule( - SelectConditionEvent event, Emitter emit) { + FutureOr _selectConditionRule(SelectConditionEvent event, Emitter emit) { emit(CreateSceneInitial()); if (event.condition.contains('any')) { conditionRule = 'or'; @@ -610,8 +643,7 @@ class CreateSceneBloc extends Bloc )); } - FutureOr _sceneTypeEvent( - SceneTypeEvent event, Emitter emit) { + FutureOr _sceneTypeEvent(SceneTypeEvent event, Emitter emit) { // emit(CreateSceneInitial()); if (event.type == CreateSceneEnum.tabToRun) { diff --git a/lib/features/scene/bloc/create_scene/create_scene_event.dart b/lib/features/scene/bloc/create_scene/create_scene_event.dart index bdff773..2b79f6d 100644 --- a/lib/features/scene/bloc/create_scene/create_scene_event.dart +++ b/lib/features/scene/bloc/create_scene/create_scene_event.dart @@ -149,8 +149,7 @@ class FetchSceneTasksEvent extends CreateSceneEvent { final String sceneId; final bool isAutomation; - const FetchSceneTasksEvent( - {this.isAutomation = false, required this.sceneId}); + const FetchSceneTasksEvent({this.isAutomation = false, required this.sceneId}); @override List get props => [sceneId, isAutomation]; @@ -185,3 +184,31 @@ class EffectiveTimePeriodEvent extends CreateSceneEvent { } class SceneIconEvent extends CreateSceneEvent {} + +class IconSelected extends CreateSceneEvent { + final String iconId; + final bool confirmSelection; + + const IconSelected({required this.iconId, required this.confirmSelection}); + + @override + List get props => [iconId]; +} + +class ShowOnDeviceClicked extends CreateSceneEvent { + final bool value; + + const ShowOnDeviceClicked({ + required this.value, + }); + + @override + List get props => [value]; +} + +class ClearTabToRunSetting extends CreateSceneEvent { + const ClearTabToRunSetting(); + + @override + List get props => []; +} diff --git a/lib/features/scene/bloc/create_scene/create_scene_state.dart b/lib/features/scene/bloc/create_scene/create_scene_state.dart index d3e95c6..be88cb4 100644 --- a/lib/features/scene/bloc/create_scene/create_scene_state.dart +++ b/lib/features/scene/bloc/create_scene/create_scene_state.dart @@ -23,8 +23,16 @@ class AddSceneTask extends CreateSceneState { final List tasksList; final List? automationTasksList; final String? condition; + final String? selectedIcon; + final List? iconModels; + final bool? showInDevice; const AddSceneTask( - {required this.tasksList, this.automationTasksList, this.condition}); + {required this.tasksList, + this.automationTasksList, + this.condition, + this.iconModels, + this.selectedIcon, + this.showInDevice}); @override List get props => [tasksList]; @@ -33,8 +41,7 @@ class AddSceneTask extends CreateSceneState { class TempHoldSceneTask extends CreateSceneState { final List tempTasksList; final List? automationTempTasksList; - const TempHoldSceneTask( - {required this.tempTasksList, this.automationTempTasksList}); + const TempHoldSceneTask({required this.tempTasksList, this.automationTempTasksList}); @override List get props => [tempTasksList]; @@ -84,8 +91,3 @@ class SceneTypeState extends CreateSceneState { final CreateSceneEnum type; const SceneTypeState(this.type); } - -class CreateSceneLoaded extends CreateSceneState { - final List iconModels; - CreateSceneLoaded(this.iconModels); -} diff --git a/lib/features/scene/bloc/scene_bloc/scene_bloc.dart b/lib/features/scene/bloc/scene_bloc/scene_bloc.dart index 047e9cb..701e30a 100644 --- a/lib/features/scene/bloc/scene_bloc/scene_bloc.dart +++ b/lib/features/scene/bloc/scene_bloc/scene_bloc.dart @@ -24,7 +24,7 @@ class SceneBloc extends Bloc { try { if (event.unitId.isNotEmpty) { - scenes = await SceneApi.getScenesByUnitId(event.unitId); + scenes = await SceneApi.getScenesByUnitId(event.unitId, showInDevice: event.showInDevice); emit(SceneLoaded(scenes, automationList)); } else { emit(const SceneError(message: 'Unit ID is empty')); @@ -34,8 +34,7 @@ class SceneBloc extends Bloc { } } - Future _onLoadAutomation( - LoadAutomation event, Emitter emit) async { + Future _onLoadAutomation(LoadAutomation event, Emitter emit) async { emit(SceneLoading()); try { @@ -50,8 +49,7 @@ class SceneBloc extends Bloc { } } - Future _onSceneTrigger( - SceneTrigger event, Emitter emit) async { + Future _onSceneTrigger(SceneTrigger event, Emitter emit) async { final currentState = state; if (currentState is SceneLoaded) { emit(SceneLoaded( @@ -78,9 +76,8 @@ class SceneBloc extends Bloc { UpdateAutomationStatus event, Emitter emit) async { final currentState = state; if (currentState is SceneLoaded) { - final newLoadingStates = - Map.from(currentState.loadingStates) - ..[event.automationId] = true; + final newLoadingStates = Map.from(currentState.loadingStates) + ..[event.automationId] = true; emit(SceneLoaded( currentState.scenes, @@ -89,11 +86,11 @@ class SceneBloc extends Bloc { )); try { - final success = await SceneApi.updateAutomationStatus( - event.automationId, event.automationStatusUpdate); + final success = + await SceneApi.updateAutomationStatus(event.automationId, event.automationStatusUpdate); if (success) { - automationList = await SceneApi.getAutomationByUnitId( - event.automationStatusUpdate.unitUuid); + automationList = + await SceneApi.getAutomationByUnitId(event.automationStatusUpdate.unitUuid); newLoadingStates[event.automationId] = false; emit(SceneLoaded( currentState.scenes, diff --git a/lib/features/scene/bloc/scene_bloc/scene_event.dart b/lib/features/scene/bloc/scene_bloc/scene_event.dart index d580ed4..d72f3a7 100644 --- a/lib/features/scene/bloc/scene_bloc/scene_event.dart +++ b/lib/features/scene/bloc/scene_bloc/scene_event.dart @@ -10,11 +10,12 @@ abstract class SceneEvent extends Equatable { class LoadScenes extends SceneEvent { final String unitId; + final bool showInDevice; - const LoadScenes(this.unitId); + const LoadScenes(this.unitId, {this.showInDevice = false}); @override - List get props => [unitId]; + List get props => [unitId, showInDevice]; } class LoadAutomation extends SceneEvent { @@ -41,8 +42,7 @@ class UpdateAutomationStatus extends SceneEvent { final String automationId; final AutomationStatusUpdate automationStatusUpdate; - const UpdateAutomationStatus( - {required this.automationStatusUpdate, required this.automationId}); + const UpdateAutomationStatus({required this.automationStatusUpdate, required this.automationId}); @override List get props => [automationStatusUpdate]; diff --git a/lib/features/scene/helper/scene_logic_helper.dart b/lib/features/scene/helper/scene_logic_helper.dart index 3219ba2..e6b8d33 100644 --- a/lib/features/scene/helper/scene_logic_helper.dart +++ b/lib/features/scene/helper/scene_logic_helper.dart @@ -125,6 +125,8 @@ mixin SceneLogicHelper { } else { final createSceneModel = CreateSceneModel( unitUuid: HomeCubit.getInstance().selectedSpace!.id ?? '', + iconId: sceneBloc.selectedIcon, + showInDevice: sceneBloc.showInDeviceScreen, sceneName: sceneName.text, decisionExpr: 'and', actions: [ @@ -171,24 +173,21 @@ mixin SceneLogicHelper { } } - Widget getTheCorrectDialogBody( - SceneStaticFunction taskItem, dynamic functionValue, + Widget getTheCorrectDialogBody(SceneStaticFunction taskItem, dynamic functionValue, {required bool isAutomation}) { if (taskItem.operationDialogType == OperationDialogType.temperature) { return AlertDialogTemperatureBody( taskItem: taskItem, functionValue: functionValue ?? taskItem.functionValue, ); - } else if ((taskItem.operationDialogType == - OperationDialogType.countdown) || + } else if ((taskItem.operationDialogType == OperationDialogType.countdown) || (taskItem.operationDialogType == OperationDialogType.delay)) { return AlertDialogCountdown( durationValue: taskItem.functionValue ?? 0, functionValue: functionValue ?? taskItem.functionValue, function: taskItem, ); - } else if (taskItem.operationDialogType == - OperationDialogType.integerSteps) { + } else if (taskItem.operationDialogType == OperationDialogType.integerSteps) { return AlertDialogSliderSteps( taskItem: taskItem, functionValue: functionValue ?? taskItem.functionValue, diff --git a/lib/features/scene/model/create_scene_model.dart b/lib/features/scene/model/create_scene_model.dart index 5475b93..43f62cb 100644 --- a/lib/features/scene/model/create_scene_model.dart +++ b/lib/features/scene/model/create_scene_model.dart @@ -4,12 +4,16 @@ import 'package:flutter/foundation.dart'; class CreateSceneModel { String unitUuid; + String iconId; + bool showInDevice; String sceneName; String decisionExpr; List actions; CreateSceneModel({ required this.unitUuid, + required this.iconId, + required this.showInDevice, required this.sceneName, required this.decisionExpr, required this.actions, @@ -17,12 +21,16 @@ class CreateSceneModel { CreateSceneModel copyWith({ String? unitUuid, + String? iconId, + bool? showInDevice, String? sceneName, String? decisionExpr, List? actions, }) { return CreateSceneModel( unitUuid: unitUuid ?? this.unitUuid, + iconId: iconId ?? this.iconId, + showInDevice: showInDevice ?? this.showInDevice, sceneName: sceneName ?? this.sceneName, decisionExpr: decisionExpr ?? this.decisionExpr, actions: actions ?? this.actions, @@ -32,6 +40,8 @@ class CreateSceneModel { Map toMap([String? sceneId]) { return { if (sceneId == null) 'unitUuid': unitUuid, + if (iconId.isNotEmpty) 'iconUuid': iconId, + 'showInHomePage': showInDevice, 'sceneName': sceneName, 'decisionExpr': decisionExpr, 'actions': actions.map((x) => x.toMap()).toList(), @@ -41,17 +51,18 @@ class CreateSceneModel { factory CreateSceneModel.fromMap(Map map) { return CreateSceneModel( unitUuid: map['unitUuid'] ?? '', + iconId: map['iconUuid'] ?? '', + showInDevice: map['showInHomePage'] ?? false, sceneName: map['sceneName'] ?? '', decisionExpr: map['decisionExpr'] ?? '', - actions: List.from( - map['actions']?.map((x) => CreateSceneAction.fromMap(x))), + actions: + List.from(map['actions']?.map((x) => CreateSceneAction.fromMap(x))), ); } String toJson([String? sceneId]) => json.encode(toMap(sceneId)); - factory CreateSceneModel.fromJson(String source) => - CreateSceneModel.fromMap(json.decode(source)); + factory CreateSceneModel.fromJson(String source) => CreateSceneModel.fromMap(json.decode(source)); @override String toString() { @@ -64,6 +75,8 @@ class CreateSceneModel { return other is CreateSceneModel && other.unitUuid == unitUuid && + other.iconId == iconId && + other.showInDevice == showInDevice && other.sceneName == sceneName && other.decisionExpr == decisionExpr && listEquals(other.actions, actions); @@ -71,10 +84,7 @@ class CreateSceneModel { @override int get hashCode { - return unitUuid.hashCode ^ - sceneName.hashCode ^ - decisionExpr.hashCode ^ - actions.hashCode; + return unitUuid.hashCode ^ sceneName.hashCode ^ decisionExpr.hashCode ^ actions.hashCode; } } @@ -120,8 +130,7 @@ class CreateSceneAction { return CreateSceneAction( entityId: map['entityId'] ?? '', actionExecutor: map['actionExecutor'] ?? '', - executorProperty: - CreateSceneExecutorProperty.fromMap(map['executorProperty']), + executorProperty: CreateSceneExecutorProperty.fromMap(map['executorProperty']), ); } @@ -145,8 +154,7 @@ class CreateSceneAction { } @override - int get hashCode => - entityId.hashCode ^ actionExecutor.hashCode ^ executorProperty.hashCode; + int get hashCode => entityId.hashCode ^ actionExecutor.hashCode ^ executorProperty.hashCode; } class CreateSceneExecutorProperty { @@ -210,6 +218,5 @@ class CreateSceneExecutorProperty { } @override - int get hashCode => - functionCode.hashCode ^ functionValue.hashCode ^ delaySeconds.hashCode; + int get hashCode => functionCode.hashCode ^ functionValue.hashCode ^ delaySeconds.hashCode; } diff --git a/lib/features/scene/model/scene_details_model.dart b/lib/features/scene/model/scene_details_model.dart index bd1e87c..99a2c5f 100644 --- a/lib/features/scene/model/scene_details_model.dart +++ b/lib/features/scene/model/scene_details_model.dart @@ -4,6 +4,8 @@ class SceneDetailsModel { final String id; final String name; final String status; + final String? icon; + final bool? showInDevice; final String type; final List actions; final List? conditions; @@ -16,48 +18,44 @@ class SceneDetailsModel { required this.status, required this.type, required this.actions, + this.icon, + this.showInDevice, this.conditions, this.decisionExpr, this.effectiveTime, }); - factory SceneDetailsModel.fromRawJson(String str) => - SceneDetailsModel.fromJson(json.decode(str)); + factory SceneDetailsModel.fromRawJson(String str) => SceneDetailsModel.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); - factory SceneDetailsModel.fromJson(Map json) => - SceneDetailsModel( - id: json["id"], - name: json["name"], - status: json["status"], - type: json["type"], - actions: (json["actions"] as List) - .map((x) => Action.fromJson(x)) - .where((x) => x != null) - .toList() - .cast(), - conditions: json["conditions"] != null - ? (json["conditions"] as List) - .map((x) => Condition.fromJson(x)) - .toList() - : null, - decisionExpr: json["decisionExpr"], - effectiveTime: json["effectiveTime"] != null - ? EffectiveTime.fromJson(json["effectiveTime"]) - : null, - ); + factory SceneDetailsModel.fromJson(Map json) => SceneDetailsModel( + id: json["id"], + name: json["name"], + status: json["status"], + type: json["type"], + actions: (json["actions"] as List) + .map((x) => Action.fromJson(x)) + .where((x) => x != null) + .toList() + .cast(), + conditions: json["conditions"] != null + ? (json["conditions"] as List).map((x) => Condition.fromJson(x)).toList() + : null, + decisionExpr: json["decisionExpr"], + effectiveTime: + json["effectiveTime"] != null ? EffectiveTime.fromJson(json["effectiveTime"]) : null, + icon: json["iconUuid"] != null ? json["iconUuid"] ?? '' : '', + showInDevice: json['showInHome'] != null ? json['showInHome'] ?? false : false); Map toJson() => { "id": id, "name": name, "status": status, "type": type, - "actions": List.from(actions.map((x) => x.toJson())), - "conditions": conditions != null - ? List.from(conditions!.map((x) => x.toJson())) - : null, + "conditions": + conditions != null ? List.from(conditions!.map((x) => x.toJson())) : null, "decisionExpr": decisionExpr, "effectiveTime": effectiveTime?.toJson(), }; @@ -90,7 +88,7 @@ class Action { ); } if (json["executorProperty"] == null) { - return null; + return null; } return Action( @@ -118,8 +116,7 @@ class ExecutorProperty { this.delaySeconds, }); - factory ExecutorProperty.fromJson(Map json) => - ExecutorProperty( + factory ExecutorProperty.fromJson(Map json) => ExecutorProperty( functionCode: json["functionCode"] ?? '', functionValue: json["functionValue"] ?? '', delaySeconds: json["delaySeconds"] ?? 0, @@ -145,8 +142,7 @@ class Condition { required this.expr, }); - factory Condition.fromRawJson(String str) => - Condition.fromJson(json.decode(str)); + factory Condition.fromRawJson(String str) => Condition.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); @@ -204,8 +200,7 @@ class EffectiveTime { required this.loops, }); - factory EffectiveTime.fromRawJson(String str) => - EffectiveTime.fromJson(json.decode(str)); + factory EffectiveTime.fromRawJson(String str) => EffectiveTime.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); diff --git a/lib/features/scene/model/scenes_model.dart b/lib/features/scene/model/scenes_model.dart index 4c0066c..0881ba9 100644 --- a/lib/features/scene/model/scenes_model.dart +++ b/lib/features/scene/model/scenes_model.dart @@ -1,29 +1,31 @@ import 'dart:convert'; +import 'dart:typed_data'; class ScenesModel { final String id; final String name; final String status; final String type; + final String icon; - ScenesModel({ - required this.id, - required this.name, - required this.status, - required this.type, - }); + ScenesModel( + {required this.id, + required this.name, + required this.status, + required this.type, + required this.icon}); - factory ScenesModel.fromRawJson(String str) => - ScenesModel.fromJson(json.decode(str)); + factory ScenesModel.fromRawJson(String str) => ScenesModel.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); + Uint8List get iconInBytes => base64Decode(icon); factory ScenesModel.fromJson(Map json) => ScenesModel( - id: json["id"], - name: json["name"] ?? '', - status: json["status"] ?? '', - type: json["type"] ?? '', - ); + id: json["id"], + name: json["name"] ?? '', + status: json["status"] ?? '', + type: json["type"] ?? '', + icon: json["icon"] ?? ''); Map toJson() => { "id": id, diff --git a/lib/features/scene/view/scene_auto_settings.dart b/lib/features/scene/view/scene_auto_settings.dart index 2b47ec2..ba9f2da 100644 --- a/lib/features/scene/view/scene_auto_settings.dart +++ b/lib/features/scene/view/scene_auto_settings.dart @@ -1,15 +1,16 @@ -import 'dart:typed_data'; - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart'; import 'package:syncrow_app/features/scene/enum/create_scene_enum.dart'; +import 'package:syncrow_app/features/scene/view/scene_tasks_view.dart'; +import 'package:syncrow_app/features/scene/widgets/alert_dialogs/icons_dialog.dart'; +import 'package:syncrow_app/features/scene/widgets/effective_period_setting/effective_period_bottom_sheet.dart'; +import 'package:syncrow_app/features/scene/widgets/scene_list_tile.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/text_widgets/body_large.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/resource_manager/color_manager.dart'; class SceneAutoSettings extends StatelessWidget { @@ -17,14 +18,13 @@ class SceneAutoSettings extends StatelessWidget { @override Widget build(BuildContext context) { - final sceneSettings = - ModalRoute.of(context)!.settings.arguments as Map? ?? - {}; + final sceneSettings = ModalRoute.of(context)!.settings.arguments as Map? ?? {}; final sceneId = sceneSettings['sceneId'] as String? ?? ''; - final isAutomation = context.read().sceneType == - CreateSceneEnum.deviceStatusChanges; + final isAutomation = + context.read().sceneType == CreateSceneEnum.deviceStatusChanges; final sceneName = sceneSettings['sceneName'] as String? ?? ''; - + bool showInDevice = context.read().showInDeviceScreen; + String selectedIcon = ''; return DefaultScaffold( title: 'Settings', padding: EdgeInsets.zero, @@ -35,44 +35,81 @@ class SceneAutoSettings extends StatelessWidget { icon: const Icon( Icons.arrow_back_ios, )), - child: BlocProvider( - create: (BuildContext context) => - CreateSceneBloc()..add(SceneIconEvent()), - child: BlocBuilder( - builder: (context, state) { - return SizedBox( - height: MediaQuery.sizeOf(context).height, - child: Column( - children: [ - DefaultContainer( - child: Padding( - padding: const EdgeInsets.only( - top: 10, left: 10, right: 10, bottom: 10), - child: Column( - children: [ - InkWell( - onTap: () { - showDialog( - context: context, - builder: (context) { - return SecondDialog( - WidgetList: BlocBuilder( + child: BlocBuilder(builder: (context, state) { + if (state is AddSceneTask) { + showInDevice = state.showInDevice ?? false; + } + + return SizedBox( + height: MediaQuery.sizeOf(context).height, + child: Column( + children: [ + if (!isAutomation) + DefaultContainer( + child: Padding( + padding: const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 10), + child: Column( + children: [ + InkWell( + onTap: () { + showDialog( + context: context, + builder: (context) { + BlocProvider.of(context).add(SceneIconEvent()); + return IconsDialog( + widgetList: Container( + height: MediaQuery.sizeOf(context).height * 0.4, + width: MediaQuery.sizeOf(context).width, + padding: const EdgeInsets.all(24), + child: BlocBuilder( builder: (context, state) { if (state is CreateSceneLoading) { - return CircularProgressIndicator(); - } else if (state is CreateSceneLoaded) { - return Container( - child: ListView.builder( - itemCount: - state.iconModels.length, - itemBuilder: (context, index) { - final iconModel = - state.iconModels[index]; - return Image.memory( - iconModel.iconBytes); - }, + return const Center( + child: SizedBox( + height: 50, + width: 50, + child: CircularProgressIndicator()), + ); + } else if (state is AddSceneTask) { + return GridView.builder( + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 5, + crossAxisSpacing: 12, + mainAxisSpacing: 12, ), + itemCount: state.iconModels?.length ?? 0, + itemBuilder: (context, index) { + final iconModel = state.iconModels![index]; + return InkWell( + onTap: () { + BlocProvider.of(context).add( + IconSelected( + iconId: iconModel.uuid, + confirmSelection: false)); + selectedIcon = iconModel.uuid; + }, + child: ClipOval( + child: Container( + padding: const EdgeInsets.all(1), + decoration: BoxDecoration( + border: Border.all( + color: state.selectedIcon == iconModel.uuid + ? ColorsManager.primaryColorWithOpacity + : Colors.transparent, + width: 2, + ), + shape: BoxShape.circle, + ), + child: Image.memory( + iconModel.iconBytes, + width: 35, + height: 35, + ), + ), + ), + ); + }, ); } else if (state is CreateSceneError) { return Text(state.message); @@ -81,258 +118,140 @@ class SceneAutoSettings extends StatelessWidget { } }, ), - cancelTab: () { - Navigator.of(context).pop(); - }, - confirmTab: (v) { - Navigator.of(context).pop(); - }, - title: 'Icons', - onTapLabel1: (selected) {}, - ); - }, - ); - }, - child: const Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - BodyMedium(text: 'Icons'), - Icon( - Icons.arrow_forward_ios_outlined, - color: ColorsManager.textGray, - size: 15, - ) - ], - ), - ), - const SizedBox( - height: 5, - ), - const Divider( - color: ColorsManager.graysColor, - ), - const SizedBox( - height: 5, - ), - Row( + ), + cancelTab: () { + Navigator.of(context).pop(); + }, + confirmTab: () { + BlocProvider.of(context).add( + IconSelected(iconId: selectedIcon, confirmSelection: true)); + Navigator.of(context).pop(); + }, + title: 'Icons', + ); + }, + ); + }, + child: const Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - const BodyMedium(text: 'Show on devices page'), - Container( - width: 100, - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Container( - height: 30, - width: 1, - color: ColorsManager.graysColor, - ), - Transform.scale( - scale: .8, - child: CupertinoSwitch( - value: true, - onChanged: (value) {}, - applyTheme: true, - ), - ), - ], - ), + BodyMedium(text: 'Icons'), + Icon( + Icons.arrow_forward_ios_outlined, + color: ColorsManager.textGray, + size: 15, ) ], ), - const SizedBox( - height: 5, - ), - const Divider( - color: ColorsManager.graysColor, - ), - SizedBox( - height: 5, - ), - const Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - //Cloud - BodyMedium(text: 'Executed by'), - Text('Cloud', - style: TextStyle( - color: ColorsManager.textGray, - )), - ], - ), - ], - ), - )), - // Padding( - // padding: const EdgeInsets.symmetric(vertical: 16), - // child: DefaultContainer( - // child: Column( - // mainAxisSize: MainAxisSize.min, - // mainAxisAlignment: MainAxisAlignment.start, - // children: [ - // const SizedBox( - // height: 8, - // ), - // Visibility( - // visible: isAutomation, - // child: SceneListTile( - // padding: const EdgeInsets.symmetric( - // horizontal: 16, vertical: 8), - // titleString: "Effective Period", - // trailingWidget: - // const Icon(Icons.arrow_forward_ios_rounded), - // onPressed: () { - // context.customBottomSheet( - // child: const EffectPeriodBottomSheetContent(), - // ); - // }, - // ), - // ), - // Visibility( - // visible: sceneName.isNotEmpty && isAutomation, - // child: SizedBox( - // width: context.width * 0.9, - // child: const Divider( - // color: ColorsManager.greyColor, - // ), - // ), - // ), - // Visibility( - // visible: sceneName.isNotEmpty, - // child: DeleteBottomSheetContent( - // isAutomation: isAutomation, - // sceneId: sceneId, - // ), - // ), - // const SizedBox( - // height: 16, - // ), - // ], - // ), - // ), - // ), - ], - ), - ); - }))); - } -} - -class SecondDialog extends StatefulWidget { - final String title; - Widget WidgetList; - final Function(String)? onTapLabel1; - final Function()? cancelTab; - final Function(int selectedSecond)? confirmTab; - - SecondDialog({ - required this.WidgetList, - required this.title, - this.onTapLabel1, - required this.cancelTab, - required this.confirmTab, - }); - - @override - _SecondDialogState createState() => _SecondDialogState(); -} - -class _SecondDialogState extends State { - @override - void initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return AlertDialog( - contentPadding: EdgeInsets.zero, - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const SizedBox( - height: 10, - ), - BodyLarge( - text: widget.title, - fontWeight: FontWeight.w700, - fontColor: ColorsManager.primaryColor, - fontSize: 16, - ), - const Padding( - padding: EdgeInsets.only(left: 15, right: 15), - child: Divider( - color: ColorsManager.textGray, - ), - ), - Expanded(child: widget.WidgetList), - Row( - children: [ - Expanded( - child: Container( - decoration: const BoxDecoration( - border: Border( - right: BorderSide( - color: ColorsManager.textGray, - width: 0.5, - ), - top: BorderSide( - color: ColorsManager.textGray, - width: 1.0, + ), + const SizedBox( + height: 5, + ), + const Divider( + color: ColorsManager.graysColor, + ), + const SizedBox( + height: 5, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const BodyMedium(text: 'Show on devices page'), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + height: 30, + width: 1, + color: ColorsManager.graysColor, + ), + Transform.scale( + scale: .8, + child: CupertinoSwitch( + value: showInDevice, + onChanged: (value) { + BlocProvider.of(context) + .add(ShowOnDeviceClicked(value: value)); + }, + applyTheme: true, + ), + ), + ], + ) + ], + ), + const SizedBox( + height: 5, + ), + const Divider( + color: ColorsManager.graysColor, + ), + const SizedBox( + height: 5, + ), + const Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + //Cloud + BodyMedium(text: 'Executed by'), + Text('Cloud', + style: TextStyle( + color: ColorsManager.textGray, + )), + ], + ), + ], ), )), - child: SizedBox( - child: InkWell( - onTap: widget.cancelTab, - child: const Padding( - padding: EdgeInsets.all(15), - child: Center( - child: Text( - 'Cancel', - style: TextStyle( - color: ColorsManager.textGray, - fontSize: 14, - fontWeight: FontWeight.w400), + if (isAutomation) + DefaultContainer( + padding: const EdgeInsets.symmetric( + horizontal: 8, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const SizedBox( + height: 8, + ), + Visibility( + visible: isAutomation, + child: SceneListTile( + titleString: "Effective Period", + trailingWidget: const Icon(Icons.arrow_forward_ios_rounded), + onPressed: () { + context.customBottomSheet( + child: const EffectPeriodBottomSheetContent(), + ); + }, ), ), - ), + Visibility( + visible: sceneName.isNotEmpty && isAutomation, + child: SizedBox( + width: context.width * 0.9, + child: const Divider( + color: ColorsManager.greyColor, + ), + ), + ), + Visibility( + visible: sceneName.isNotEmpty, + child: DeleteBottomSheetContent( + isAutomation: isAutomation, + sceneId: sceneId, + ), + ), + const SizedBox( + height: 16, + ), + ], ), ), - ), - ), - Expanded( - child: Container( - decoration: const BoxDecoration( - border: Border( - left: BorderSide( - color: ColorsManager.textGray, - width: 0.5, - ), - top: BorderSide( - color: ColorsManager.textGray, - width: 1.0, - ), - )), - child: InkWell( - onTap: () {}, - child: const Padding( - padding: EdgeInsets.all(15), - child: Center( - child: Text( - 'Confirm', - style: TextStyle( - color: ColorsManager.primaryColor, - fontSize: 14, - fontWeight: FontWeight.w400), - ), - ), - )), - )) - ], - ) - ], - ), - ); + ], + ), + ); + })); } } diff --git a/lib/features/scene/view/scene_view.dart b/lib/features/scene/view/scene_view.dart index ce297ce..a2d1881 100644 --- a/lib/features/scene/view/scene_view.dart +++ b/lib/features/scene/view/scene_view.dart @@ -21,35 +21,32 @@ class SceneView extends StatelessWidget { Widget build(BuildContext context) { return BlocProvider( create: (BuildContext context) => SceneBloc() - ..add(LoadScenes(HomeCubit.getInstance().selectedSpace?.id ?? '')) + ..add(LoadScenes(HomeCubit.getInstance().selectedSpace?.id ?? '', showInDevice: pageType)) ..add(LoadAutomation(HomeCubit.getInstance().selectedSpace?.id ?? '')), child: BlocBuilder( builder: (context, state) { if (state is DeleteSceneSuccess) { if (state.success) { - BlocProvider.of(context) - .add(LoadScenes(HomeCubit.getInstance().selectedSpace!.id!)); BlocProvider.of(context).add( - LoadAutomation(HomeCubit.getInstance().selectedSpace!.id!)); + LoadScenes(HomeCubit.getInstance().selectedSpace!.id!, showInDevice: pageType)); + BlocProvider.of(context) + .add(LoadAutomation(HomeCubit.getInstance().selectedSpace!.id!)); } } if (state is CreateSceneWithTasks) { if (state.success == true) { - BlocProvider.of(context) - .add(LoadScenes(HomeCubit.getInstance().selectedSpace!.id!)); BlocProvider.of(context).add( - LoadAutomation(HomeCubit.getInstance().selectedSpace!.id!)); - context - .read() - .add(const SmartSceneClearEvent()); + LoadScenes(HomeCubit.getInstance().selectedSpace!.id!, showInDevice: pageType)); + BlocProvider.of(context) + .add(LoadAutomation(HomeCubit.getInstance().selectedSpace!.id!)); + context.read().add(const SmartSceneClearEvent()); } } return BlocListener( listener: (context, state) { if (state is SceneTriggerSuccess) { context.showCustomSnackbar( - message: - 'Scene ${state.sceneName} triggered successfully!'); + message: 'Scene ${state.sceneName} triggered successfully!'); } }, child: HomeCubit.getInstance().spaces?.isEmpty ?? true @@ -86,30 +83,25 @@ class SceneView extends StatelessWidget { child: ListView( children: [ Theme( - data: ThemeData().copyWith( - dividerColor: Colors.transparent), + data: ThemeData() + .copyWith(dividerColor: Colors.transparent), child: ExpansionTile( - tilePadding: - const EdgeInsets.symmetric( - horizontal: 6), + tilePadding: const EdgeInsets.symmetric(horizontal: 6), initiallyExpanded: true, iconColor: ColorsManager.grayColor, - title: const BodyMedium( - text: 'Tap to run routines'), + title: const BodyMedium(text: 'Tap to run routines'), children: [ scenes.isNotEmpty ? SceneGrid( scenes: scenes, - loadingSceneId: - state.loadingSceneId, + loadingSceneId: state.loadingSceneId, disablePlayButton: false, - loadingStates: state - .loadingStates, // Add this line + loadingStates: + state.loadingStates, // Add this line ) : const Center( child: BodyMedium( - text: - 'No scenes have been added yet', + text: 'No scenes have been added yet', ), ), const SizedBox( @@ -119,30 +111,25 @@ class SceneView extends StatelessWidget { ), ), Theme( - data: ThemeData().copyWith( - dividerColor: Colors.transparent), + data: ThemeData() + .copyWith(dividerColor: Colors.transparent), child: ExpansionTile( initiallyExpanded: true, iconColor: ColorsManager.grayColor, - tilePadding: - const EdgeInsets.symmetric( - horizontal: 6), - title: const BodyMedium( - text: 'Automation'), + tilePadding: const EdgeInsets.symmetric(horizontal: 6), + title: const BodyMedium(text: 'Automation'), children: [ automationList.isNotEmpty ? SceneGrid( scenes: automationList, - loadingSceneId: - state.loadingSceneId, + loadingSceneId: state.loadingSceneId, disablePlayButton: true, - loadingStates: state - .loadingStates, // Add this line + loadingStates: + state.loadingStates, // Add this line ) : const Center( child: BodyMedium( - text: - 'No automations have been added yet', + text: 'No automations have been added yet', ), ), const SizedBox( diff --git a/lib/features/scene/widgets/alert_dialogs/icons_dialog.dart b/lib/features/scene/widgets/alert_dialogs/icons_dialog.dart new file mode 100644 index 0000000..88e0bf4 --- /dev/null +++ b/lib/features/scene/widgets/alert_dialogs/icons_dialog.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class IconsDialog extends StatelessWidget { + final String title; + final Widget widgetList; + final Function()? cancelTab; + final Function()? confirmTab; + + const IconsDialog({ + super.key, + required this.widgetList, + required this.title, + required this.cancelTab, + required this.confirmTab, + }); + + @override + Widget build(BuildContext context) { + return AlertDialog( + contentPadding: EdgeInsets.zero, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox( + height: 10, + ), + BodyLarge( + text: title, + fontWeight: FontWeight.w700, + fontColor: ColorsManager.primaryColor, + fontSize: 16, + ), + const Padding( + padding: EdgeInsets.only(left: 15, right: 15), + child: Divider( + color: ColorsManager.textGray, + ), + ), + widgetList, + Row( + children: [ + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + right: BorderSide( + color: ColorsManager.textGray, + width: 0.5, + ), + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: SizedBox( + child: InkWell( + onTap: cancelTab, + child: const Padding( + padding: EdgeInsets.all(15), + child: Center( + child: Text( + 'Cancel', + style: TextStyle( + color: ColorsManager.textGray, + fontSize: 14, + fontWeight: FontWeight.w400), + ), + ), + ), + ), + ), + ), + ), + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + left: BorderSide( + color: ColorsManager.textGray, + width: 0.5, + ), + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: InkWell( + onTap: confirmTab!, + child: const Padding( + padding: EdgeInsets.all(15), + child: Center( + child: Text( + 'Confirm', + style: TextStyle( + color: ColorsManager.primaryColor, + fontSize: 14, + fontWeight: FontWeight.w400), + ), + ), + )), + )) + ], + ) + ], + ), + ); + } +} diff --git a/lib/features/scene/widgets/scene_view_widget/scene_item.dart b/lib/features/scene/widgets/scene_view_widget/scene_item.dart index 53c1c1d..78f4200 100644 --- a/lib/features/scene/widgets/scene_view_widget/scene_item.dart +++ b/lib/features/scene/widgets/scene_view_widget/scene_item.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart'; import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart'; import 'package:syncrow_app/features/scene/bloc/scene_bloc/scene_bloc.dart'; @@ -37,8 +38,8 @@ class SceneItem extends StatelessWidget { onTap: () { context.read().add(const SmartSceneClearEvent()); if (disablePlayButton == false) { - BlocProvider.of(context).add( - FetchSceneTasksEvent(sceneId: scene.id, isAutomation: false)); + BlocProvider.of(context) + .add(FetchSceneTasksEvent(sceneId: scene.id, isAutomation: false)); /// the state to set the scene type must be after the fetch BlocProvider.of(context) @@ -72,19 +73,22 @@ class SceneItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Image.asset( - height: 32, - width: 32, - Assets.assetsIconsLogo, - fit: BoxFit.fill, - ), + if (!disablePlayButton) + Image.memory( + height: 32, + width: 32, + scene.iconInBytes, + fit: BoxFit.fill, + errorBuilder: (context, error, stackTrace) => + Image.asset(height: 32, width: 32, fit: BoxFit.fill, Assets.assetsIconsLogo), + ), + if (disablePlayButton) + SvgPicture.asset(height: 32, width: 32, fit: BoxFit.fill, Assets.automationIcon), disablePlayButton == false ? IconButton( padding: EdgeInsets.zero, onPressed: () { - context - .read() - .add(SceneTrigger(scene.id, scene.name)); + context.read().add(SceneTrigger(scene.id, scene.name)); }, icon: isLoading ? const Center( @@ -106,15 +110,11 @@ class SceneItem extends StatelessWidget { activeColor: ColorsManager.primaryColor, value: scene.status == 'enable' ? true : false, onChanged: (value) { - context.read().add( - UpdateAutomationStatus( - automationStatusUpdate: - AutomationStatusUpdate( - isEnable: value, - unitUuid: HomeCubit.getInstance() - .selectedSpace! - .id!), - automationId: scene.id)); + context.read().add(UpdateAutomationStatus( + automationStatusUpdate: AutomationStatusUpdate( + isEnable: value, + unitUuid: HomeCubit.getInstance().selectedSpace!.id!), + automationId: scene.id)); }, ), ], diff --git a/lib/generated/assets.dart b/lib/generated/assets.dart index 2d7e20a..1a2ecf7 100644 --- a/lib/generated/assets.dart +++ b/lib/generated/assets.dart @@ -3,8 +3,7 @@ class Assets { /// Assets for assetsFontsAftikaRegular /// assets/fonts/AftikaRegular.ttf - static const String assetsFontsAftikaRegular = - "assets/fonts/AftikaRegular.ttf"; + static const String assetsFontsAftikaRegular = "assets/fonts/AftikaRegular.ttf"; /// Assets for assetsIcons3GangSwitch /// assets/icons/3GangSwitch.svg @@ -20,98 +19,82 @@ class Assets { /// Assets for assetsIconsAutomatedClock /// assets/icons/automated_clock.svg - static const String assetsIconsAutomatedClock = - "assets/icons/automated_clock.svg"; + static const String assetsIconsAutomatedClock = "assets/icons/automated_clock.svg"; static const String acSwitchIcon = "assets/icons/ac_switch_ic.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstChargeddmOff /// assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstChargeddmOff.svg - static const String - assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstChargeddmOff = + static const String assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstChargeddmOff = "assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstDefaultdmOff /// assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstDefaultdmOff.svg - static const String - assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstDefaultdmOff = + static const String assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstDefaultdmOff = "assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOnstChargeddmOff /// assets/icons/battery/dmOff/perOffchargOfflowOffpmOnstChargeddmOff.svg - static const String - assetsIconsBatteryDmOffPerOffchargOfflowOffpmOnstChargeddmOff = + static const String assetsIconsBatteryDmOffPerOffchargOfflowOffpmOnstChargeddmOff = "assets/icons/battery/dmOff/perOffchargOfflowOffpmOnstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOnpmOffstDefaultdmOff /// assets/icons/battery/dmOff/perOffchargOfflowOnpmOffstDefaultdmOff.svg - static const String - assetsIconsBatteryDmOffPerOffchargOfflowOnpmOffstDefaultdmOff = + static const String assetsIconsBatteryDmOffPerOffchargOfflowOnpmOffstDefaultdmOff = "assets/icons/battery/dmOff/perOffchargOfflowOnpmOffstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOnpmOnstDefaultdmOff /// assets/icons/battery/dmOff/perOffchargOfflowOnpmOnstDefaultdmOff.svg - static const String - assetsIconsBatteryDmOffPerOffchargOfflowOnpmOnstDefaultdmOff = + static const String assetsIconsBatteryDmOffPerOffchargOfflowOnpmOnstDefaultdmOff = "assets/icons/battery/dmOff/perOffchargOfflowOnpmOnstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOffpmOffstChargeddmOff /// assets/icons/battery/dmOff/perOffchargOnlowOffpmOffstChargeddmOff.svg - static const String - assetsIconsBatteryDmOffPerOffchargOnlowOffpmOffstChargeddmOff = + static const String assetsIconsBatteryDmOffPerOffchargOnlowOffpmOffstChargeddmOff = "assets/icons/battery/dmOff/perOffchargOnlowOffpmOffstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOnpmOffstlowBatterydmOff /// assets/icons/battery/dmOff/perOffchargOnlowOnpmOffstlowBatterydmOff.svg - static const String - assetsIconsBatteryDmOffPerOffchargOnlowOnpmOffstlowBatterydmOff = + static const String assetsIconsBatteryDmOffPerOffchargOnlowOnpmOffstlowBatterydmOff = "assets/icons/battery/dmOff/perOffchargOnlowOnpmOffstlowBatterydmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOnpmOnstlowpmdmOff /// assets/icons/battery/dmOff/perOffchargOnlowOnpmOnstlowpmdmOff.svg - static const String - assetsIconsBatteryDmOffPerOffchargOnlowOnpmOnstlowpmdmOff = + static const String assetsIconsBatteryDmOffPerOffchargOnlowOnpmOnstlowpmdmOff = "assets/icons/battery/dmOff/perOffchargOnlowOnpmOnstlowpmdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstChargeddmOff /// assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstChargeddmOff.svg - static const String - assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstChargeddmOff = + static const String assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstChargeddmOff = "assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstDefaultdmOff /// assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstDefaultdmOff.svg - static const String - assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstDefaultdmOff = + static const String assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstDefaultdmOff = "assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOnstChargeddmOff /// assets/icons/battery/dmOff/perOnchargOfflowOffpmOnstChargeddmOff.svg - static const String - assetsIconsBatteryDmOffPerOnchargOfflowOffpmOnstChargeddmOff = + static const String assetsIconsBatteryDmOffPerOnchargOfflowOffpmOnstChargeddmOff = "assets/icons/battery/dmOff/perOnchargOfflowOffpmOnstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOnpmOffstDefaultdmOff /// assets/icons/battery/dmOff/perOnchargOfflowOnpmOffstDefaultdmOff.svg - static const String - assetsIconsBatteryDmOffPerOnchargOfflowOnpmOffstDefaultdmOff = + static const String assetsIconsBatteryDmOffPerOnchargOfflowOnpmOffstDefaultdmOff = "assets/icons/battery/dmOff/perOnchargOfflowOnpmOffstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOnpmOnstDefaultdmOff /// assets/icons/battery/dmOff/perOnchargOfflowOnpmOnstDefaultdmOff.svg - static const String - assetsIconsBatteryDmOffPerOnchargOfflowOnpmOnstDefaultdmOff = + static const String assetsIconsBatteryDmOffPerOnchargOfflowOnpmOnstDefaultdmOff = "assets/icons/battery/dmOff/perOnchargOfflowOnpmOnstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOffpmOffstChargeddmOff /// assets/icons/battery/dmOff/perOnchargOnlowOffpmOffstChargeddmOff.svg - static const String - assetsIconsBatteryDmOffPerOnchargOnlowOffpmOffstChargeddmOff = + static const String assetsIconsBatteryDmOffPerOnchargOnlowOffpmOffstChargeddmOff = "assets/icons/battery/dmOff/perOnchargOnlowOffpmOffstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOnpmOffstlowBatterydmOff /// assets/icons/battery/dmOff/perOnchargOnlowOnpmOffstlowBatterydmOff.svg - static const String - assetsIconsBatteryDmOffPerOnchargOnlowOnpmOffstlowBatterydmOff = + static const String assetsIconsBatteryDmOffPerOnchargOnlowOnpmOffstlowBatterydmOff = "assets/icons/battery/dmOff/perOnchargOnlowOnpmOffstlowBatterydmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOnpmOnstlowpmdmOff @@ -121,44 +104,37 @@ class Assets { /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstChargeddmOn /// assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstChargeddmOn.svg - static const String - assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstChargeddmOn = + static const String assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstChargeddmOn = "assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstDefaultdmOn /// assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstDefaultdmOn.svg - static const String - assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstDefaultdmOn = + static const String assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstDefaultdmOn = "assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOnstChargeddmOn /// assets/icons/battery/dmOn/perOffchargOfflowOffpmOnstChargeddmOn.svg - static const String - assetsIconsBatteryDmOnPerOffchargOfflowOffpmOnstChargeddmOn = + static const String assetsIconsBatteryDmOnPerOffchargOfflowOffpmOnstChargeddmOn = "assets/icons/battery/dmOn/perOffchargOfflowOffpmOnstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOnpmOffstDefaultdmOn /// assets/icons/battery/dmOn/perOffchargOfflowOnpmOffstDefaultdmOn.svg - static const String - assetsIconsBatteryDmOnPerOffchargOfflowOnpmOffstDefaultdmOn = + static const String assetsIconsBatteryDmOnPerOffchargOfflowOnpmOffstDefaultdmOn = "assets/icons/battery/dmOn/perOffchargOfflowOnpmOffstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOnpmOnstDefaultdmOn /// assets/icons/battery/dmOn/perOffchargOfflowOnpmOnstDefaultdmOn.svg - static const String - assetsIconsBatteryDmOnPerOffchargOfflowOnpmOnstDefaultdmOn = + static const String assetsIconsBatteryDmOnPerOffchargOfflowOnpmOnstDefaultdmOn = "assets/icons/battery/dmOn/perOffchargOfflowOnpmOnstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOffpmOffstChargeddmOn /// assets/icons/battery/dmOn/perOffchargOnlowOffpmOffstChargeddmOn.svg - static const String - assetsIconsBatteryDmOnPerOffchargOnlowOffpmOffstChargeddmOn = + static const String assetsIconsBatteryDmOnPerOffchargOnlowOffpmOffstChargeddmOn = "assets/icons/battery/dmOn/perOffchargOnlowOffpmOffstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOnpmOffstlowBatterydmOn /// assets/icons/battery/dmOn/perOffchargOnlowOnpmOffstlowBatterydmOn.svg - static const String - assetsIconsBatteryDmOnPerOffchargOnlowOnpmOffstlowBatterydmOn = + static const String assetsIconsBatteryDmOnPerOffchargOnlowOnpmOffstlowBatterydmOn = "assets/icons/battery/dmOn/perOffchargOnlowOnpmOffstlowBatterydmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOnpmOnstlowpmdmOn @@ -168,44 +144,37 @@ class Assets { /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstChargeddmOn /// assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstChargeddmOn.svg - static const String - assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstChargeddmOn = + static const String assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstChargeddmOn = "assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstDefaultdmOn /// assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstDefaultdmOn.svg - static const String - assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstDefaultdmOn = + static const String assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstDefaultdmOn = "assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOnstChargeddmOn /// assets/icons/battery/dmOn/perOnchargOfflowOffpmOnstChargeddmOn.svg - static const String - assetsIconsBatteryDmOnPerOnchargOfflowOffpmOnstChargeddmOn = + static const String assetsIconsBatteryDmOnPerOnchargOfflowOffpmOnstChargeddmOn = "assets/icons/battery/dmOn/perOnchargOfflowOffpmOnstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOnpmOffstDefaultdmOn /// assets/icons/battery/dmOn/perOnchargOfflowOnpmOffstDefaultdmOn.svg - static const String - assetsIconsBatteryDmOnPerOnchargOfflowOnpmOffstDefaultdmOn = + static const String assetsIconsBatteryDmOnPerOnchargOfflowOnpmOffstDefaultdmOn = "assets/icons/battery/dmOn/perOnchargOfflowOnpmOffstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOnpmOnstDefaultdmOn /// assets/icons/battery/dmOn/perOnchargOfflowOnpmOnstDefaultdmOn.svg - static const String - assetsIconsBatteryDmOnPerOnchargOfflowOnpmOnstDefaultdmOn = + static const String assetsIconsBatteryDmOnPerOnchargOfflowOnpmOnstDefaultdmOn = "assets/icons/battery/dmOn/perOnchargOfflowOnpmOnstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOffpmOffstChargeddmOn /// assets/icons/battery/dmOn/perOnchargOnlowOffpmOffstChargeddmOn.svg - static const String - assetsIconsBatteryDmOnPerOnchargOnlowOffpmOffstChargeddmOn = + static const String assetsIconsBatteryDmOnPerOnchargOnlowOffpmOffstChargeddmOn = "assets/icons/battery/dmOn/perOnchargOnlowOffpmOffstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOnpmOffstlowBatterydmOn /// assets/icons/battery/dmOn/perOnchargOnlowOnpmOffstlowBatterydmOn.svg - static const String - assetsIconsBatteryDmOnPerOnchargOnlowOnpmOffstlowBatterydmOn = + static const String assetsIconsBatteryDmOnPerOnchargOnlowOnpmOffstlowBatterydmOn = "assets/icons/battery/dmOn/perOnchargOnlowOnpmOffstlowBatterydmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOnpmOnstlowpmdmOn @@ -249,8 +218,7 @@ class Assets { static const String assetsIconsCurtainsIconVerticalBlade = "assets/icons/curtainsIcon/left_vertical_blade.svg"; - static const String rightVerticalBlade = - "assets/icons/curtainsIcon/right_vertical_blade.svg"; + static const String rightVerticalBlade = "assets/icons/curtainsIcon/right_vertical_blade.svg"; /// Assets for assetsIconsDashboard /// assets/icons/dashboard.svg @@ -260,8 +228,7 @@ class Assets { /// Assets for assetsIconsDashboardFill /// assets/icons/dashboard-fill.svg - static const String assetsIconsDashboardFill = - "assets/icons/dashboard-fill.svg"; + static const String assetsIconsDashboardFill = "assets/icons/dashboard-fill.svg"; /// Assets for assetsIconsDevices /// assets/icons/Devices.svg @@ -277,8 +244,7 @@ class Assets { /// Assets for assetsIconsDoorLockLinkage /// assets/icons/DoorLockLinkage.svg - static const String assetsIconsDoorLockLinkage = - "assets/icons/DoorLockLinkage.svg"; + static const String assetsIconsDoorLockLinkage = "assets/icons/DoorLockLinkage.svg"; /// Assets for assetsIconsDoorLockLock /// assets/icons/DoorLockLock.svg @@ -286,18 +252,15 @@ class Assets { /// Assets for assetsIconsDoorLockMembers /// assets/icons/DoorLockMembers.svg - static const String assetsIconsDoorLockMembers = - "assets/icons/DoorLockMembers.svg"; + static const String assetsIconsDoorLockMembers = "assets/icons/DoorLockMembers.svg"; /// Assets for assetsIconsDoorLockPassword /// assets/icons/DoorLockPassword.svg - static const String assetsIconsDoorLockPassword = - "assets/icons/DoorLockPassword.svg"; + static const String assetsIconsDoorLockPassword = "assets/icons/DoorLockPassword.svg"; /// Assets for assetsIconsDoorLockRecords /// assets/icons/DoorLockRecords.svg - static const String assetsIconsDoorLockRecords = - "assets/icons/DoorLockRecords.svg"; + static const String assetsIconsDoorLockRecords = "assets/icons/DoorLockRecords.svg"; /// Assets for assetsIconsDoorlockAssetsBatteryIndicator /// assets/icons/doorlock-assets/BatteryIndicator.svg @@ -318,8 +281,7 @@ class Assets { /// assets/icons/doorlock-assets/lockIcon.svg static const String assetsIconsDoorlockAssetsLockIcon = "assets/icons/doorlock-assets/lockIcon.svg"; - static const String doorUnlockIcon = - "assets/icons/doorlock-assets/door_un_look_ic.svg"; + static const String doorUnlockIcon = "assets/icons/doorlock-assets/door_un_look_ic.svg"; /// Assets for assetsIconsDoorlockAssetsMembersManagement /// assets/icons/doorlock-assets/members-management.svg @@ -407,13 +369,11 @@ class Assets { /// Assets for assetsIconsLightSwitchOff /// assets/icons/lightSwitchOff.svg - static const String assetsIconsLightSwitchOff = - "assets/icons/lightSwitchOff.svg"; + static const String assetsIconsLightSwitchOff = "assets/icons/lightSwitchOff.svg"; /// Assets for assetsIconsLightSwitchOn /// assets/icons/lightSwitchOn.svg - static const String assetsIconsLightSwitchOn = - "assets/icons/lightSwitchOn.svg"; + static const String assetsIconsLightSwitchOn = "assets/icons/lightSwitchOn.svg"; /// Assets for assetsIconsLinkageIconsDoorLockAlarm /// assets/icons/linkageIcons/doorLockAlarm.svg @@ -422,8 +382,7 @@ class Assets { /// Assets for assetsIconsLinkTimeLimitedPasswordIcon /// assets/icons/timeLimitedPasswordIcon.svg - static const String timeLimitedPasswordIcon = - "assets/icons/timeLimitedPasswordIcon.svg"; + static const String timeLimitedPasswordIcon = "assets/icons/timeLimitedPasswordIcon.svg"; /// Assets for assetsIconsoneTimePassword /// assets/icons/oneTimePassword.svg @@ -431,8 +390,7 @@ class Assets { /// Assets for assetsIconsTimeLimitedPassword /// assets/icons/timeLimitedPassword.svg - static const String timeLimitedPassword = - "assets/icons/timeLimitedPassword.svg"; + static const String timeLimitedPassword = "assets/icons/timeLimitedPassword.svg"; /// Assets for assetsIconsNoValidPasswords /// assets/icons/noValidPasswords.svg @@ -601,13 +559,11 @@ class Assets { /// Assets for assetsIconsPresenceSensorAssetsParameterSettings /// assets/icons/presence-sensor-assets/space_type_icon.svg - static const String spaceTypeIcon = - "assets/icons/presence-sensor-assets/space_type_icon.svg"; + static const String spaceTypeIcon = "assets/icons/presence-sensor-assets/space_type_icon.svg"; /// Assets for assetsIconsPresenceSensorAssetsParameterSettings /// assets/icons/presence-sensor-assets/space_type_icon.svg - static const String sensitivityIcon = - "assets/icons/presence-sensor-assets/Sensitivity.svg"; + static const String sensitivityIcon = "assets/icons/presence-sensor-assets/Sensitivity.svg"; /// Assets for assetsIconsPresenceSensorAssetsParameterSettings /// assets/icons/presence-sensor-assets/maximum_distance.svg @@ -640,8 +596,7 @@ class Assets { /// Assets for assetsIconsRoutinesFill /// assets/icons/Routines-fill.svg - static const String assetsIconsRoutinesFill = - "assets/icons/Routines-fill.svg"; + static const String assetsIconsRoutinesFill = "assets/icons/Routines-fill.svg"; /// Assets for assetsIconsScan /// assets/icons/Scan.svg @@ -673,8 +628,7 @@ class Assets { /// Assets for assetsIconsSustainability /// assets/icons/sustainability.svg - static const String assetsIconsSustainability = - "assets/icons/sustainability.svg"; + static const String assetsIconsSustainability = "assets/icons/sustainability.svg"; /// Assets for assetsIconsUnlockingMethodsIconsFace /// assets/icons/unlockingMethodsIcons/face.svg @@ -770,8 +724,7 @@ class Assets { /// Assets for assetsImagesHorizintalBlade /// assets/images/HorizintalBlade.png - static const String assetsImagesHorizintalBlade = - "assets/images/HorizintalBlade.png"; + static const String assetsImagesHorizintalBlade = "assets/images/HorizintalBlade.png"; /// Assets for assetsImagesLogo /// assets/images/Logo.svg @@ -779,8 +732,7 @@ class Assets { /// Assets for assetsImagesLogoHorizontal /// assets/images/logo_horizontal.png - static const String assetsImagesLogoHorizontal = - "assets/images/logo_horizontal.png"; + static const String assetsImagesLogoHorizontal = "assets/images/logo_horizontal.png"; /// Assets for assetsImagesPause /// assets/images/Pause.png @@ -810,8 +762,7 @@ class Assets { /// assets/images/Window.png static const String assetsImagesWindow = "assets/images/window_img.svg"; - static const String assetsSensitivityFunction = - "assets/icons/functions_icons/sensitivity.svg"; + static const String assetsSensitivityFunction = "assets/icons/functions_icons/sensitivity.svg"; //assets/icons/functions_icons/sesitivity_operation_icon.svg static const String assetsSensitivityOperationIcon = @@ -819,73 +770,59 @@ class Assets { //assets/icons/functions_icons/ac_power.svg - static const String assetsAcPower = - "assets/icons/functions_icons/ac_power.svg"; + static const String assetsAcPower = "assets/icons/functions_icons/ac_power.svg"; //assets/icons/functions_icons/ac_power_off.svg - static const String assetsAcPowerOFF = - "assets/icons/functions_icons/ac_power_off.svg"; + static const String assetsAcPowerOFF = "assets/icons/functions_icons/ac_power_off.svg"; //assets/icons/functions_icons/child_lock.svg - static const String assetsChildLock = - "assets/icons/functions_icons/child_lock.svg"; + static const String assetsChildLock = "assets/icons/functions_icons/child_lock.svg"; //assets/icons/functions_icons/cooling.svg - static const String assetsFreezing = - "assets/icons/functions_icons/freezing.svg"; + static const String assetsFreezing = "assets/icons/functions_icons/freezing.svg"; //assets/icons/functions_icons/fan_speed.svg - static const String assetsFanSpeed = - "assets/icons/functions_icons/fan_speed.svg"; + static const String assetsFanSpeed = "assets/icons/functions_icons/fan_speed.svg"; //assets/icons/functions_icons/ac_cooling.svg - static const String assetsAcCooling = - "assets/icons/functions_icons/ac_cooling.svg"; + static const String assetsAcCooling = "assets/icons/functions_icons/ac_cooling.svg"; //assets/icons/functions_icons/ac_heating.svg - static const String assetsAcHeating = - "assets/icons/functions_icons/ac_heating.svg"; + static const String assetsAcHeating = "assets/icons/functions_icons/ac_heating.svg"; //assets/icons/functions_icons/celsius_degrees.svg - static const String assetsCelsiusDegrees = - "assets/icons/functions_icons/celsius_degrees.svg"; + static const String assetsCelsiusDegrees = "assets/icons/functions_icons/celsius_degrees.svg"; //assets/icons/functions_icons/tempreture.svg - static const String assetsTempreture = - "assets/icons/functions_icons/tempreture.svg"; + static const String assetsTempreture = "assets/icons/functions_icons/tempreture.svg"; //assets/icons/functions_icons/ac_fan_low.svg - static const String assetsAcFanLow = - "assets/icons/functions_icons/ac_fan_low.svg"; + static const String assetsAcFanLow = "assets/icons/functions_icons/ac_fan_low.svg"; //assets/icons/functions_icons/ac_fan_middle.svg - static const String assetsAcFanMiddle = - "assets/icons/functions_icons/ac_fan_middle.svg"; + static const String assetsAcFanMiddle = "assets/icons/functions_icons/ac_fan_middle.svg"; //assets/icons/functions_icons/ac_fan_high.svg - static const String assetsAcFanHigh = - "assets/icons/functions_icons/ac_fan_high.svg"; + static const String assetsAcFanHigh = "assets/icons/functions_icons/ac_fan_high.svg"; //assets/icons/functions_icons/ac_fan_auto.svg - static const String assetsAcFanAuto = - "assets/icons/functions_icons/ac_fan_auto.svg"; + static const String assetsAcFanAuto = "assets/icons/functions_icons/ac_fan_auto.svg"; //assets/icons/functions_icons/scene_child_lock.svg - static const String assetsSceneChildLock = - "assets/icons/functions_icons/scene_child_lock.svg"; + static const String assetsSceneChildLock = "assets/icons/functions_icons/scene_child_lock.svg"; //assets/icons/functions_icons/scene_child_unlock.svg @@ -894,18 +831,15 @@ class Assets { //assets/icons/functions_icons/scene_refresh.svg - static const String assetsSceneRefresh = - "assets/icons/functions_icons/scene_refresh.svg"; + static const String assetsSceneRefresh = "assets/icons/functions_icons/scene_refresh.svg"; //assets/icons/functions_icons/light_countdown.svg - static const String assetsLightCountdown = - "assets/icons/functions_icons/light_countdown.svg"; + static const String assetsLightCountdown = "assets/icons/functions_icons/light_countdown.svg"; //assets/icons/functions_icons/far_detection.svg - static const String assetsFarDetection = - "assets/icons/functions_icons/far_detection.svg"; + static const String assetsFarDetection = "assets/icons/functions_icons/far_detection.svg"; //assets/icons/functions_icons/far_detection_function.svg @@ -914,13 +848,11 @@ class Assets { //assets/icons/functions_icons/indicator.svg - static const String assetsIndicator = - "assets/icons/functions_icons/indicator.svg"; + static const String assetsIndicator = "assets/icons/functions_icons/indicator.svg"; //assets/icons/functions_icons/motion_detection.svg - static const String assetsMotionDetection = - "assets/icons/functions_icons/motion_detection.svg"; + static const String assetsMotionDetection = "assets/icons/functions_icons/motion_detection.svg"; //assets/icons/functions_icons/motionless_detection.svg @@ -929,18 +861,15 @@ class Assets { //assets/icons/functions_icons/nobody_time.svg - static const String assetsNobodyTime = - "assets/icons/functions_icons/nobody_time.svg"; + static const String assetsNobodyTime = "assets/icons/functions_icons/nobody_time.svg"; //assets/icons/functions_icons/factory_reset.svg - static const String assetsFactoryReset = - "assets/icons/functions_icons/factory_reset.svg"; + static const String assetsFactoryReset = "assets/icons/functions_icons/factory_reset.svg"; //assets/icons/functions_icons/master_state.svg - static const String assetsMasterState = - "assets/icons/functions_icons/master_state.svg"; + static const String assetsMasterState = "assets/icons/functions_icons/master_state.svg"; //assets/icons/functions_icons/switch_alarm_sound.svg @@ -949,8 +878,7 @@ class Assets { //assets/icons/functions_icons/reset_off.svg - static const String assetsResetOff = - "assets/icons/functions_icons/reset_off.svg"; + static const String assetsResetOff = "assets/icons/functions_icons/reset_off.svg"; //assets/icons/functions_icons/automation_functions/card_unlock.svg @@ -1024,8 +952,7 @@ class Assets { //assets/icons/functions_icons/automation_functions/motion.svg - static const String assetsMotion = - "assets/icons/functions_icons/automation_functions/motion.svg"; + static const String assetsMotion = "assets/icons/functions_icons/automation_functions/motion.svg"; //assets/icons/functions_icons/automation_functions/current_temp.svg @@ -1047,33 +974,27 @@ class Assets { static const String waterHeaterOn = "assets/icons/water_heater_on.svg"; static const String waterHeaterOff = "assets/icons/water_heater_off.svg"; - static const String scheduleCelenderIcon = - "assets/icons/schedule_celender_icon.svg"; - static const String scheduleCirculateIcon = - "assets/icons/schedule_circulate_icon.svg"; - static const String scheduleInchingIcon = - "assets/icons/schedule_Inching_icon.svg"; + static const String scheduleCelenderIcon = "assets/icons/schedule_celender_icon.svg"; + static const String scheduleCirculateIcon = "assets/icons/schedule_circulate_icon.svg"; + static const String scheduleInchingIcon = "assets/icons/schedule_Inching_icon.svg"; static const String scheduleTimeIcon = "assets/icons/schedule_time_icon.svg"; static const String waterHeaterIcon = "assets/icons/water_heater_icon.svg"; static const String doorOpen = "assets/icons/opened_door.svg"; static const String doorClose = "assets/icons/closed_door.svg"; - static const String doorNotificationSetting = - "assets/icons/door_notification_setting_icon.svg"; + static const String doorNotificationSetting = "assets/icons/door_notification_setting_icon.svg"; static const String doorRecordsIcon = "assets/icons/door_records_icon.svg"; static const String doorSensorIcon = "assets/icons/door_sensor_icon.svg"; static const String closedGarageIcon = "assets/icons/closed_garage_door.svg"; static const String openGarageIcon = "assets/icons/open_garage_door.svg"; static const String garageCountdown = "assets/icons/garage_countdown.svg"; - static const String garagePreferencesIcon = - "assets/icons/garage_preferences_icon.svg"; + static const String garagePreferencesIcon = "assets/icons/garage_preferences_icon.svg"; static const String garageSchedule = "assets/icons/garage_schedule.svg"; static const String garageIcon = "assets/icons/garageIcon.svg"; static const String normalWaterLeak = "assets/icons/normal_water_leak.svg"; - static const String detectedWaterLeak = - "assets/icons/detected_water_leak.svg"; + static const String detectedWaterLeak = "assets/icons/detected_water_leak.svg"; static const String waterLeakIcon = "assets/icons/waterleak_icon.svg"; static const String leakDetectedIcon = "assets/icons/leak_detected.svg"; @@ -1089,6 +1010,7 @@ class Assets { static const String voltageIcon = "assets/icons/voltage_icon.svg"; static const String speedoMeter = "assets/icons/speedo_meter.svg"; static const String powerClampIcon = "assets/icons/power_clamp.svg"; + static const String automationIcon = "assets/icons/automation_ic.svg"; //powerClampIcon } diff --git a/lib/services/api/scene_api.dart b/lib/services/api/scene_api.dart index 13511a5..6e0d981 100644 --- a/lib/services/api/scene_api.dart +++ b/lib/services/api/scene_api.dart @@ -1,7 +1,6 @@ -import 'dart:math'; - import 'package:syncrow_app/features/scene/model/create_automation_model.dart'; import 'package:syncrow_app/features/scene/model/create_scene_model.dart'; +import 'package:syncrow_app/features/scene/model/icon_model.dart'; import 'package:syncrow_app/features/scene/model/scene_details_model.dart'; import 'package:syncrow_app/features/scene/model/scenes_model.dart'; import 'package:syncrow_app/features/scene/model/update_automation.dart'; @@ -12,8 +11,7 @@ class SceneApi { static final HTTPService _httpService = HTTPService(); //create scene - static Future> createScene( - CreateSceneModel createSceneModel) async { + static Future> createScene(CreateSceneModel createSceneModel) async { try { final response = await _httpService.post( path: ApiEndpoints.createScene, @@ -49,10 +47,11 @@ class SceneApi { //get scene by unit id - static Future> getScenesByUnitId(String unitId) async { + static Future> getScenesByUnitId(String unitId, {showInDevice = false}) async { try { final response = await _httpService.get( path: ApiEndpoints.getUnitScenes.replaceAll('{unitUuid}', unitId), + queryParameters: {'showInHomePage': showInDevice}, showServerMessage: false, expectedResponseModel: (json) { List scenes = []; @@ -103,12 +102,10 @@ class SceneApi { } //automation details - static Future getAutomationDetails( - String automationId) async { + static Future getAutomationDetails(String automationId) async { try { final response = await _httpService.get( - path: ApiEndpoints.getAutomationDetails - .replaceAll('{automationId}', automationId), + path: ApiEndpoints.getAutomationDetails.replaceAll('{automationId}', automationId), showServerMessage: false, expectedResponseModel: (json) => SceneDetailsModel.fromJson(json), ); @@ -119,12 +116,11 @@ class SceneApi { } //updateAutomationStatus - static Future updateAutomationStatus(String automationId, - AutomationStatusUpdate createAutomationEnable) async { + static Future updateAutomationStatus( + String automationId, AutomationStatusUpdate createAutomationEnable) async { try { final response = await _httpService.put( - path: ApiEndpoints.updateAutomationStatus - .replaceAll('{automationId}', automationId), + path: ApiEndpoints.updateAutomationStatus.replaceAll('{automationId}', automationId), body: createAutomationEnable.toMap(), expectedResponseModel: (json) => json['success'], ); @@ -133,6 +129,7 @@ class SceneApi { rethrow; } } + static Future getSceneDetails(String sceneId) async { try { final response = await _httpService.get( @@ -146,20 +143,19 @@ class SceneApi { } } - static Future getIcon() async { - try { - final response = await _httpService.get( - path: ApiEndpoints.getIconScene, - showServerMessage: false, - expectedResponseModel: (json) { - log(json); - return json; - }, - ); - return response; - } catch (e) { - rethrow; - } + static Future> getIcon() async { + final response = await _httpService.get( + path: ApiEndpoints.getIconScene, + showServerMessage: false, + expectedResponseModel: (json) { + List iconsList = []; + json.forEach((element) { + iconsList.add(IconModel.fromJson(element)); + }); + return iconsList; + }, + ); + return response; } //update Scene @@ -167,8 +163,7 @@ class SceneApi { try { final response = await _httpService.put( path: ApiEndpoints.updateScene.replaceAll('{sceneId}', sceneId), - body: createSceneModel - .toJson(sceneId.isNotEmpty == true ? sceneId : null), + body: createSceneModel.toJson(sceneId.isNotEmpty == true ? sceneId : null), expectedResponseModel: (json) { return json; }, @@ -180,14 +175,11 @@ class SceneApi { } //update automation - static updateAutomation( - CreateAutomationModel createAutomationModel, String automationId) async { + static updateAutomation(CreateAutomationModel createAutomationModel, String automationId) async { try { final response = await _httpService.put( - path: ApiEndpoints.updateAutomation - .replaceAll('{automationId}', automationId), - body: createAutomationModel - .toJson(automationId.isNotEmpty == true ? automationId : null), + path: ApiEndpoints.updateAutomation.replaceAll('{automationId}', automationId), + body: createAutomationModel.toJson(automationId.isNotEmpty == true ? automationId : null), expectedResponseModel: (json) { return json; }, @@ -200,8 +192,7 @@ class SceneApi { //delete Scene - static Future deleteScene( - {required String unitUuid, required String sceneId}) async { + static Future deleteScene({required String unitUuid, required String sceneId}) async { try { final response = await _httpService.delete( path: ApiEndpoints.deleteScene