import 'package:flutter/material.dart'; import 'groups/groups_screen.dart'; import 'groups/groups_model.dart'; import '../../bloc/inter_family_bloc.dart'; import 'inter_family_widget.dart'; import '../../product/base/bloc/base_bloc.dart'; import '../../product/constant/app/app_constants.dart'; import '../../product/constant/icon/icon_constants.dart'; import '../../product/extension/context_extension.dart'; import '../../product/services/language_services.dart'; class InterFamilyScreen extends StatefulWidget { const InterFamilyScreen({super.key}); @override State createState() => _InterFamilyScreenState(); } class _InterFamilyScreenState extends State { late InterFamilyBloc interFamilyBloc; String title = ""; int _selectedIndex = 0; bool isLoading = false; @override void initState() { super.initState(); interFamilyBloc = BlocProvider.of(context); // fetch initial groups for the default selected tab WidgetsBinding.instance.addPostFrameCallback((_) { interFamilyBloc.getAllGroup( context, _selectedIndex == 0 ? ApplicationConstants.OWNER_GROUP : ApplicationConstants.PARTICIPANT_GROUP); }); } List ownerGroups = []; List participantGroups = []; List get _widgetOptions => [ GroupsScreen( role: ApplicationConstants.OWNER_GROUP, groups: ownerGroups, interFamilyBloc: interFamilyBloc, ), GroupsScreen( role: ApplicationConstants.PARTICIPANT_GROUP, groups: participantGroups, interFamilyBloc: interFamilyBloc, ), ]; @override Widget build(BuildContext context) { checkTitle(_selectedIndex); return StreamBuilder( stream: interFamilyBloc.streamSelectedScreen, initialData: _selectedIndex, builder: (context, selectSnapshot) { // subscribe to groups stream and update local lists so child widgets render instantly return StreamBuilder>( stream: interFamilyBloc.streamCurrentGroups, builder: (context, groupsSnapshot) { if (groupsSnapshot.hasData) { final all = groupsSnapshot.data!; ownerGroups = all .where((g) => g.isOwner == true && g.visibility == 'PUBLIC') .toList(); participantGroups = all .where((g) => g.isOwner == null && g.visibility == 'PUBLIC') .toList(); } // build UI below return Scaffold( appBar: AppBar( actions: [ ElevatedButton( onPressed: () { if (selectSnapshot.data == 0) { createOrJoinGroupDialog( context, interFamilyBloc, ApplicationConstants.OWNER_GROUP, appLocalization(context).add_new_group, appLocalization(context).group_name_title, "", false, "", "", "", ); } else { createOrJoinGroupDialog( context, interFamilyBloc, ApplicationConstants.PARTICIPANT_GROUP, appLocalization(context).join_group, appLocalization(context).group_id_title, '', true, "", appLocalization(context).group_name_title, "", ); } }, style: ElevatedButton.styleFrom(shape: const CircleBorder()), child: IconConstants.instance.getMaterialIcon(Icons.add), ), ], leading: Builder( builder: (context) { return IconButton( onPressed: () { Scaffold.of(context).openDrawer(); }, icon: const Icon(Icons.menu), ); }, ), title: StreamBuilder( stream: interFamilyBloc.streamTitleScreen, initialData: title, builder: (context, titleSnapshot) { return Center( child: Text(titleSnapshot.data ?? title), ); }, ), ), drawer: Drawer( width: context.dynamicWidth(0.6), child: ListView( padding: EdgeInsets.zero, children: [ ListTile( title: Text(appLocalization(context).my_group_title), selected: _selectedIndex == 0, onTap: () { _onItemTapped(0); title = appLocalization(context).my_group_title; interFamilyBloc.sinkTitleScreen.add(title); Navigator.pop(context); }, ), ListTile( title: Text(appLocalization(context).invite_group), selected: _selectedIndex == 1, onTap: () { _onItemTapped(1); title = appLocalization(context).invite_group; interFamilyBloc.sinkTitleScreen.add(title); Navigator.pop(context); }, ), ], ), ), body: _widgetOptions[selectSnapshot.data ?? _selectedIndex], ); }, ); }, ); } void checkTitle(int index) { if (index == 0) { title = appLocalization(context).my_group_title; interFamilyBloc.sinkTitleScreen.add(title); } else { title = appLocalization(context).invite_group; interFamilyBloc.sinkTitleScreen.add(title); } } void _onItemTapped(int index) { _selectedIndex = index; interFamilyBloc.sinkSelectedScreen.add(_selectedIndex); isLoading = false; interFamilyBloc.sinkIsLoading.add(isLoading); // fetch groups for the selected tab immediately interFamilyBloc.getAllGroup( context, _selectedIndex == 0 ? ApplicationConstants.OWNER_GROUP : ApplicationConstants.PARTICIPANT_GROUP); } }