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