'use client'; import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query'; import Link from 'next/link'; import {useRouter} from 'next/navigation'; import {useState} from 'react'; import {EmptyState} from '@/components/feedback/empty-state'; import {ErrorState} from '@/components/feedback/error-state'; import {LoadingState} from '@/components/feedback/loading-state'; import {PageHeader} from '@/components/layout/page-header'; import {AppCard} from '@/components/ui/app-card'; import { activatePagesDeployment, deletePagesDeployment, deletePagesProject, getPagesDeployments, getPagesProject, } from '@/features/pages/api/pages'; import {DangerButton, PrimaryButton, SecondaryButton,} from '@/features/shared/components/resource-primitives'; import {PagesProjectEditorModal} from './pages-project-editor-modal'; import {PagesDeploymentUploadModal} from './pages-deployment-upload-modal'; import {formatBytes} from '@/lib/utils/metrics'; import {deploymentsQueryKey, projectQueryKey, projectsQueryKey,} from '../utils'; export function PagesProjectDetailPage({ projectId }: { projectId: string }) { const router = useRouter(); const queryClient = useQueryClient(); const [isEditModalOpen, setEditModalOpen] = useState(false); const [isUploadModalOpen, setUploadModalOpen] = useState(false); const parsedProjectId = Number(projectId); const projectQuery = useQuery({ queryKey: projectQueryKey(projectId), queryFn: () => getPagesProject(parsedProjectId), enabled: projectId !== '' && Number.isFinite(parsedProjectId), }); const deploymentsQuery = useQuery({ queryKey: deploymentsQueryKey(parsedProjectId), queryFn: () => getPagesDeployments(parsedProjectId), enabled: projectId !== '' && Number.isFinite(parsedProjectId), }); const activateMutation = useMutation({ mutationFn: (deploymentId: number) => activatePagesDeployment(parsedProjectId, deploymentId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: deploymentsQueryKey(parsedProjectId), }); queryClient.invalidateQueries({ queryKey: projectQueryKey(projectId) }); queryClient.invalidateQueries({ queryKey: projectsQueryKey }); }, }); const deleteDeploymentMutation = useMutation({ mutationFn: (deploymentId: number) => deletePagesDeployment(parsedProjectId, deploymentId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: deploymentsQueryKey(parsedProjectId), }); queryClient.invalidateQueries({ queryKey: projectQueryKey(projectId) }); queryClient.invalidateQueries({ queryKey: projectsQueryKey }); }, }); const deleteProjectMutation = useMutation({ mutationFn: () => deletePagesProject(parsedProjectId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: projectsQueryKey }); router.push('/pages'); }, }); if (projectId === '' || !Number.isFinite(parsedProjectId)) { return ( ); } if (projectQuery.isLoading) { return ; } if (projectQuery.isError) { return ( ); } const project = projectQuery.data; if (!project) { return ( ); } const handleDeleteProject = () => { if (!window.confirm(`确认删除 Pages 项目 ${project.name} 吗?`)) { return; } deleteProjectMutation.mutate(); }; return (
返回列表 setEditModalOpen(true)} > 编辑项目 setUploadModalOpen(true)} > 上传部署包 删除项目 } /> {deploymentsQuery.isLoading ? (

加载中...

) : deploymentsQuery.isError ? (

{deploymentsQuery.error.message}

) : (deploymentsQuery.data ?? []).length === 0 ? ( ) : (
{(deploymentsQuery.data ?? []).map((deployment) => (

#{deployment.deployment_number}{' '} {deployment.status === 'active' ? '· 已激活' : ''}

{deployment.checksum.slice(0, 16)} · {deployment.file_count}{' '} files · {formatBytes(deployment.total_size)}

{ if ( window.confirm( `确认激活部署 #${deployment.deployment_number} 吗?`, ) ) { activateMutation.mutate(deployment.id); } }} > 激活 { if ( window.confirm( `确认删除部署 #${deployment.deployment_number} 吗?`, ) ) { deleteDeploymentMutation.mutate(deployment.id); } }} > 删除
))}
)}
setEditModalOpen(false)} project={project} /> setUploadModalOpen(false)} projectId={parsedProjectId} />
); }