diff --git a/ui/app/workspace/logs/sheets/logDetailsSheet.tsx b/ui/app/workspace/logs/sheets/logDetailsSheet.tsx index 74669ec3ca..e192708eeb 100644 --- a/ui/app/workspace/logs/sheets/logDetailsSheet.tsx +++ b/ui/app/workspace/logs/sheets/logDetailsSheet.tsx @@ -1,8 +1,8 @@ "use client"; -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { useHotkeys } from "react-hotkeys-hook"; -import { useLazyGetLogByIdQuery } from "@/lib/store/apis/logsApi"; +import { useGetLogByIdQuery } from "@/lib/store/apis/logsApi"; import { AlertDialog, AlertDialogAction, @@ -85,13 +85,15 @@ const isContainerOperation = (object: string) => { export function LogDetailSheet({ log, open, onOpenChange, handleDelete, onNavigate, hasPrev = false, hasNext = false }: LogDetailSheetProps) { const { copy: copyRequestId } = useCopyToClipboard({ successMessage: "Request ID copied" }); const { copy: copyBody } = useCopyToClipboard({ successMessage: "Request body copied to clipboard", errorMessage: "Failed to copy request body" }); - const [fetchLog, { data: fullLog, isFetching }] = useLazyGetLogByIdQuery(); - + const [pollingInterval, setPollingInterval] = useState(0); + const { data: fullLog, isLoading, isError } = useGetLogByIdQuery(log?.id ?? "", { + skip: !open || !log?.id, + pollingInterval, + }); + const shouldPoll = isError || fullLog?.status === "processing"; useEffect(() => { - if (open && log?.id) { - fetchLog(log.id); - } - }, [open, log?.id, fetchLog]); + setPollingInterval(shouldPoll ? 2000 : 0); + }, [shouldPoll]); // Keyboard navigation: arrow up/down to navigate between logs useHotkeys("up", () => onNavigate?.("prev"), { enabled: open && hasPrev, preventDefault: true }); @@ -99,8 +101,8 @@ export function LogDetailSheet({ log, open, onOpenChange, handleDelete, onNaviga if (!log) return null; - // Show a loader until the full log data is fetched from the dedicated single-log endpoint. - const isFullDataReady = fullLog?.id === log.id && !isFetching; + // Show a loader only on the initial fetch, not during background polling refetches. + const isFullDataReady = fullLog?.id === log.id && !isLoading; const displayLog = isFullDataReady ? fullLog : log; const isContainer = isContainerOperation(displayLog.object); @@ -142,9 +144,9 @@ export function LogDetailSheet({ log, open, onOpenChange, handleDelete, onNaviga ) : ( <> - -
- + +
+ {displayLog.id && (

Request ID:{" "} diff --git a/ui/lib/store/apis/logsApi.ts b/ui/lib/store/apis/logsApi.ts index aed46a32f3..64343555b3 100644 --- a/ui/lib/store/apis/logsApi.ts +++ b/ui/lib/store/apis/logsApi.ts @@ -394,4 +394,5 @@ export const { useDeleteLogsMutation, useRecalculateLogCostsMutation, useLazyGetLogByIdQuery, + useGetLogByIdQuery, } = logsApi;