diff options
Diffstat (limited to 'src/state/cache')
-rw-r--r-- | src/state/cache/thread-mutes.tsx | 55 |
1 files changed, 54 insertions, 1 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]) +} |