flnxi-Wu/components/ui/StorageEditConfirmModal.tsx
2026-05-25 14:52:24 +08:00

163 lines
5.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use client';
import { useState } from 'react';
import { cn } from '@/lib/ui-styles';
interface StorageEditConfirmModalProps {
isOpen: boolean;
onClose: () => void;
onConfirm: () => void;
}
export default function StorageEditConfirmModal({
isOpen,
onClose,
onConfirm,
}: StorageEditConfirmModalProps) {
const [password, setPassword] = useState('');
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
if (!isOpen) return null;
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setError(null);
if (!password.trim()) {
setError('请输入密码');
return;
}
setLoading(true);
try {
const response = await fetch('/api/auth/verify-admin-password', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ password }),
});
const data = await response.json();
if (data.success) {
setPassword('');
onConfirm();
onClose();
} else {
setError(data.error || '密码验证失败');
}
} catch (err) {
setError('网络错误,请稍后重试');
} finally {
setLoading(false);
}
};
const handleClose = () => {
setPassword('');
setError(null);
onClose();
};
return (
<div className="fixed inset-0 z-50 flex items-center justify-center">
{/* 背景遮罩 */}
<div
className="absolute inset-0 bg-black/45"
onClick={handleClose}
/>
{/* 弹窗内容 */}
<div className="relative bg-white dark:bg-slate-800 rounded-xl shadow-lg border border-slate-200 dark:border-slate-700 w-full max-w-md mx-4 overflow-hidden">
{/* 头部 */}
<div className="px-6 py-4 border-b border-slate-200 dark:border-slate-700">
<div className="flex items-center justify-between">
<div className="flex items-center gap-3">
<div className="w-10 h-10 rounded-full bg-amber-100 dark:bg-amber-900/30 flex items-center justify-center">
<svg className="w-5 h-5 text-amber-600 dark:text-amber-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
</svg>
</div>
<h3 className="text-lg font-semibold text-slate-900 dark:text-white">
安全验证
</h3>
</div>
<button
onClick={handleClose}
className="p-1 rounded-lg hover:bg-slate-100 dark:hover:bg-slate-700 transition-colors"
>
<svg className="w-5 h-5 text-slate-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
</div>
{/* 警告信息 */}
<div className="px-6 py-4 bg-amber-50 dark:bg-amber-900/20 border-b border-amber-100 dark:border-amber-800">
<p className="text-sm text-amber-700 dark:text-amber-400">
对象存储配置是系统核心参数,修改不当可能导致素材无法上传或访问。请确认您了解修改的影响。
</p>
</div>
{/* 内容 */}
<form onSubmit={handleSubmit} className="p-6 space-y-4">
<div>
<label className="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">
超级管理员密码
</label>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="请输入超级管理员密码"
className={cn(
'w-full px-4 py-3 rounded-xl border text-sm',
'bg-slate-50 dark:bg-slate-900',
'border-slate-200 dark:border-slate-700',
'text-slate-900 dark:text-white',
'placeholder:text-slate-400 dark:placeholder:text-slate-500',
'focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-transparent',
'transition-all'
)}
autoFocus
/>
</div>
{error && (
<div className="px-4 py-3 rounded-xl bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800">
<p className="text-sm text-red-600 dark:text-red-400">{error}</p>
</div>
)}
<div className="flex gap-3">
<button
type="button"
onClick={handleClose}
className={cn(
'flex-1 px-4 py-3 rounded-xl font-medium text-sm transition-all',
'bg-slate-100 dark:bg-slate-700 hover:bg-slate-200 dark:hover:bg-slate-600',
'text-slate-700 dark:text-slate-300'
)}
>
取消
</button>
<button
type="submit"
disabled={loading}
className={cn(
'flex-1 px-4 py-3 rounded-xl font-medium text-sm transition-all',
'bg-amber-600 hover:bg-amber-700 text-white',
'disabled:opacity-50 disabled:cursor-not-allowed'
)}
>
{loading ? '验证中...' : '确认修改'}
</button>
</div>
</form>
</div>
</div>
);
}