import { createStore, reconcile } from "solid-js/store" import { createSimpleContext } from "./helper" import type { PromptInfo } from "../prompt/history" import { useTuiStartup } from "./runtime" export type HomeRoute = { type: "home" prompt?: PromptInfo } export type SessionRoute = { type: "session" sessionID: string prompt?: PromptInfo } export type PluginRoute = { type: "plugin" id: string data?: Record } export type Route = HomeRoute | SessionRoute | PluginRoute export const { use: useRoute, provider: RouteProvider } = createSimpleContext({ name: "Route", init: (props: { initialRoute?: Route }) => { const startup = useTuiStartup() const [store, setStore] = createStore( props.initialRoute ?? initialRoute(startup.initialRoute) ?? { type: "home" }, ) return { get data() { return store }, navigate(route: Route) { setStore(reconcile(route)) }, } }, }) function initialRoute(value: unknown): Route | undefined { if (!value || typeof value !== "object" || !("type" in value)) return if (value.type === "home") return { type: "home" } if (value.type === "session" && "sessionID" in value && typeof value.sessionID === "string") { return { type: "session", sessionID: value.sessionID } } if (value.type === "plugin" && "id" in value && typeof value.id === "string") { return { type: "plugin", id: value.id } } } export type RouteContext = ReturnType export function useRouteData(type: T) { const route = useRoute() return route.data as Extract }