diff --git a/lib/features/scene/view/scene_view.dart b/lib/features/scene/view/scene_view.dart index c62cbd8..b78e3b5 100644 --- a/lib/features/scene/view/scene_view.dart +++ b/lib/features/scene/view/scene_view.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart'; -import 'package:syncrow_app/features/app_layout/model/community_model.dart'; import 'package:syncrow_app/features/app_layout/model/space_model.dart'; import 'package:syncrow_app/features/devices/view/widgets/scene_listview.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'; import 'package:syncrow_app/features/scene/bloc/scene_bloc/scene_event.dart'; import 'package:syncrow_app/features/scene/bloc/smart_scene/smart_scene_select_dart_bloc.dart'; +import 'package:syncrow_app/features/scene/helper/scene_bloc_factory.dart'; import 'package:syncrow_app/features/scene/widgets/empty_devices_widget.dart'; import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_grid_view.dart'; import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_header.dart'; @@ -22,71 +22,30 @@ class SceneView extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (BuildContext context) { - if (pageType) { - return SceneBloc() - ..add(LoadScenes( - HomeCubit.getInstance().selectedSpace?.id ?? '', - HomeCubit.getInstance().selectedSpace ?? - SpaceModel( - id: '-1', - name: '', - community: Community( - uuid: '-1', - name: '', - )), - showInDevice: pageType)); - } else { - return SceneBloc() - ..add(LoadScenes( - HomeCubit.getInstance().selectedSpace?.id ?? '', - HomeCubit.getInstance().selectedSpace ?? - SpaceModel( - id: '-1', - name: '', - community: Community( - uuid: '-1', - name: '', - )), - showInDevice: pageType)) - ..add(LoadAutomation( - HomeCubit.getInstance().selectedSpace?.id ?? '', - HomeCubit.getInstance().selectedSpace?.community.uuid ?? '')); - } - }, + create: (context) => SceneBlocFactory.create( + pageType: pageType, + homeCubit: HomeCubit.getInstance(), + ), child: BlocBuilder( builder: (context, state) { + final selectedSpace = HomeCubit.getInstance().selectedSpace; if (state is DeleteSceneSuccess) { if (state.success) { - BlocProvider.of(context).add(LoadScenes( - HomeCubit.getInstance().selectedSpace!.id, - HomeCubit.getInstance().selectedSpace!, - showInDevice: pageType)); - BlocProvider.of(context).add(LoadAutomation( - HomeCubit.getInstance().selectedSpace!.id, - HomeCubit.getInstance().selectedSpace!.community.uuid)); + _loadScenesAndAutomations(context, selectedSpace); } } if (state is CreateSceneWithTasks) { - if (state.success == true) { - BlocProvider.of(context).add(LoadScenes( - HomeCubit.getInstance().selectedSpace!.id, - HomeCubit.getInstance().selectedSpace!, - showInDevice: pageType)); - BlocProvider.of(context).add(LoadAutomation( - HomeCubit.getInstance().selectedSpace!.id, - HomeCubit.getInstance().selectedSpace!.community.uuid)); - context - .read() - .add(const SmartSceneClearEvent()); + if (state.success) { + _loadScenesAndAutomations(context, selectedSpace); + 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 @@ -95,13 +54,14 @@ class SceneView extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - if (pageType == false) const SceneHeader(), - if (pageType == false) const SizedBox(height: 8), + if (!pageType) ...[ + const SceneHeader(), + const SizedBox(height: 8), + ], BlocBuilder( builder: (context, state) { if (state is SceneLoading) { - return const Center( - child: CircularProgressIndicator()); + return const Center(child: CircularProgressIndicator()); } if (state is SceneError) { return Center( @@ -112,83 +72,79 @@ class SceneView extends StatelessWidget { final scenes = state.scenes; final automationList = state.automationList; if (scenes.isEmpty) return const EmptyDevicesWidget(); - return pageType - ? SizedBox( - height: context.height * 0.1, - child: SceneListview( - scenes: scenes, - loadingSceneId: state.loadingSceneId, - ), - ) - : Expanded( - child: ListView( + + if (pageType) { + return SizedBox( + height: context.height * 0.1, + child: SceneListview( + scenes: scenes, + loadingSceneId: state.loadingSceneId, + ), + ); + } + + return Theme( + data: Theme.of(context).copyWith( + dividerColor: Colors.transparent, + ), + child: Expanded( + child: ListView( + children: [ + ExpansionTile( + tilePadding: const EdgeInsets.symmetric( + horizontal: 6, + ), + initiallyExpanded: true, + iconColor: ColorsManager.grayColor, + title: const BodyMedium( + text: 'Tap to run routines', + ), children: [ - Theme( - data: ThemeData().copyWith( - dividerColor: Colors.transparent), - child: ExpansionTile( - tilePadding: - const EdgeInsets.symmetric( - horizontal: 6), - initiallyExpanded: true, - iconColor: ColorsManager.grayColor, - title: const BodyMedium( - text: 'Tap to run routines'), - children: [ - scenes.isNotEmpty - ? SceneGrid( - scenes: scenes, - loadingSceneId: - state.loadingSceneId, - disablePlayButton: false, - loadingStates: state - .loadingStates, // Add this line - ) - : const Center( - child: BodyMedium( - text: - 'No scenes have been added yet', - ), - ), - const SizedBox(height: 10), - ], + if (scenes.isNotEmpty) + SceneGrid( + scenes: scenes, + loadingSceneId: state.loadingSceneId, + disablePlayButton: false, + loadingStates: state.loadingStates, + ) + else + const Center( + child: BodyMedium( + text: 'No scenes have been added yet', + ), ), - ), - Theme( - data: ThemeData().copyWith( - dividerColor: Colors.transparent), - child: ExpansionTile( - initiallyExpanded: true, - iconColor: ColorsManager.grayColor, - tilePadding: - const EdgeInsets.symmetric( - horizontal: 6), - title: const BodyMedium( - text: 'Automation'), - children: [ - automationList.isNotEmpty - ? SceneGrid( - scenes: automationList, - loadingSceneId: - state.loadingSceneId, - disablePlayButton: true, - loadingStates: state - .loadingStates, // Add this line - ) - : const Center( - child: BodyMedium( - text: - 'No automations have been added yet', - ), - ), - const SizedBox(height: 10), - ], - ), - ), - const SizedBox(height: 15), + const SizedBox(height: 10), ], ), - ); + ExpansionTile( + initiallyExpanded: true, + iconColor: ColorsManager.grayColor, + tilePadding: const EdgeInsets.symmetric( + horizontal: 6, + ), + title: const BodyMedium(text: 'Automation'), + children: [ + automationList.isNotEmpty + ? SceneGrid( + scenes: automationList, + loadingSceneId: state.loadingSceneId, + disablePlayButton: true, + loadingStates: state.loadingStates, + ) + : const Center( + child: BodyMedium( + text: + 'No automations have been added yet', + ), + ), + const SizedBox(height: 10), + ], + ), + const SizedBox(height: 15), + ], + ), + ), + ); } return const SizedBox.shrink(); }, @@ -200,4 +156,21 @@ class SceneView extends StatelessWidget { ), ); } + + void _loadScenesAndAutomations(BuildContext context, SpaceModel? selectedSpace) { + BlocProvider.of(context) + ..add( + LoadScenes( + selectedSpace!.id, + selectedSpace, + showInDevice: pageType, + ), + ) + ..add( + LoadAutomation( + selectedSpace.id, + selectedSpace.community.uuid, + ), + ); + } }