From 8957783c2b6c4e2a82099bd4f652abb2ec504330 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 14 Aug 2024 17:17:19 -0500 Subject: [PATCH] Handle unhiding with reply cache --- src/state/threadgate-hidden-replies.tsx | 10 +++++++++- src/view/com/posts/FeedItem.tsx | 12 ++++++++++-- src/view/com/util/forms/PostDropdownBtn.tsx | 6 ++++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/state/threadgate-hidden-replies.tsx b/src/state/threadgate-hidden-replies.tsx index 5f270df36b..940851db03 100644 --- a/src/state/threadgate-hidden-replies.tsx +++ b/src/state/threadgate-hidden-replies.tsx @@ -2,6 +2,7 @@ import React from 'react' type StateContext = { uris: string[] + recentlyUnhiddenUris: string[] } type ApiContext = { addHiddenReplyUri: (uri: string) => void @@ -10,6 +11,7 @@ type ApiContext = { const StateContext = React.createContext({ uris: [], + recentlyUnhiddenUris: [], }) const ApiContext = React.createContext({ @@ -19,21 +21,27 @@ const ApiContext = React.createContext({ export function Provider({children}: {children: React.ReactNode}) { const [uris, setHiddenReplyUris] = React.useState([]) + const [recentlyUnhiddenUris, setRecentlyUnhiddenUris] = React.useState< + string[] + >([]) const stateCtx = React.useMemo( () => ({ uris, + recentlyUnhiddenUris, }), - [uris], + [uris, recentlyUnhiddenUris], ) const apiCtx = React.useMemo( () => ({ addHiddenReplyUri(uri: string) { setHiddenReplyUris(prev => Array.from(new Set([...prev, uri]))) + setRecentlyUnhiddenUris(prev => prev.filter(u => u !== uri)) }, removeHiddenReplyUri(uri: string) { setHiddenReplyUris(prev => prev.filter(u => u !== uri)) + setRecentlyUnhiddenUris(prev => Array.from(new Set([...prev, uri]))) }, }), [setHiddenReplyUris], diff --git a/src/view/com/posts/FeedItem.tsx b/src/view/com/posts/FeedItem.tsx index 67a20a58b1..40f47a7a7d 100644 --- a/src/view/com/posts/FeedItem.tsx +++ b/src/view/com/posts/FeedItem.tsx @@ -416,10 +416,12 @@ let PostContent = ({ const [limitLines, setLimitLines] = useState( () => countLines(richText.text) >= MAX_POST_LINES, ) - const {uris: hiddenReplyUris} = useThreadgateHiddenReplyUris() + const {uris: hiddenReplyUris, recentlyUnhiddenUris} = + useThreadgateHiddenReplyUris() const additionalPostAlerts: AppModerationCause[] = React.useMemo(() => { const isPostHiddenByHiddenReplyCache = hiddenReplyUris.includes(post.uri) const isPostHiddenByThreadgate = + !recentlyUnhiddenUris.includes(post.uri) && !!threadgateRecord?.hiddenReplies?.includes(post.uri) const isHidden = isPostHiddenByHiddenReplyCache || isPostHiddenByThreadgate const alertSource = @@ -437,7 +439,13 @@ let PostContent = ({ }, ] : [] - }, [post, hiddenReplyUris, threadgateRecord, currentAccount?.did]) + }, [ + post, + hiddenReplyUris, + recentlyUnhiddenUris, + threadgateRecord, + currentAccount?.did, + ]) const onPressShowMore = React.useCallback(() => { setLimitLines(false) diff --git a/src/view/com/util/forms/PostDropdownBtn.tsx b/src/view/com/util/forms/PostDropdownBtn.tsx index 7958a23735..ccf8eabb62 100644 --- a/src/view/com/util/forms/PostDropdownBtn.tsx +++ b/src/view/com/util/forms/PostDropdownBtn.tsx @@ -123,7 +123,8 @@ let PostDropdownBtn = ({ const quotePostDetachConfirmControl = useDialogControl() const {mutateAsync: toggleReplyVisibility} = useToggleReplyVisibilityMutation() - const {uris: hiddenReplies} = useThreadgateHiddenReplyUris() + const {uris: hiddenReplies, recentlyUnhiddenUris} = + useThreadgateHiddenReplyUris() const postUri = post.uri const postCid = post.cid @@ -147,7 +148,8 @@ let PostDropdownBtn = ({ const isRootPostAuthor = new AtUri(rootUri).host === currentAccount?.did const isReplyHiddenByThreadgate = hiddenReplies.includes(postUri) || - threadgateRecord?.hiddenReplies?.includes(postUri) + (!recentlyUnhiddenUris.includes(postUri) && + threadgateRecord?.hiddenReplies?.includes(postUri)) const {mutateAsync: toggleQuoteDetachment, isPending} = useToggleQuoteDetachmentMutation()