import type { components } from '@pipu/api-client'; import { useId } from 'react'; import { useTranslation } from 'react-i18next'; import { formatDateTime } from '../../shared/lib/format'; import { cx } from '../../shared/ui/ui'; import s from './library.module.css'; type ScanProgress = components['schemas']['ScanProgress']; export type SourceStatus = components['schemas']['SourceStatus']; export function StatusBadge({ status }: { status: SourceStatus }) { const { t } = useTranslation('admin'); return {t(`sources.status_${status}`)}; } /** Прогресс идущего скана или итог последнего. */ export function ScanLine({ scan, lastScanAt }: { scan: ScanProgress | null; lastScanAt: string | null }) { const { t, i18n } = useTranslation('admin'); const id = useId(); if (scan?.running) { const phase = scan.phase ?? (scan.found === 0 ? 'walking' : scan.to_process > 0 ? 'processing' : 'preparing'); const determinate = phase === 'processing' && scan.to_process > 0; const pct = scan.to_process > 0 ? Math.round((scan.processed / scan.to_process) * 100) : 0; const state = phase === 'walking' ? scan.walked_dirs === undefined ? t('sources.scan_walking') : t('sources.scan_walk_progress', { dirs: scan.walked_dirs.toLocaleString(i18n.language), found: scan.found.toLocaleString(i18n.language) }) : phase === 'preparing' ? t('sources.scan_preparing') : phase === 'finalizing' ? t('sources.scan_finalizing') : t('sources.scanning', { processed: scan.processed, total: scan.to_process }); return (