Skip to content

Commit 8e1b53b

Browse files
authored
fix(app): handle session busy state better (#18758)
1 parent 0a7dfc0 commit 8e1b53b

3 files changed

Lines changed: 26 additions & 38 deletions

File tree

bun.lock

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/app/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"@solid-primitives/resize-observer": "2.1.3",
5252
"@solid-primitives/scroll": "2.1.3",
5353
"@solid-primitives/storage": "catalog:",
54+
"@solid-primitives/timer": "1.4.4",
5455
"@solid-primitives/websocket": "1.3.1",
5556
"@solidjs/meta": "catalog:",
5657
"@solidjs/router": "catalog:",

packages/app/src/pages/session/message-timeline.tsx

Lines changed: 18 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { For, createEffect, createMemo, on, onCleanup, Show, Index, type JSX } from "solid-js"
1+
import { For, createEffect, createMemo, on, onCleanup, Show, Index, type JSX, createSignal } from "solid-js"
22
import { createStore, produce } from "solid-js/store"
33
import { useNavigate } from "@solidjs/router"
44
import { useMutation } from "@tanstack/solid-query"
@@ -30,6 +30,7 @@ import { useSDK } from "@/context/sdk"
3030
import { useSync } from "@/context/sync"
3131
import { messageAgentColor } from "@/utils/agent"
3232
import { parseCommentNote, readCommentMetadata } from "@/utils/comment-note"
33+
import { makeTimer } from "@solid-primitives/timer"
3334

3435
type MessageComment = {
3536
path: string
@@ -250,38 +251,21 @@ export function MessageTimeline(props: {
250251
const working = createMemo(() => !!pending() || sessionStatus().type !== "idle")
251252
const tint = createMemo(() => messageAgentColor(sessionMessages(), sync.data.agent))
252253

253-
const [slot, setSlot] = createStore({
254-
open: false,
255-
show: false,
256-
fade: false,
254+
const [timeoutDone, setTimeoutDone] = createSignal(true)
255+
256+
const workingStatus = createMemo<"hidden" | "showing" | "hiding">((prev) => {
257+
if (working()) return "showing"
258+
if (prev === "showing" || !timeoutDone()) return "hiding"
259+
return "hidden"
257260
})
258261

259-
let f: number | undefined
260-
const clear = () => {
261-
if (f !== undefined) window.clearTimeout(f)
262-
f = undefined
263-
}
262+
createEffect(() => {
263+
if (workingStatus() !== "hiding") return
264+
265+
setTimeoutDone(false)
266+
makeTimer(() => setTimeoutDone(true), 260, setTimeout)
267+
})
264268

265-
onCleanup(clear)
266-
createEffect(
267-
on(
268-
working,
269-
(on, prev) => {
270-
clear()
271-
if (on) {
272-
setSlot({ open: true, show: true, fade: false })
273-
return
274-
}
275-
if (prev) {
276-
setSlot({ open: false, show: true, fade: true })
277-
f = window.setTimeout(() => setSlot({ show: false, fade: false }), 260)
278-
return
279-
}
280-
setSlot({ open: false, show: false, fade: false })
281-
},
282-
{ defer: true },
283-
),
284-
)
285269
const activeMessageID = createMemo(() => {
286270
const parentID = pending()?.parentID
287271
if (parentID) {
@@ -676,17 +660,15 @@ export function MessageTimeline(props: {
676660
<div
677661
class="shrink-0 flex items-center justify-center overflow-hidden transition-[width,margin] duration-300 ease-[cubic-bezier(0.22,1,0.36,1)]"
678662
style={{
679-
width: slot.open ? "16px" : "0px",
680-
"margin-right": slot.open ? "8px" : "0px",
663+
width: working() ? "16px" : "0px",
664+
"margin-right": working() ? "8px" : "0px",
681665
}}
682666
aria-hidden="true"
683667
>
684-
<Show when={slot.show}>
668+
<Show when={workingStatus() !== "hidden"}>
685669
<div
686670
class="transition-opacity duration-200 ease-out"
687-
classList={{
688-
"opacity-0": slot.fade,
689-
}}
671+
classList={{ "opacity-0": workingStatus() === "hiding" }}
690672
>
691673
<Spinner class="size-4" style={{ color: tint() ?? "var(--icon-interactive-base)" }} />
692674
</div>
@@ -912,7 +894,6 @@ export function MessageTimeline(props: {
912894
</div>
913895
</div>
914896
</Show>
915-
916897
<div
917898
role="log"
918899
class="flex flex-col gap-12 items-start justify-start pb-16 transition-[margin]"

0 commit comments

Comments
 (0)