mirror of
https://github.com/nostrlabs-io/zap-stream-flutter.git
synced 2025-06-16 20:08:50 +00:00
@ -64,6 +64,16 @@ class ChatWidget extends StatelessWidget {
|
|||||||
.where((e) => e.kind == 9735)
|
.where((e) => e.kind == 9735)
|
||||||
.map((e) => ZapReceipt.fromEvent(e))
|
.map((e) => ZapReceipt.fromEvent(e))
|
||||||
.toList();
|
.toList();
|
||||||
|
// pubkey -> Set<badge a tag>
|
||||||
|
final badgeAwards = filteredChat
|
||||||
|
.where((e) => e.kind == 8)
|
||||||
|
.map((e) => e.getTags("p").map((p) => (p, e.getFirstTag("a")!)))
|
||||||
|
.expand((v) => v)
|
||||||
|
.groupFoldBy(
|
||||||
|
(e) => e.$1,
|
||||||
|
(Set<String>? acc, v) => (acc ?? {})..add(v.$2),
|
||||||
|
);
|
||||||
|
|
||||||
return Column(
|
return Column(
|
||||||
spacing: 8,
|
spacing: 8,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
@ -81,6 +91,15 @@ class ChatWidget extends StatelessWidget {
|
|||||||
key: Key("chat:${filteredChat[idx].id}"),
|
key: Key("chat:${filteredChat[idx].id}"),
|
||||||
stream: stream,
|
stream: stream,
|
||||||
msg: filteredChat[idx],
|
msg: filteredChat[idx],
|
||||||
|
badges:
|
||||||
|
badgeAwards[filteredChat[idx].pubKey]
|
||||||
|
?.map(
|
||||||
|
(a) => ChatBadgeWidget.fromATag(
|
||||||
|
a,
|
||||||
|
key: Key("${filteredChat[idx].pubKey}:$a"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList(),
|
||||||
),
|
),
|
||||||
1312 => ChatRaidMessage(
|
1312 => ChatRaidMessage(
|
||||||
event: filteredChat[idx],
|
event: filteredChat[idx],
|
||||||
|
@ -72,3 +72,28 @@ class ChatBadgeAwardWidget extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ChatBadgeWidget extends StatelessWidget {
|
||||||
|
final Nip01Event badge;
|
||||||
|
|
||||||
|
const ChatBadgeWidget({super.key, required this.badge});
|
||||||
|
|
||||||
|
static Widget fromATag(String aTag, {Key? key}) {
|
||||||
|
return FutureBuilder(
|
||||||
|
future: ndk.requests.query(filters: [aTagToFilter(aTag)]).future,
|
||||||
|
builder: (context, state) {
|
||||||
|
final ev = state.data?.firstOrNull;
|
||||||
|
if (ev == null) return SizedBox();
|
||||||
|
return ChatBadgeWidget(badge: ev, key: key);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final image = badge.getFirstTag("image");
|
||||||
|
if (image?.isEmpty ?? true) return SizedBox();
|
||||||
|
|
||||||
|
return ProxyImg(url: image, resize: 24, height: 24, key: UniqueKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -13,8 +13,14 @@ import 'package:zap_stream_flutter/widgets/profile.dart';
|
|||||||
class ChatMessageWidget extends StatelessWidget {
|
class ChatMessageWidget extends StatelessWidget {
|
||||||
final StreamEvent stream;
|
final StreamEvent stream;
|
||||||
final Nip01Event msg;
|
final Nip01Event msg;
|
||||||
|
final List<Widget>? badges;
|
||||||
|
|
||||||
const ChatMessageWidget({super.key, required this.stream, required this.msg});
|
const ChatMessageWidget({
|
||||||
|
super.key,
|
||||||
|
required this.stream,
|
||||||
|
required this.msg,
|
||||||
|
this.badges,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -60,6 +66,16 @@ class ChatMessageWidget extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (badges?.isNotEmpty ?? false) TextSpan(text: " "),
|
||||||
|
if (badges?.isNotEmpty ?? false)
|
||||||
|
WidgetSpan(
|
||||||
|
alignment: PlaceholderAlignment.middle,
|
||||||
|
child: Row(
|
||||||
|
spacing: 4,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: badges!,
|
||||||
|
),
|
||||||
|
),
|
||||||
TextSpan(text: " "),
|
TextSpan(text: " "),
|
||||||
...textToSpans(msg.content, msg.tags, msg.pubKey),
|
...textToSpans(msg.content, msg.tags, msg.pubKey),
|
||||||
],
|
],
|
||||||
|
Reference in New Issue
Block a user