| | |
| | import { useCallback, useEffect, useMemo, useRef } from "react"; |
| |
|
| | export function useBroadcastChannel( |
| | channelName: string, |
| | onMessageReceived: (message: any) => void |
| | ) { |
| | const channel = useMemo( |
| | () => getSingletonChannel(channelName), |
| | [channelName] |
| | ); |
| | const isSubscribed = useRef(false); |
| |
|
| | useEffect(() => { |
| | if (!isSubscribed.current || process.env.NODE_ENV !== "development") { |
| | channel.onmessage = (event) => onMessageReceived(event.data); |
| | } |
| | return () => { |
| | if (isSubscribed.current || process.env.NODE_ENV !== "development") { |
| | channel.close(); |
| | isSubscribed.current = true; |
| | } |
| | }; |
| | |
| | }, []); |
| |
|
| | const postMessage = useCallback( |
| | (message: any) => { |
| | channel?.postMessage(message); |
| | }, |
| | [channel] |
| | ); |
| |
|
| | return { |
| | postMessage, |
| | }; |
| | } |
| |
|
| | const channelInstances: { [key: string]: BroadcastChannel } = {}; |
| |
|
| | export const getSingletonChannel = (name: string): BroadcastChannel => { |
| | if (!channelInstances[name]) { |
| | channelInstances[name] = new BroadcastChannel(name); |
| | } |
| | return channelInstances[name]; |
| | }; |
| |
|