From efd95837eacde2cccf8a0550f1a917d18189c878 Mon Sep 17 00:00:00 2001 From: Kieran Date: Tue, 13 May 2025 13:25:23 +0100 Subject: [PATCH] feat: listen to stream info on stream page fix: disable cache read/write in RxFilter --- lib/pages/stream.dart | 44 +++++++++++++++++++++++++++++-------------- lib/rx_filter.dart | 10 ++++------ lib/widgets/chat.dart | 18 ++++++++---------- 3 files changed, 42 insertions(+), 30 deletions(-) diff --git a/lib/pages/stream.dart b/lib/pages/stream.dart index 3145db4..61e59b6 100644 --- a/lib/pages/stream.dart +++ b/lib/pages/stream.dart @@ -1,10 +1,12 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:chewie/chewie.dart'; import 'package:flutter/material.dart'; +import 'package:ndk/ndk.dart'; import 'package:video_player/video_player.dart'; import 'package:wakelock_plus/wakelock_plus.dart'; import 'package:zap_stream_flutter/imgproxy.dart'; import 'package:zap_stream_flutter/main.dart'; +import 'package:zap_stream_flutter/rx_filter.dart'; import 'package:zap_stream_flutter/theme.dart'; import 'package:zap_stream_flutter/utils.dart'; import 'package:zap_stream_flutter/widgets/button.dart'; @@ -72,6 +74,23 @@ class _StreamPage extends State { @override Widget build(BuildContext context) { + return RxFilter( + relays: widget.stream.info.relays, + filters: [ + Filter( + kinds: [widget.stream.event.kind], + authors: [widget.stream.event.pubKey], + dTags: [widget.stream.event.getDtag()!], + ), + ], + builder: (ctx, state) { + final stream = StreamEvent(state?.firstOrNull ?? widget.stream.event); + return _buildStream(context, stream); + }, + ); + } + + Widget _buildStream(BuildContext context, StreamEvent stream) { return Column( spacing: 4, crossAxisAlignment: CrossAxisAlignment.start, @@ -84,24 +103,21 @@ class _StreamPage extends State { : Container( color: LAYER_1, child: - (widget.stream.info.image?.isNotEmpty ?? false) + (stream.info.image?.isNotEmpty ?? false) ? CachedNetworkImage( - imageUrl: proxyImg( - context, - widget.stream.info.image!, - ), + imageUrl: proxyImg(context, stream.info.image!), ) : null, ), ), Text( - widget.stream.info.title ?? "", + stream.info.title ?? "", style: TextStyle(fontWeight: FontWeight.w600, fontSize: 18), ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ProfileWidget.pubkey(widget.stream.info.host), + ProfileWidget.pubkey(stream.info.host), Row( spacing: 8, children: [ @@ -118,13 +134,13 @@ class _StreamPage extends State { constraints: BoxConstraints.expand(), builder: (ctx) { return ZapWidget( - pubkey: widget.stream.info.host, - target: widget.stream.event, + pubkey: stream.info.host, + target: stream.event, zapTags: // tag goal onto zap request - widget.stream.info.goal != null + stream.info.goal != null ? [ - ["e", widget.stream.info.goal!], + ["e", stream.info.goal!], ] : null, ); @@ -132,11 +148,11 @@ class _StreamPage extends State { ); }, ), - if (widget.stream.info.participants != null) + if (stream.info.participants != null) PillWidget( color: LAYER_1, child: Text( - "${widget.stream.info.participants} viewers", + "${stream.info.participants} viewers", style: TextStyle( fontSize: 12, fontWeight: FontWeight.w500, @@ -147,7 +163,7 @@ class _StreamPage extends State { ), ], ), - Expanded(child: ChatWidget(stream: widget.stream)), + Expanded(child: ChatWidget(stream: stream)), ], ); } diff --git a/lib/rx_filter.dart b/lib/rx_filter.dart index f31beaf..78b4bca 100644 --- a/lib/rx_filter.dart +++ b/lib/rx_filter.dart @@ -37,8 +37,6 @@ class _RxFilter extends State> { developer.log("RX:SEDNING ${widget.filters}"); _response = ndk.requests.subscription( filters: widget.filters, - cacheRead: true, - cacheWrite: true, explicitRelays: widget.relays, ); if (!widget.leaveOpen) { @@ -55,7 +53,6 @@ class _RxFilter extends State> { }) .listen((events) { setState(() { - _events ??= HashMap(); developer.log( "RX:GOT ${events.length} events for ${widget.filters}", ); @@ -66,9 +63,10 @@ class _RxFilter extends State> { void _replaceInto(Nip01Event ev) { final evKey = _eventKey(ev); - final existing = _events?[evKey]; + _events ??= HashMap(); + final existing = _events![evKey]; if (existing == null || existing.$1 < ev.createdAt) { - _events?[evKey] = ( + _events![evKey] = ( ev.createdAt, widget.mapper != null ? widget.mapper!(ev) : ev as T, ); @@ -79,7 +77,7 @@ class _RxFilter extends State> { if ([0, 3].contains(ev.kind) || (ev.kind >= 10000 && ev.kind < 20000)) { return "${ev.kind}:${ev.pubKey}"; } else if (ev.kind >= 30000 && ev.kind < 40000) { - return "${ev.kind}:${ev.pubKey}:${ev.getDtag()}"; + return "${ev.kind}:${ev.pubKey}:${ev.getDtag()!}"; } else { return ev.id; } diff --git a/lib/widgets/chat.dart b/lib/widgets/chat.dart index aed6622..1408433 100644 --- a/lib/widgets/chat.dart +++ b/lib/widgets/chat.dart @@ -22,18 +22,16 @@ class ChatWidget extends StatelessWidget { muteLists.add(ndk.accounts.getPublicKey()!); } + var filters = [ + Filter(kinds: [1311, 9735], limit: 200, aTags: [stream.aTag]), + Filter(kinds: [Nip51List.kMute], authors: muteLists), + ]; + if (stream.info.goal != null) { + filters.add(Filter(kinds: [9041], ids: [stream.info.goal!])); + } return RxFilter( - key: Key("stream:chat:${stream.aTag}"), relays: stream.info.relays, - filters: [ - Filter(kinds: [1311, 9735], limit: 200, aTags: [stream.aTag]), - Filter(kinds: [Nip51List.kMute], authors: muteLists), - ...(stream.info.goal != null - ? [ - Filter(kinds: [9041], ids: [stream.info.goal!]), - ] - : []), - ], + filters: filters, builder: (ctx, state) { final mutedPubkeys = (state ?? [])