@stainless-code/layers
Version:
Headless, UI-agnostic layer/stack manager for modal/dialog/drawer/popover/toast UI. Call a layer like an async function and await its response.
37 lines (35 loc) • 1.23 kB
text/typescript
import type { Layer } from "./layer";
import { LayerStack } from "./layerStack";
import type {
DefaultLayerError,
DismissOptions,
LayerCallContext,
LayerState,
} from "./types";
/**
* Creates the framework-neutral imperative context passed to a layer component.
* Adapters provide rendering; stack and layer instances retain lifecycle control.
*/
export function createCallContext<P, R, RootProps = unknown>(
stack: LayerStack<P, R, DefaultLayerError, unknown>,
layer: Layer<P, R, DefaultLayerError, unknown>,
state: LayerState<P, R, DefaultLayerError, unknown>,
rootProps?: RootProps,
): LayerCallContext<P, R, RootProps> {
return {
end: (response: R, opts?: DismissOptions) =>
stack.dismiss(layer, response, opts),
dismiss: (response: R, opts?: DismissOptions) =>
stack.dismiss(layer, response, opts),
addBlocker: (fn) => layer.addBlocker(fn),
update: (patch: Partial<P>) => stack.update(layer, patch),
setRunning: (running: boolean) => stack.setRunning(layer, running),
settle: () => stack.settle(layer),
ended: state.ended,
index: state.index,
stackSize: state.stackSize,
root: rootProps as RootProps,
stackId: stack.id,
layerId: layer.id,
};
}