diff options
Diffstat (limited to 'packages/app/src/pages')
| -rw-r--r-- | packages/app/src/pages/layout.tsx | 21 | ||||
| -rw-r--r-- | packages/app/src/pages/session.tsx | 4 | ||||
| -rw-r--r-- | packages/app/src/pages/session/file-tabs.tsx | 30 | ||||
| -rw-r--r-- | packages/app/src/pages/session/session-prompt-dock.tsx | 39 |
4 files changed, 51 insertions, 43 deletions
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index e280b2f92..29ba142e5 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -177,7 +177,12 @@ export default function Layout(props: ParentProps) { const sidebarHovering = createMemo(() => !layout.sidebar.opened() && state.hoverProject !== undefined) const sidebarExpanded = createMemo(() => layout.sidebar.opened() || sidebarHovering()) - const clearHoverProjectSoon = () => queueMicrotask(() => setState("hoverProject", undefined)) + const setHoverProject = (value: string | undefined) => { + setState("hoverProject", value) + if (value !== undefined) return + aim.reset() + } + const clearHoverProjectSoon = () => queueMicrotask(() => setHoverProject(undefined)) const setHoverSession = (id: string | undefined) => setState("hoverSession", id) const hoverProjectData = createMemo(() => { @@ -188,13 +193,7 @@ export default function Layout(props: ParentProps) { createEffect(() => { if (!layout.sidebar.opened()) return - aim.reset() - setState("hoverProject", undefined) - }) - - createEffect(() => { - if (state.hoverProject !== undefined) return - aim.reset() + setHoverProject(undefined) }) const autoselecting = createMemo(() => { @@ -225,7 +224,7 @@ export default function Layout(props: ParentProps) { const clearSidebarHoverState = () => { if (layout.sidebar.opened()) return setState("hoverSession", undefined) - setState("hoverProject", undefined) + setHoverProject(undefined) } const navigateWithSidebarReset = (href: string) => { @@ -1490,7 +1489,7 @@ export default function Layout(props: ParentProps) { function handleDragStart(event: unknown) { const id = getDraggableId(event) if (!id) return - setState("hoverProject", undefined) + setHoverProject(undefined) setStore("activeProject", id) } @@ -1924,7 +1923,7 @@ export default function Layout(props: ParentProps) { if (navLeave.current !== undefined) clearTimeout(navLeave.current) navLeave.current = window.setTimeout(() => { navLeave.current = undefined - setState("hoverProject", undefined) + setHoverProject(undefined) setState("hoverSession", undefined) }, 300) }} diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 165845564..21ba4e7d7 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -1,4 +1,4 @@ -import { onCleanup, Show, Match, Switch, createMemo, createEffect, on } from "solid-js" +import { onCleanup, Show, Match, Switch, createMemo, createEffect, on, onMount } from "solid-js" import { createMediaQuery } from "@solid-primitives/media" import { createResizeObserver } from "@solid-primitives/resize-observer" import { useLocal } from "@/context/local" @@ -981,7 +981,7 @@ export default function Page() { consumePendingMessage: layout.pendingMessage.consume, }) - createEffect(() => { + onMount(() => { document.addEventListener("keydown", handleKeyDown) }) diff --git a/packages/app/src/pages/session/file-tabs.tsx b/packages/app/src/pages/session/file-tabs.tsx index 9e3a54311..ebc1f5922 100644 --- a/packages/app/src/pages/session/file-tabs.tsx +++ b/packages/app/src/pages/session/file-tabs.tsx @@ -168,6 +168,13 @@ export function FileTabContent(props: { tab: string }) { draftTop: undefined as number | undefined, }) + const setCommenting = (range: SelectedLineRange | null) => { + setNote("commenting", range) + scheduleComments() + if (!range) return + setNote("draft", "") + } + const getRoot = () => { const el = wrap if (!el) return @@ -261,13 +268,6 @@ export function FileTabContent(props: { tab: string }) { }) createEffect(() => { - const range = note.commenting - scheduleComments() - if (!range) return - setNote("draft", "") - }) - - createEffect(() => { const focus = comments.focus() const p = path() if (!focus || !p) return @@ -278,7 +278,7 @@ export function FileTabContent(props: { tab: string }) { if (!target) return setNote("openedComment", target.id) - setNote("commenting", null) + setCommenting(null) file.setSelectedLines(p, target.selection) requestAnimationFrame(() => comments.clearFocus()) }) @@ -438,16 +438,16 @@ export function FileTabContent(props: { tab: string }) { const p = path() if (!p) return file.setSelectedLines(p, range) - if (!range) setNote("commenting", null) + if (!range) setCommenting(null) }} onLineSelectionEnd={(range: SelectedLineRange | null) => { if (!range) { - setNote("commenting", null) + setCommenting(null) return } setNote("openedComment", null) - setNote("commenting", range) + setCommenting(range) }} overflow="scroll" class="select-text" @@ -468,7 +468,7 @@ export function FileTabContent(props: { tab: string }) { onClick={() => { const p = path() if (!p) return - setNote("commenting", null) + setCommenting(null) setNote("openedComment", (current) => (current === comment.id ? null : comment.id)) file.setSelectedLines(p, comment.selection) }} @@ -483,12 +483,12 @@ export function FileTabContent(props: { tab: string }) { value={note.draft} selection={formatCommentLabel(range())} onInput={(value) => setNote("draft", value)} - onCancel={() => setNote("commenting", null)} + onCancel={() => setCommenting(null)} onSubmit={(value) => { const p = path() if (!p) return addCommentToContext({ file: p, selection: range(), comment: value, origin: "file" }) - setNote("commenting", null) + setCommenting(null) }} onPopoverFocusOut={(e: FocusEvent) => { const current = e.currentTarget as HTMLDivElement @@ -497,7 +497,7 @@ export function FileTabContent(props: { tab: string }) { setTimeout(() => { if (!document.activeElement || !current.contains(document.activeElement)) { - setNote("commenting", null) + setCommenting(null) } }, 0) }} diff --git a/packages/app/src/pages/session/session-prompt-dock.tsx b/packages/app/src/pages/session/session-prompt-dock.tsx index 3f0b7a6e8..abe12bcb0 100644 --- a/packages/app/src/pages/session/session-prompt-dock.tsx +++ b/packages/app/src/pages/session/session-prompt-dock.tsx @@ -70,29 +70,28 @@ export function SessionPromptDock(props: { setSessionHandoff(sessionKey(), { prompt: previewPrompt() }) }) - const [responding, setResponding] = createSignal(false) - - createEffect( - on( - () => permissionRequest()?.id, - () => setResponding(false), - { defer: true }, - ), - ) + const [responding, setResponding] = createSignal<string | undefined>() + const permissionResponding = () => { + const perm = permissionRequest() + if (!perm) return false + return responding() === perm.id + } const decide = (response: "once" | "always" | "reject") => { const perm = permissionRequest() if (!perm) return - if (responding()) return + if (responding() === perm.id) return - setResponding(true) + setResponding(perm.id) sdk.client.permission .respond({ sessionID: perm.sessionID, permissionID: perm.id, response }) .catch((err: unknown) => { const message = err instanceof Error ? err.message : String(err) showToast({ title: language.t("common.requestFailed"), description: message }) }) - .finally(() => setResponding(false)) + .finally(() => { + setResponding((id) => (id === perm.id ? undefined : id)) + }) } const done = createMemo( @@ -218,18 +217,28 @@ export function SessionPromptDock(props: { <> <div /> <div data-slot="permission-footer-actions"> - <Button variant="ghost" size="normal" onClick={() => decide("reject")} disabled={responding()}> + <Button + variant="ghost" + size="normal" + onClick={() => decide("reject")} + disabled={permissionResponding()} + > {language.t("ui.permission.deny")} </Button> <Button variant="secondary" size="normal" onClick={() => decide("always")} - disabled={responding()} + disabled={permissionResponding()} > {language.t("ui.permission.allowAlways")} </Button> - <Button variant="primary" size="normal" onClick={() => decide("once")} disabled={responding()}> + <Button + variant="primary" + size="normal" + onClick={() => decide("once")} + disabled={permissionResponding()} + > {language.t("ui.permission.allowOnce")} </Button> </div> |
