diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/state/cache/thread-mutes.tsx | 55 | ||||
-rw-r--r-- | src/state/persisted/schema.ts | 3 | ||||
-rw-r--r-- | src/state/queries/post.ts | 4 |
3 files changed, 58 insertions, 4 deletions
diff --git a/src/state/cache/thread-mutes.tsx b/src/state/cache/thread-mutes.tsx index b58bd430f..dc5104c14 100644 --- a/src/state/cache/thread-mutes.tsx +++ b/src/state/cache/thread-mutes.tsx @@ -1,4 +1,7 @@ -import React from 'react' +import React, {useEffect} from 'react' + +import * as persisted from '#/state/persisted' +import {useAgent, useSession} from '../session' type StateContext = Map<string, boolean> type SetStateContext = (uri: string, value: boolean) => void @@ -21,6 +24,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) { }, [setState], ) + + useMigrateMutes(setThreadMute) + return ( <stateContext.Provider value={state}> <setStateContext.Provider value={setThreadMute}> @@ -42,3 +48,50 @@ export function useIsThreadMuted(uri: string, defaultValue = false) { export function useSetThreadMute() { return React.useContext(setStateContext) } + +function useMigrateMutes(setThreadMute: SetStateContext) { + const agent = useAgent() + const {currentAccount} = useSession() + + useEffect(() => { + if (currentAccount) { + if ( + !persisted + .get('mutedThreads') + .some(uri => uri.includes(currentAccount.did)) + ) { + return + } + + let cancelled = false + + const migrate = async () => { + while (!cancelled) { + const threads = persisted.get('mutedThreads') + + const root = threads.findLast(uri => uri.includes(currentAccount.did)) + + if (!root) break + + persisted.write( + 'mutedThreads', + threads.filter(uri => uri !== root), + ) + + setThreadMute(root, true) + + await agent.api.app.bsky.graph + .muteThread({root}) + // not a big deal if this fails, since the post might have been deleted + .catch(console.error) + } + } + + migrate() + + return () => { + cancelled = true + } + } + }, [agent, currentAccount, setThreadMute]) +} diff --git a/src/state/persisted/schema.ts b/src/state/persisted/schema.ts index b81cf5962..9d5b17d35 100644 --- a/src/state/persisted/schema.ts +++ b/src/state/persisted/schema.ts @@ -74,7 +74,6 @@ export const schema = z.object({ flickr: z.enum(externalEmbedOptions).optional(), }) .optional(), - mutedThreads: z.array(z.string()), // should move to server invites: z.object({ copiedInvites: z.array(z.string()), }), @@ -88,6 +87,8 @@ export const schema = z.object({ disableHaptics: z.boolean().optional(), disableAutoplay: z.boolean().optional(), kawaii: z.boolean().optional(), + /** @deprecated */ + mutedThreads: z.array(z.string()), }) export type Schema = z.infer<typeof schema> diff --git a/src/state/queries/post.ts b/src/state/queries/post.ts index 8e77bf6b9..a511d6b3d 100644 --- a/src/state/queries/post.ts +++ b/src/state/queries/post.ts @@ -304,8 +304,8 @@ export function useThreadMuteMutationQueue( const queueToggle = useToggleMutationQueue<boolean>({ initialState: isThreadMuted, - runMutation: async (_prev, shouldLike) => { - if (shouldLike) { + runMutation: async (_prev, shouldMute) => { + if (shouldMute) { await threadMuteMutation.mutateAsync({ uri: rootUri, }) |