import 'package:flutter/material.dart'; import '../../comment_tree.dart'; import '../../l10n/l10n.dart'; import '../../stores/accounts_store.dart'; import '../../util/observer_consumers.dart'; import '../../widgets/bottom_modal.dart'; import '../../widgets/bottom_safe.dart'; import '../../widgets/comment/comment.dart'; import '../../widgets/failed_to_load.dart'; import 'full_post_store.dart'; class _SortSelection { final IconData icon; final String term; const _SortSelection(this.icon, this.term); } /// Manages comments section, sorts them class CommentSection extends StatelessWidget { static const sortPairs = { CommentSortType.hot: _SortSelection(Icons.whatshot, L10nStrings.hot), CommentSortType.new_: _SortSelection(Icons.new_releases, L10nStrings.new_), CommentSortType.old: _SortSelection(Icons.calendar_today, L10nStrings.old), CommentSortType.top: _SortSelection(Icons.trending_up, L10nStrings.top), CommentSortType.chat: _SortSelection(Icons.chat, L10nStrings.chat), }; const CommentSection({super.key}); @override Widget build(BuildContext context) { return ObserverBuilder( builder: (context, store) { final fullPostView = store.fullPostView; // error & spinner handling if (fullPostView == null) { if (store.fullPostState.errorTerm != null) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 30), child: FailedToLoad( message: 'Comments failed to load', refresh: () => store.refresh(context .read() .defaultUserDataFor(store.instanceHost) ?.jwt)), ); } else { return const Padding( padding: EdgeInsets.only(top: 40), child: Center(child: CircularProgressIndicator.adaptive()), ); } } return Column( children: [ Padding( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), child: Row( children: [ OutlinedButton( onPressed: () { showBottomModal( title: 'sort by', context: context, builder: (context) => Column( children: [ for (final e in sortPairs.entries) ListTile( leading: Icon(e.value.icon), title: Text((e.value.term).tr(context)), trailing: store.sorting == e.key ? const Icon(Icons.check) : null, onTap: () { Navigator.of(context).pop(); store.updateSorting(e.key); }, ) ], ), ); }, child: Row( children: [ Text((sortPairs[store.sorting]!.term).tr(context)), const Icon(Icons.arrow_drop_down), ], ), ), const Spacer(), ], ), ), // sorting menu goes here if (fullPostView.comments.isEmpty) const Padding( padding: EdgeInsets.symmetric(vertical: 50), child: Text( 'no comments yet', style: TextStyle(fontStyle: FontStyle.italic), ), ) else ...[ for (final com in store.newComments) CommentWidget.fromCommentView( com, detached: false, key: ValueKey(com), ), if (store.sorting == CommentSortType.chat) for (final com in fullPostView.comments) CommentWidget.fromCommentView( com, detached: false, key: ValueKey(com), ) else for (final com in store.sortedCommentTree!) CommentWidget( com, key: ValueKey(com), ), const BottomSafe.fab(), ] ], ); }, ); } }