44 lines
1008 B
TypeScript
44 lines
1008 B
TypeScript
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;
|
|
};
|