diff options
| author | Samuel Newman <mozzius@protonmail.com> | 2024-06-18 22:05:59 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-19 00:05:59 +0300 |
| commit | 0012d1236ffa4f268fb359931d02335b21610fd6 (patch) | |
| tree | e217b731a607a332b084a35b5717e64811209984 /src/state/cache | |
| parent | 502bcad7017d72fb23c40a268b1e220f892db7da (diff) | |
| download | voidsky-0012d1236ffa4f268fb359931d02335b21610fd6.tar.zst | |
Migrate local thread mutes (#4523)
* migrate thread mutes * don't try and clear if not logged in yet * migrate mutes one at a time * write before mutating * only migrate mutes of self posts * use /** @deprecated */ * shouldLike -> shouldMute
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]) +} |
