mirror of
https://gitea.toothfairyai.com/ToothFairyAI/tf_code.git
synced 2026-04-11 03:08:41 +00:00
96 lines
2.9 KiB
TypeScript
96 lines
2.9 KiB
TypeScript
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")
|
|
},
|
|
},
|
|
}
|
|
},
|
|
})
|