diff options
| author | Brendan Allan <[email protected]> | 2026-03-18 17:01:38 +0800 |
|---|---|---|
| committer | Brendan Allan <[email protected]> | 2026-03-18 17:01:38 +0800 |
| commit | 4ba7d3b4062b090ea41c2674a3141c2a66def561 (patch) | |
| tree | 49afc70d372e5e15e45dd715b449a9dc16ebae43 | |
| parent | a43783a6d47a069ca2fd187c378b8e9899093b37 (diff) | |
| download | opencode-4ba7d3b4062b090ea41c2674a3141c2a66def561.tar.gz opencode-4ba7d3b4062b090ea41c2674a3141c2a66def561.zip | |
app: replace autoselect effects with single resource
| -rw-r--r-- | packages/app/src/pages/layout.tsx | 57 | ||||
| -rw-r--r-- | packages/app/src/utils/persist.ts | 16 |
2 files changed, 33 insertions, 40 deletions
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index a694ce094..ce4513a5b 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -2,6 +2,7 @@ import { batch, createEffect, createMemo, + createResource, For, on, onCleanup, @@ -277,16 +278,6 @@ export default function Layout(props: ParentProps) { setHoverProject(undefined) }) - const autoselecting = createMemo(() => { - if (params.dir) return false - if (!state.autoselect) return false - if (!pageReady()) return true - if (!layoutReady()) return true - const list = layout.projects.list() - if (list.length > 0) return true - return !!server.projects.last() - }) - createEffect(() => { if (!state.autoselect) return const dir = params.dir @@ -572,33 +563,22 @@ export default function Layout(props: ParentProps) { return projects.find((p) => p.worktree === root) }) - createEffect( - on( - () => ({ ready: pageReady(), layoutReady: layoutReady(), dir: params.dir, list: layout.projects.list() }), - (value) => { - if (!value.ready) return - if (!value.layoutReady) return - if (!state.autoselect) return - if (value.dir) return - - const last = server.projects.last() - - if (value.list.length === 0) { - if (!last) return - setState("autoselect", false) - openProject(last, false) - navigateToProject(last) - return - } + const [autoselecting] = createResource(async () => { + await ready.promise + await layout.ready.promise - const next = value.list.find((project) => project.worktree === last) ?? value.list[0] - if (!next) return - setState("autoselect", false) - openProject(next.worktree, false) - navigateToProject(next.worktree) - }, - ), - ) + const list = layout.projects.list() + const last = server.projects.last() + + if (list.length === 0) { + if (!last) return + await openProject(last, true) + } else { + const next = list.find((project) => project.worktree === last) ?? list[0] + if (!next) return + await openProject(next.worktree, true) + } + }) const workspaceName = (directory: string, projectId?: string, branch?: string) => { const key = workspaceKey(directory) @@ -1311,7 +1291,7 @@ export default function Layout(props: ParentProps) { function openProject(directory: string, navigate = true) { layout.projects.open(directory) - if (navigate) navigateToProject(directory) + if (navigate) return navigateToProject(directory) } const handleDeepLinks = (urls: string[]) => { @@ -2381,7 +2361,8 @@ export default function Layout(props: ParentProps) { "size-full overflow-x-hidden flex flex-col items-start contain-strict border-t border-border-weak-base bg-background-base xl:border-l xl:rounded-tl-[12px]": true, }} > - <Show when={!autoselecting()} fallback={<div class="size-full" />}> + <Show when={!autoselecting.loading} fallback={<div class="size-full" />}> + slkdjflkj {props.children} </Show> </main> diff --git a/packages/app/src/utils/persist.ts b/packages/app/src/utils/persist.ts index bee2f3e7d..3dcbeb7d3 100644 --- a/packages/app/src/utils/persist.ts +++ b/packages/app/src/utils/persist.ts @@ -5,7 +5,12 @@ import { createResource, type Accessor } from "solid-js" import type { SetStoreFunction, Store } from "solid-js/store" type InitType = Promise<string> | string | null -type PersistedWithReady<T> = [Store<T>, SetStoreFunction<T>, InitType, Accessor<boolean>] +type PersistedWithReady<T> = [ + Store<T>, + SetStoreFunction<T>, + InitType, + Accessor<boolean> & { promise: undefined | Promise<any> }, +] type PersistTarget = { storage?: string @@ -460,5 +465,12 @@ export function persisted<T>( { initialValue: !isAsync }, ) - return [state, setState, init, () => ready() === true] + return [ + state, + setState, + init, + Object.assign(() => ready() === true, { + promise: init instanceof Promise ? init : undefined, + }), + ] } |
