@@ -6,8 +6,9 @@ import 'package:logging/logging.dart';
66import 'package:whitenoise/config/providers/active_pubkey_provider.dart' ;
77import 'package:whitenoise/config/providers/auth_provider.dart' ;
88import 'package:whitenoise/config/providers/chat_provider.dart' ;
9+ import 'package:whitenoise/config/providers/follows_provider.dart' ;
910import 'package:whitenoise/config/states/group_state.dart' ;
10- import 'package:whitenoise/domain/models/user_model.dart' ;
11+ import 'package:whitenoise/domain/models/user_model.dart' as domain_user ;
1112import 'package:whitenoise/src/rust/api/error.dart' show ApiError;
1213import 'package:whitenoise/src/rust/api/groups.dart' ;
1314import 'package:whitenoise/src/rust/api/users.dart' as rust_users;
@@ -307,13 +308,27 @@ class GroupsNotifier extends Notifier<GroupsState> {
307308 _logger.info ('GroupsProvider: Loaded ${memberPubkeys .length } members for group $groupId ' );
308309
309310 // Fetch metadata for each member and create User objects
310- final List <User > members = [];
311+ final List <domain_user. User > members = [];
311312 for (final memberPubkey in memberPubkeys) {
312313 try {
313314 final npub = PubkeyFormatter (pubkey: memberPubkey).toNpub () ?? '' ;
315+
316+ // First try to get from follows (cached contacts)
317+ final followsNotifier = ref.read (followsProvider.notifier);
318+ final existingFollow = followsNotifier.findFollowByPubkey (memberPubkey);
319+
320+ if (existingFollow != null ) {
321+ _logger.info ('Found member $npub in follows cache' );
322+ // Convert Rust User to domain User
323+ final domainUser = domain_user.User .fromMetadata (existingFollow.metadata, npub);
324+ members.add (domainUser);
325+ continue ;
326+ }
327+
328+ // If not in follows, fetch directly from API
314329 try {
315330 final metadata = await rust_users.userMetadata (pubkey: memberPubkey);
316- final user = User .fromMetadata (metadata, npub);
331+ final user = domain_user. User .fromMetadata (metadata, npub);
317332 members.add (user);
318333 } catch (metadataError) {
319334 // Log the full exception details with proper Whitenoise ApiError unpacking
@@ -326,7 +341,7 @@ class GroupsNotifier extends Notifier<GroupsState> {
326341 }
327342 _logger.warning (logMessage, metadataError);
328343 // Create a fallback user with minimal info
329- final fallbackUser = User (
344+ final fallbackUser = domain_user. User (
330345 id: npub,
331346 displayName: 'Unknown User' ,
332347 nip05: '' ,
@@ -348,7 +363,7 @@ class GroupsNotifier extends Notifier<GroupsState> {
348363 }
349364 }
350365
351- final updatedGroupMembers = Map <String , List <User >>.from (state.groupMembers ?? {});
366+ final updatedGroupMembers = Map <String , List <domain_user. User >>.from (state.groupMembers ?? {});
352367 updatedGroupMembers[groupId] = members;
353368
354369 state = state.copyWith (groupMembers: updatedGroupMembers);
@@ -385,14 +400,14 @@ class GroupsNotifier extends Notifier<GroupsState> {
385400 _logger.info ('GroupsProvider: Loaded ${adminPubkeys .length } admins for group $groupId ' );
386401
387402 // Fetch metadata for each admin and create User objects
388- final List <User > admins = [];
403+ final List <domain_user. User > admins = [];
389404 for (final adminPubkey in adminPubkeys) {
390405 try {
391406 final npub = PubkeyFormatter (pubkey: adminPubkey).toNpub () ?? '' ;
392407
393408 try {
394409 final metadata = await rust_users.userMetadata (pubkey: adminPubkey);
395- final user = User .fromMetadata (metadata, npub);
410+ final user = domain_user. User .fromMetadata (metadata, npub);
396411 admins.add (user);
397412 } catch (metadataError) {
398413 // Log the full exception details with proper ApiError unpacking
@@ -405,7 +420,7 @@ class GroupsNotifier extends Notifier<GroupsState> {
405420 }
406421 _logger.warning (logMessage, metadataError);
407422 // Create a fallback user with minimal info
408- final fallbackUser = User (
423+ final fallbackUser = domain_user. User (
409424 id: npub,
410425 displayName: 'Unknown User' ,
411426 nip05: '' ,
@@ -427,7 +442,7 @@ class GroupsNotifier extends Notifier<GroupsState> {
427442 }
428443 }
429444
430- final updatedGroupAdmins = Map <String , List <User >>.from (state.groupAdmins ?? {});
445+ final updatedGroupAdmins = Map <String , List <domain_user. User >>.from (state.groupAdmins ?? {});
431446 updatedGroupAdmins[groupId] = admins;
432447
433448 state = state.copyWith (groupAdmins: updatedGroupAdmins);
@@ -710,11 +725,11 @@ class GroupsNotifier extends Notifier<GroupsState> {
710725 return groupInformation.groupType;
711726 }
712727
713- List <User >? getGroupMembers (String groupId) {
728+ List <domain_user. User >? getGroupMembers (String groupId) {
714729 return state.groupMembers? [groupId];
715730 }
716731
717- List <User >? getGroupAdmins (String groupId) {
732+ List <domain_user. User >? getGroupAdmins (String groupId) {
718733 return state.groupAdmins? [groupId];
719734 }
720735
@@ -1043,7 +1058,7 @@ final groupsProvider = NotifierProvider<GroupsNotifier, GroupsState>(
10431058);
10441059
10451060extension GroupMemberUtils on GroupsNotifier {
1046- User ? getOtherGroupMember (String ? groupId) {
1061+ domain_user. User ? getOtherGroupMember (String ? groupId) {
10471062 if (groupId == null ) return null ;
10481063 final activePubkey = ref.read (activePubkeyProvider);
10491064 if (activePubkey == null || activePubkey.isEmpty) return null ;
0 commit comments