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/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'; import 'package:syncrow_app/features/shared_widgets/app_loading_indicator.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 SceneView extends StatelessWidget { const SceneView({ this.pageType = false, super.key, }); final bool pageType; @override Widget build(BuildContext context) { return BlocProvider( 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) _loadScenesAndAutomations(context, selectedSpace); } if (state is CreateSceneWithTasks) { 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!', ); } }, child: HomeCubit.getInstance().spaces.isEmpty ? const EmptyDevicesWidget() : Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ if (!pageType) ...[ const SceneHeader(), const SizedBox(height: 8), ], BlocBuilder( builder: (context, state) { if (state is SceneLoading) { return const AppLoadingIndicator(); } if (state is SceneError) { return Center( child: Text(state.message), ); } if (state is SceneLoaded) { final scenes = state.scenes; final automationList = state.automationList; if (scenes.isEmpty) return const EmptyDevicesWidget(); 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 automations', ), children: [ 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', ), ), const SizedBox(height: 10), ], ), ExpansionTile( initiallyExpanded: true, iconColor: ColorsManager.grayColor, tilePadding: const EdgeInsets.symmetric( horizontal: 6, ), title: const BodyMedium(text: 'Automation'), children: [ if (automationList.isNotEmpty) SceneGrid( scenes: automationList, loadingSceneId: state.loadingSceneId, disablePlayButton: true, loadingStates: state.loadingStates, ) else const Center( child: BodyMedium( text: 'No automations have been added yet', ), ), const SizedBox(height: 10), ], ), const SizedBox(height: 15), ], ), ), ); } return const SizedBox.shrink(); }, ), ], ), ); }, ), ); } void _loadScenesAndAutomations(BuildContext context, SpaceModel? selectedSpace) { BlocProvider.of(context) ..add( LoadScenes( selectedSpace!.id, selectedSpace, showInDevice: pageType, ), ) ..add( LoadAutomation( selectedSpace.id, selectedSpace.community.uuid, ), ); } }