39 lines
973 B
TypeScript
39 lines
973 B
TypeScript
|
|
/**
|
||
|
|
* Application-layer notification port.
|
||
|
|
*
|
||
|
|
* UI layers (e.g. toast) register their implementation via `setNotify`.
|
||
|
|
* Application code calls `notify.*` without importing any UI module.
|
||
|
|
*/
|
||
|
|
|
||
|
|
export interface NotifyOptions {
|
||
|
|
title?: string;
|
||
|
|
duration?: number;
|
||
|
|
onClick?: () => void;
|
||
|
|
actionLabel?: string;
|
||
|
|
}
|
||
|
|
|
||
|
|
type NotifyFn = (message: string, titleOrOptions?: string | NotifyOptions) => void;
|
||
|
|
|
||
|
|
interface Notify {
|
||
|
|
success: NotifyFn;
|
||
|
|
error: NotifyFn;
|
||
|
|
warning: NotifyFn;
|
||
|
|
info: NotifyFn;
|
||
|
|
}
|
||
|
|
|
||
|
|
const noop: NotifyFn = () => {};
|
||
|
|
|
||
|
|
let _impl: Notify = { success: noop, error: noop, warning: noop, info: noop };
|
||
|
|
|
||
|
|
/** Called once by the UI layer to wire up the real implementation. */
|
||
|
|
export function setNotify(impl: Notify): void {
|
||
|
|
_impl = impl;
|
||
|
|
}
|
||
|
|
|
||
|
|
export const notify: Notify = {
|
||
|
|
success: (...args) => _impl.success(...args),
|
||
|
|
error: (...args) => _impl.error(...args),
|
||
|
|
warning: (...args) => _impl.warning(...args),
|
||
|
|
info: (...args) => _impl.info(...args),
|
||
|
|
};
|