Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 17x 8x 8x 6x 6x 25x 11x 17x | import { useEffect, useRef } from "react"; import type { SubscriptionManager } from "./SubscriptionManager"; /** * This hook provides a simple subscription semantic to React components. */ export function useSubscription<T = unknown>(): SubscriptionManager<T> { const subscribersRef = useRef<((data: T) => void)[]>([]); function subscribe(fn: (data: T) => void) { subscribersRef.current.push(fn); return () => { subscribersRef.current = subscribersRef.current.filter( (subscription) => !Object.is(subscription, fn) ); }; } function notify(data: T) { subscribersRef.current.forEach((fn) => fn(data)); } function useSubscribeEffect(fn: (data: T) => void) { useEffect(() => subscribe(fn), [fn]); } return { subscribe, notify, useSubscribeEffect }; } |