import React from 'react'; import { useI18n } from '@/application/i18n/I18nProvider'; import type { ScriptRun } from '@/types/global/netcatty-bridge-script.d.ts'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { cn } from '@/lib/utils.ts'; export interface ScriptRunLogDialogProps { run: ScriptRun | null; open: boolean; onOpenChange: (open: boolean) => void; } function formatDuration(startedAt: number, endedAt?: number) { const ms = (endedAt ?? Date.now()) - startedAt; const seconds = Math.floor(ms / 1000); const minutes = Math.floor(seconds / 60); const rest = seconds % 60; return `${String(minutes).padStart(2, '0')}:${String(rest).padStart(2, '0')}`; } export const ScriptRunLogDialog: React.FC = ({ run, open, onOpenChange, }) => { const { t } = useI18n(); if (!run) return null; const label = run.scriptLabel || run.scriptId || t('scripts.running.unnamed'); const elapsed = formatDuration(run.startedAt, run.endedAt); const statusLabel = t(`scripts.running.status.${run.status}`); const logText = run.logs.map((entry) => entry.message).join('\n'); return ( {t('scripts.running.logTitle', { name: label })}
{statusLabel} · {t('scripts.running.operationsCount', { count: run.stepIndex ?? 0 })} · {t('scripts.running.elapsed', { elapsed })}
{run.error ? (
{run.error}
) : null} {run.waitingFor ? (
{t('scripts.running.waitingFor', { pattern: run.waitingFor })}
) : null}
            {logText || t('scripts.running.logEmpty')}
          
); };