app: replace autoselect effects with single resource

This commit is contained in:
Brendan Allan
2026-03-18 17:01:38 +08:00
parent a43783a6d4
commit 4ba7d3b406
2 changed files with 32 additions and 39 deletions

View File

@@ -2,6 +2,7 @@ import {
batch, batch,
createEffect, createEffect,
createMemo, createMemo,
createResource,
For, For,
on, on,
onCleanup, onCleanup,
@@ -277,16 +278,6 @@ export default function Layout(props: ParentProps) {
setHoverProject(undefined) 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(() => { createEffect(() => {
if (!state.autoselect) return if (!state.autoselect) return
const dir = params.dir const dir = params.dir
@@ -572,33 +563,22 @@ export default function Layout(props: ParentProps) {
return projects.find((p) => p.worktree === root) return projects.find((p) => p.worktree === root)
}) })
createEffect( const [autoselecting] = createResource(async () => {
on( await ready.promise
() => ({ ready: pageReady(), layoutReady: layoutReady(), dir: params.dir, list: layout.projects.list() }), await layout.ready.promise
(value) => {
if (!value.ready) return
if (!value.layoutReady) return
if (!state.autoselect) return
if (value.dir) return
const last = server.projects.last() const list = layout.projects.list()
const last = server.projects.last()
if (value.list.length === 0) { if (list.length === 0) {
if (!last) return if (!last) return
setState("autoselect", false) await openProject(last, true)
openProject(last, false) } else {
navigateToProject(last) const next = list.find((project) => project.worktree === last) ?? list[0]
return if (!next) return
} await openProject(next.worktree, true)
}
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 workspaceName = (directory: string, projectId?: string, branch?: string) => { const workspaceName = (directory: string, projectId?: string, branch?: string) => {
const key = workspaceKey(directory) const key = workspaceKey(directory)
@@ -1311,7 +1291,7 @@ export default function Layout(props: ParentProps) {
function openProject(directory: string, navigate = true) { function openProject(directory: string, navigate = true) {
layout.projects.open(directory) layout.projects.open(directory)
if (navigate) navigateToProject(directory) if (navigate) return navigateToProject(directory)
} }
const handleDeepLinks = (urls: string[]) => { 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, "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} {props.children}
</Show> </Show>
</main> </main>

View File

@@ -5,7 +5,12 @@ import { createResource, type Accessor } from "solid-js"
import type { SetStoreFunction, Store } from "solid-js/store" import type { SetStoreFunction, Store } from "solid-js/store"
type InitType = Promise<string> | string | null 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 = { type PersistTarget = {
storage?: string storage?: string
@@ -460,5 +465,12 @@ export function persisted<T>(
{ initialValue: !isAsync }, { initialValue: !isAsync },
) )
return [state, setState, init, () => ready() === true] return [
state,
setState,
init,
Object.assign(() => ready() === true, {
promise: init instanceof Promise ? init : undefined,
}),
]
} }