// Tells the portal's agreements notice about an agreement recorded somewhere else, so it updates at // once instead of waiting for its lagging status search. import { useEffect, useRef } from 'react'; import type { ConsentInstrumentId } from '../../config/consentInstruments'; // `owner` is agreementOwner's: an answer for another viewer, practice or person satisfies no other notice. type Listener = (instrument: ConsentInstrumentId, owner: string) => void; const listeners = new Set(); export const announceAgreementRecorded = (instrument: ConsentInstrumentId, owner: string): void => { listeners.forEach((listener) => listener(instrument, owner)); }; export const useAgreementRecorded = (listener: Listener): void => { // Replaced during render, so an event arriving after this render committed is judged by this render's owner. const latest = useRef(listener); latest.current = listener; useEffect(() => { const relay: Listener = (instrument, owner) => latest.current(instrument, owner); listeners.add(relay); return () => { listeners.delete(relay); }; }, []); };