"use client" import { useEffect, useState } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog" import { Copy, Plus, RefreshCw } from "lucide-react" import { useToast } from "@/components/ui/use-toast" import { nanoid } from "nanoid" import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { EXPIRY_OPTIONS } from "@/types/email" import { useCopy } from "@/hooks/use-copy" interface CreateDialogProps { onEmailCreated: () => void } interface DomainResponse { domains: string[] } export function CreateDialog({ onEmailCreated }: CreateDialogProps) { const [open, setOpen] = useState(false) const [loading, setLoading] = useState(false) const [emailName, setEmailName] = useState("") const [domains, setDomains] = useState([]) const [currentDomain, setCurrentDomain] = useState("") const [expiryTime, setExpiryTime] = useState(EXPIRY_OPTIONS[1].value.toString()) const { toast } = useToast() const { copyToClipboard } = useCopy() const generateRandomName = () => setEmailName(nanoid(8)) const copyEmailAddress = () => { copyToClipboard(`${emailName}@${currentDomain}`) } const createEmail = async () => { if (!emailName.trim()) { toast({ title: "错误", description: "请输入邮箱名", variant: "destructive" }) return } setLoading(true) try { const response = await fetch("/api/emails/generate", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ name: emailName, domain: currentDomain, expiryTime: parseInt(expiryTime) }) }) if (!response.ok) { const data = await response.json() toast({ title: "错误", description: (data as { error: string }).error, variant: "destructive" }) return } toast({ title: "成功", description: "已创建新的临时邮箱" }) onEmailCreated() setOpen(false) setEmailName("") } catch { toast({ title: "错误", description: "创建邮箱失败", variant: "destructive" }) } finally { setLoading(false) } } const fetchDomains = async () => { const response = await fetch("/api/emails/domains"); const data = (await response.json()) as DomainResponse; setDomains(data.domains || []); setCurrentDomain(data.domains[0] || ""); }; useEffect(() => { fetchDomains() }, []) return ( 创建新的临时邮箱
setEmailName(e.target.value)} placeholder="输入邮箱名" className="flex-1" /> {domains.length > 1 && ( )}
{EXPIRY_OPTIONS.map((option) => (
))}
完整邮箱地址将为: {emailName ? (
{`${emailName}@${currentDomain}`}
) : ( ... )}
) }