import { TriangleAlert } from 'lucide-react'; import type { ReactNode } from 'react'; import { ErrorInline } from '@/components/layout/error'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Badge } from '@/components/ui/badge'; import { type PagesGitHubReleaseSource, type PagesRemoteURLSource, type PagesSourceRevision, } from '@/lib/services/openflare'; import { cn, formatDateTime } from '@/lib/utils'; function revisionSummary(revision?: PagesSourceRevision) { if (!revision) return '尚无记录'; const label = revision.label?.trim(); const short = revision.revision.slice(0, 12); return label ? `${label} · ${short}` : short; } function formatOptionalTime(value?: string | null, empty = '—') { return value ? formatDateTime(value) : empty; } function SourceMetaRow({ label, children, mono, }: { label: string; children: ReactNode; mono?: boolean; }) { return (
{label}
{children}
); } export function RemoteSourceDetails({ source, }: { source: PagesRemoteURLSource; }) { return (
{source.remote_url || '—'}
{source.allow_insecure ? '允许不安全连接' : '校验证书'} {formatOptionalTime(source.last_synced_at, '尚未同步')}
{revisionSummary(source.last_applied)}
{source.last_error ? : null}
); } export function GitHubSourceDetails({ source, }: { source: PagesGitHubReleaseSource; }) { const attentionRevision = source.sync_status === 'attention' ? source.last_seen : undefined; const releaseLabel = source.release_selector === 'latest' ? '最新 Release' : `固定 Tag · ${source.release_tag || '未提供'}`; return (
{attentionRevision ? ( Release Asset 发生变化,需要显式确认

当前远端 revision 与已发布内容不一致。请核对版本和资源后,再确认发布这一精确 revision。

{attentionRevision.revision}
) : null}
{source.github_repository} {source.asset_name} {releaseLabel}
{source.release_selector === 'latest' ? ( <> {source.auto_update_enabled ? '已开启' : '已关闭'} {source.check_interval_minutes} 分钟 {formatOptionalTime(source.next_check_at, '等待调度')} {formatOptionalTime(source.last_checked_at, '尚未检查')} ) : ( {formatOptionalTime(source.last_checked_at, '尚未检查')} )} {revisionSummary(source.last_seen)} {revisionSummary(source.last_applied)} {formatOptionalTime(source.last_synced_at, '尚未同步')}
{source.last_error ? : null}
); }