/** @format */ import { TelegrafContext } from './context' import { Middleware, Composer, MiddlewareFn } from './composer' export interface SceneContextOptions { sessionName: string default?: string ttl?: number } export interface SceneContext { ctx: TContext scenes: Map> options: SceneContextOptions readonly session: { state?: object current?: string expires?: number } state: object readonly current: BaseScene | null reset: () => void enter: ( sceneId: string, initialState?: object, silent?: boolean ) => Promise reenter: () => Promise leave: () => Promise } export interface SceneContextMessageUpdate extends TelegrafContext { scene: SceneContext } export interface BaseSceneOptions { handlers: Middleware[] enterHandlers: Middleware[] leaveHandlers: Middleware[] ttl?: number } export class BaseScene< TContext extends SceneContextMessageUpdate > extends Composer { constructor(id: string, options?: Partial>) id: string options: BaseSceneOptions enterHandler: Middleware leaveHandler: Middleware ttl?: number enter: (...fns: Middleware[]) => this leave: (...fns: Middleware[]) => this enterMiddleware: () => Middleware leaveMiddleware: () => Middleware } export type Scene = BaseScene< TContext > export type StageOptions = SceneContextOptions export class Stage extends Composer< TContext > { constructor(scenes: Scene[], options?: Partial) register: (...scenes: Scene[]) => this middleware: () => MiddlewareFn static enter: ( sceneId: string, initialState?: object, silent?: boolean ) => Middleware static reenter: () => Middleware static leave: () => Middleware }