From fccff22edd90c7654b377f7abb1815a22827a000 Mon Sep 17 00:00:00 2001 From: ComputelessComputer <63365510+ComputelessComputer@users.noreply.github.com> Date: Sat, 27 Jun 2026 23:36:01 +0900 Subject: [PATCH] Hide transcript spinner during live meetings Share the transcript tab spinner rule between session headers so active listening keeps the transcript tab idle while finalizing and batch transcription still show progress. --- .../src/session/components/note-input/index.test.tsx | 8 ++++++++ .../src/session/components/note-input/index.tsx | 7 ++++++- apps/desktop/src/session/index.tsx | 11 ++++++----- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/apps/desktop/src/session/components/note-input/index.test.tsx b/apps/desktop/src/session/components/note-input/index.test.tsx index da481e485d..6e3ae3bc3f 100644 --- a/apps/desktop/src/session/components/note-input/index.test.tsx +++ b/apps/desktop/src/session/components/note-input/index.test.tsx @@ -196,4 +196,12 @@ describe("NoteInput tab selection", () => { expect(screen.getByTestId("is-transcribing").textContent).toBe("true"); }); + + it("keeps the transcript spinner while batch transcription is running", () => { + hoisted.sessionMode = "running_batch"; + + renderNoteInput(); + + expect(screen.getByTestId("is-transcribing").textContent).toBe("true"); + }); }); diff --git a/apps/desktop/src/session/components/note-input/index.tsx b/apps/desktop/src/session/components/note-input/index.tsx index 819c271bfc..8dc2642970 100644 --- a/apps/desktop/src/session/components/note-input/index.tsx +++ b/apps/desktop/src/session/components/note-input/index.tsx @@ -25,6 +25,7 @@ import { Transcript } from "./transcript"; import { useCaretNearBottom } from "~/session/components/caret-position-context"; import { useCurrentNoteTab } from "~/session/components/shared"; import { useScrollPreservation } from "~/shared/hooks/useScrollPreservation"; +import type { SessionMode } from "~/store/zustand/listener/general"; import { type Tab, useTabs } from "~/store/zustand/tabs"; import { type EditorView as TabEditorView } from "~/store/zustand/tabs/schema"; import { useListener } from "~/stt/contexts"; @@ -37,6 +38,10 @@ export interface NoteInputHandle { prepareForTabChange: () => void; } +export function shouldShowTranscriptTabSpinner(sessionMode: SessionMode) { + return sessionMode === "finalizing" || sessionMode === "running_batch"; +} + export const NoteInput = forwardRef< NoteInputHandle, { @@ -90,7 +95,7 @@ export const NoteInput = forwardRef< sessionMode === "finalizing" || sessionMode === "running_batch"; const shouldShowTranscriptSpinner = - sessionMode === "finalizing" || sessionMode === "running_batch"; + shouldShowTranscriptTabSpinner(sessionMode); const { scrollRef, onBeforeTabChange } = useScrollPreservation( renderedCurrentTab.type === "enhanced" diff --git a/apps/desktop/src/session/index.tsx b/apps/desktop/src/session/index.tsx index 15120625da..cd9cd62e58 100644 --- a/apps/desktop/src/session/index.tsx +++ b/apps/desktop/src/session/index.tsx @@ -6,7 +6,11 @@ import { commands as fsSyncCommands } from "@hypr/plugin-fs-sync"; import { CaretPositionProvider } from "./components/caret-position-context"; import { FloatingActionButton } from "./components/floating"; -import { NoteInput, type NoteInputHandle } from "./components/note-input"; +import { + NoteInput, + shouldShowTranscriptTabSpinner, + type NoteInputHandle, +} from "./components/note-input"; import { Header as NoteInputHeader, useEditorTabs, @@ -130,10 +134,7 @@ function TabContentNoteInner({ const sessionId = tab.id; const { skipReason } = useAutoEnhance(tab); const sessionMode = useListener((state) => state.getSessionMode(sessionId)); - const isTranscribing = - sessionMode === "active" || - sessionMode === "finalizing" || - sessionMode === "running_batch"; + const isTranscribing = shouldShowTranscriptTabSpinner(sessionMode); useAutoFocusTitle({ sessionId, noteInputRef }); usePendingUpload(sessionId);