diff --git a/lib/app.dart b/lib/app.dart index bb8b3dd..2e0e90b 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -76,7 +76,7 @@ void runZapStream() { if (state.extra is StreamEvent) { return StreamPage(stream: state.extra as StreamEvent); } else { - throw UnimplementedError(); + return StreamPage.loader(state.pathParameters["id"]!); } }, ), @@ -119,6 +119,21 @@ void runZapStream() { ), ], ), + GoRoute( + path: "/:id", + redirect: (context, state) { + final id = state.pathParameters["id"]!; + if (id.startsWith("naddr1") || + id.startsWith("nevent1") || + id.startsWith("note1")) { + return "/e/$id"; + } else if (id.startsWith("npub1") || + id.startsWith("nprofile1")) { + return "/p/$id"; + } + return null; + }, + ), ], ), ], diff --git a/lib/pages/stream.dart b/lib/pages/stream.dart index 5ca87ce..f11c14c 100644 --- a/lib/pages/stream.dart +++ b/lib/pages/stream.dart @@ -1,5 +1,6 @@ import 'dart:developer' as developer; +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:ndk/ndk.dart'; @@ -24,6 +25,30 @@ class StreamPage extends StatefulWidget { const StreamPage({super.key, required this.stream}); + static Widget loader(String id) { + final entity = decodeBech32ToTLVEntity(id); + return RxFilter( + Key("stream-loader:$id"), + filters: [entity.toFilter()], + builder: (context, state) { + final stream = state?.firstWhereOrNull( + (e) => e.getDtag() == entity.specialUtf8, + ); + if (stream != null) { + return StreamPage(stream: StreamEvent(stream)); + } else { + return Center( + child: SizedBox( + width: 40, + height: 40, + child: CircularProgressIndicator(), + ), + ); + } + }, + ); + } + @override State createState() => _StreamPage(); }