import { Clock3, Globe2, User2, X } from "lucide-react"; import type { WorkspaceLogDetail } from "../../api/logs"; import { API_BASE_URL } from "../../config/constants"; import { useTranslation } from "../../hooks/useTranslation"; import { Button } from "../ui/button"; const resolveImageUrl = (value?: string | null) => { if (!value) return null; if (/^https?:\/\//i.test(value)) return value; return `${API_BASE_URL.replace(/\/+$/, "")}/${value.replace(/^\/+/, "")}`; }; export function LogDetailsPanel({ open, log, isLoading, onClose, }: { open: boolean; log: WorkspaceLogDetail | null; isLoading: boolean; onClose: () => void; }) { const { t, lang } = useTranslation(); if (!open) { return null; } const formatTimestamp = (value?: string | null) => { if (!value) return "-"; return new Intl.DateTimeFormat(lang === "fa" ? "fa-IR-u-ca-persian" : "en-US", { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", }).format(new Date(value)); }; const actorName = log?.actor?.full_name || t.logs?.unknownActor || "Unknown actor"; const actorAvatar = resolveImageUrl(log?.actor?.profile_picture); return (
{isLoading ? (
{t.logs?.loadingDetails || "Loading details..."}
) : !log ? (
{t.logs?.selectLogHint || "Select a log entry to see its details."}
) : (
{actorAvatar ? ( {actorName} ) : ( {actorName.trim().charAt(0).toUpperCase()} )}

{actorName}

{log.actor?.mobile || "-"}
{formatTimestamp(log.timestamp)}
{log.remote_addr ? (
{log.remote_addr}
) : null}

{t.logs?.target || "Target"}

{log.target.name}

{t.logs?.sections?.[log.section] || log.section}

{t.logs?.event || "Event"}

{t.logs?.events?.[log.event] || log.event}

{log.audit_action}

{t.logs?.changesTitle || "Changes"}

{log.changes.length ? (
{log.changes.map((change, index) => (

{change.label}

{/*

{change.summary}

*/}

{t.logs?.previousValue || "Previous"}

{change.old_value || "-"}

{t.logs?.currentValue || "Current"}

{change.new_value || "-"}

))}
) : (
{t.logs?.noDetails || "No field-level details are available for this activity."}
)}
{log.serialized_snapshot ? (
{t.logs?.snapshot || "Serialized snapshot"}
                    {JSON.stringify(log.serialized_snapshot, null, 2)}
                  
) : null}
)}
); }