diff --git a/lib/screens/forum/forum_page.dart b/lib/screens/forum/forum_page.dart index 334cfc7d..5bb84c11 100644 --- a/lib/screens/forum/forum_page.dart +++ b/lib/screens/forum/forum_page.dart @@ -16,7 +16,7 @@ import 'package:tsdm_client/routes/screen_paths.dart'; import 'package:tsdm_client/utils/debug.dart'; import 'package:tsdm_client/utils/show_toast.dart'; import 'package:tsdm_client/widgets/forum_card.dart'; -import 'package:tsdm_client/widgets/list_sliver_app_bar.dart'; +import 'package:tsdm_client/widgets/list_app_bar.dart'; import 'package:tsdm_client/widgets/thread_card.dart'; import 'package:universal_html/html.dart' as uh; import 'package:universal_html/parsing.dart'; @@ -365,8 +365,7 @@ class _ForumPageState extends ConsumerState ); return Scaffold( - appBar: ListSliverAppBar( - fid: widget.fid, + appBar: ListAppBar( title: widget.title, bottom: _noPermissionFallbackDialog == null ? TabBar( @@ -377,6 +376,10 @@ class _ForumPageState extends ConsumerState ], ) : null, + onSearch: () async { + await context.pushNamed(ScreenPaths.search, + queryParameters: {'fid': widget.fid}); + }, onSelected: (value) async { switch (value) { case MenuActions.refresh: diff --git a/lib/screens/thread/post_list.dart b/lib/screens/thread/post_list.dart index f2b3e75c..2c52ad06 100644 --- a/lib/screens/thread/post_list.dart +++ b/lib/screens/thread/post_list.dart @@ -5,6 +5,7 @@ import 'package:collection/collection.dart'; import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:tsdm_client/constants/layout.dart'; import 'package:tsdm_client/extensions/universal_html.dart'; @@ -14,8 +15,10 @@ import 'package:tsdm_client/models/reply_parameters.dart'; import 'package:tsdm_client/packages/html_muncher/lib/html_muncher.dart'; import 'package:tsdm_client/providers/net_client_provider.dart'; import 'package:tsdm_client/providers/screen_state_provider.dart'; +import 'package:tsdm_client/routes/screen_paths.dart'; import 'package:tsdm_client/utils/debug.dart'; import 'package:tsdm_client/utils/show_toast.dart'; +import 'package:tsdm_client/widgets/list_app_bar.dart'; import 'package:universal_html/html.dart' as uh; import 'package:universal_html/parsing.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -23,12 +26,12 @@ import 'package:url_launcher/url_launcher.dart'; const _headerMaxExtent = 60.0; const _headerMinExtent = 60.0; -enum _MenuActions { - refresh, - copyUrl, - openInBrowser, - backToTop, -} +// enum _MenuActions { +// refresh, +// copyUrl, +// openInBrowser, +// backToTop, +// } /// A widget that retrieve data from network and supports refresh. class PostList extends ConsumerStatefulWidget { @@ -318,85 +321,47 @@ class _PostListState extends ConsumerState> { WidgetRef ref, double shrinkOffset, ) { - final titleText = widget.title; + String? titleText; final isExpandHeader = _listScrollController.offset < _headerMaxExtent; - Widget? titleWidget; - if (titleText != null) { - if (!isExpandHeader) { - titleWidget = Text(titleText); - } + if (widget.title != null && !isExpandHeader) { + titleText = widget.title; } - return Column( - children: [ - AppBar( - title: titleWidget, - actions: [ - PopupMenuButton( - itemBuilder: (context) => [ - PopupMenuItem( - value: _MenuActions.refresh, - child: Row(children: [ - const Icon(Icons.refresh_outlined), - Text(context.t.networkList.actionRefresh), - ]), - ), - PopupMenuItem( - value: _MenuActions.copyUrl, - child: Row(children: [ - const Icon(Icons.copy_outlined), - Text(context.t.networkList.actionCopyUrl), - ]), - ), - PopupMenuItem( - value: _MenuActions.openInBrowser, - child: Row(children: [ - const Icon(Icons.launch_outlined), - Text(context.t.networkList.actionOpenInBrowser), - ]), - ), - PopupMenuItem( - value: _MenuActions.backToTop, - child: Row(children: [ - const Icon(Icons.vertical_align_top_outlined), - Text(context.t.networkList.actionBackToTop), - ]), - ), - ], - onSelected: (value) async { - switch (value) { - case _MenuActions.refresh: - await _refresh(); - case _MenuActions.copyUrl: - await Clipboard.setData( - ClipboardData(text: widget.fetchUrl), - ); - if (!context.mounted) { - return; - } - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text( - context.t.aboutPage.copiedToClipboard, - ), - )); - case _MenuActions.openInBrowser: - await launchUrl( - Uri.parse(widget.fetchUrl), - mode: LaunchMode.externalApplication, - ); - case _MenuActions.backToTop: - await _listScrollController.animateTo( - 0, - curve: Curves.ease, - duration: const Duration(milliseconds: 500), - ); - } - }, - ), - ], - ), - ], + return ListAppBar( + title: titleText, + onSearch: () async { + await context.pushNamed(ScreenPaths.search); + }, + onSelected: (value) async { + switch (value) { + case MenuActions.refresh: + await _refresh(); + case MenuActions.copyUrl: + await Clipboard.setData( + ClipboardData(text: widget.fetchUrl), + ); + if (!context.mounted) { + return; + } + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text( + context.t.aboutPage.copiedToClipboard, + ), + )); + case MenuActions.openInBrowser: + await launchUrl( + Uri.parse(widget.fetchUrl), + mode: LaunchMode.externalApplication, + ); + case MenuActions.backToTop: + await _listScrollController.animateTo( + 0, + curve: Curves.ease, + duration: const Duration(milliseconds: 500), + ); + } + }, ); } diff --git a/lib/widgets/list_sliver_app_bar.dart b/lib/widgets/list_app_bar.dart similarity index 82% rename from lib/widgets/list_sliver_app_bar.dart rename to lib/widgets/list_app_bar.dart index 7f66326e..0b8cbb53 100644 --- a/lib/widgets/list_sliver_app_bar.dart +++ b/lib/widgets/list_app_bar.dart @@ -1,8 +1,8 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:tsdm_client/generated/i18n/strings.g.dart'; -import 'package:tsdm_client/routes/screen_paths.dart'; enum MenuActions { refresh, @@ -11,17 +11,16 @@ enum MenuActions { backToTop, } -class ListSliverAppBar extends ConsumerWidget - implements PreferredSizeWidget { - const ListSliverAppBar({ - required this.fid, +class ListAppBar extends ConsumerWidget implements PreferredSizeWidget { + const ListAppBar({ + required this.onSearch, this.title, this.bottom, this.onSelected, super.key, }); - final String fid; + final FutureOr Function() onSearch; final String? title; final PopupMenuItemSelected? onSelected; @@ -35,10 +34,7 @@ class ListSliverAppBar extends ConsumerWidget actions: [ IconButton( icon: const Icon(Icons.search_outlined), - onPressed: () async { - await context - .pushNamed(ScreenPaths.search, queryParameters: {'fid': fid}); - }, + onPressed: onSearch, ), PopupMenuButton( itemBuilder: (context) => [