diff --git a/lib/api.dart b/lib/api.dart index 851e720..1ec73d5 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -143,6 +143,7 @@ class ZapStreamApi { } Future updateDefaultStreamInfo({ + String? id, String? title, String? summary, String? image, @@ -154,6 +155,7 @@ class ZapStreamApi { await _sendPatchRequest( url, body: { + "id": id, "title": title, "summary": summary, "image": image, diff --git a/lib/pages/live.dart b/lib/pages/live.dart index 99ef785..bdcc87a 100644 --- a/lib/pages/live.dart +++ b/lib/pages/live.dart @@ -177,6 +177,7 @@ class _LivePage extends State builder: (context, streamState) { final ev = streamState ?.sortedBy((e) => e.createdAt) + .reversed .firstWhereOrNull((e) => e.getFirstTag("status") == "live"); final stream = ev != null ? StreamEvent(ev) : null; @@ -337,6 +338,7 @@ class _LivePage extends State api: _api, account: _account!, hideEndpointConfig: _streaming, + currentStream: ev, ); }, ).then((_) { diff --git a/lib/widgets/stream_config.dart b/lib/widgets/stream_config.dart index 5148e76..9a1340f 100644 --- a/lib/widgets/stream_config.dart +++ b/lib/widgets/stream_config.dart @@ -1,6 +1,7 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:ndk/entities.dart'; import 'package:zap_stream_flutter/api.dart'; import 'package:zap_stream_flutter/const.dart'; import 'package:zap_stream_flutter/i18n/strings.g.dart'; @@ -12,12 +13,14 @@ class StreamConfigWidget extends StatefulWidget { final ZapStreamApi api; final AccountInfo account; final bool? hideEndpointConfig; + final Nip01Event? currentStream; const StreamConfigWidget({ super.key, required this.api, required this.account, this.hideEndpointConfig, + this.currentStream, }); @override @@ -41,6 +44,19 @@ class _StreamConfigWidget extends State { super.initState(); } + Widget _variantWidget(String cap) { + if (cap.startsWith("variant:")) { + final caps = cap.split(":"); + return PillWidget( + color: LAYER_3, + child: Text(caps[1].replaceAll("h", "p")), + ); + } else if (cap.startsWith("dvr:")) { + return PillWidget(color: LAYER_3, child: Text("Recording")); + } + return PillWidget(color: LAYER_3, child: Text(cap)); + } + @override Widget build(BuildContext context) { return ValueListenableBuilder( @@ -88,14 +104,15 @@ class _StreamConfigWidget extends State { ], ), if (endpoint != null && !(widget.hideEndpointConfig ?? false)) - Row( - spacing: 8, - children: - endpoint.capabilities - .map( - (e) => PillWidget(color: LAYER_3, child: Text(e)), - ) - .toList(), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + spacing: 8, + children: + endpoint.capabilities + .map((e) => _variantWidget(e)) + .toList(), + ), ), TextField( @@ -155,6 +172,7 @@ class _StreamConfigWidget extends State { t.button.save, onTap: (context) async { await widget.api.updateDefaultStreamInfo( + id: widget.currentStream?.getFirstTag("d"), title: _title.text, summary: _summary.text, contentWarning: _nsfw ? "nsfw" : null,