"use client" import type React from "react" import { useState } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Alert, AlertDescription } from "@/components/ui/alert" import { Mail, ArrowLeft, CheckCircle } from "lucide-react" interface ForgotPasswordDialogProps { open: boolean onOpenChange: (open: boolean) => void onBackToLogin: () => void } export function ForgotPasswordDialog({ open, onOpenChange, onBackToLogin }: ForgotPasswordDialogProps) { const [email, setEmail] = useState("") const [isLoading, setIsLoading] = useState(false) const [isSuccess, setIsSuccess] = useState(false) const [error, setError] = useState("") const [resetUrl, setResetUrl] = useState("") const [expiresAt, setExpiresAt] = useState("") const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setError("") if (!email) { setError("請輸入電子郵件地址") return } if (!email.includes("@")) { setError("請輸入有效的電子郵件地址") return } setIsLoading(true) try { const response = await fetch('/api/auth/forgot-password', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email }), }) const data = await response.json() if (data.success) { setResetUrl(data.resetUrl) setExpiresAt(data.expiresAt) setIsSuccess(true) } else { setError(data.error || "生成重設連結失敗") } } catch (err) { setError("生成重設連結時發生錯誤") } finally { setIsLoading(false) } } const handleClose = () => { setEmail("") setError("") setIsSuccess(false) setResetUrl("") setExpiresAt("") onOpenChange(false) } if (isSuccess) { return ( 密碼重設連結已生成 請複製以下連結並在新視窗中開啟以重設密碼 重設連結已為以下電子郵件生成: {email} 重設連結 { navigator.clipboard.writeText(resetUrl) // 可以添加 toast 提示 }} variant="outline" size="sm" > 複製 此連結將在 {new Date(expiresAt).toLocaleString('zh-TW')} 過期 window.open(resetUrl, '_blank')} className="w-full" > 在新視窗中開啟重設頁面 返回登入 關閉 ) } return ( 忘記密碼 請輸入您的電子郵件地址,我們將生成密碼重設連結 電子郵件 setEmail(e.target.value)} className="pl-10" required /> {error && ( {error} )} 返回登入 {isLoading ? "生成中..." : "生成重設連結"} ) }
重設連結已為以下電子郵件生成:
{email}
此連結將在 {new Date(expiresAt).toLocaleString('zh-TW')} 過期