From 2423a684170d72b964e52df843f138c75cb34eb3 Mon Sep 17 00:00:00 2001 From: Alexander Harding <2166114+aeharding@users.noreply.github.com> Date: Thu, 2 May 2024 21:46:51 -0500 Subject: [PATCH] Add option to always show author in feed (#1454) Resolves #1220 --- .../post/inFeed/compact/CompactPost.tsx | 22 +++++++++++----- src/features/post/inFeed/large/LargePost.tsx | 25 ++++++++++++++----- .../appearance/posts/AlwaysShowAuthor.tsx | 21 ++++++++++++++++ .../settings/appearance/posts/Posts.tsx | 2 ++ src/features/settings/settingsSlice.tsx | 11 ++++++++ src/services/db.ts | 1 + 6 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 src/features/settings/appearance/posts/AlwaysShowAuthor.tsx diff --git a/src/features/post/inFeed/compact/CompactPost.tsx b/src/features/post/inFeed/compact/CompactPost.tsx index 1300640c54..571ad80305 100644 --- a/src/features/post/inFeed/compact/CompactPost.tsx +++ b/src/features/post/inFeed/compact/CompactPost.tsx @@ -143,10 +143,12 @@ const Domain = styled.span` `; export default function CompactPost({ post }: PostProps) { + const alwaysShowAuthor = useAppSelector( + (state) => state.settings.appearance.posts.alwaysShowAuthor, + ); const compactThumbnailPositionType = useAppSelector( (state) => state.settings.appearance.compact.thumbnailsPosition, ); - const compactShowVotingButtons = useAppSelector( (state) => state.settings.appearance.compact.showVotingButtons, ); @@ -210,11 +212,19 @@ export default function CompactPost({ post }: PostProps) { prefix="by" /> ) : ( - + <> + + {alwaysShowAuthor && ( + <> + {" "} + + + )} + )} diff --git a/src/features/post/inFeed/large/LargePost.tsx b/src/features/post/inFeed/large/LargePost.tsx index c82622d025..786ac4dea9 100644 --- a/src/features/post/inFeed/large/LargePost.tsx +++ b/src/features/post/inFeed/large/LargePost.tsx @@ -79,6 +79,9 @@ export default function LargePost({ post }: PostProps) { const showVotingButtons = useAppSelector( (state) => state.settings.appearance.large.showVotingButtons, ); + const alwaysShowAuthor = useAppSelector( + (state) => state.settings.appearance.posts.alwaysShowAuthor, + ); const hasBeenRead = useAppSelector((state) => state.post.postReadById[post.post.id]) || post.read; @@ -123,12 +126,22 @@ export default function LargePost({ post }: PostProps) { disableInstanceClick /> ) : ( - + <> + + {alwaysShowAuthor && ( + <> + {" "} + + + )} + )} diff --git a/src/features/settings/appearance/posts/AlwaysShowAuthor.tsx b/src/features/settings/appearance/posts/AlwaysShowAuthor.tsx new file mode 100644 index 0000000000..c92434e8a1 --- /dev/null +++ b/src/features/settings/appearance/posts/AlwaysShowAuthor.tsx @@ -0,0 +1,21 @@ +import { useAppDispatch, useAppSelector } from "../../../../store"; +import { setAlwaysShowAuthor } from "../../settingsSlice"; +import { IonItem, IonToggle } from "@ionic/react"; + +export default function AlwaysShowAuthor() { + const dispatch = useAppDispatch(); + const alwaysShowAuthor = useAppSelector( + (state) => state.settings.appearance.posts.alwaysShowAuthor, + ); + + return ( + + dispatch(setAlwaysShowAuthor(e.detail.checked))} + > + Always Show Author + + + ); +} diff --git a/src/features/settings/appearance/posts/Posts.tsx b/src/features/settings/appearance/posts/Posts.tsx index ac12779f3b..835367e223 100644 --- a/src/features/settings/appearance/posts/Posts.tsx +++ b/src/features/settings/appearance/posts/Posts.tsx @@ -5,6 +5,7 @@ import PostSize from "./PostSize"; import EmbedCrossposts from "./EmbedCrossposts"; import ShowCommunityIcons from "./ShowCommunityIcons"; import EmbedExternalMedia from "./EmbedExternalMedia"; +import AlwaysShowAuthor from "./AlwaysShowAuthor"; export default function Posts() { return ( @@ -18,6 +19,7 @@ export default function Posts() { + ); diff --git a/src/features/settings/settingsSlice.tsx b/src/features/settings/settingsSlice.tsx index 9df68e2a32..a6720e4805 100644 --- a/src/features/settings/settingsSlice.tsx +++ b/src/features/settings/settingsSlice.tsx @@ -74,6 +74,7 @@ interface SettingsState { embedCrossposts: boolean; showCommunityIcons: boolean; embedExternalMedia: boolean; + alwaysShowAuthor: boolean; }; large: { showVotingButtons: boolean; @@ -169,6 +170,7 @@ export const initialState: SettingsState = { embedCrossposts: true, showCommunityIcons: true, embedExternalMedia: true, + alwaysShowAuthor: false, }, large: { showVotingButtons: true, @@ -375,6 +377,10 @@ export const appearanceSlice = createSlice({ state.appearance.posts.embedExternalMedia = action.payload; db.setSetting("embed_external_media", action.payload); }, + setAlwaysShowAuthor(state, action: PayloadAction) { + state.appearance.posts.alwaysShowAuthor = action.payload; + db.setSetting("always_show_author", action.payload); + }, setAlwaysUseReaderMode(state, action: PayloadAction) { state.general.safari.alwaysUseReaderMode = action.payload; db.setSetting("always_use_reader_mode", action.payload); @@ -686,6 +692,7 @@ export const fetchSettingsFromDatabase = createAsyncThunk( "no_subscribed_in_feed", ); const embed_external_media = await db.getSetting("embed_external_media"); + const always_show_author = await db.getSetting("always_show_author"); const always_use_reader_mode = await db.getSetting( "always_use_reader_mode", ); @@ -726,6 +733,9 @@ export const fetchSettingsFromDatabase = createAsyncThunk( embedExternalMedia: embed_external_media ?? initialState.appearance.posts.embedExternalMedia, + alwaysShowAuthor: + always_show_author ?? + initialState.appearance.posts.alwaysShowAuthor, }, large: { showVotingButtons: @@ -893,6 +903,7 @@ export const { setDefaultFeed, setNoSubscribedInFeed, setEmbedExternalMedia, + setAlwaysShowAuthor, setAlwaysUseReaderMode, setShowCollapsedComment, setQuickSwitchDarkMode, diff --git a/src/services/db.ts b/src/services/db.ts index 499d0453b8..b886ee4cb8 100644 --- a/src/services/db.ts +++ b/src/services/db.ts @@ -332,6 +332,7 @@ export type SettingValueTypes = { has_presented_block_nsfw_tip: boolean; no_subscribed_in_feed: boolean; embed_external_media: boolean; + always_show_author: boolean; always_use_reader_mode: boolean; infinite_scrolling: boolean; upvote_on_save: boolean;