@@ -2,8 +2,13 @@ import 'package:flutter/material.dart';
22import 'package:flutter_riverpod/flutter_riverpod.dart' ;
33import 'package:gap/gap.dart' ;
44import 'package:whitenoise/config/extensions/toast_extension.dart' ;
5+ import 'package:whitenoise/config/providers/follows_provider.dart' ;
56import 'package:whitenoise/config/providers/group_provider.dart' ;
7+ import 'package:whitenoise/config/providers/user_profile_data_provider.dart' ;
8+ import 'package:whitenoise/domain/models/contact_model.dart' ;
69import 'package:whitenoise/src/rust/api/groups.dart' ;
10+ import 'package:whitenoise/ui/chat/chat_management/widgets/create_group_dialog.dart' ;
11+ import 'package:whitenoise/ui/contact_list/new_group_chat_sheet.dart' ;
712import 'package:whitenoise/ui/core/themes/assets.dart' ;
813import 'package:whitenoise/ui/core/themes/src/app_theme.dart' ;
914import 'package:whitenoise/ui/core/ui/wn_avatar.dart' ;
@@ -37,30 +42,48 @@ class _AddToGroupScreenState extends ConsumerState<AddToGroupScreen> {
3742 setState (() {
3843 _isLoading = true ;
3944 });
40- await ref.read (groupsProvider.notifier).loadGroups ();
4145
42- final regularGroups = await ref.read (groupsProvider.notifier).getRegularGroups ();
43- if (regularGroups.isEmpty) {
44- return ;
45- }
46+ try {
47+ await ref.read (groupsProvider.notifier).loadGroups ();
4648
47- final loadTasks = < Future <void >> [];
49+ final regularGroups = await ref.read (groupsProvider.notifier).getRegularGroups ();
50+ if (regularGroups.isEmpty) {
51+ // Show dialog when no groups exist
52+ if (mounted) {
53+ _showCreateGroupDialog ();
54+ }
55+ return ;
56+ }
57+
58+ final loadTasks = < Future <void >> [];
4859
49- for (final group in regularGroups) {
50- final existingMembers = ref.read (groupsProvider).groupMembers? [group.mlsGroupId];
51- if (existingMembers == null ) {
52- loadTasks.add (ref.read (groupsProvider.notifier).loadGroupMembers (group.mlsGroupId));
60+ for (final group in regularGroups) {
61+ final existingMembers = ref.read (groupsProvider).groupMembers? [group.mlsGroupId];
62+ if (existingMembers == null ) {
63+ loadTasks.add (ref.read (groupsProvider.notifier).loadGroupMembers (group.mlsGroupId));
64+ }
5365 }
54- }
5566
56- if (loadTasks.isNotEmpty) {
57- await Future .wait (loadTasks);
58- }
67+ if (loadTasks.isNotEmpty) {
68+ await Future .wait (loadTasks);
69+ }
5970
60- setState (() {
61- _regularGroups = regularGroups;
62- _isLoading = false ;
63- });
71+ setState (() {
72+ _regularGroups = regularGroups;
73+ });
74+ } catch (e) {
75+ // Handle any errors during group loading
76+ if (mounted) {
77+ ref.showErrorToast ('Failed to load groups: $e ' );
78+ }
79+ } finally {
80+ // Always ensure loading state is reset
81+ if (mounted) {
82+ setState (() {
83+ _isLoading = false ;
84+ });
85+ }
86+ }
6487 }
6588
6689 Future <void > _addUserToGroups () async {
@@ -108,6 +131,68 @@ class _AddToGroupScreenState extends ConsumerState<AddToGroupScreen> {
108131 });
109132 }
110133
134+ void _showCreateGroupDialog () {
135+ CreateGroupDialog .show (
136+ context,
137+ onCreateGroup: () async {
138+ try {
139+ // Close the dialog only
140+ if (Navigator .of (context).canPop ()) {
141+ Navigator .of (context).pop ();
142+ }
143+
144+ // Get contact information for the user to be added
145+ ContactModel ? contactToAdd;
146+ try {
147+ // First try to get from follows (cached contacts)
148+ final followsNotifier = ref.read (followsProvider.notifier);
149+ final existingFollow = followsNotifier.findFollowByPubkey (widget.contactNpub);
150+
151+ if (existingFollow != null ) {
152+ contactToAdd = ContactModel .fromMetadata (
153+ pubkey: existingFollow.pubkey,
154+ metadata: existingFollow.metadata,
155+ );
156+ } else {
157+ // If not in follows, fetch from user profile data provider
158+ final userProfileDataNotifier = ref.read (userProfileDataProvider.notifier);
159+ contactToAdd = await userProfileDataNotifier.getUserProfileData (widget.contactNpub);
160+ }
161+ } catch (e) {
162+ // Create a basic contact model with just the public key
163+ contactToAdd = ContactModel (
164+ displayName: 'Unknown User' ,
165+ publicKey: widget.contactNpub,
166+ );
167+ }
168+
169+ // Ensure we always have a contact (in case getUserProfileData returns null)
170+
171+ if (! mounted) return ;
172+
173+ await NewGroupChatSheet .show (
174+ context,
175+ preSelectedContacts: [contactToAdd],
176+ onGroupCreated: (group) {
177+ // Only pop the AddToGroupScreen if group was created successfully
178+ if (mounted && group != null ) {
179+ Navigator .of (context).pop ();
180+ }
181+ },
182+ );
183+ } catch (e) {
184+ if (mounted) {
185+ ref.showErrorToast ('Error creating group: $e ' );
186+ }
187+ }
188+ },
189+ onCancel: () {
190+ Navigator .of (context).pop ();
191+ Navigator .of (context).pop ();
192+ },
193+ );
194+ }
195+
111196 @override
112197 Widget build (BuildContext context) {
113198 return Scaffold (
0 commit comments