From c60e8d0772d93fb3b0eca00b5fb1de9e110df320 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 30 Aug 2024 12:26:40 -0500 Subject: [PATCH] Composer blocks (#5040) * Move i18n provider up the stack * Protect composer opening for a blocked post * Protect ctrls from interacting with blocked user --- src/App.native.tsx | 40 +++++++++++----------- src/App.web.tsx | 36 +++++++++---------- src/state/shell/composer.tsx | 27 +++++++++++---- src/view/com/util/post-ctrls/PostCtrls.tsx | 35 +++++++++++++++++++ 4 files changed, 93 insertions(+), 45 deletions(-) diff --git a/src/App.native.tsx b/src/App.native.tsx index c26052a9..9e999ba0 100644 --- a/src/App.native.tsx +++ b/src/App.native.tsx @@ -172,31 +172,31 @@ function App() { * that is set up in the InnerApp component above. */ return ( - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + ) } diff --git a/src/App.web.tsx b/src/App.web.tsx index fa1fba03..88fd8024 100644 --- a/src/App.web.tsx +++ b/src/App.web.tsx @@ -151,29 +151,29 @@ function App() { * that is set up in the InnerApp component above. */ return ( - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + ) } diff --git a/src/state/shell/composer.tsx b/src/state/shell/composer.tsx index c9900548..74802a99 100644 --- a/src/state/shell/composer.tsx +++ b/src/state/shell/composer.tsx @@ -5,8 +5,11 @@ import { AppBskyRichtextFacet, ModerationDecision, } from '@atproto/api' +import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' +import * as Toast from '#/view/com/util/Toast' export interface ComposerOptsPostRef { uri: string @@ -22,12 +25,7 @@ export interface ComposerOptsQuote { text: string facets?: AppBskyRichtextFacet.Main[] indexedAt: string - author: { - did: string - handle: string - displayName?: string - avatar?: string - } + author: AppBskyActorDefs.ProfileViewBasic embeds?: AppBskyEmbedRecord.ViewRecord['embeds'] } export interface ComposerOpts { @@ -56,10 +54,25 @@ const controlsContext = React.createContext({ }) export function Provider({children}: React.PropsWithChildren<{}>) { + const {_} = useLingui() const [state, setState] = React.useState() const openComposer = useNonReactiveCallback((opts: ComposerOpts) => { - setState(opts) + const author = opts.replyTo?.author || opts.quote?.author + const isBlocked = Boolean( + author && + (author.viewer?.blocking || + author.viewer?.blockedBy || + author.viewer?.blockingByList), + ) + if (isBlocked) { + Toast.show( + _(msg`Cannot interact with a blocked user`), + 'exclamation-circle', + ) + } else { + setState(opts) + } }) const closeComposer = useNonReactiveCallback(() => { diff --git a/src/view/com/util/post-ctrls/PostCtrls.tsx b/src/view/com/util/post-ctrls/PostCtrls.tsx index f577e168..05a14ed7 100644 --- a/src/view/com/util/post-ctrls/PostCtrls.tsx +++ b/src/view/com/util/post-ctrls/PostCtrls.tsx @@ -89,6 +89,11 @@ let PostCtrls = ({ const {captureAction} = useProgressGuideControls() const playHaptic = useHaptics() const gate = useGate() + const isBlocked = Boolean( + post.author.viewer?.blocking || + post.author.viewer?.blockedBy || + post.author.viewer?.blockingByList, + ) const shouldShowLoggedOutWarning = React.useMemo(() => { return ( @@ -105,6 +110,14 @@ let PostCtrls = ({ ) as StyleProp const onPressToggleLike = React.useCallback(async () => { + if (isBlocked) { + Toast.show( + _(msg`Cannot interact with a blocked user`), + 'exclamation-circle', + ) + return + } + try { if (!post.viewer?.like) { playHaptic() @@ -124,6 +137,7 @@ let PostCtrls = ({ } } }, [ + _, playHaptic, post.uri, post.viewer?.like, @@ -132,9 +146,18 @@ let PostCtrls = ({ sendInteraction, captureAction, feedContext, + isBlocked, ]) const onRepost = useCallback(async () => { + if (isBlocked) { + Toast.show( + _(msg`Cannot interact with a blocked user`), + 'exclamation-circle', + ) + return + } + try { if (!post.viewer?.repost) { sendInteraction({ @@ -152,15 +175,25 @@ let PostCtrls = ({ } } }, [ + _, post.uri, post.viewer?.repost, queueRepost, queueUnrepost, sendInteraction, feedContext, + isBlocked, ]) const onQuote = useCallback(() => { + if (isBlocked) { + Toast.show( + _(msg`Cannot interact with a blocked user`), + 'exclamation-circle', + ) + return + } + sendInteraction({ item: post.uri, event: 'app.bsky.feed.defs#interactionQuote', @@ -178,6 +211,7 @@ let PostCtrls = ({ onPost: onPostReply, }) }, [ + _, sendInteraction, post.uri, post.cid, @@ -188,6 +222,7 @@ let PostCtrls = ({ openComposer, record.text, onPostReply, + isBlocked, ]) const onShare = useCallback(() => {