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) {
-
+
+
+
-
+
-
-
-
-
+
+
+
+
+