import { Ionicons } from '@expo/vector-icons' import { Block, Text, Toast } from '@share/components' import { router } from 'expo-router' import React, { useCallback, useState } from 'react' import { TextInput } from 'react-native' import { KeyboardAwareScrollView } from 'react-native-keyboard-controller' import BannerSection from '@/components/BannerSection' import { emailOtp, forgetPassword } from '@/lib/auth' import { isValidEmail } from '@/utils' const APP_NAME = '多米' export default function ForgotPassword() { const [step, setStep] = useState<'send' | 'reset'>('send') const [email, setEmail] = useState('') const [code, setCode] = useState('') // 邮件中的验证码/token const [newPassword, setNewPassword] = useState('') const [confirmPassword, setConfirmPassword] = useState('') const [loading, setLoading] = useState(false) const [showNewPassword, setShowNewPassword] = useState(false) const [showConfirmPassword, setShowConfirmPassword] = useState(false) const handleSend = useCallback(async () => { if (!email) { Toast.show({ title: '请输入邮箱' }) return } if (!isValidEmail(email)) { Toast.show({ title: '请输入正确的邮箱格式' }) return } setLoading(true) try { // better-auth的forgetPassword可能使用emailOtp方法 const result = await forgetPassword.emailOtp({ email }) if (result.error) { Toast.show({ title: '邮箱未注册,发送失败' }) } else { Toast.show({ title: '重置验证码已发送到邮箱,请查看邮箱后继续' }) setStep('reset') } } catch (err) { const error = err as Error Toast.show({ title: error?.message || '发送失败,请稍后重试' }) } finally { setLoading(false) } }, [email]) const handleReset = useCallback(async () => { if (!code) { Toast.show({ title: '请输入邮件中的重置令牌' }) return } if (!newPassword || !confirmPassword) { Toast.show({ title: '请输入新密码并确认' }) return } if (newPassword !== confirmPassword) { Toast.show({ title: '两次密码输入不一致' }) return } if (newPassword.length < 6) { Toast.show({ title: '密码长度至少6位' }) return } setLoading(true) try { const result = await emailOtp.resetPassword({ email, otp: code, password: newPassword }) if (result.error) { Toast.show({ title: result.error.message || '重置失败,请稍后重试' }) } else { Toast.show({ title: '密码已重置,请使用新密码登录' }) router.replace('/auth') } } catch (err) { const error = err as Error Toast.show({ title: error?.message || '重置失败,请稍后重试' }) } finally { setLoading(false) } }, [code, newPassword, confirmPassword]) return ( {APP_NAME} {/* 发送邮箱步骤 */} {step === 'send' && ( 邮箱 )} {/* 重置密码步骤 */} {step === 'reset' && ( 邮箱 重置令牌(邮件中获取) 新密码 setShowNewPassword(!showNewPassword)} className="p-1"> 确认密码 setShowConfirmPassword(!showConfirmPassword)} className="p-1"> )} {loading ? ( ) : ( )} {loading ? '处理中...' : step === 'send' ? '发送重置链接' : '重置密码'} { if (step === 'send') router.replace('/auth') else setStep('send') }} > {step === 'send' ? '返回登录' : '返回发送重置邮件'} © 2025 LOOMART. All rights reserved. ) }