From c2b9fe9a82b42300eab6e769926b046404fcfad4 Mon Sep 17 00:00:00 2001 From: Alexander Harding Date: Mon, 20 Jan 2025 17:06:43 -0600 Subject: [PATCH] feat: never show read setting (#1816) --- src/features/feed/PostCommentFeed.tsx | 18 +++++++++++---- .../general/hiding/HidingSettings.tsx | 2 ++ .../general/hiding/NeverShowReadPosts.tsx | 23 +++++++++++++++++++ src/features/settings/settingsSlice.tsx | 9 ++++++++ src/services/db.ts | 2 ++ 5 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 src/features/settings/general/hiding/NeverShowReadPosts.tsx diff --git a/src/features/feed/PostCommentFeed.tsx b/src/features/feed/PostCommentFeed.tsx index 5325062ef9..d67b3ba752 100644 --- a/src/features/feed/PostCommentFeed.tsx +++ b/src/features/feed/PostCommentFeed.tsx @@ -68,6 +68,9 @@ export default function PostCommentFeed({ const markReadOnScroll = useAppSelector( (state) => state.settings.general.posts.markReadOnScroll, ); + const neverShowReadPosts = useAppSelector( + (state) => state.settings.general.posts.neverShowReadPosts, + ); const autohidePostIfNeeded = useAutohidePostIfNeeded(); const itemsRef = useRef(); @@ -179,18 +182,23 @@ export default function PostCommentFeed({ const filterOnRxFn = useCallback( (item: PostCommentItem) => { const postHidden = postHiddenById[item.post.id]; - if (filterHiddenPosts && postHidden?.hidden) return false; + if (isPost(item)) { + if (filterHiddenPosts && postHidden?.hidden) return false; - // Filter removed from community/special feed pages for mods - if (filterHiddenPosts && item.post.removed) { - return false; + // Ignore neverShowReadPosts on hidden posts page (and profile, etc) + if (filterHiddenPosts && neverShowReadPosts && item.read) return false; + + // Filter removed from community/special feed pages for mods + if (filterHiddenPosts && item.post.removed) { + return false; + } } if (_filterOnRxFn) return _filterOnRxFn(item); return true; }, - [filterHiddenPosts, postHiddenById, _filterOnRxFn], + [filterHiddenPosts, postHiddenById, _filterOnRxFn, neverShowReadPosts], ); const getIndex = useCallback( diff --git a/src/features/settings/general/hiding/HidingSettings.tsx b/src/features/settings/general/hiding/HidingSettings.tsx index 03a990c765..0828dff292 100644 --- a/src/features/settings/general/hiding/HidingSettings.tsx +++ b/src/features/settings/general/hiding/HidingSettings.tsx @@ -7,6 +7,7 @@ import AutoHideRead from "./autoHide/AutoHideRead"; import DisableInCommunities from "./autoHide/DisableInCommunities"; import DisableMarkingRead from "./DisableMarkingRead"; import MarkReadOnScroll from "./MarkReadOnScroll"; +import NeverShowReadPosts from "./NeverShowReadPosts"; import ShowHiddenInCommunities from "./ShowHiddenInCommunities"; import ShowHideReadButton from "./ShowHideReadButton"; @@ -24,6 +25,7 @@ export default function HidingSettings() { + )} diff --git a/src/features/settings/general/hiding/NeverShowReadPosts.tsx b/src/features/settings/general/hiding/NeverShowReadPosts.tsx new file mode 100644 index 0000000000..52a1048815 --- /dev/null +++ b/src/features/settings/general/hiding/NeverShowReadPosts.tsx @@ -0,0 +1,23 @@ +import { IonItem, IonToggle } from "@ionic/react"; + +import { useAppDispatch, useAppSelector } from "#/store"; + +import { setNeverShowReadPosts } from "../../settingsSlice"; + +export default function NeverShowReadPosts() { + const dispatch = useAppDispatch(); + const neverShowReadPosts = useAppSelector( + (state) => state.settings.general.posts.neverShowReadPosts, + ); + + return ( + + dispatch(setNeverShowReadPosts(e.detail.checked))} + > + Never Show Previously Read + + + ); +} diff --git a/src/features/settings/settingsSlice.tsx b/src/features/settings/settingsSlice.tsx index fc72cd916f..83b66d735f 100644 --- a/src/features/settings/settingsSlice.tsx +++ b/src/features/settings/settingsSlice.tsx @@ -136,6 +136,7 @@ export interface SettingsState { markReadOnScroll: boolean; showHideReadButton: boolean; showHiddenInCommunities: boolean; + neverShowReadPosts: boolean; autoHideRead: boolean; disableAutoHideInCommunities: boolean; infiniteScrolling: boolean; @@ -249,6 +250,7 @@ const baseState: SettingsState = { disableMarkingRead: false, infiniteScrolling: true, markReadOnScroll: false, + neverShowReadPosts: false, rememberCommunitySort: false, showHiddenInCommunities: false, showHideReadButton: false, @@ -429,6 +431,11 @@ export const settingsSlice = createSlice({ db.setSetting("mark_read_on_scroll", action.payload); }, + setNeverShowReadPosts(state, action: PayloadAction) { + state.general.posts.neverShowReadPosts = action.payload; + + db.setSetting("never_show_read_posts", action.payload); + }, setNoSubscribedInFeed(state, action: PayloadAction) { state.general.noSubscribedInFeed = action.payload; db.setSetting("no_subscribed_in_feed", action.payload); @@ -792,6 +799,7 @@ export const { setLargeShowVotingButtons, setLinkHandler, setMarkPostsReadOnScroll, + setNeverShowReadPosts, setNoSubscribedInFeed, setNsfwBlur, setPostAppearance, @@ -908,6 +916,7 @@ function hydrateStateWithGlobalSettings( disableMarkingRead: settings.disable_marking_posts_read, infiniteScrolling: settings.infinite_scrolling, markReadOnScroll: settings.mark_read_on_scroll, + neverShowReadPosts: settings.never_show_read_posts, rememberCommunitySort: settings.remember_community_post_sort, showHiddenInCommunities: settings.show_hidden_in_communities, showHideReadButton: settings.show_hide_read_button, diff --git a/src/services/db.ts b/src/services/db.ts index b83dddfe57..fc06b61af5 100644 --- a/src/services/db.ts +++ b/src/services/db.ts @@ -353,6 +353,7 @@ export interface GlobalSettingValueTypes { large_show_voting_buttons: boolean; link_handler: LinkHandlerType; mark_read_on_scroll: boolean; + never_show_read_posts: boolean; no_subscribed_in_feed: boolean; post_appearance_type: PostAppearanceType; prefer_native_apps: boolean; @@ -457,6 +458,7 @@ export const ALL_GLOBAL_SETTINGS = arrayOfAll()([ "upvote_on_save", "user_instance_url_display", "vote_display_mode", + "never_show_read_posts", "votes_theme", "hide_alt_text", "show_controls_on_open",