From 0123103f586d36e03b51e72aeddb674c0b6cfe44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Thu, 16 Apr 2026 21:57:08 -0400 Subject: [PATCH] fix(renderer): subscribe ConsoleView to logRevision to trigger re-render (D-04) logRevision was bumped on every run-log event but no component subscribed, so ref mutations to logBufferRef never triggered a re-render -- the console pre stayed stale until something else forced a render. Subscribe to logRevision via useAppStore and depend on it in the useMemo that reads logBufferRef, keeping the ref-based buffer (cheap writes) while restoring re-renders. --- src/renderer/views/ConsoleView.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/renderer/views/ConsoleView.tsx b/src/renderer/views/ConsoleView.tsx index 66fcceb7..b39eeb1e 100644 --- a/src/renderer/views/ConsoleView.tsx +++ b/src/renderer/views/ConsoleView.tsx @@ -1,8 +1,10 @@ +import { useMemo } from "react"; import { AnimatePresence, motion } from "framer-motion"; import { FolderOpen, TerminalWindow, X } from "@phosphor-icons/react"; import type { RunRecord } from "@shared/types"; import { ActionButton, Select, StatusPill } from "../components/ui"; import { formatMoney, formatTime } from "../lib/formatters"; +import { useAppStore } from "../state/store"; interface ConsoleViewProps { consoleOpen: boolean; @@ -27,6 +29,14 @@ export function ConsoleView({ panelTransition, t, }: ConsoleViewProps) { + const logRevision = useAppStore((s) => s.logRevision); + const logBuffer = useMemo( + () => (selectedRun ? logBufferRef.current[selectedRun.id] ?? "" : ""), + // logRevision is intentionally part of deps: it bumps on every run-log + // push into the ref, forcing this memo (and this component) to re-evaluate + // the ref contents on re-render. + [selectedRun, logRevision, logBufferRef], + ); return ( {consoleOpen ? ( @@ -96,7 +106,7 @@ export function ConsoleView({
-                {selectedRun ? logBufferRef.current[selectedRun.id] ?? t("common.waitingForLog") : t("common.noRunSelected")}
+                {selectedRun ? (logBuffer || t("common.waitingForLog")) : t("common.noRunSelected")}