From 39726b360e23df1064045d79dcfffa89112c2a82 Mon Sep 17 00:00:00 2001 From: Esdras Renan Date: Wed, 22 Oct 2025 19:40:07 -0300 Subject: [PATCH] feat(machines): robust probe for machine details + clear error/not-found states\n\n- Probe Convex (browser) and server route when query is undefined or null\n- Tri-state fallback (undefined|null|data) to disambiguate not-found\n- Restore skeleton + not-found + error rendering with actionable retry\n- No behavior change when data is available --- .../machines/admin-machine-details.client.tsx | 58 ++++++++++++++++--- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/src/components/admin/machines/admin-machine-details.client.tsx b/src/components/admin/machines/admin-machine-details.client.tsx index 894d8b5..ddef2ff 100644 --- a/src/components/admin/machines/admin-machine-details.client.tsx +++ b/src/components/admin/machines/admin-machine-details.client.tsx @@ -24,11 +24,11 @@ export function AdminMachineDetailsClient({ tenantId: _tenantId, machineId }: { const single = useQuery(api.machines.getById, queryArgs) // Fallback via HTTP in caso de o Convex React demorar/ficar preso em loading - const [fallback, setFallback] = useState | null>(null) + const [fallback, setFallback] = useState | null | undefined>(undefined) const [loadError, setLoadError] = useState(null) const [retryTick, setRetryTick] = useState(0) const timer = useRef | null>(null) - const shouldLoad = single === undefined && !fallback && Boolean(machineId) + const shouldLoad = (single === undefined || single === null) && fallback === undefined && Boolean(machineId) useEffect(() => { if (!shouldLoad) return @@ -58,7 +58,7 @@ export function AdminMachineDetailsClient({ tenantId: _tenantId, machineId }: { const res = await fetch(`/api/admin/machines/${machineId}/details`, { credentials: "include" }) if (res.ok) { const data = (await res.json()) as Record - setFallback(data) + setFallback(data ?? null) setLoadError(null) } else { let message = `Falha ao carregar (HTTP ${res.status})` @@ -70,7 +70,11 @@ export function AdminMachineDetailsClient({ tenantId: _tenantId, machineId }: { } catch { // ignore } - setLoadError(message) + if (res.status == 404) { + setFallback(null) + } else { + setLoadError(message) + } } } catch { setLoadError("Erro de rede ao carregar os dados da máquina.") @@ -96,12 +100,12 @@ export function AdminMachineDetailsClient({ tenantId: _tenantId, machineId }: { }, [shouldLoad, machineId, retryTick]) const machine: MachinesQueryItem | null = useMemo(() => { - const source = single ?? fallback + const source = single ?? (fallback === undefined ? undefined : fallback) if (source === undefined || source === null) return source as null return normalizeMachineItem(source) }, [single, fallback]) - const isLoading = single === undefined && !fallback && !loadError - const isNotFound = single === null && !fallback + const isLoading = single === undefined && fallback === undefined && !loadError + const isNotFound = (single === null || fallback === null) && !loadError const onRetry = () => { setLoadError(null) @@ -114,6 +118,46 @@ export function AdminMachineDetailsClient({ tenantId: _tenantId, machineId }: { // ignore } } + if (loadError && !machine) { + return ( + + +

Falha ao carregar os dados da máquina

+

{loadError}

+
+ +
+
+
+ ) + } + + if (isLoading) { + return ( + + + + + + + + ) + } + + if (isNotFound) { + return ( + + +

Máquina não encontrada

+

Verifique o identificador e tente novamente.

+
+ +
+
+
+ ) + } + return }