finished rooms call with all devices and single devices call

This commit is contained in:
ashrafzarkanisala
2024-06-23 20:12:38 +03:00
parent b58af41b88
commit 759888857d
8 changed files with 446 additions and 72 deletions
@@ -1,12 +1,25 @@
import 'dart:async';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/device_manager_bloc/device_manager_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/device_manager_bloc/device_manager_event.dart';
import 'package:syncrow_app/features/scene/bloc/tab_change/tab_change_event.dart';
import 'package:syncrow_app/features/scene/bloc/tab_change/tab_change_state.dart';
class TabBarBloc extends Bloc<TabBarEvent, TabBarState> {
TabBarBloc() : super(const Initial()) {
on<TabChanged>((event, emit) {
emit(TabSelected(
selectedTabIndex: event.selectedIndex, roomId: event.roomId));
});
final DeviceManagerBloc deviceManagerBloc;
TabBarBloc(this.deviceManagerBloc) : super(const Initial()) {
on<TabChanged>(_handleTabChanged);
}
FutureOr<void> _handleTabChanged(
TabChanged event, Emitter<TabBarState> emit) {
if (event.roomId == "-1") {
deviceManagerBloc.add(FetchAllDevices());
} else {
deviceManagerBloc.add(FetchDevicesByRoomId(event.roomId));
}
emit(TabSelected(
roomId: event.roomId, selectedTabIndex: event.selectedIndex));
}
}
@@ -34,7 +34,7 @@ class _SceneControlDevicesViewState extends State<SceneControlDevicesView>
0,
RoomModel(
name: 'All Devices',
devices: [],
devices: DevicesCubit.getInstance().allDevices,
id: '-1',
type: SpaceType.Room,
),
@@ -57,7 +57,7 @@ class _SceneControlDevicesViewState extends State<SceneControlDevicesView>
TabChanged(selectedIndex: value, roomId: rooms?[value].id ?? ''));
/// fetch devices
context.read<DevicesCubit>().fetchDevicesByRoomId(rooms![value].id!);
// context.read<DevicesCubit>().fetchDevicesByRoomId(rooms![value].id!);
return;
}
}
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
import 'package:syncrow_app/features/devices/bloc/device_manager_bloc/device_manager_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/device_manager_bloc/device_manager_state.dart';
import 'package:syncrow_app/features/devices/model/room_model.dart';
import 'package:syncrow_app/features/scene/bloc/tab_change/tab_change_bloc.dart';
import 'package:syncrow_app/features/scene/bloc/tab_change/tab_change_state.dart';
@@ -8,18 +9,16 @@ import 'package:syncrow_app/features/scene/view/widgets/scene_list_tile.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.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/generated/assets.dart';
import 'package:syncrow_app/utils/context_extension.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class SceneDevicesBody extends StatelessWidget {
const SceneDevicesBody({
super.key,
required TabController tabController,
required this.rooms,
}) : _tabController = tabController;
}) : _tabController = tabController;
final TabController _tabController;
final List<RoomModel>? rooms;
@@ -27,11 +26,10 @@ class SceneDevicesBody extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<TabBarBloc, TabBarState>(
builder: (context, state) {
builder: (context, tabState) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
/// Tab bar
TabBar(
controller: _tabController,
dividerColor: Colors.transparent,
@@ -42,7 +40,8 @@ class SceneDevicesBody extends StatelessWidget {
text: e.name ?? '',
textAlign: TextAlign.start,
style: context.bodyLarge.copyWith(
color: (state is TabSelected) && state.roomId == e.id
color: (tabState is TabSelected) &&
tabState.roomId == e.id
? ColorsManager.textPrimaryColor
: ColorsManager.textPrimaryColor.withOpacity(0.2),
),
@@ -52,59 +51,10 @@ class SceneDevicesBody extends StatelessWidget {
isScrollable: true,
tabAlignment: TabAlignment.start,
),
/// Tab bar view
Expanded(
child: TabBarView(
controller: _tabController,
children: rooms!
.map((e) => BlocBuilder<DevicesCubit, DevicesState>(
builder: (context, state) {
if (state is GetDevicesLoading) {
return const Center(
child: CircularProgressIndicator());
} else if (state is GetDevicesSuccess) {
return ListView.builder(
itemCount: state.devices!.length,
itemBuilder: (context, index) {
final device = state.devices![index];
return DefaultContainer(
child: SceneListTile(
minLeadingWidth: 40,
leadingWidget: Image.network(
device.icon ?? '',
errorBuilder:
(context, error, stackTrace) =>
Image.asset(
Assets.assetsIconsLogo,
width: 20,
),
),
titleWidget: BodyMedium(
text: device.name ?? '',
style: context.titleSmall.copyWith(
color:
ColorsManager.secondaryTextColor,
fontWeight: FontWeight.w400,
fontSize: 20,
),
),
trailingWidget: const Icon(
Icons.arrow_forward_ios_rounded,
size: 16,
weight: 0.2,
),
),
);
},
);
} else if (state is GetDevicesError) {
return Center(child: Text(state.errorMsg));
}
return const SizedBox();
},
))
.toList(),
children: rooms!.map((e) => _buildRoomTab(e, context)).toList(),
),
),
],
@@ -112,4 +62,49 @@ class SceneDevicesBody extends StatelessWidget {
},
);
}
Widget _buildRoomTab(RoomModel room, BuildContext context) {
return BlocBuilder<DeviceManagerBloc, DeviceManagerState>(
builder: (context, state) {
if (state is GetDevicesLoading) {
return const Center(child: CircularProgressIndicator());
} else if (state is GetDevicesSuccess) {
return ListView.builder(
itemCount: state.devices?.length ?? 0,
itemBuilder: (context, index) {
final device = state.devices![index];
return DefaultContainer(
child: SceneListTile(
minLeadingWidth: 40,
leadingWidget: Image.network(
device.icon ?? '',
errorBuilder: (context, error, stackTrace) => Image.asset(
Assets.assetsIconsLogo,
width: 20,
),
),
titleWidget: BodyMedium(
text: device.name ?? '',
style: context.titleSmall.copyWith(
color: ColorsManager.secondaryTextColor,
fontWeight: FontWeight.w400,
fontSize: 20,
),
),
trailingWidget: const Icon(
Icons.arrow_forward_ios_rounded,
size: 16,
weight: 0.2,
),
),
);
},
);
} else if (state is GetDevicesError) {
return Center(child: Text(state.error));
}
return const SizedBox();
},
);
}
}