mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import React from 'react'
2import {AppState} from 'react-native'
3
4import {MessagesEventBus} from '#/state/messages/events/agent'
5import {useAgent, useSession} from '#/state/session'
6
7const MessagesEventBusContext = React.createContext<MessagesEventBus | null>(
8 null,
9)
10
11export function useMessagesEventBus() {
12 const ctx = React.useContext(MessagesEventBusContext)
13 if (!ctx) {
14 throw new Error(
15 'useMessagesEventBus must be used within a MessagesEventBusProvider',
16 )
17 }
18 return ctx
19}
20
21export function MessagesEventBusProvider({
22 children,
23}: {
24 children: React.ReactNode
25}) {
26 const {currentAccount} = useSession()
27
28 if (!currentAccount) {
29 return (
30 <MessagesEventBusContext.Provider value={null}>
31 {children}
32 </MessagesEventBusContext.Provider>
33 )
34 }
35
36 return (
37 <MessagesEventBusProviderInner>{children}</MessagesEventBusProviderInner>
38 )
39}
40
41export function MessagesEventBusProviderInner({
42 children,
43}: {
44 children: React.ReactNode
45}) {
46 const agent = useAgent()
47 const [bus] = React.useState(
48 () =>
49 new MessagesEventBus({
50 agent,
51 }),
52 )
53
54 React.useEffect(() => {
55 bus.resume()
56
57 return () => {
58 bus.suspend()
59 }
60 }, [bus])
61
62 React.useEffect(() => {
63 const handleAppStateChange = (nextAppState: string) => {
64 if (nextAppState === 'active') {
65 bus.resume()
66 } else {
67 bus.background()
68 }
69 }
70
71 const sub = AppState.addEventListener('change', handleAppStateChange)
72
73 return () => {
74 sub.remove()
75 }
76 }, [bus])
77
78 return (
79 <MessagesEventBusContext.Provider value={bus}>
80 {children}
81 </MessagesEventBusContext.Provider>
82 )
83}