@thepassle/app-tools
Version:
Collection of tools I regularly use to build apps. Maybe they're useful to somebody else. Maybe not. Most of these are thin wrappers around native API's, like the native `<dialog>` element, `fetch` API, and `URLPattern`.
49 lines (48 loc) • 1.12 kB
TypeScript
/**
* `'state-changed'` event
* @template T
* @example this.dispatchEvent(new StateEvent(data));
*/
export class StateEvent<T> extends Event {
/**
* @param {T} state
*/
constructor(state: T);
/** @type {T} */
state: T;
}
/**
* @template T
* @typedef {{
* name: string,
* update?: (prevState: T, newState: T) => T,
* effect?: (prevState: T, newState: T) => void | Promise<void>,
* }} Plugin
*/
/**
* @template T
* @extends EventTarget
*/
export class State<T> extends EventTarget {
/**
* @param {T} initialState
* @param {Array<Plugin<T>>} [plugins=[]]
*/
constructor(initialState: T, plugins?: Array<Plugin<T>>);
/**
* @param {T | ((prevState: T) => T)} state
* @param {boolean} [broadcast=true]
*/
setState(state: T | ((prevState: T) => T), broadcast?: boolean): void;
/**
* @returns {T}
*/
getState(): T;
#private;
}
export const state: State<{}>;
export type Plugin<T> = {
name: string;
update?: (prevState: T, newState: T) => T;
effect?: (prevState: T, newState: T) => void | Promise<void>;
};