import { createStore } from "solid-js/store" import { createMemo } from "solid-js" import { createSimpleContext } from "@opencode-ai/ui/context" import { makePersisted } from "@solid-primitives/storage" export const { use: useLayout, provider: LayoutProvider } = createSimpleContext({ name: "Layout", init: () => { const [store, setStore] = makePersisted( createStore({ projects: [] as { directory: string; expanded: boolean; lastSession?: string }[], sidebar: { opened: false, width: 280, }, terminal: { opened: false, height: 280, }, review: { state: "pane" as "pane" | "tab", }, }), { name: "default-layout.v4", }, ) return { projects: { list: createMemo(() => store.projects), open(directory: string) { if (store.projects.find((x) => x.directory === directory)) return setStore("projects", (x) => [...x, { directory, expanded: true }]) }, close(directory: string) { setStore("projects", (x) => x.filter((x) => x.directory !== directory)) }, expand(directory: string) { setStore("projects", (x) => x.map((x) => (x.directory === directory ? { ...x, expanded: true } : x))) }, collapse(directory: string) { setStore("projects", (x) => x.map((x) => (x.directory === directory ? { ...x, expanded: false } : x))) }, lastSession(directory: string) { return store.projects.find((x) => x.directory === directory)?.lastSession }, setLastSession(directory: string, session: string | undefined) { setStore("projects", (x) => x.map((x) => (x.directory === directory ? { ...x, lastSession: session } : x))) }, }, sidebar: { opened: createMemo(() => store.sidebar.opened), open() { setStore("sidebar", "opened", true) }, close() { setStore("sidebar", "opened", false) }, toggle() { setStore("sidebar", "opened", (x) => !x) }, width: createMemo(() => store.sidebar.width), resize(width: number) { setStore("sidebar", "width", width) }, }, terminal: { opened: createMemo(() => store.terminal.opened), open() { setStore("terminal", "opened", true) }, close() { setStore("terminal", "opened", false) }, toggle() { setStore("terminal", "opened", (x) => !x) }, height: createMemo(() => store.terminal.height), resize(height: number) { setStore("terminal", "height", height) }, }, review: { state: createMemo(() => store.review?.state ?? "closed"), pane() { setStore("review", "state", "pane") }, tab() { setStore("review", "state", "tab") }, }, } }, })