'use client'; import { useEffect, useState } from 'react'; import { Loader2 } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { toast } from 'sonner'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { CodeBlock } from '@/components/ui/code-block'; import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from '@/components/ui/sheet'; import { type ConfigVersionDetail, ConfigVersionService, type ConfigVersionSummary, } from '@/lib/services/openflare'; import { formatDateTime } from '@/lib/utils'; interface VersionSnapshotSheetProps { version: ConfigVersionSummary | null; open: boolean; onOpenChange: (open: boolean) => void; } export function VersionSnapshotSheet({ version, open, onOpenChange, }: VersionSnapshotSheetProps) { const t = useTranslations('configVersions'); const [detail, setDetail] = useState(null); const [loading, setLoading] = useState(false); useEffect(() => { if (!open || !version) { setDetail(null); return; } let cancelled = false; setLoading(true); ConfigVersionService.getById(version.id) .then((data) => { if (!cancelled) setDetail(data); }) .catch((err) => { if (!cancelled) { toast.error(t('snapshotLoadFailed'), { description: err instanceof Error ? err.message : t('unknownError'), }); } }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [open, version, t]); return ( {version ? t('snapshotVersion', { version: version.version }) : t('snapshotTitle')} {t('snapshotDesc')}
{loading ? (
{t('loadingSnapshot')}
) : detail ? (
{detail.is_active ? ( {t('active')} ) : ( {t('history')} )} {detail.checksum}

{t('createdBy')}

{detail.created_by || t('system')}

{t('createdAt')}

{formatDateTime(detail.created_at)}

{t('mainConfig')}

{t('routeConfig')}

) : null}
); }