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}
);
}