From 4ba7d3b4062b090ea41c2674a3141c2a66def561 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Wed, 18 Mar 2026 17:01:38 +0800 Subject: [PATCH] app: replace autoselect effects with single resource --- packages/app/src/pages/layout.tsx | 55 ++++++++++--------------------- packages/app/src/utils/persist.ts | 16 +++++++-- 2 files changed, 32 insertions(+), 39 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 [autoselecting] = createResource(async () => { + await ready.promise + await layout.ready.promise - const last = server.projects.last() + const list = layout.projects.list() + const last = server.projects.last() - if (value.list.length === 0) { - if (!last) return - setState("autoselect", false) - openProject(last, false) - navigateToProject(last) - return - } - - 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) - }, - ), - ) + 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, }} > - }> + }> + slkdjflkj {props.children} 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 | null -type PersistedWithReady = [Store, SetStoreFunction, InitType, Accessor] +type PersistedWithReady = [ + Store, + SetStoreFunction, + InitType, + Accessor & { promise: undefined | Promise }, +] type PersistTarget = { storage?: string @@ -460,5 +465,12 @@ export function persisted( { initialValue: !isAsync }, ) - return [state, setState, init, () => ready() === true] + return [ + state, + setState, + init, + Object.assign(() => ready() === true, { + promise: init instanceof Promise ? init : undefined, + }), + ] }