about summary refs log tree commit diff
path: root/src/state/messages/events/index.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/messages/events/index.tsx')
-rw-r--r--src/state/messages/events/index.tsx67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/state/messages/events/index.tsx b/src/state/messages/events/index.tsx
new file mode 100644
index 000000000..f37d0abea
--- /dev/null
+++ b/src/state/messages/events/index.tsx
@@ -0,0 +1,67 @@
+import React from 'react'
+import {AppState} from 'react-native'
+import {BskyAgent} from '@atproto-labs/api'
+
+import {isWeb} from '#/platform/detection'
+import {MessagesEventBus} from '#/state/messages/events/agent'
+import {MessagesEventBusState} from '#/state/messages/events/types'
+import {useAgent} from '#/state/session'
+import {useDmServiceUrlStorage} from '#/screens/Messages/Temp/useDmServiceUrlStorage'
+import {IS_DEV} from '#/env'
+
+const MessagesEventBusContext =
+  React.createContext<MessagesEventBusState | null>(null)
+
+export function useMessagesEventBus() {
+  const ctx = React.useContext(MessagesEventBusContext)
+  if (!ctx) {
+    throw new Error('useChat must be used within a ChatProvider')
+  }
+  return ctx
+}
+
+export function MessagesEventBusProvider({
+  children,
+}: {
+  children: React.ReactNode
+}) {
+  const {serviceUrl} = useDmServiceUrlStorage()
+  const {getAgent} = useAgent()
+  const [bus] = React.useState(
+    () =>
+      new MessagesEventBus({
+        agent: new BskyAgent({
+          service: serviceUrl,
+        }),
+        __tempFromUserDid: getAgent().session?.did!,
+      }),
+  )
+  const service = React.useSyncExternalStore(bus.subscribe, bus.getSnapshot)
+
+  if (isWeb && IS_DEV) {
+    // @ts-ignore
+    window.messagesEventBus = service
+  }
+
+  React.useEffect(() => {
+    const handleAppStateChange = (nextAppState: string) => {
+      if (nextAppState === 'active') {
+        bus.resume()
+      } else {
+        bus.background()
+      }
+    }
+
+    const sub = AppState.addEventListener('change', handleAppStateChange)
+
+    return () => {
+      sub.remove()
+    }
+  }, [bus])
+
+  return (
+    <MessagesEventBusContext.Provider value={service}>
+      {children}
+    </MessagesEventBusContext.Provider>
+  )
+}