Files
bsky-social-app/src/state/messages/events/index.tsx
T
Eric Bailey 3d1ed04a70 [🐴] Do not init event bus if no session (#4193)
* Do not init event bus if no session

* Be explicit

* Simplify, fix log
2024-05-23 12:00:56 -05:00

84 lines
1.7 KiB
TypeScript

import React from 'react'
import {AppState} from 'react-native'
import {MessagesEventBus} from '#/state/messages/events/agent'
import {useAgent, useSession} from '#/state/session'
const MessagesEventBusContext = React.createContext<MessagesEventBus | null>(
null,
)
export function useMessagesEventBus() {
const ctx = React.useContext(MessagesEventBusContext)
if (!ctx) {
throw new Error(
'useMessagesEventBus must be used within a MessagesEventBusProvider',
)
}
return ctx
}
export function MessagesEventBusProvider({
children,
}: {
children: React.ReactNode
}) {
const {currentAccount} = useSession()
if (!currentAccount) {
return (
<MessagesEventBusContext.Provider value={null}>
{children}
</MessagesEventBusContext.Provider>
)
}
return (
<MessagesEventBusProviderInner>{children}</MessagesEventBusProviderInner>
)
}
export function MessagesEventBusProviderInner({
children,
}: {
children: React.ReactNode
}) {
const {getAgent} = useAgent()
const [bus] = React.useState(
() =>
new MessagesEventBus({
agent: getAgent(),
}),
)
React.useEffect(() => {
bus.resume()
return () => {
bus.suspend()
}
}, [bus])
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={bus}>
{children}
</MessagesEventBusContext.Provider>
)
}