Skip to content

Commit

Permalink
refactor(ui): Use separate app bar in post list
Browse files Browse the repository at this point in the history
  • Loading branch information
realth000 committed Dec 11, 2023
1 parent 4805b0f commit 1892f07
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 95 deletions.
9 changes: 6 additions & 3 deletions lib/screens/forum/forum_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -365,8 +365,7 @@ class _ForumPageState extends ConsumerState<ForumPage>
);

return Scaffold(
appBar: ListSliverAppBar(
fid: widget.fid,
appBar: ListAppBar(
title: widget.title,
bottom: _noPermissionFallbackDialog == null
? TabBar(
Expand All @@ -377,6 +376,10 @@ class _ForumPageState extends ConsumerState<ForumPage>
],
)
: null,
onSearch: () async {
await context.pushNamed(ScreenPaths.search,
queryParameters: {'fid': widget.fid});
},
onSelected: (value) async {
switch (value) {
case MenuActions.refresh:
Expand Down
127 changes: 46 additions & 81 deletions lib/screens/thread/post_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -14,21 +15,23 @@ 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';

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<T> extends ConsumerStatefulWidget {
Expand Down Expand Up @@ -318,85 +321,47 @@ class _PostListState<T> extends ConsumerState<PostList<T>> {
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),
);
}
},
);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -11,17 +11,16 @@ enum MenuActions {
backToTop,
}

class ListSliverAppBar<T> extends ConsumerWidget
implements PreferredSizeWidget {
const ListSliverAppBar({
required this.fid,
class ListAppBar<T> extends ConsumerWidget implements PreferredSizeWidget {
const ListAppBar({
required this.onSearch,
this.title,
this.bottom,
this.onSelected,
super.key,
});

final String fid;
final FutureOr<void> Function() onSearch;
final String? title;

final PopupMenuItemSelected<MenuActions>? onSelected;
Expand All @@ -35,10 +34,7 @@ class ListSliverAppBar<T> 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) => [
Expand Down

0 comments on commit 1892f07

Please sign in to comment.