diff --git a/lib/screens/user_screen.dart b/lib/screens/user_screen.dart index 154a035..078b365 100644 --- a/lib/screens/user_screen.dart +++ b/lib/screens/user_screen.dart @@ -210,17 +210,22 @@ class _UserZapsList extends HookConsumerWidget { return const SizedBox.shrink(); } - // Collect addressable tags for apps + // Collect addressable tags for apps and metadata IDs final allAppTags = >{}; + final metadataIds = {}; for (final app in apps) { final appTags = app.event.addressableIdTagMap; for (final entry in appTags.entries) { allAppTags[entry.key] = {...?allAppTags[entry.key], ...entry.value}; } + final metadata = app.latestFileMetadata; + if (metadata != null) { + metadataIds.add(metadata.id); + } } // Query zaps on apps (via #a tag) - final zapsState = ref.watch( + final appZapsState = ref.watch( query( tags: allAppTags, source: const LocalAndRemoteSource(relays: 'social'), @@ -228,7 +233,22 @@ class _UserZapsList extends HookConsumerWidget { ), ); - final allZaps = zapsState.models; + // Query zaps on metadata (via #e tag) - for legacy compatibility + final metadataZapsState = metadataIds.isNotEmpty + ? ref.watch( + query( + tags: {'#e': metadataIds}, + source: const LocalAndRemoteSource(relays: 'social'), + subscriptionPrefix: 'user-metadata-zaps', + ), + ) + : null; + + // Combine zaps from both queries + final allZaps = { + ...appZapsState.models, + if (metadataZapsState != null) ...metadataZapsState.models, + }; if (allZaps.isEmpty) { return const SizedBox.shrink(); diff --git a/lib/widgets/app_detail_widgets.dart b/lib/widgets/app_detail_widgets.dart index 8ea4de1..c48bea6 100644 --- a/lib/widgets/app_detail_widgets.dart +++ b/lib/widgets/app_detail_widgets.dart @@ -268,24 +268,15 @@ class SocialActionsRow extends HookConsumerWidget { } } -class _ZappersListSection extends StatelessWidget { +class _ZappersListSection extends ConsumerWidget { const _ZappersListSection({required this.app}); final App app; - @override - Widget build(BuildContext context) { - return _ZappersListSectionWithMetadata(app: app); - } -} - -class _ZappersListSectionWithMetadata extends ConsumerWidget { - const _ZappersListSectionWithMetadata({required this.app}); - - final App app; - @override Widget build(BuildContext context, WidgetRef ref) { + final metadataId = app.latestFileMetadata?.id; + // Query zaps on app (via #a tag) final zapsState = ref.watch( query( @@ -295,7 +286,24 @@ class _ZappersListSectionWithMetadata extends ConsumerWidget { ), ); - final allZaps = zapsState.models; + // Query zaps on metadata (via #e tag) - for legacy compatibility + final zapsOnMetadataState = metadataId != null + ? ref.watch( + query( + tags: { + '#e': {metadataId}, + }, + source: const LocalAndRemoteSource(relays: 'social'), + subscriptionPrefix: 'metadata-zaps', + ), + ) + : null; + + // Combine zaps from both queries + final allZaps = { + ...zapsState.models, + if (zapsOnMetadataState != null) ...zapsOnMetadataState.models, + }; if (allZaps.isEmpty) return const SizedBox.shrink(); diff --git a/lib/widgets/common/profile_avatar.dart b/lib/widgets/common/profile_avatar.dart index faf883f..8c0ca87 100644 --- a/lib/widgets/common/profile_avatar.dart +++ b/lib/widgets/common/profile_avatar.dart @@ -29,23 +29,40 @@ class ProfileAvatar extends StatelessWidget { height: radius * 2, fadeInDuration: const Duration(milliseconds: 500), fadeOutDuration: const Duration(milliseconds: 200), - placeholder: (context, url) => const SizedBox.shrink(), - errorWidget: (context, url, error) => Center( - child: Icon( - Icons.person_outline, - color: AppColors.darkSkeletonHighlight, - size: radius * 1.3, + placeholder: (context, url) => Container( + width: radius * 2, + height: radius * 2, + color: const Color(0xFF1A1A1A), + child: Center( + child: Icon( + Icons.person, + color: const Color(0xFF2C4A6B), + size: radius * 1.2, + ), + ), + ), + errorWidget: (context, url, error) => Container( + width: radius * 2, + height: radius * 2, + color: const Color(0xFF1A1A1A), + child: Center( + child: Icon( + Icons.person, + color: const Color(0xFF2C4A6B), + size: radius * 1.2, + ), ), ), ) - : SizedBox( + : Container( width: radius * 2, height: radius * 2, + color: const Color(0xFF1A1A1A), child: Center( child: Icon( - Icons.person_outline, - color: AppColors.darkSkeletonHighlight, - size: radius * 1.3, + Icons.person, + color: const Color(0xFF0D1B2A), + size: radius * 2, ), ), ),