'use client'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useState } from 'react'; import { EmptyState } from '@/components/feedback/empty-state'; import { ErrorState } from '@/components/feedback/error-state'; import { InlineMessage } from '@/components/feedback/inline-message'; import { LoadingState } from '@/components/feedback/loading-state'; import { PageHeader } from '@/components/layout/page-header'; import { AppCard } from '@/components/ui/app-card'; import { StatusBadge } from '@/components/ui/status-badge'; import { deleteOrigin, getOrigin } from '@/features/origins/api/origins'; import { OriginEditorModal } from '@/features/origins/components/origin-editor-modal'; import { DangerButton, SecondaryButton, } from '@/features/shared/components/resource-primitives'; import { formatDateTime } from '@/lib/utils/date'; export function OriginDetailPage({ originId }: { originId: string }) { const router = useRouter(); const queryClient = useQueryClient(); const [feedback, setFeedback] = useState<{ tone: 'success' | 'danger'; message: string; } | null>(null); const [isEditorOpen, setIsEditorOpen] = useState(false); const originQuery = useQuery({ queryKey: ['origins', originId], queryFn: () => getOrigin(Number(originId)), enabled: originId !== '', }); const deleteMutation = useMutation({ mutationFn: deleteOrigin, onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: ['origins'] }); router.push('/origin'); }, onError: (error) => { setFeedback({ tone: 'danger', message: error instanceof Error ? error.message : '请求失败,请稍后重试。', }); }, }); if (originQuery.isLoading) { return ; } if (originQuery.isError) { return ( ); } const origin = originQuery.data; if (!origin) { return ( ); } const handleDelete = () => { if (!window.confirm(`确认删除源站 ${origin.name} 吗?`)) { return; } deleteMutation.mutate(origin.id); }; return ( <>
返回 setIsEditorOpen(true)} > 编辑源站 删除源站 } /> {feedback ? ( ) : null}

{origin.address}

0 ? 'success' : 'warning'} />

编辑地址后,绑定规则的主源站地址会一起更新。

{formatDateTime(origin.created_at)}

{formatDateTime(origin.updated_at)}

{origin.remark || '暂无备注'}

{origin.routes.length === 0 ? ( ) : (
{origin.routes.map((route) => ( ))}
域名 源站地址 状态 更新时间
{route.domain} {route.origin_url} {formatDateTime(route.updated_at)}
)}
{isEditorOpen ? ( setIsEditorOpen(false)} onSaved={() => { setFeedback({ tone: 'success', message: '源站已更新。' }); void queryClient.invalidateQueries({ queryKey: ['origins', origin.id], }); void queryClient.invalidateQueries({ queryKey: ['origins'] }); }} /> ) : null} ); }