From 1413f8c5071c22809c48d10d795af4e2d6b4fa08 Mon Sep 17 00:00:00 2001 From: Micah Morrison Date: Fri, 13 Oct 2023 12:49:52 -0400 Subject: [PATCH 1/6] Support new sort types --- CHANGELOG.md | 1 + lib/core/singletons/lemmy_client.dart | 51 +++++++++++ lib/feed/widgets/feed_fab.dart | 1 + lib/feed/widgets/feed_page_app_bar.dart | 1 + lib/l10n/app_en.arb | 2 + lib/l10n/app_es.arb | 2 + lib/l10n/app_fi.arb | 2 + lib/l10n/app_pl.arb | 2 + lib/l10n/app_sv.arb | 2 + lib/post/pages/post_page.dart | 4 +- lib/settings/pages/general_settings_page.dart | 17 +++- lib/shared/comment_sort_picker.dart | 79 ++++++++++------- lib/shared/sort_picker.dart | 85 ++++++++++++------- pubspec.lock | 6 +- pubspec.yaml | 6 +- 15 files changed, 187 insertions(+), 74 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96cc9a22a..846720ab1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - Added Read All in inbox. - contribution from @ggriffo - Added support for lemmy 0.19.x authentication - contribution from @micahmo - Added support for accessibility profiles in settings - contribution from @micahmo +- Support new scaled and controversial sort types - contribution from @micahmo ### Changed - Collapsed comments are easier to expand - contribution from @micahmo diff --git a/lib/core/singletons/lemmy_client.dart b/lib/core/singletons/lemmy_client.dart index 51926b41b..c9f634f0f 100644 --- a/lib/core/singletons/lemmy_client.dart +++ b/lib/core/singletons/lemmy_client.dart @@ -1,4 +1,7 @@ import 'package:lemmy_api_client/v3.dart'; +import 'package:thunder/account/models/account.dart'; +import 'package:thunder/core/auth/helpers/fetch_account.dart'; +import 'package:version/version.dart'; class LemmyClient { LemmyApiV3 lemmyApiV3 = const LemmyApiV3(''); @@ -7,9 +10,57 @@ class LemmyClient { void changeBaseUrl(String baseUrl) { lemmyApiV3 = LemmyApiV3(baseUrl); + _populateSiteInfo(); // Do NOT await this. Let it populate in the background. } static final LemmyClient _instance = LemmyClient._initialize(); static LemmyClient get instance => _instance; + + Future _populateSiteInfo() async { + if (!_lemmySites.containsKey(instance.lemmyApiV3.host)) { + // Retrieve the site so we can look up metadata about it later + Account? account = await fetchActiveProfileAccount(); + + _lemmySites[instance.lemmyApiV3.host] = await instance.lemmyApiV3.run( + GetSite( + auth: account?.jwt, + ), + ); + } + } + + bool supportsFeature(LemmyFeature feature) { + if (_lemmySites.containsKey(instance.lemmyApiV3.host)) { + // Parse the version + FullSiteView site = _lemmySites[instance.lemmyApiV3.host]!; + Version version; + try { + version = Version.parse(site.version); + } catch (e) { + return false; + } + + // Check the feature and return whether it's supported in this version + return switch (feature) { + LemmyFeature.sortTypeControversial || LemmyFeature.sortTypeScaled || LemmyFeature.commentSortTypeControversial => version >= Version(0, 19, 0, preRelease: ["rc", "1"]), + }; + } + + return false; + } + + static final Map _lemmySites = {}; +} + +enum LemmyFeature { + sortTypeControversial, + sortTypeScaled, + commentSortTypeControversial, +} + +enum IncludeVersionSpecificFeature { + never, + ifSupported, + always, } diff --git a/lib/feed/widgets/feed_fab.dart b/lib/feed/widgets/feed_fab.dart index 6e51999d3..deecd5218 100644 --- a/lib/feed/widgets/feed_fab.dart +++ b/lib/feed/widgets/feed_fab.dart @@ -249,6 +249,7 @@ class FeedFAB extends StatelessWidget { showModalBottomSheet( showDragHandle: true, context: context, + isScrollControlled: true, builder: (builderContext) => SortPicker( title: l10n.sortOptions, onSelect: (selected) => context.read().add(FeedChangeSortTypeEvent(selected.payload)), diff --git a/lib/feed/widgets/feed_page_app_bar.dart b/lib/feed/widgets/feed_page_app_bar.dart index 5b2a713dd..0ea5cfa31 100644 --- a/lib/feed/widgets/feed_page_app_bar.dart +++ b/lib/feed/widgets/feed_page_app_bar.dart @@ -97,6 +97,7 @@ class FeedPageAppBar extends StatelessWidget { showModalBottomSheet( showDragHandle: true, context: context, + isScrollControlled: true, builder: (builderContext) => SortPicker( title: l10n.sortOptions, onSelect: (selected) => feedBloc.add(FeedChangeSortTypeEvent(selected.payload)), diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 667d3ee49..a7f530e56 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -177,6 +177,8 @@ "shareLink": "Share Link", "upvote": "Upvote", "downvote": "Downvote", + "scaled": "Scaled", + "controversial": "Controversial", "edit": "Edit", "restore": "Restore", "delete": "Delete", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 75f482f0b..2cd33c5f8 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -177,6 +177,8 @@ "shareLink": "Share Link", "upvote": "Upvote", "downvote": "Downvote", + "scaled": "Scaled", + "controversial": "Controversial", "edit": "Edit", "restore": "Restore", "delete": "Delete", diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 96ab29a41..10dfc8e52 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -177,6 +177,8 @@ "shareLink": "Share Link", "upvote": "Upvote", "downvote": "Downvote", + "scaled": "Scaled", + "controversial": "Controversial", "edit": "Edit", "restore": "Restore", "delete": "Delete", diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 90db3954f..2a60ba314 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -177,6 +177,8 @@ "edit": "Edit", "restore": "Restore", "delete": "Delete", + "scaled": "Scaled", + "controversial": "Controversial", "inReplyTo": "In reply to {post} in {community}", "xUpvotes": "{x} upvotes", "xDownvotes": "{x} downvotes", diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index 96ab29a41..10dfc8e52 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -177,6 +177,8 @@ "shareLink": "Share Link", "upvote": "Upvote", "downvote": "Downvote", + "scaled": "Scaled", + "controversial": "Controversial", "edit": "Edit", "restore": "Restore", "delete": "Delete", diff --git a/lib/post/pages/post_page.dart b/lib/post/pages/post_page.dart index 17529e3f0..22fabf575 100644 --- a/lib/post/pages/post_page.dart +++ b/lib/post/pages/post_page.dart @@ -16,6 +16,7 @@ import 'package:thunder/core/auth/bloc/auth_bloc.dart'; import 'package:thunder/core/enums/fab_action.dart'; import 'package:thunder/core/enums/local_settings.dart'; import 'package:thunder/core/models/post_view_media.dart'; +import 'package:thunder/core/singletons/lemmy_client.dart'; import 'package:thunder/core/singletons/preferences.dart'; import 'package:thunder/post/bloc/post_bloc.dart'; import 'package:thunder/post/pages/post_page_success.dart'; @@ -122,7 +123,8 @@ class _PostPageState extends State { if (previousState.sortType != currentState.sortType) { setState(() { sortType = currentState.sortType; - final sortTypeItem = commentSortTypeItems.firstWhere((sortTypeItem) => sortTypeItem.payload == currentState.sortType); + final sortTypeItem = CommentSortPicker.getCommentSortTypeItems(includeVersionSpecificFeature: IncludeVersionSpecificFeature.always) + .firstWhere((sortTypeItem) => sortTypeItem.payload == currentState.sortType); sortTypeIcon = sortTypeItem.icon; sortTypeLabel = sortTypeItem.label; }); diff --git a/lib/settings/pages/general_settings_page.dart b/lib/settings/pages/general_settings_page.dart index 62b73a767..8de2ffa33 100644 --- a/lib/settings/pages/general_settings_page.dart +++ b/lib/settings/pages/general_settings_page.dart @@ -7,6 +7,7 @@ import 'package:lemmy_api_client/v3.dart'; import 'package:thunder/core/enums/local_settings.dart'; import 'package:thunder/core/enums/nested_comment_indicator.dart'; +import 'package:thunder/core/singletons/lemmy_client.dart'; import 'package:thunder/core/singletons/preferences.dart'; import 'package:thunder/settings/widgets/list_option.dart'; import 'package:thunder/settings/widgets/toggle_option.dart'; @@ -405,11 +406,12 @@ class _GeneralSettingsPageState extends State with SingleTi ListOption( description: LocalSettings.defaultFeedSortType.label, value: ListPickerItem(label: defaultSortType.value, icon: Icons.local_fire_department_rounded, payload: defaultSortType), - options: allSortTypeItems, + options: [...SortPicker.getDefaultSortTypeItems(includeVersionSpecificFeature: IncludeVersionSpecificFeature.never), ...topSortTypeItems], icon: Icons.sort_rounded, onChanged: (_) {}, isBottomModalScrollControlled: true, customListPicker: SortPicker( + includeVersionSpecificFeature: IncludeVersionSpecificFeature.never, title: LocalSettings.defaultFeedSortType.label, onSelect: (value) { setPreferences(LocalSettings.defaultFeedSortType, value.payload.name); @@ -616,10 +618,11 @@ class _GeneralSettingsPageState extends State with SingleTi ListOption( description: LocalSettings.defaultCommentSortType.label, value: ListPickerItem(label: defaultCommentSortType.value, icon: Icons.local_fire_department_rounded, payload: defaultCommentSortType), - options: commentSortTypeItems, + options: CommentSortPicker.getCommentSortTypeItems(includeVersionSpecificFeature: IncludeVersionSpecificFeature.never), icon: Icons.comment_bank_rounded, onChanged: (_) {}, customListPicker: CommentSortPicker( + includeVersionSpecificFeature: IncludeVersionSpecificFeature.never, title: 'Comment Sort Type', onSelect: (value) { setPreferences(LocalSettings.defaultCommentSortType, value.payload.name); @@ -628,10 +631,16 @@ class _GeneralSettingsPageState extends State with SingleTi ), valueDisplay: Row( children: [ - Icon(commentSortTypeItems.firstWhere((sortTypeItem) => sortTypeItem.payload == defaultCommentSortType).icon, size: 13), + Icon( + CommentSortPicker.getCommentSortTypeItems(includeVersionSpecificFeature: IncludeVersionSpecificFeature.always) + .firstWhere((sortTypeItem) => sortTypeItem.payload == defaultCommentSortType) + .icon, + size: 13), const SizedBox(width: 4), Text( - commentSortTypeItems.firstWhere((sortTypeItem) => sortTypeItem.payload == defaultCommentSortType).label, + CommentSortPicker.getCommentSortTypeItems(includeVersionSpecificFeature: IncludeVersionSpecificFeature.always) + .firstWhere((sortTypeItem) => sortTypeItem.payload == defaultCommentSortType) + .label, style: theme.textTheme.titleSmall, ), ], diff --git a/lib/shared/comment_sort_picker.dart b/lib/shared/comment_sort_picker.dart index 32faf8d1e..9ac245b98 100644 --- a/lib/shared/comment_sort_picker.dart +++ b/lib/shared/comment_sort_picker.dart @@ -1,41 +1,58 @@ import 'package:flutter/material.dart'; import 'package:lemmy_api_client/v3.dart'; +import 'package:thunder/core/singletons/lemmy_client.dart'; import 'package:thunder/shared/picker_item.dart'; import 'package:thunder/utils/bottom_sheet_list_picker.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:thunder/utils/global_context.dart'; -List> commentSortTypeItems = [ - ListPickerItem( - payload: CommentSortType.top, - icon: Icons.military_tech, - label: AppLocalizations.of(GlobalContext.context)!.top, - ), - ListPickerItem( - payload: CommentSortType.old, - icon: Icons.access_time_outlined, - label: AppLocalizations.of(GlobalContext.context)!.old, - ), - ListPickerItem( - payload: CommentSortType.new_, - icon: Icons.auto_awesome_rounded, - label: AppLocalizations.of(GlobalContext.context)!.new_, - ), - ListPickerItem( - payload: CommentSortType.hot, - icon: Icons.local_fire_department, - label: AppLocalizations.of(GlobalContext.context)!.hot, - ), - // - // ListPickerItem( - // payload: CommentSortType.chat, - // icon: Icons.chat, - // label: 'Chat', - // ), -]; - class CommentSortPicker extends BottomSheetListPicker { - CommentSortPicker({super.key, required super.onSelect, required super.title, List>? items, super.previouslySelected}) : super(items: items ?? commentSortTypeItems); + final IncludeVersionSpecificFeature includeVersionSpecificFeature; + + static List> getCommentSortTypeItems({IncludeVersionSpecificFeature includeVersionSpecificFeature = IncludeVersionSpecificFeature.ifSupported}) => [ + ListPickerItem( + payload: CommentSortType.top, + icon: Icons.military_tech, + label: AppLocalizations.of(GlobalContext.context)!.top, + ), + ListPickerItem( + payload: CommentSortType.old, + icon: Icons.access_time_outlined, + label: AppLocalizations.of(GlobalContext.context)!.old, + ), + if (includeVersionSpecificFeature == IncludeVersionSpecificFeature.always || + (includeVersionSpecificFeature == IncludeVersionSpecificFeature.ifSupported && LemmyClient.instance.supportsFeature(LemmyFeature.commentSortTypeControversial))) + ListPickerItem( + payload: CommentSortType.controversial, + icon: Icons.warning_rounded, + label: AppLocalizations.of(GlobalContext.context)!.controversial, + ), + ListPickerItem( + payload: CommentSortType.new_, + icon: Icons.auto_awesome_rounded, + label: AppLocalizations.of(GlobalContext.context)!.new_, + ), + ListPickerItem( + payload: CommentSortType.hot, + icon: Icons.local_fire_department, + label: AppLocalizations.of(GlobalContext.context)!.hot, + ), + // + // ListPickerItem( + // payload: CommentSortType.chat, + // icon: Icons.chat, + // label: 'Chat', + // ), + ]; + + CommentSortPicker( + {super.key, + required super.onSelect, + required super.title, + List>? items, + super.previouslySelected, + this.includeVersionSpecificFeature = IncludeVersionSpecificFeature.ifSupported}) + : super(items: items ?? CommentSortPicker.getCommentSortTypeItems(includeVersionSpecificFeature: includeVersionSpecificFeature)); @override State createState() => _SortPickerState(); @@ -79,7 +96,7 @@ class _SortPickerState extends State { shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), children: [ - ..._generateList(commentSortTypeItems, theme), + ..._generateList(CommentSortPicker.getCommentSortTypeItems(includeVersionSpecificFeature: widget.includeVersionSpecificFeature), theme), ], ), const SizedBox(height: 16.0), diff --git a/lib/shared/sort_picker.dart b/lib/shared/sort_picker.dart index 419bc423e..a5051437c 100644 --- a/lib/shared/sort_picker.dart +++ b/lib/shared/sort_picker.dart @@ -1,38 +1,11 @@ import 'package:flutter/material.dart'; import 'package:lemmy_api_client/v3.dart'; +import 'package:thunder/core/singletons/lemmy_client.dart'; import 'package:thunder/shared/picker_item.dart'; import 'package:thunder/utils/bottom_sheet_list_picker.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:thunder/utils/global_context.dart'; -List> defaultSortTypeItems = [ - ListPickerItem( - payload: SortType.hot, - icon: Icons.local_fire_department_rounded, - label: AppLocalizations.of(GlobalContext.context)!.hot, - ), - ListPickerItem( - payload: SortType.active, - icon: Icons.rocket_launch_rounded, - label: AppLocalizations.of(GlobalContext.context)!.active, - ), - ListPickerItem( - payload: SortType.new_, - icon: Icons.auto_awesome_rounded, - label: AppLocalizations.of(GlobalContext.context)!.new_, - ), - ListPickerItem( - payload: SortType.mostComments, - icon: Icons.comment_bank_rounded, - label: AppLocalizations.of(GlobalContext.context)!.mostComments, - ), - ListPickerItem( - payload: SortType.newComments, - icon: Icons.add_comment_rounded, - label: AppLocalizations.of(GlobalContext.context)!.newComments, - ), -]; - List> topSortTypeItems = [ ListPickerItem( payload: SortType.topHour, @@ -76,10 +49,56 @@ List> topSortTypeItems = [ ), ]; -List> allSortTypeItems = [...defaultSortTypeItems, ...topSortTypeItems]; +List> allSortTypeItems = [...SortPicker.getDefaultSortTypeItems(includeVersionSpecificFeature: IncludeVersionSpecificFeature.always), ...topSortTypeItems]; class SortPicker extends BottomSheetListPicker { - SortPicker({super.key, required super.onSelect, required super.title, List>? items, super.previouslySelected}) : super(items: items ?? defaultSortTypeItems); + final IncludeVersionSpecificFeature includeVersionSpecificFeature; + + static List> getDefaultSortTypeItems({IncludeVersionSpecificFeature includeVersionSpecificFeature = IncludeVersionSpecificFeature.ifSupported}) => [ + ListPickerItem( + payload: SortType.hot, + icon: Icons.local_fire_department_rounded, + label: AppLocalizations.of(GlobalContext.context)!.hot, + ), + ListPickerItem( + payload: SortType.active, + icon: Icons.rocket_launch_rounded, + label: AppLocalizations.of(GlobalContext.context)!.active, + ), + if (includeVersionSpecificFeature == IncludeVersionSpecificFeature.always || + (includeVersionSpecificFeature == IncludeVersionSpecificFeature.ifSupported && LemmyClient.instance.supportsFeature(LemmyFeature.sortTypeScaled))) + ListPickerItem( + payload: SortType.scaled, + icon: Icons.line_weight_rounded, + label: AppLocalizations.of(GlobalContext.context)!.scaled, + ), + if (includeVersionSpecificFeature == IncludeVersionSpecificFeature.always || + (includeVersionSpecificFeature == IncludeVersionSpecificFeature.ifSupported && LemmyClient.instance.supportsFeature(LemmyFeature.sortTypeControversial))) + ListPickerItem( + payload: SortType.controversial, + icon: Icons.warning_rounded, + label: AppLocalizations.of(GlobalContext.context)!.controversial, + ), + ListPickerItem( + payload: SortType.mostComments, + icon: Icons.comment_bank_rounded, + label: AppLocalizations.of(GlobalContext.context)!.mostComments, + ), + ListPickerItem( + payload: SortType.newComments, + icon: Icons.add_comment_rounded, + label: AppLocalizations.of(GlobalContext.context)!.newComments, + ), + ]; + + SortPicker( + {super.key, + required super.onSelect, + required super.title, + List>? items, + super.previouslySelected, + this.includeVersionSpecificFeature = IncludeVersionSpecificFeature.ifSupported}) + : super(items: items ?? getDefaultSortTypeItems(includeVersionSpecificFeature: includeVersionSpecificFeature)); @override State createState() => _SortPickerState(); @@ -96,12 +115,12 @@ class _SortPickerState extends State { transitionBuilder: (Widget child, Animation animation) { return FadeTransition(opacity: animation, child: child); }, - child: topSelected ? topSortPicker() : defaultSortPicker(), + child: topSelected ? topSortPicker() : defaultSortPicker(widget.includeVersionSpecificFeature), ), ); } - Widget defaultSortPicker() { + Widget defaultSortPicker(IncludeVersionSpecificFeature includeVersionSpecificFeature) { final theme = Theme.of(context); return Column( @@ -123,7 +142,7 @@ class _SortPickerState extends State { shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), children: [ - ..._generateList(defaultSortTypeItems, theme), + ..._generateList(SortPicker.getDefaultSortTypeItems(includeVersionSpecificFeature: widget.includeVersionSpecificFeature), theme), PickerItem( label: AppLocalizations.of(GlobalContext.context)!.top, icon: Icons.military_tech, diff --git a/pubspec.lock b/pubspec.lock index 792ce7a70..0339ac246 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -850,9 +850,9 @@ packages: dependency: "direct main" description: path: "." - ref: "607f817e8687ebc60688fd4e0b51aeb11562cdbf" - resolved-ref: "607f817e8687ebc60688fd4e0b51aeb11562cdbf" - url: "https://github.com/thunder-app/lemmy_api_client.git" + ref: "66bddc050f505d7cbda73b38258f72b5d4aeb07d" + resolved-ref: "66bddc050f505d7cbda73b38258f72b5d4aeb07d" + url: "https://github.com/micahmo/lemmy_api_client.git" source: git version: "0.21.0" link_preview_generator: diff --git a/pubspec.yaml b/pubspec.yaml index e1c600cbd..0b3e19924 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,8 +28,10 @@ dependencies: ref: 017c8614c59b7081f54a7af70cc9586888d53b56 lemmy_api_client: git: - url: https://github.com/thunder-app/lemmy_api_client.git - ref: 607f817e8687ebc60688fd4e0b51aeb11562cdbf + #url: https://github.com/thunder-app/lemmy_api_client.git + #ref: 607f817e8687ebc60688fd4e0b51aeb11562cdbf + url: https://github.com/micahmo/lemmy_api_client.git + ref: 66bddc050f505d7cbda73b38258f72b5d4aeb07d link_preview_generator: git: url: https://github.com/thunder-app/link_preview_generator.git From 8e3c63423ba4bdc3acc81cd4a29a1c7aedcffa9c Mon Sep 17 00:00:00 2001 From: Micah Morrison Date: Mon, 16 Oct 2023 22:25:46 -0400 Subject: [PATCH 2/6] Update API package --- pubspec.lock | 6 +++--- pubspec.yaml | 6 ++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 0339ac246..a97e51f53 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -850,9 +850,9 @@ packages: dependency: "direct main" description: path: "." - ref: "66bddc050f505d7cbda73b38258f72b5d4aeb07d" - resolved-ref: "66bddc050f505d7cbda73b38258f72b5d4aeb07d" - url: "https://github.com/micahmo/lemmy_api_client.git" + ref: "9c0f20c3ca3cdcfff447034c1b857dca3c0444d4" + resolved-ref: "9c0f20c3ca3cdcfff447034c1b857dca3c0444d4" + url: "https://github.com/thunder-app/lemmy_api_client.git" source: git version: "0.21.0" link_preview_generator: diff --git a/pubspec.yaml b/pubspec.yaml index 0b3e19924..0731e8661 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,10 +28,8 @@ dependencies: ref: 017c8614c59b7081f54a7af70cc9586888d53b56 lemmy_api_client: git: - #url: https://github.com/thunder-app/lemmy_api_client.git - #ref: 607f817e8687ebc60688fd4e0b51aeb11562cdbf - url: https://github.com/micahmo/lemmy_api_client.git - ref: 66bddc050f505d7cbda73b38258f72b5d4aeb07d + url: https://github.com/thunder-app/lemmy_api_client.git + ref: 9c0f20c3ca3cdcfff447034c1b857dca3c0444d4 link_preview_generator: git: url: https://github.com/thunder-app/link_preview_generator.git From c4e14949f4f338149d1c699c9e2274bb72e44655 Mon Sep 17 00:00:00 2001 From: Micah Morrison Date: Thu, 19 Oct 2023 13:36:02 -0400 Subject: [PATCH 3/6] Remove unnecessary strings --- lib/l10n/app_es.arb | 2 -- lib/l10n/app_pl.arb | 2 -- 2 files changed, 4 deletions(-) diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 5342f08b0..ff2b4ff81 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -351,8 +351,6 @@ "@upvote": {}, "downvote": "Downvote", "@downvote": {}, - "scaled": "Scaled", - "controversial": "Controversial", "edit": "Edit", "@edit": {}, "restore": "Restore", diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 687998367..f28d00817 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -175,8 +175,6 @@ "edit": "Edit", "restore": "Restore", "delete": "Delete", - "scaled": "Scaled", - "controversial": "Controversial", "inReplyTo": "In reply to {post} in {community}", "xUpvotes": "{x} upvotes", "xDownvotes": "{x} downvotes", From 0656ce3c8f7c7decd4449c9a7c884eee9e291f0d Mon Sep 17 00:00:00 2001 From: Micah Morrison Date: Thu, 19 Oct 2023 13:38:23 -0400 Subject: [PATCH 4/6] Invert logic for less nesting --- lib/core/singletons/lemmy_client.dart | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/lib/core/singletons/lemmy_client.dart b/lib/core/singletons/lemmy_client.dart index c9f634f0f..9a9055ac5 100644 --- a/lib/core/singletons/lemmy_client.dart +++ b/lib/core/singletons/lemmy_client.dart @@ -31,23 +31,21 @@ class LemmyClient { } bool supportsFeature(LemmyFeature feature) { - if (_lemmySites.containsKey(instance.lemmyApiV3.host)) { - // Parse the version - FullSiteView site = _lemmySites[instance.lemmyApiV3.host]!; - Version version; - try { - version = Version.parse(site.version); - } catch (e) { - return false; - } + if (!_lemmySites.containsKey(instance.lemmyApiV3.host)) return false; - // Check the feature and return whether it's supported in this version - return switch (feature) { - LemmyFeature.sortTypeControversial || LemmyFeature.sortTypeScaled || LemmyFeature.commentSortTypeControversial => version >= Version(0, 19, 0, preRelease: ["rc", "1"]), - }; + // Parse the version + FullSiteView site = _lemmySites[instance.lemmyApiV3.host]!; + Version version; + try { + version = Version.parse(site.version); + } catch (e) { + return false; } - return false; + // Check the feature and return whether it's supported in this version + return switch (feature) { + LemmyFeature.sortTypeControversial || LemmyFeature.sortTypeScaled || LemmyFeature.commentSortTypeControversial => version >= Version(0, 19, 0, preRelease: ["rc", "1"]), + }; } static final Map _lemmySites = {}; From 85b9706296b7877ad78c322048216c84a36c73b8 Mon Sep 17 00:00:00 2001 From: Micah Morrison Date: Thu, 19 Oct 2023 13:39:36 -0400 Subject: [PATCH 5/6] Invert if to reduce nesting --- lib/core/singletons/lemmy_client.dart | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/core/singletons/lemmy_client.dart b/lib/core/singletons/lemmy_client.dart index 9a9055ac5..b1946680f 100644 --- a/lib/core/singletons/lemmy_client.dart +++ b/lib/core/singletons/lemmy_client.dart @@ -18,16 +18,16 @@ class LemmyClient { static LemmyClient get instance => _instance; Future _populateSiteInfo() async { - if (!_lemmySites.containsKey(instance.lemmyApiV3.host)) { - // Retrieve the site so we can look up metadata about it later - Account? account = await fetchActiveProfileAccount(); + if (_lemmySites.containsKey(instance.lemmyApiV3.host)) return; - _lemmySites[instance.lemmyApiV3.host] = await instance.lemmyApiV3.run( - GetSite( - auth: account?.jwt, - ), - ); - } + // Retrieve the site so we can look up metadata about it later + Account? account = await fetchActiveProfileAccount(); + + _lemmySites[instance.lemmyApiV3.host] = await instance.lemmyApiV3.run( + GetSite( + auth: account?.jwt, + ), + ); } bool supportsFeature(LemmyFeature feature) { From ba005579a29879271021ea9aed75e313c8a906a5 Mon Sep 17 00:00:00 2001 From: Micah Morrison Date: Thu, 19 Oct 2023 14:10:32 -0400 Subject: [PATCH 6/6] Simplify feature version checking --- lib/core/singletons/lemmy_client.dart | 29 +++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/core/singletons/lemmy_client.dart b/lib/core/singletons/lemmy_client.dart index b1946680f..3251028c5 100644 --- a/lib/core/singletons/lemmy_client.dart +++ b/lib/core/singletons/lemmy_client.dart @@ -35,26 +35,39 @@ class LemmyClient { // Parse the version FullSiteView site = _lemmySites[instance.lemmyApiV3.host]!; - Version version; + Version instanceVersion; try { - version = Version.parse(site.version); + instanceVersion = Version.parse(site.version); } catch (e) { return false; } // Check the feature and return whether it's supported in this version - return switch (feature) { - LemmyFeature.sortTypeControversial || LemmyFeature.sortTypeScaled || LemmyFeature.commentSortTypeControversial => version >= Version(0, 19, 0, preRelease: ["rc", "1"]), - }; + return instanceVersion > feature.minSupportedVersion; } static final Map _lemmySites = {}; } enum LemmyFeature { - sortTypeControversial, - sortTypeScaled, - commentSortTypeControversial, + sortTypeControversial(0, 19, 0, preRelease: ["rc", "1"]), + sortTypeScaled(0, 19, 0, preRelease: ["rc", "1"]), + commentSortTypeControversial(0, 19, 0, preRelease: ["rc", "1"]); + + final int major; + final int minor; + final int patch; + final List preRelease; + + const LemmyFeature(this.major, this.minor, this.patch, {this.preRelease = const []}); + + Version get minSupportedVersion => Version( + major, + minor, + patch, + // The Version package attempts to modify this list, so give them a non-final copy. + preRelease: List.from(preRelease), + ); } enum IncludeVersionSpecificFeature {