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 -> shouldMutezio/stable
parent
502bcad701
commit
0012d1236f
|
@ -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 StateContext = Map<string, boolean>
|
||||||
type SetStateContext = (uri: string, value: boolean) => void
|
type SetStateContext = (uri: string, value: boolean) => void
|
||||||
|
@ -21,6 +24,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
|
||||||
},
|
},
|
||||||
[setState],
|
[setState],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
useMigrateMutes(setThreadMute)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<stateContext.Provider value={state}>
|
<stateContext.Provider value={state}>
|
||||||
<setStateContext.Provider value={setThreadMute}>
|
<setStateContext.Provider value={setThreadMute}>
|
||||||
|
@ -42,3 +48,50 @@ export function useIsThreadMuted(uri: string, defaultValue = false) {
|
||||||
export function useSetThreadMute() {
|
export function useSetThreadMute() {
|
||||||
return React.useContext(setStateContext)
|
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])
|
||||||
|
}
|
||||||
|
|
|
@ -74,7 +74,6 @@ export const schema = z.object({
|
||||||
flickr: z.enum(externalEmbedOptions).optional(),
|
flickr: z.enum(externalEmbedOptions).optional(),
|
||||||
})
|
})
|
||||||
.optional(),
|
.optional(),
|
||||||
mutedThreads: z.array(z.string()), // should move to server
|
|
||||||
invites: z.object({
|
invites: z.object({
|
||||||
copiedInvites: z.array(z.string()),
|
copiedInvites: z.array(z.string()),
|
||||||
}),
|
}),
|
||||||
|
@ -88,6 +87,8 @@ export const schema = z.object({
|
||||||
disableHaptics: z.boolean().optional(),
|
disableHaptics: z.boolean().optional(),
|
||||||
disableAutoplay: z.boolean().optional(),
|
disableAutoplay: z.boolean().optional(),
|
||||||
kawaii: z.boolean().optional(),
|
kawaii: z.boolean().optional(),
|
||||||
|
/** @deprecated */
|
||||||
|
mutedThreads: z.array(z.string()),
|
||||||
})
|
})
|
||||||
export type Schema = z.infer<typeof schema>
|
export type Schema = z.infer<typeof schema>
|
||||||
|
|
||||||
|
|
|
@ -304,8 +304,8 @@ export function useThreadMuteMutationQueue(
|
||||||
|
|
||||||
const queueToggle = useToggleMutationQueue<boolean>({
|
const queueToggle = useToggleMutationQueue<boolean>({
|
||||||
initialState: isThreadMuted,
|
initialState: isThreadMuted,
|
||||||
runMutation: async (_prev, shouldLike) => {
|
runMutation: async (_prev, shouldMute) => {
|
||||||
if (shouldLike) {
|
if (shouldMute) {
|
||||||
await threadMuteMutation.mutateAsync({
|
await threadMuteMutation.mutateAsync({
|
||||||
uri: rootUri,
|
uri: rootUri,
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue