Spaces:
Running
Running
| /* eslint-disable @typescript-eslint/no-explicit-any */ | |
| 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; | |
| } | |
| }; | |
| // eslint-disable-next-line react-hooks/exhaustive-deps | |
| }, []); | |
| 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]; | |
| }; | |