diff --git a/packages/tui/src/component/dialog-move-session.tsx b/packages/tui/src/component/dialog-move-session.tsx index 5b4dac5357..f334cd0e12 100644 --- a/packages/tui/src/component/dialog-move-session.tsx +++ b/packages/tui/src/component/dialog-move-session.tsx @@ -1,6 +1,6 @@ import { useTerminalDimensions } from "@opentui/solid" import { TextAttributes } from "@opentui/core" -import { createMemo, createResource, createSignal, ErrorBoundary, onMount, Show } from "solid-js" +import { createEffect, createMemo, createResource, createSignal, Show } from "solid-js" import path from "path" import { DialogSelect, type DialogSelectOption } from "../ui/dialog-select" import { useDialog } from "../ui/dialog" @@ -32,13 +32,7 @@ type DialogMoveSessionProps = { } export function DialogMoveSession(props: DialogMoveSessionProps) { - const dialog = useDialog() - onMount(() => dialog.setSize("xlarge")) - return ( - }> - - - ) + return } function DialogMoveSessionContent(props: DialogMoveSessionProps) { @@ -55,6 +49,7 @@ function DialogMoveSessionContent(props: DialogMoveSessionProps) { const [toDelete, setToDelete] = createSignal() const [removing, setRemoving] = createSignal(props.initialRemoving) const [replacementCurrent, setReplacementCurrent] = createSignal() + const [loadError, setLoadError] = createSignal() const deleteHint = useCommandShortcut("dialog.move_session.delete") function reopen(initialRemoving?: string) { @@ -63,11 +58,16 @@ function DialogMoveSessionContent(props: DialogMoveSessionProps) { )) } - const [loadedProject] = createResource( + const [loadedProject, loadedProjectActions] = createResource( () => (projectContext.project() === props.projectID ? undefined : props.projectID), async (projectID) => { - const result = await sdk.client.project.current({}, { throwOnError: true }) - return result.data?.id === projectID ? result.data.worktree : undefined + try { + const result = await sdk.client.project.current({}, { throwOnError: true }) + return result.data?.id === projectID ? result.data.worktree : undefined + } catch (error) { + setLoadError(error) + return undefined + } }, ) const currentCheckout = createMemo(() => @@ -85,6 +85,9 @@ function DialogMoveSessionContent(props: DialogMoveSessionProps) { ) const directories = await sdk.client.project.directories({ projectID }, { throwOnError: true }) return directories.data ?? [] + } catch (error) { + setLoadError(error) + return [] } finally { setWorking(false) } @@ -109,8 +112,6 @@ function DialogMoveSessionContent(props: DialogMoveSessionProps) { const data = directories() const current = currentRoot()?.directory if (directories.loading && !data && !current) return [{ title: "Loading project directories...", value: undefined }] - if (directories.error && !data && !current) - return [{ title: "Failed to load project directories", value: undefined }] const roots = [...(data ?? [])] if (current && !roots.some((item) => item.directory === current)) roots.unshift({ directory: current }) roots.sort((a, b) => { @@ -276,51 +277,66 @@ function DialogMoveSessionContent(props: DialogMoveSessionProps) { if (await removedCurrent(deletingCurrent)) return } + const retry = () => { + setLoadError(undefined) + void loadedProjectActions.refetch() + void refetch() + } + + createEffect(() => dialog.setSize(loadError() ? "medium" : "xlarge")) + return ( - - - - Move session - - - - - - } - options={options()} - locked={directories.loading || loadedProject.loading || Boolean(removing())} - current={current()} - onSelect={(option) => { - if (option.value) props.onSelect(option.value) - }} - onMove={() => setToDelete(undefined)} - actions={[ - { - command: "dialog.move_session.new", - title: "new", - onTrigger: () => props.onSelect({ type: "new" }), - }, - { - command: "dialog.move_session.delete", - title: "delete", - disabled: (option) => { - const value = option?.value - if (!value || value.type !== "directory" || value.subdirectory) return true - return !directories()?.find((item) => item.directory === value.directory)?.strategy - }, - onTrigger: remove, - }, - { - command: "dialog.move_session.refresh", - title: "refresh", - onTrigger: () => void refetch(), - }, - ]} - /> - + + + + Move session + + + + + + } + options={options()} + locked={directories.loading || loadedProject.loading || Boolean(removing())} + current={current()} + onSelect={(option) => { + if (option.value) props.onSelect(option.value) + }} + onMove={() => setToDelete(undefined)} + actions={[ + { + command: "dialog.move_session.new", + title: "new", + onTrigger: () => props.onSelect({ type: "new" }), + }, + { + command: "dialog.move_session.delete", + title: "delete", + disabled: (option) => { + const value = option?.value + if (!value || value.type !== "directory" || value.subdirectory) return true + return !directories()?.find((item) => item.directory === value.directory)?.strategy + }, + onTrigger: remove, + }, + { + command: "dialog.move_session.refresh", + title: "refresh", + onTrigger: () => void refetch(), + }, + ]} + /> + + } + > + {(error) => } + ) } @@ -338,12 +354,18 @@ function DialogMoveSessionError(props: { error: unknown; retry: () => void }) { })) return ( - - Failed to load project directories - - {errorMessage(props.error)} - - + + + Move session + + esc + + + Failed to load project directories + {errorMessage(props.error)} + + + retry