"use client" import { useEffect, useState } from "react" import { useTranslations } from "next-intl" 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" import { useConfig } from "@/hooks/use-config" interface CreateDialogProps { onEmailCreated: () => void } export function CreateDialog({ onEmailCreated }: CreateDialogProps) { const { config } = useConfig() const t = useTranslations("emails.create") const tList = useTranslations("emails.list") const tCommon = useTranslations("common.actions") const [open, setOpen] = useState(false) const [loading, setLoading] = useState(false) const [emailName, setEmailName] = 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: tList("error"), description: t("namePlaceholder"), 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: tList("error"), description: (data as { error: string }).error, variant: "destructive" }) return } toast({ title: tList("success"), description: t("success") }) onEmailCreated() setOpen(false) setEmailName("") } catch { toast({ title: tList("error"), description: t("failed"), variant: "destructive" }) } finally { setLoading(false) } } useEffect(() => { if ((config?.emailDomainsArray?.length ?? 0) > 0) { setCurrentDomain(config?.emailDomainsArray[0] ?? "") } }, [config]) return ( {t("title")}
setEmailName(e.target.value)} placeholder={t("namePlaceholder")} className="flex-1" /> {(config?.emailDomainsArray?.length ?? 0) > 1 && ( )}
{EXPIRY_OPTIONS.map((option, index) => { const labels = [t("oneHour"), t("oneDay"), t("threeDays"), t("permanent")] return (
) })}
{t("domain")}: {emailName ? (
{`${emailName}@${currentDomain}`}
) : ( ... )}
) }