From 9f028512e6c6ec27f794b59424232fdb534683af Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 13 Feb 2024 14:02:11 -0600 Subject: [PATCH] Handle subscription --- .../ProfileModerationService/Header.tsx | 63 +++++++++++++++++-- .../ProfileModerationService/index.tsx | 4 +- src/state/queries/modservice.ts | 29 +++++++-- 3 files changed, 85 insertions(+), 11 deletions(-) diff --git a/src/screens/ProfileModerationService/Header.tsx b/src/screens/ProfileModerationService/Header.tsx index dde7d520ca..67fee31d97 100644 --- a/src/screens/ProfileModerationService/Header.tsx +++ b/src/screens/ProfileModerationService/Header.tsx @@ -19,6 +19,8 @@ import { } from '#/view/com/util/forms/NativeDropdown' import {useSession} from '#/state/session' import {useModalControls} from '#/state/modals' +import {useModServiceSubscriptionMutation} from '#/state/queries/modservice' +import {UsePreferencesQueryResponse} from '#/state/queries/preferences' import {useTheme, atoms as a, tokens, web, native, useBreakpoints} from '#/alf' import {Text} from '#/components/Typography' @@ -30,8 +32,10 @@ import {Bars3_Stroke2_Corner0_Rounded as Bars} from '#/components/icons/Bars' import {Divider} from '#/components/Divider' export function Header({ + preferences, modservice, }: { + preferences: UsePreferencesQueryResponse modservice: AppBskyModerationDefs.ModServiceViewDetailed }) { const t = useTheme() @@ -40,6 +44,13 @@ export function Header({ const navigation = useNavigation() const {_} = useLingui() const canGoBack = navigation.canGoBack() + const {mutateAsync: service, variables} = useModServiceSubscriptionMutation() + const isSubscribed = + variables?.subscribe ?? + preferences.moderationOpts.mods.find( + mod => mod.did === modservice.creator.did, + ) + const [subscriptionError, setSubscriptionError] = React.useState('') const onPressBack = React.useCallback(() => { if (navigation.canGoBack()) { @@ -53,8 +64,16 @@ export function Header({ setDrawerOpen(true) }, [setDrawerOpen]) + const toggleSubscribe = React.useCallback(async () => { + try { + await service({did: modservice.creator.did, subscribe: !isSubscribed}) + } catch (e: any) { + setSubscriptionError(e.message) + } + }, [service, isSubscribed, modservice.creator.did]) + return ( - + {!gtMobile && ( + label={_(msg`Subscribe to this moderation service`)} + onPress={toggleSubscribe}> - Subscribe + {isSubscribed ? ( + Unsubscribe + ) : ( + Subscribe + )} @@ -134,9 +158,14 @@ export function Header({ size="small" variant="solid" color="primary" - label={_(msg`Subscribe to moderation service`)}> + label={_(msg`Subscribe to this moderation service`)} + onPress={toggleSubscribe}> - Subscribe + {isSubscribed ? ( + Unsubscribe + ) : ( + Subscribe + )} @@ -144,6 +173,30 @@ export function Header({ )} + + {subscriptionError && ( + + + + An error occurred while editing your subscription. + + + {subscriptionError} + + + + )} ) } diff --git a/src/screens/ProfileModerationService/index.tsx b/src/screens/ProfileModerationService/index.tsx index 7aee6f80fb..10a0e2e187 100644 --- a/src/screens/ProfileModerationService/index.tsx +++ b/src/screens/ProfileModerationService/index.tsx @@ -120,7 +120,7 @@ function ProfileModservicecreenIntermediate({modDid}: {modDid: string}) { } export function ProfileModserviceScreenInner({ - // preferences, + preferences, modservice, }: { preferences: UsePreferencesQueryResponse @@ -186,7 +186,7 @@ export function ProfileModserviceScreenInner({ borderWidth: 0, paddingHorizontal: a.px_xl.paddingLeft, }}> -
+
{modservice.description ? ( diff --git a/src/state/queries/modservice.ts b/src/state/queries/modservice.ts index 5cf45254cd..26a54d74fd 100644 --- a/src/state/queries/modservice.ts +++ b/src/state/queries/modservice.ts @@ -1,14 +1,35 @@ -import {useQuery} from '@tanstack/react-query' -import {getAgent} from '../session' +import {useQuery, useMutation, useQueryClient} from '@tanstack/react-query' -export const RQKEY = (did: string) => ['mod-service-info', did] +import {getAgent} from '#/state/session' +import {preferencesQueryKey} from '#/state/queries/preferences' + +export const modServiceInfoQueryKey = (did: string) => ['mod-service-info', did] export function useModServiceInfoQuery({did}: {did: string}) { return useQuery({ - queryKey: RQKEY(did), + queryKey: modServiceInfoQueryKey(did), queryFn: async () => { const res = await getAgent().app.bsky.moderation.getService({did}) return res.data }, }) } + +export function useModServiceSubscriptionMutation() { + const queryClient = useQueryClient() + + return useMutation({ + async mutationFn({did, subscribe}: {did: string; subscribe: boolean}) { + if (subscribe) { + await getAgent().addModService(did) + } else { + await getAgent().removeModService(did) + } + }, + onSuccess() { + queryClient.invalidateQueries({ + queryKey: preferencesQueryKey, + }) + }, + }) +}