diff --git a/app/api/emails/domains/route.ts b/app/api/emails/domains/route.ts new file mode 100644 index 0000000..b3dbd29 --- /dev/null +++ b/app/api/emails/domains/route.ts @@ -0,0 +1,25 @@ +import { EMAIL_CONFIG } from "@/config" +import { NextResponse } from "next/server" + +export const runtime = "edge" + +export async function GET() { + try { + const domains = EMAIL_CONFIG.DOMAINS + + if (domains.length === 0) { + return NextResponse.json( + { error: "无效的域名列表" }, + { status: 400 } + ) + } + + return NextResponse.json({ domains }) + } catch (error) { + console.error('Failed to fetch domains:', error) + return NextResponse.json( + { error: "获取域名列表失败" }, + { status: 500 } + ) + } +} \ No newline at end of file diff --git a/app/components/emails/create-dialog.tsx b/app/components/emails/create-dialog.tsx index 95afd53..8e678fa 100644 --- a/app/components/emails/create-dialog.tsx +++ b/app/components/emails/create-dialog.tsx @@ -1,6 +1,6 @@ "use client" -import { useState } from "react" +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" @@ -11,17 +11,21 @@ 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 { EMAIL_CONFIG } from "@/config" 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 [domain, setDomain] = useState(EMAIL_CONFIG.DOMAINS[0]) + const [domains, setDomains] = useState([]) + const [currentDomain, setCurrentDomain] = useState("") const [expiryTime, setExpiryTime] = useState(EXPIRY_OPTIONS[1].value.toString()) const { toast } = useToast() @@ -42,13 +46,13 @@ export function CreateDialog({ onEmailCreated }: CreateDialogProps) { const response = await fetch("/api/emails/generate", { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ + body: JSON.stringify({ name: emailName, - domain, + domain: currentDomain, expiryTime: parseInt(expiryTime) }) }) - + if (!response.ok) { const data = await response.json() toast({ @@ -77,6 +81,17 @@ export function CreateDialog({ onEmailCreated }: CreateDialogProps) { } } + 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 ( @@ -97,13 +112,13 @@ export function CreateDialog({ onEmailCreated }: CreateDialogProps) { placeholder="输入邮箱名" className="flex-1" /> - {EMAIL_CONFIG.DOMAINS.length > 1 && ( - - {EMAIL_CONFIG.DOMAINS.map(d => ( + {domains.map(d => ( @{d} ))} @@ -118,7 +133,7 @@ export function CreateDialog({ onEmailCreated }: CreateDialogProps) { - +
- 完整邮箱地址将为: {emailName ? `${emailName}@${domain}` : "..."} + 完整邮箱地址将为: {emailName ? `${emailName}@${currentDomain}` : "..."}