import Router from "@koa/router"; import { Context } from "koa"; import { Templatable } from "tempstream"; import { Mountable } from "./mountable.js"; export type StatefulPageActionDescription = { action: ActionName; label?: string; content?: string; disabled?: boolean; } | ActionName; export type StateAndMetadata = { state: State; inputs: Record; action: keyof Actions; action_args: string; } | { state: State; inputs: Record; action: null; action_args: null; $: Record; }; export type StatefulPageActionArgument, Args extends unknown[] = unknown[]> = { ctx: Context; state: State; inputs: Record; args: Args; page: StatefulPage; }; export type StatefulPageAction, Args extends unknown[] = unknown[]> = (obj: StatefulPageActionArgument) => State | Promise; export type ExtractStatefulPageActionArgs = X extends StatefulPageAction ? Args : never; export declare abstract class StatefulPage, Actions extends Record>> extends Mountable { abstract actions: Actions; abstract getInitialState(ctx: Context): State | Promise; abstract render(ctx: Context, state: State, inputs: Record): Templatable | Promise; canAccess(_ctx: Context): Promise<{ canAccess: boolean; message: string; }>; constructor(); abstract wrapInLayout(ctx: Context, content: Templatable, state: State): Templatable; wrapInForm(context: Context, state: State, content: Templatable): Promise; extractActionAndLabel(action_description: StatefulPageActionDescription): { action: string; label: string; content: string; disabled: boolean; }; makeActionURL(action_description: StatefulPageActionDescription, ...args: ExtractStatefulPageActionArgs): string; makeActionButton(_state: State, action_description: StatefulPageActionDescription, ...args: ExtractStatefulPageActionArgs): string; makeActionCallback(action_description: { action: ActionName; label?: string; } | ActionName, ...args: ExtractStatefulPageActionArgs): string; rerender(): string; preprocessState(values: State): Promise; preprocessOverrides(_context: Context, _state: State, values: Record): Promise>; serializeState(_context: Context, state: State): Promise; deserializeState(_context: Context, s: string): Promise; extractState(ctx: Context): Promise>; mount(router: Router, path: string): void; }