From ad780551b7b4700b3b8ade9d32ef0f557b777088 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 4 Sep 2025 14:13:49 -0400 Subject: [PATCH] file upload real-time state management fix --- server/reflector/views/transcripts.py | 3 ++- .../[transcriptId]/upload/page.tsx | 13 ++++++++-- www/app/reflector-api.d.ts | 26 ++++++++++++++++--- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/server/reflector/views/transcripts.py b/server/reflector/views/transcripts.py index 3f32a9bd..9acfcbf8 100644 --- a/server/reflector/views/transcripts.py +++ b/server/reflector/views/transcripts.py @@ -27,6 +27,7 @@ from reflector.db.search import ( from reflector.db.transcripts import ( SourceKind, TranscriptParticipant, + TranscriptStatus, TranscriptTopic, transcripts_controller, ) @@ -63,7 +64,7 @@ class GetTranscriptMinimal(BaseModel): id: str user_id: str | None name: str - status: str + status: TranscriptStatus locked: bool duration: float title: str | None diff --git a/www/app/(app)/transcripts/[transcriptId]/upload/page.tsx b/www/app/(app)/transcripts/[transcriptId]/upload/page.tsx index 3a13052e..567272ff 100644 --- a/www/app/(app)/transcripts/[transcriptId]/upload/page.tsx +++ b/www/app/(app)/transcripts/[transcriptId]/upload/page.tsx @@ -24,10 +24,16 @@ const TranscriptUpload = (details: TranscriptUpload) => { const router = useRouter(); - const [status, setStatus] = useState( + const [status_, setStatus] = useState( webSockets.status.value || transcript.response?.status || "idle", ); + // status is obviously done if we have transcript + const status = + !transcript.loading && transcript.response?.status === "ended" + ? transcript.response?.status + : status_; + useEffect(() => { if (!transcriptStarted && webSockets.transcriptTextLive.length !== 0) setTranscriptStarted(true); @@ -35,8 +41,11 @@ const TranscriptUpload = (details: TranscriptUpload) => { useEffect(() => { //TODO HANDLE ERROR STATUS BETTER + // TODO deprecate webSockets.status.value / depend on transcript.response?.status from query lib const newStatus = - webSockets.status.value || transcript.response?.status || "idle"; + transcript.response?.status === "ended" + ? "ended" + : webSockets.status.value || transcript.response?.status || "idle"; setStatus(newStatus); if (newStatus && (newStatus == "ended" || newStatus == "error")) { console.log(newStatus, "redirecting"); diff --git a/www/app/reflector-api.d.ts b/www/app/reflector-api.d.ts index 3ae5b10a..8a2cadb0 100644 --- a/www/app/reflector-api.d.ts +++ b/www/app/reflector-api.d.ts @@ -566,8 +566,17 @@ export interface components { user_id: string | null; /** Name */ name: string; - /** Status */ - status: string; + /** + * Status + * @enum {string} + */ + status: + | "idle" + | "uploaded" + | "recording" + | "processing" + | "error" + | "ended"; /** Locked */ locked: boolean; /** Duration */ @@ -611,8 +620,17 @@ export interface components { user_id: string | null; /** Name */ name: string; - /** Status */ - status: string; + /** + * Status + * @enum {string} + */ + status: + | "idle" + | "uploaded" + | "recording" + | "processing" + | "error" + | "ended"; /** Locked */ locked: boolean; /** Duration */