From 8fac52f122db9be0f7b7be7d2a733520b8131111 Mon Sep 17 00:00:00 2001 From: ludmila-lovelace Date: Sat, 17 Jan 2026 13:10:41 +1100 Subject: [PATCH 1/4] feat: use compact view for link posts and add config toggles --- lib/l10n/app_en.arb | 8 +++ lib/l10n/generated/app_localizations.dart | 12 ++++ lib/l10n/generated/app_localizations_ar.dart | 6 ++ lib/l10n/generated/app_localizations_be.dart | 6 ++ lib/l10n/generated/app_localizations_cs.dart | 6 ++ lib/l10n/generated/app_localizations_de.dart | 6 ++ lib/l10n/generated/app_localizations_en.dart | 6 ++ lib/l10n/generated/app_localizations_eo.dart | 6 ++ lib/l10n/generated/app_localizations_es.dart | 6 ++ lib/l10n/generated/app_localizations_fi.dart | 6 ++ lib/l10n/generated/app_localizations_fr.dart | 6 ++ lib/l10n/generated/app_localizations_hu.dart | 6 ++ lib/l10n/generated/app_localizations_it.dart | 6 ++ lib/l10n/generated/app_localizations_nb.dart | 6 ++ lib/l10n/generated/app_localizations_nl.dart | 6 ++ lib/l10n/generated/app_localizations_pl.dart | 6 ++ lib/l10n/generated/app_localizations_pt.dart | 6 ++ lib/l10n/generated/app_localizations_ru.dart | 6 ++ lib/l10n/generated/app_localizations_sk.dart | 6 ++ lib/l10n/generated/app_localizations_sv.dart | 6 ++ lib/l10n/generated/app_localizations_ta.dart | 6 ++ lib/l10n/generated/app_localizations_tr.dart | 6 ++ lib/l10n/generated/app_localizations_uk.dart | 6 ++ lib/l10n/generated/app_localizations_zh.dart | 6 ++ .../feed_preferences_cubit.dart | 4 ++ .../feed_preferences_state.dart | 14 +++++ lib/src/core/enums/local_settings.dart | 4 ++ .../presentation/widgets/post_card.dart | 8 ++- .../pages/post_appearance_settings_page.dart | 59 ++++++++++++++++++- 29 files changed, 238 insertions(+), 3 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index a0b3acc69..ec2307f58 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1586,6 +1586,10 @@ "@linkHandlingInAppShort": { "description": "Short description for in-app link handling" }, + "linkPostsUseCompactView": "Show Compact Link Posts", + "@linkPostsUseCompactView": { + "description": "Toggle to use compact view for link posts." + }, "linksBehaviourSettings": "Links", "@linksBehaviourSettings": { "description": "Subcategory in Setting -> General" @@ -2081,6 +2085,10 @@ "@pinned": { "description": "Status to indicate that an item has been pinned" }, + "pinnedPostsUseCompactView": "Show Compact Pinned Posts", + "@pinnedPostsUseCompactView": { + "description": "Toggle to use compact view for pinned posts." + }, "pinnedPostToCommunity": "Pinned post to community", "@pinnedPostToCommunity": { "description": "Message shown when a post is pinned to a community" diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 9703facb0..d1a6ad38b 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2476,6 +2476,12 @@ abstract class AppLocalizations { /// **'In-app'** String get linkHandlingInAppShort; + /// Toggle to use compact view for link posts. + /// + /// In en, this message translates to: + /// **'Show Compact Link Posts'** + String get linkPostsUseCompactView; + /// Subcategory in Setting -> General /// /// In en, this message translates to: @@ -3274,6 +3280,12 @@ abstract class AppLocalizations { /// **'Pinned'** String get pinned; + /// Toggle to use compact view for pinned posts. + /// + /// In en, this message translates to: + /// **'Show Compact Pinned Posts'** + String get pinnedPostsUseCompactView; + /// Message shown when a post is pinned to a community /// /// In en, this message translates to: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index ca1668463..aca509569 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1337,6 +1337,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Links'; @@ -1792,6 +1795,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_be.dart b/lib/l10n/generated/app_localizations_be.dart index f1d2631b3..ccf146bee 100644 --- a/lib/l10n/generated/app_localizations_be.dart +++ b/lib/l10n/generated/app_localizations_be.dart @@ -1345,6 +1345,9 @@ class AppLocalizationsBe extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Links'; @@ -1800,6 +1803,9 @@ class AppLocalizationsBe extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_cs.dart b/lib/l10n/generated/app_localizations_cs.dart index 9e226da5b..972e82ce6 100644 --- a/lib/l10n/generated/app_localizations_cs.dart +++ b/lib/l10n/generated/app_localizations_cs.dart @@ -1348,6 +1348,9 @@ class AppLocalizationsCs extends AppLocalizations { @override String get linkHandlingInAppShort => 'V aplikaci'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Odkazy'; @@ -1806,6 +1809,9 @@ class AppLocalizationsCs extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 858f45a52..8ba05b570 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1365,6 +1365,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-App'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Links'; @@ -1831,6 +1834,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get pinned => 'Angeheftet'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Post an Community angeheftet'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 1f8952ddf..6bdaae503 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1345,6 +1345,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Links'; @@ -1800,6 +1803,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_eo.dart b/lib/l10n/generated/app_localizations_eo.dart index 66dd00285..48795eb25 100644 --- a/lib/l10n/generated/app_localizations_eo.dart +++ b/lib/l10n/generated/app_localizations_eo.dart @@ -1335,6 +1335,9 @@ class AppLocalizationsEo extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Ligiloj'; @@ -1789,6 +1792,9 @@ class AppLocalizationsEo extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 2d2753a65..cbff1c2fe 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1372,6 +1372,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get linkHandlingInAppShort => 'En la aplicación'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Enlaces'; @@ -1837,6 +1840,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_fi.dart b/lib/l10n/generated/app_localizations_fi.dart index d4ba51a16..b0fb6ded9 100644 --- a/lib/l10n/generated/app_localizations_fi.dart +++ b/lib/l10n/generated/app_localizations_fi.dart @@ -1335,6 +1335,9 @@ class AppLocalizationsFi extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Linkit'; @@ -1792,6 +1795,9 @@ class AppLocalizationsFi extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 08fcea84e..9849e9e87 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1365,6 +1365,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Liens'; @@ -1826,6 +1829,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_hu.dart b/lib/l10n/generated/app_localizations_hu.dart index 266698fdf..92b77db31 100644 --- a/lib/l10n/generated/app_localizations_hu.dart +++ b/lib/l10n/generated/app_localizations_hu.dart @@ -1345,6 +1345,9 @@ class AppLocalizationsHu extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Links'; @@ -1800,6 +1803,9 @@ class AppLocalizationsHu extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index afa697b96..d757f45df 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1345,6 +1345,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Link'; @@ -1805,6 +1808,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_nb.dart b/lib/l10n/generated/app_localizations_nb.dart index ad60e7318..5a05f3468 100644 --- a/lib/l10n/generated/app_localizations_nb.dart +++ b/lib/l10n/generated/app_localizations_nb.dart @@ -1326,6 +1326,9 @@ class AppLocalizationsNb extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Links'; @@ -1782,6 +1785,9 @@ class AppLocalizationsNb extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_nl.dart b/lib/l10n/generated/app_localizations_nl.dart index f1f349da3..70af72cb1 100644 --- a/lib/l10n/generated/app_localizations_nl.dart +++ b/lib/l10n/generated/app_localizations_nl.dart @@ -1356,6 +1356,9 @@ class AppLocalizationsNl extends AppLocalizations { @override String get linkHandlingInAppShort => 'Intern'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Koppelingen'; @@ -1819,6 +1822,9 @@ class AppLocalizationsNl extends AppLocalizations { @override String get pinned => 'Vastgepind'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Bericht vastgepind in gemeenschap'; diff --git a/lib/l10n/generated/app_localizations_pl.dart b/lib/l10n/generated/app_localizations_pl.dart index ab96c21ef..9c7dc9c98 100644 --- a/lib/l10n/generated/app_localizations_pl.dart +++ b/lib/l10n/generated/app_localizations_pl.dart @@ -1349,6 +1349,9 @@ class AppLocalizationsPl extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Linki'; @@ -1808,6 +1811,9 @@ class AppLocalizationsPl extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index e086895da..8ea36f4ea 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1354,6 +1354,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Ligações'; @@ -1809,6 +1812,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 021d1c889..d0b4ede12 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1349,6 +1349,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get linkHandlingInAppShort => 'В приложении'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Ссылки'; @@ -1798,6 +1801,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get pinned => 'Прикреплено'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_sk.dart b/lib/l10n/generated/app_localizations_sk.dart index db0cfb392..45abd9d6b 100644 --- a/lib/l10n/generated/app_localizations_sk.dart +++ b/lib/l10n/generated/app_localizations_sk.dart @@ -1354,6 +1354,9 @@ class AppLocalizationsSk extends AppLocalizations { @override String get linkHandlingInAppShort => 'V aplikácii'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Links'; @@ -1809,6 +1812,9 @@ class AppLocalizationsSk extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_sv.dart b/lib/l10n/generated/app_localizations_sv.dart index 6d4bd92a8..3f62f3330 100644 --- a/lib/l10n/generated/app_localizations_sv.dart +++ b/lib/l10n/generated/app_localizations_sv.dart @@ -1332,6 +1332,9 @@ class AppLocalizationsSv extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Links'; @@ -1787,6 +1790,9 @@ class AppLocalizationsSv extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_ta.dart b/lib/l10n/generated/app_localizations_ta.dart index 5ce16f39c..0e6ef68ae 100644 --- a/lib/l10n/generated/app_localizations_ta.dart +++ b/lib/l10n/generated/app_localizations_ta.dart @@ -1365,6 +1365,9 @@ class AppLocalizationsTa extends AppLocalizations { @override String get linkHandlingInAppShort => 'பயன்பாட்டில்'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'இணைப்புகள்'; @@ -1834,6 +1837,9 @@ class AppLocalizationsTa extends AppLocalizations { @override String get pinned => 'குத்திவைக்கப்பட்டது'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'சமூகத்தில் பின் செய்யப்பட்ட இடுகை'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index c54f4a65a..3cfabf2b2 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1352,6 +1352,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get linkHandlingInAppShort => 'Uygulama içi'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Bağlantılar'; @@ -1808,6 +1811,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get pinned => 'Sabitlenmiş'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_uk.dart b/lib/l10n/generated/app_localizations_uk.dart index b35157046..ce8ab45b5 100644 --- a/lib/l10n/generated/app_localizations_uk.dart +++ b/lib/l10n/generated/app_localizations_uk.dart @@ -1340,6 +1340,9 @@ class AppLocalizationsUk extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Links'; @@ -1795,6 +1798,9 @@ class AppLocalizationsUk extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 2ef89ade9..863b06e9b 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1345,6 +1345,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get linkHandlingInAppShort => 'In-app'; + @override + String get linkPostsUseCompactView => 'Show Compact Link Posts'; + @override String get linksBehaviourSettings => 'Links'; @@ -1800,6 +1803,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get pinned => 'Pinned'; + @override + String get pinnedPostsUseCompactView => 'Show Compact Pinned Posts'; + @override String get pinnedPostToCommunity => 'Pinned post to community'; diff --git a/lib/src/app/cubits/feed_preferences_cubit/feed_preferences_cubit.dart b/lib/src/app/cubits/feed_preferences_cubit/feed_preferences_cubit.dart index f287d1314..08818005c 100644 --- a/lib/src/app/cubits/feed_preferences_cubit/feed_preferences_cubit.dart +++ b/lib/src/app/cubits/feed_preferences_cubit/feed_preferences_cubit.dart @@ -51,6 +51,8 @@ class FeedPreferencesCubit extends Cubit { final showTitleFirst = UserPreferences.getLocalSetting(LocalSettings.showPostTitleFirst) ?? false; final hideThumbnails = UserPreferences.getLocalSetting(LocalSettings.hideThumbnails) ?? false; final showThumbnailPreviewOnRight = UserPreferences.getLocalSetting(LocalSettings.showThumbnailPreviewOnRight) ?? false; + final linkPostsUseCompactView = UserPreferences.getLocalSetting(LocalSettings.linkPostsUseCompactView) ?? false; + final pinnedPostsUseCompactView = UserPreferences.getLocalSetting(LocalSettings.pinnedPostsUseCompactView) ?? true; final showTextPostIndicator = UserPreferences.getLocalSetting(LocalSettings.showTextPostIndicator) ?? false; final tappableAuthorCommunity = UserPreferences.getLocalSetting(LocalSettings.tappableAuthorCommunity) ?? false; @@ -96,6 +98,8 @@ class FeedPreferencesCubit extends Cubit { showTitleFirst: showTitleFirst, hideThumbnails: hideThumbnails, showThumbnailPreviewOnRight: showThumbnailPreviewOnRight, + linkPostsUseCompactView: linkPostsUseCompactView, + pinnedPostsUseCompactView: pinnedPostsUseCompactView, showTextPostIndicator: showTextPostIndicator, tappableAuthorCommunity: tappableAuthorCommunity, showVoteActions: showVoteActions, diff --git a/lib/src/app/cubits/feed_preferences_cubit/feed_preferences_state.dart b/lib/src/app/cubits/feed_preferences_cubit/feed_preferences_state.dart index 934c91ef7..1762ecfe0 100644 --- a/lib/src/app/cubits/feed_preferences_cubit/feed_preferences_state.dart +++ b/lib/src/app/cubits/feed_preferences_cubit/feed_preferences_state.dart @@ -14,6 +14,8 @@ class FeedPreferencesState extends Equatable { this.showTitleFirst = false, this.hideThumbnails = false, this.showThumbnailPreviewOnRight = false, + this.linkPostsUseCompactView = false, + this.pinnedPostsUseCompactView = true, this.showTextPostIndicator = false, this.tappableAuthorCommunity = false, this.showVoteActions = true, @@ -75,6 +77,12 @@ class FeedPreferencesState extends Equatable { /// Whether to show thumbnail preview on the right (compact view) final bool showThumbnailPreviewOnRight; + /// Whether to use compact view for link posts + final bool linkPostsUseCompactView; + + /// Whether to use compact view for pinned posts + final bool pinnedPostsUseCompactView; + /// Whether to show text post indicator (compact view) final bool showTextPostIndicator; @@ -158,6 +166,8 @@ class FeedPreferencesState extends Equatable { bool? showTitleFirst, bool? hideThumbnails, bool? showThumbnailPreviewOnRight, + bool? linkPostsUseCompactView, + bool? pinnedPostsUseCompactView, bool? showTextPostIndicator, bool? tappableAuthorCommunity, bool? showVoteActions, @@ -195,6 +205,8 @@ class FeedPreferencesState extends Equatable { showTitleFirst: showTitleFirst ?? this.showTitleFirst, hideThumbnails: hideThumbnails ?? this.hideThumbnails, showThumbnailPreviewOnRight: showThumbnailPreviewOnRight ?? this.showThumbnailPreviewOnRight, + linkPostsUseCompactView: linkPostsUseCompactView ?? this.linkPostsUseCompactView, + pinnedPostsUseCompactView: pinnedPostsUseCompactView ?? this.pinnedPostsUseCompactView, showTextPostIndicator: showTextPostIndicator ?? this.showTextPostIndicator, tappableAuthorCommunity: tappableAuthorCommunity ?? this.tappableAuthorCommunity, showVoteActions: showVoteActions ?? this.showVoteActions, @@ -235,6 +247,8 @@ class FeedPreferencesState extends Equatable { showTitleFirst, hideThumbnails, showThumbnailPreviewOnRight, + linkPostsUseCompactView, + pinnedPostsUseCompactView, showTextPostIndicator, tappableAuthorCommunity, showVoteActions, diff --git a/lib/src/core/enums/local_settings.dart b/lib/src/core/enums/local_settings.dart index 2b5fbaa68..76008d3bd 100644 --- a/lib/src/core/enums/local_settings.dart +++ b/lib/src/core/enums/local_settings.dart @@ -188,6 +188,8 @@ enum LocalSettings { hideThumbnails(name: 'setting_general_hide_thumbnails', key: 'hideThumbnails', category: LocalSettingsCategories.posts, subCategory: LocalSettingsSubCategories.feed), showThumbnailPreviewOnRight( name: 'setting_compact_show_thumbnail_on_right', key: 'showThumbnailPreviewOnRight', category: LocalSettingsCategories.posts, subCategory: LocalSettingsSubCategories.posts), + linkPostsUseCompactView(name: 'setting_general_links_use_compact_view', key: 'linkPostsUseCompactView', category: LocalSettingsCategories.posts, subCategory: LocalSettingsSubCategories.posts), + pinnedPostsUseCompactView(name: 'setting_general_pins_use_compact_view', key: 'pinnedPostsUseCompactView', category: LocalSettingsCategories.posts, subCategory: LocalSettingsSubCategories.posts), showTextPostIndicator(name: 'setting_compact_show_text_post_indicator', key: 'showTextPostIndicator', category: LocalSettingsCategories.posts, subCategory: LocalSettingsSubCategories.posts), tappableAuthorCommunity(name: 'setting_compact_tappable_author_community', key: 'tappableAuthorCommunity', category: LocalSettingsCategories.general, subCategory: LocalSettingsSubCategories.feed), @@ -521,6 +523,8 @@ extension LocalizationExt on AppLocalizations { 'showPostTitleFirst': showPostTitleFirst, 'hideThumbnails': hideThumbnails, 'showThumbnailPreviewOnRight': showThumbnailPreviewOnRight, + 'linkPostsUseCompactView': linkPostsUseCompactView, + 'pinnedPostsUseCompactView': pinnedPostsUseCompactView, 'showTextPostIndicator': showTextPostIndicator, 'tappableAuthorCommunity': tappableAuthorCommunity, 'postBodyViewType': postBodyViewType, diff --git a/lib/src/features/community/presentation/widgets/post_card.dart b/lib/src/features/community/presentation/widgets/post_card.dart index ba935b0c2..9d168c383 100644 --- a/lib/src/features/community/presentation/widgets/post_card.dart +++ b/lib/src/features/community/presentation/widgets/post_card.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:thunder/src/app/cubits/feed_ui_cubit/feed_ui_cubit.dart'; +import 'package:thunder/src/core/enums/media_type.dart'; import 'package:thunder/src/features/account/account.dart'; import 'package:thunder/src/features/community/community.dart'; @@ -165,6 +166,8 @@ class _PostCardState extends State { final showEdgeToEdgeImages = context.select((cubit) => cubit.state.showEdgeToEdgeImages); final showTitleFirst = context.select((cubit) => cubit.state.showTitleFirst); final showTextContent = context.select((cubit) => cubit.state.showTextContent); + final linkPostsUseCompactView = context.select((cubit) => cubit.state.linkPostsUseCompactView); + final pinnedPostsUseCompactView = context.select((cubit) => cubit.state.pinnedPostsUseCompactView); final currentSwipeDirection = determinePostSwipeDirection( isUserLoggedIn: isUserLoggedIn, @@ -176,9 +179,12 @@ class _PostCardState extends State { disableSwiping: widget.disableSwiping, ); final feedType = context.select((bloc) => bloc.state.feedType); + final postIsCompact = useCompactView || + (pinnedPostsUseCompactView && (widget.post.featuredLocal || (feedType == FeedType.community && widget.post.featuredCommunity))) || + (linkPostsUseCompactView && widget.post.media.first.mediaType == MediaType.link && widget.post.media.first.originalUrl?.isNotEmpty == true); // Determine which post card view to use based on the settings - Widget child = useCompactView || widget.post.featuredLocal || (feedType == FeedType.community && widget.post.featuredCommunity) + Widget child = postIsCompact ? PostCardViewCompact( post: widget.post, creator: widget.post.creator!, diff --git a/lib/src/features/settings/presentation/pages/post_appearance_settings_page.dart b/lib/src/features/settings/presentation/pages/post_appearance_settings_page.dart index 7bf1a8a58..c7b664859 100644 --- a/lib/src/features/settings/presentation/pages/post_appearance_settings_page.dart +++ b/lib/src/features/settings/presentation/pages/post_appearance_settings_page.dart @@ -13,6 +13,7 @@ import 'package:thunder/src/features/community/community.dart'; import 'package:thunder/src/core/enums/custom_theme_type.dart'; import 'package:thunder/src/core/enums/feed_card_divider_thickness.dart'; import 'package:thunder/src/core/enums/local_settings.dart'; +import 'package:thunder/src/core/enums/media_type.dart'; import 'package:thunder/src/core/enums/post_body_view_type.dart'; import 'package:thunder/src/core/enums/view_mode.dart'; import 'package:thunder/src/core/singletons/preferences.dart'; @@ -49,6 +50,12 @@ class _PostAppearanceSettingsPageState extends State /// When enabled, the thumbnail previews will be shown on the right. By default, they are shown on the left bool showThumbnailPreviewOnRight = false; + /// When enabled, link posts will use compact view + bool linkPostsUseCompactView = false; + + /// When enabled, pinned posts will use compact view + bool pinnedPostsUseCompactView = true; + /// When enabled, the text post indicator will be shown for text posts bool showTextPostIndicator = false; @@ -152,6 +159,8 @@ class _PostAppearanceSettingsPageState extends State // Card View Settings showTitleFirst = prefs.getBool(LocalSettings.showPostTitleFirst.name) ?? false; + linkPostsUseCompactView = prefs.getBool(LocalSettings.linkPostsUseCompactView.name) ?? false; + pinnedPostsUseCompactView = prefs.getBool(LocalSettings.pinnedPostsUseCompactView.name) ?? true; showFullHeightImages = prefs.getBool(LocalSettings.showPostFullHeightImages.name) ?? true; showEdgeToEdgeImages = prefs.getBool(LocalSettings.showPostEdgeToEdgeImages.name) ?? false; showTextContent = prefs.getBool(LocalSettings.showPostTextContentPreview.name) ?? false; @@ -225,6 +234,14 @@ class _PostAppearanceSettingsPageState extends State await prefs.setBool(LocalSettings.showThumbnailPreviewOnRight.name, value); setState(() => showThumbnailPreviewOnRight = value); break; + case LocalSettings.linkPostsUseCompactView: + await prefs.setBool(LocalSettings.linkPostsUseCompactView.name, value); + setState(() => linkPostsUseCompactView = value); + break; + case LocalSettings.pinnedPostsUseCompactView: + await prefs.setBool(LocalSettings.pinnedPostsUseCompactView.name, value); + setState(() => pinnedPostsUseCompactView = value); + break; case LocalSettings.showTextPostIndicator: await prefs.setBool(LocalSettings.showTextPostIndicator.name, value); setState(() => showTextPostIndicator = value); @@ -307,6 +324,8 @@ class _PostAppearanceSettingsPageState extends State await prefs.remove(LocalSettings.feedCardDividerColor.name); await prefs.remove(LocalSettings.compactPostCardMetadataItems.name); await prefs.remove(LocalSettings.showThumbnailPreviewOnRight.name); + await prefs.remove(LocalSettings.linkPostsUseCompactView.name); + await prefs.remove(LocalSettings.pinnedPostsUseCompactView.name); await prefs.remove(LocalSettings.showTextPostIndicator.name); await prefs.remove(LocalSettings.cardPostCardMetadataItems.name); await prefs.remove(LocalSettings.showPostTitleFirst.name); @@ -335,6 +354,18 @@ class _PostAppearanceSettingsPageState extends State final account = context.read().state.account; final repository = PostRepositoryImpl(account: account); + ThunderPost? postPinned = await repository.createExample( + postTitle: 'Example Pinned Post', + personName: 'Lightning', + personInstance: 'lemmy.world', + communityName: 'Thunder', + postBody: 'Thunder is an open source, cross platform app for interacting, and exploring Lemmy communities.', + pinned: true, + read: false, + scoreCount: 76, + commentCount: 1437, + ); + ThunderPost? postText = await repository.createExample( postTitle: 'Example Text Post', personName: 'Lightning', @@ -366,12 +397,13 @@ class _PostAppearanceSettingsPageState extends State personInstance: 'lemmy.world', communityName: 'Thunder', postUrl: 'https://github.com/thunder-app/thunder', + postThumbnailUrl: 'https://raw.githubusercontent.com/thunder-app/thunder/refs/heads/develop/assets/logo.png', read: false, scoreCount: 1210, commentCount: 543, ); - return [postText, postLink, postImage].nonNulls.toList(); + return [postPinned, postText, postLink, postImage].nonNulls.toList(); } @override @@ -516,10 +548,12 @@ class _PostAppearanceSettingsPageState extends State final post = snapshot.data![index]!; final creator = post.creator!; final community = post.community!; + final postIsCompact = + useCompactView || (pinnedPostsUseCompactView && post.featuredCommunity) || (linkPostsUseCompactView && post.media.first.mediaType == MediaType.link); return Column( children: [ - (useCompactView) + (postIsCompact) ? IgnorePointer( child: PostCardViewCompact( post: post, @@ -527,6 +561,7 @@ class _PostAppearanceSettingsPageState extends State community: community, indicateRead: dimReadPosts, isLastTapped: false, + showMedia: !hideThumbnails, ), ) : IgnorePointer( @@ -949,6 +984,26 @@ class _PostAppearanceSettingsPageState extends State setting: LocalSettings.showPostSaveAction, highlightedSetting: settingToHighlight, ), + ToggleOption( + description: l10n.linkPostsUseCompactView, + value: linkPostsUseCompactView, + iconEnabled: Icons.add_link, + iconDisabled: Icons.link, + onToggle: useCompactView ? null : (bool value) => setPreferences(LocalSettings.linkPostsUseCompactView, value), + highlightKey: settingToHighlightKey, + setting: LocalSettings.linkPostsUseCompactView, + highlightedSetting: settingToHighlight, + ), + ToggleOption( + description: l10n.pinnedPostsUseCompactView, + value: pinnedPostsUseCompactView, + iconEnabled: Icons.push_pin, + iconDisabled: Icons.push_pin_outlined, + onToggle: useCompactView ? null : (bool value) => setPreferences(LocalSettings.pinnedPostsUseCompactView, value), + highlightKey: settingToHighlightKey, + setting: LocalSettings.pinnedPostsUseCompactView, + highlightedSetting: settingToHighlight, + ), SizedBox(height: 32.0), Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), From 3c2f986e3c7d02ec0b18e7d6155648f985573387 Mon Sep 17 00:00:00 2001 From: ludmila-lovelace Date: Sat, 17 Jan 2026 13:38:04 +1100 Subject: [PATCH 2/4] fix: remove unnecessary check for link urls --- lib/src/features/community/presentation/widgets/post_card.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/features/community/presentation/widgets/post_card.dart b/lib/src/features/community/presentation/widgets/post_card.dart index 9d168c383..a9d2be8a1 100644 --- a/lib/src/features/community/presentation/widgets/post_card.dart +++ b/lib/src/features/community/presentation/widgets/post_card.dart @@ -181,7 +181,7 @@ class _PostCardState extends State { final feedType = context.select((bloc) => bloc.state.feedType); final postIsCompact = useCompactView || (pinnedPostsUseCompactView && (widget.post.featuredLocal || (feedType == FeedType.community && widget.post.featuredCommunity))) || - (linkPostsUseCompactView && widget.post.media.first.mediaType == MediaType.link && widget.post.media.first.originalUrl?.isNotEmpty == true); + (linkPostsUseCompactView && widget.post.media.first.mediaType == MediaType.link); // Determine which post card view to use based on the settings Widget child = postIsCompact From b37f19ffef92304f99085630c133ad4bb93903df Mon Sep 17 00:00:00 2001 From: ludmila-lovelace Date: Sat, 17 Jan 2026 14:47:47 +1100 Subject: [PATCH 3/4] fix: check if post media is empty --- lib/src/features/community/presentation/widgets/post_card.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/features/community/presentation/widgets/post_card.dart b/lib/src/features/community/presentation/widgets/post_card.dart index a9d2be8a1..7715d58c0 100644 --- a/lib/src/features/community/presentation/widgets/post_card.dart +++ b/lib/src/features/community/presentation/widgets/post_card.dart @@ -181,7 +181,7 @@ class _PostCardState extends State { final feedType = context.select((bloc) => bloc.state.feedType); final postIsCompact = useCompactView || (pinnedPostsUseCompactView && (widget.post.featuredLocal || (feedType == FeedType.community && widget.post.featuredCommunity))) || - (linkPostsUseCompactView && widget.post.media.first.mediaType == MediaType.link); + (linkPostsUseCompactView && widget.post.media.isNotEmpty && widget.post.media.first.mediaType == MediaType.link); // Determine which post card view to use based on the settings Widget child = postIsCompact From 6e9da8bc51961efc36336ce281f91e3198177862 Mon Sep 17 00:00:00 2001 From: Hamlet Jiang Su Date: Sat, 17 Jan 2026 09:34:51 -0800 Subject: [PATCH 4/4] fix: fix localization string not being in alphabetical order --- lib/l10n/app_en.arb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index ec2307f58..708d8eb1a 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -2085,14 +2085,14 @@ "@pinned": { "description": "Status to indicate that an item has been pinned" }, - "pinnedPostsUseCompactView": "Show Compact Pinned Posts", - "@pinnedPostsUseCompactView": { - "description": "Toggle to use compact view for pinned posts." - }, "pinnedPostToCommunity": "Pinned post to community", "@pinnedPostToCommunity": { "description": "Message shown when a post is pinned to a community" }, + "pinnedPostsUseCompactView": "Show Compact Pinned Posts", + "@pinnedPostsUseCompactView": { + "description": "Toggle to use compact view for pinned posts." + }, "placeholderText": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", "@placeholderText": { "description": "Placeholder text for any previews. This comes from https://www.lipsum.com/"