// ignore_for_file: use_build_context_synchronously import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import '../../../product/constant/enums/app_route_enums.dart'; import 'groups_model.dart'; import 'groups_widget.dart'; import '../../../bloc/inter_family_bloc.dart'; import '../inter_family_widget.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'; /// Stateless widget that renders a provided list of groups. The parent /// screen owns fetching/updating the list; this widget only displays it and /// forwards actions to the provided [InterFamilyBloc]. class GroupsScreen extends StatelessWidget { const GroupsScreen( {super.key, required this.role, required this.groups, required this.interFamilyBloc}); final String role; final List groups; final InterFamilyBloc interFamilyBloc; @override Widget build(BuildContext context) { if (role != ApplicationConstants.OWNER_GROUP && role != ApplicationConstants.PARTICIPANT_GROUP) { return const SizedBox.shrink(); } if (groups.isEmpty) { return Center(child: Text(appLocalization(context).dont_have_group)); } return ListView.builder( itemCount: groups.length, itemBuilder: (context, index) { final group = groups[index]; return ListTile( onTap: () => context.pushNamed(AppRoutes.GROUP_DETAIL.name, pathParameters: {"groupId": group.id!}, extra: role), leading: IconConstants.instance.getMaterialIcon(Icons.diversity_2), title: Text(group.name ?? '', style: const TextStyle(fontWeight: FontWeight.bold)), subtitle: Text(group.description ?? ''), trailing: role == ApplicationConstants.OWNER_GROUP ? _ownerPopupMenu(group, context) : null, ); }, ); } Widget _ownerPopupMenu(Group group, BuildContext context) { return PopupMenuButton( shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(8.0))), itemBuilder: (ctx) => [ _buildPopupMenuItem(group, context, appLocalization(context).share_group_title, Icons.share, 4), _buildPopupMenuItem( group, context, appLocalization(context).change_group_infomation_title, Icons.settings_backup_restore, 2), _buildPopupMenuItem( group, context, appLocalization(context).delete_group_title, Icons.delete_forever_rounded, 3), ], icon: const Icon(Icons.more_horiz), ); } PopupMenuItem _buildPopupMenuItem(Group group, BuildContext context, String title, IconData iconData, int value) { return PopupMenuItem( value: value, child: Row(children: [ Icon(iconData, color: Colors.black), const SizedBox(width: 10), Text(title) ]), onTap: () { Future.delayed(context.lowDuration, () { if (title == appLocalization(context).share_group_title) { shareGroup(context, group); } else if (title == appLocalization(context).change_group_infomation_title) { createOrJoinGroupDialog( context, interFamilyBloc, role, appLocalization(context).change_group_infomation_content, appLocalization(context).group_name_title, group.name ?? '', false, group.id ?? '', appLocalization(context).description_group, group.description ?? '', ); } else if (title == appLocalization(context).delete_group_title) { showActionDialog( context, role, interFamilyBloc, appLocalization(context).delete_group_title, appLocalization(context).delete_group_content, group, ); } }); }, ); } }