From 5442adb5174cee717b9a301d0cce8be8f3338388 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Tue, 9 Dec 2025 11:08:55 -0600 Subject: wip(desktop): progress --- packages/desktop/src/pages/directory-layout.tsx | 33 +++++----- packages/desktop/src/pages/home.tsx | 34 ++++++++-- packages/desktop/src/pages/layout.tsx | 88 ++++++++++++++++--------- packages/desktop/src/pages/session.tsx | 5 +- 4 files changed, 103 insertions(+), 57 deletions(-) (limited to 'packages/desktop/src/pages') diff --git a/packages/desktop/src/pages/directory-layout.tsx b/packages/desktop/src/pages/directory-layout.tsx index 20467c066..c909a373d 100644 --- a/packages/desktop/src/pages/directory-layout.tsx +++ b/packages/desktop/src/pages/directory-layout.tsx @@ -1,32 +1,31 @@ -import { createMemo, type ParentProps } from "solid-js" +import { createMemo, Show, type ParentProps } from "solid-js" import { useParams } from "@solidjs/router" import { SDKProvider } from "@/context/sdk" import { SyncProvider, useSync } from "@/context/sync" import { LocalProvider } from "@/context/local" -import { useGlobalSync } from "@/context/global-sync" import { base64Decode } from "@opencode-ai/util/encode" import { DataProvider } from "@opencode-ai/ui/context" import { iife } from "@opencode-ai/util/iife" export default function Layout(props: ParentProps) { const params = useParams() - const sync = useGlobalSync() const directory = createMemo(() => { - const decoded = base64Decode(params.dir!) - return sync.data.projects.find((x) => x.worktree === decoded)?.worktree ?? "/" + return base64Decode(params.dir!) }) return ( - - - {iife(() => { - const sync = useSync() - return ( - - {props.children} - - ) - })} - - + + + + {iife(() => { + const sync = useSync() + return ( + + {props.children} + + ) + })} + + + ) } diff --git a/packages/desktop/src/pages/home.tsx b/packages/desktop/src/pages/home.tsx index 469e2b7f7..517926613 100644 --- a/packages/desktop/src/pages/home.tsx +++ b/packages/desktop/src/pages/home.tsx @@ -1,22 +1,38 @@ import { useGlobalSync } from "@/context/global-sync" -import { For, Match, Switch } from "solid-js" +import { For, Match, Show, Switch } from "solid-js" import { Button } from "@opencode-ai/ui/button" import { Logo } from "@opencode-ai/ui/logo" import { useLayout } from "@/context/layout" import { useNavigate } from "@solidjs/router" import { base64Encode } from "@opencode-ai/util/encode" import { Icon } from "@opencode-ai/ui/icon" +import { usePlatform } from "@/context/platform" export default function Home() { - const navigate = useNavigate() const sync = useGlobalSync() const layout = useLayout() + const platform = usePlatform() + const navigate = useNavigate() function openProject(directory: string) { layout.projects.open(directory) navigate(`/${base64Encode(directory)}`) } + async function chooseProject() { + const result = await platform.openDirectoryPickerDialog?.({ + title: "Open project", + multiple: true, + }) + if (Array.isArray(result)) { + for (const directory of result) { + openProject(directory) + } + } else if (result) { + openProject(result) + } + } + return (
@@ -25,9 +41,11 @@ export default function Home() {
Recent projects
- + + +
    @@ -54,7 +72,11 @@ export default function Home() {
    Get started by opening a local project
- + + +
diff --git a/packages/desktop/src/pages/layout.tsx b/packages/desktop/src/pages/layout.tsx index 03eeedfb1..6831fdf31 100644 --- a/packages/desktop/src/pages/layout.tsx +++ b/packages/desktop/src/pages/layout.tsx @@ -17,19 +17,27 @@ import { getFilename } from "@opencode-ai/util/path" import { Select } from "@opencode-ai/ui/select" import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu" import { Session } from "@opencode-ai/sdk/v2/client" +import { usePlatform } from "@/context/platform" +import { createStore } from "solid-js/store" export default function Layout(props: ParentProps) { - const navigate = useNavigate() + const [store, setStore] = createStore({ + lastSession: {} as { [directory: string]: string }, + }) + const params = useParams() const globalSync = useGlobalSync() const layout = useLayout() + const platform = usePlatform() + const navigate = useNavigate() const currentDirectory = createMemo(() => base64Decode(params.dir ?? "")) const sessions = createMemo(() => globalSync.child(currentDirectory())[0].session ?? []) const currentSession = createMemo(() => sessions().find((s) => s.id === params.id)) function navigateToProject(directory: string | undefined) { if (!directory) return - navigate(`/${base64Encode(directory)}`) + const lastSession = store.lastSession[directory] + navigate(`/${base64Encode(directory)}${lastSession ? `/session/${lastSession}` : ""}`) } function navigateToSession(session: Session | undefined) { @@ -37,19 +45,36 @@ export default function Layout(props: ParentProps) { navigate(`/${params.dir}/session/${session?.id}`) } + function openProject(directory: string, navigate = true) { + layout.projects.open(directory) + if (navigate) navigateToProject(directory) + } + function closeProject(directory: string) { layout.projects.close(directory) navigate("/") } - const handleOpenProject = async () => { - // layout.projects.open(dir.) + async function chooseProject() { + const result = await platform.openDirectoryPickerDialog?.({ + title: "Open project", + multiple: true, + }) + if (Array.isArray(result)) { + for (const directory of result) { + openProject(directory, false) + } + navigateToProject(result[0]) + } else if (result) { + openProject(result) + } } - // createEffect(() => { - // if (!params.dir) return - // layout.projects.setLastSession(base64Decode(params.dir), params.id) - // }) + createEffect(() => { + if (!params.dir || !params.id) return + const directory = base64Decode(params.dir) + setStore("lastSession", directory, params.id) + }) return (
@@ -89,7 +114,7 @@ export default function Layout(props: ParentProps) {