about summary refs log tree commit diff
path: root/src/state/cache
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/cache')
-rw-r--r--src/state/cache/thread-mutes.tsx55
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])
+}