// 发布管理 - 审批/驳回弹窗(自包含提交逻辑) // Logan.Li import { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { AlertCircle, X, Check, Loader2 } from 'lucide-react'; import { releaseApi } from '@/api'; import { toast } from 'sonner'; import type { JsonData } from '@/types/common'; interface ReleaseApproveDialogProps { release: JsonData | null; open: boolean; onOpenChange: (open: boolean) => void; onSuccess?: () => void; } export function ReleaseApproveDialog({ release, open, onOpenChange, onSuccess }: ReleaseApproveDialogProps) { const { t } = useTranslation(); const [submitting, setSubmitting] = useState(false); // 提交完成即重置 loading(防复用) // Logan.Li useEffect(() => { if (!open) setSubmitting(false); }, [open]); const handleApprove = async (approved: boolean) => { if (!release) return; setSubmitting(true); try { if (approved) { await releaseApi.approveRelease(release.id); toast.success(t('deploy.release.approvePassed')); } else { await releaseApi.rejectRelease(release.id); toast.success(t('deploy.toast.rejected')); } onOpenChange(false); onSuccess?.(); } catch { toast.error(approved ? t('deploy.toast.approveFailed') : t('deploy.toast.rejectFailed')); } finally { setSubmitting(false); } }; return ( {t('deploy.release.approve')} {release?.app_name} - {release?.version}
{release?.description && (

{t('deploy.release.releaseDesc')}

{release.description}

)}
{t('deploy.release.approveHint')}
); }