import { useState, useEffect } from "react"; import { useFetcher } from "@remix-run/react"; import { AlertCircle, Loader2 } from "lucide-react"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../ui/dialog"; import { Badge } from "../ui/badge"; import { type LogItem } from "~/hooks/use-logs"; interface LogDetailsProps { open: boolean; onOpenChange: (open: boolean) => void; text?: string; error?: string; log: LogItem; } interface EpisodeFact { uuid: string; fact: string; createdAt: string; validAt: string; attributes: any; } interface EpisodeFactsResponse { facts: EpisodeFact[]; } export function LogDetails({ open, onOpenChange, text, error, log, }: LogDetailsProps) { const [facts, setFacts] = useState([]); const [factsLoading, setFactsLoading] = useState(false); const fetcher = useFetcher(); // Fetch episode facts when dialog opens and episodeUUID exists useEffect(() => { if (open && log.episodeUUID && facts.length === 0) { setFactsLoading(true); fetcher.load(`/api/v1/episodes/${log.episodeUUID}/facts`); } }, [open, log.episodeUUID, facts.length]); // Handle fetcher response useEffect(() => { if (fetcher.data && fetcher.state === "idle") { setFactsLoading(false); const response = fetcher.data; setFacts(response.facts); } }, [fetcher.data, fetcher.state]); return ( Log Details
{log.episodeUUID && ( Episode: {log.episodeUUID.slice(0, 8)}... )} {log.source && ( Source: {log.source} )}
{/* Log Content */}

{/* Error Details */} {error && (

Error Details

{error}

)} {/* Episode Facts */} {log.episodeUUID && (

Facts

{factsLoading ? (
) : facts.length > 0 ? (
{facts.map((fact) => (

{fact.fact}

Valid: {new Date(fact.validAt).toLocaleString()} {Object.keys(fact.attributes).length > 0 && ( {Object.keys(fact.attributes).length} attributes )}
))}
) : (
No facts found for this episode
)}
)}
); }