import type { Announce } from '../../../types'; import { warning } from '../../../dev-warning'; export type ExpiringAnnounce = Announce & { wasCalled: () => boolean; }; export default (announce: Announce): ExpiringAnnounce => { let wasCalled = false; let isExpired = false; // not allowing async announcements const timeoutId: TimeoutID = setTimeout(() => { isExpired = true; }); const result = (message: string): void => { if (wasCalled) { warning('Announcement already made. Not making a second announcement'); return; } if (isExpired) { warning(` Announcements cannot be made asynchronously. Default message has already been announced. `); return; } wasCalled = true; announce(message); clearTimeout(timeoutId); }; // getter for isExpired // using this technique so that a consumer cannot // set the isExpired or wasCalled flags result.wasCalled = (): boolean => wasCalled; return result; };