import { Ionicons } from '@expo/vector-icons' import { Block, Text, Toast } from '@share/components' import { router } from 'expo-router' import React, { useCallback, useMemo, useState } from 'react' import { TextInput } from 'react-native' import { KeyboardAwareScrollView } from 'react-native-keyboard-controller' import { APP_VERSION } from '@/app.config' import BannerSection from '@/components/BannerSection' import { phoneNumber, setAuthToken } from '@/lib/auth' import { isValidPhone } from '@/utils' const APP_NAME = '多米' export default function Auth() { const [phone, setPhone] = useState('') const [code, setCode] = useState('') const [loading, setLoading] = useState(false) const [countdown, setCountdown] = useState(0) const canSendCode = useMemo(() => { return isValidPhone(phone) }, [phone]) // TODO: 获取验证码接口还未实现,需要后端提供手机号验证码发送接口 const handleSendCode = useCallback(async () => { if (!canSendCode) { Toast.show({ title: '请输入有效的手机号' }) return } Toast.showLoading({ title: '正在发送验证码...' }) setLoading(true) try { // TODO: 调用获取验证码接口 // 当前使用 better-auth 的 phoneNumber.sendOtp,但后端可能还未实现 // 如果后端未实现,这里会报错,需要后端提供手机号验证码发送接口 const result = await phoneNumber.sendOtp({ phoneNumber: phone, }) if (result.error) { Toast.show({ title: result.error.message || '验证码发送失败,请检查后端接口是否已实现' }) return } Toast.show({ title: '验证码已发送,请查收短信' }) setCountdown(60) // 开始倒计时 // 倒计时逻辑 const timer = setInterval(() => { setCountdown((prev) => { if (prev <= 1) { clearInterval(timer) return 0 } return prev - 1 }) }, 1000) } catch (error: any) { Toast.show({ title: error.message || '验证码发送失败' }) } finally { Toast.hideLoading() setLoading(false) } }, [phone, canSendCode]) const handleLogin = useCallback(async () => { if (!phone || !code) { Toast.show({ title: '请填写手机号和验证码' }) return } if (!isValidPhone(phone)) { Toast.show({ title: '请输入有效的手机号' }) return } setLoading(true) try { // 使用 better-auth 的 phoneNumber.verify 进行验证和登录 // verify 方法会自动创建会话,如果用户不存在会自动注册 const result = await phoneNumber.verify({ phoneNumber: phone, code, updatePhoneNumber: true, // 如果已登录,更新手机号 }) if (result.error) { Toast.show({ title: result.error.message || '验证码错误或已过期' }) return } // 获取认证 token(如果后端返回) // better-auth 会自动处理 session,但如果有自定义 token,需要手动设置 if (result.data && 'token' in result.data && result.data.token) { await setAuthToken(result.data.token) } Toast.show({ title: '登录成功!' }) router.replace('/(tabs)') } catch (error: any) { Toast.show({ title: error.message || '登录失败' }) } finally { setLoading(false) } }, [phone, code]) return ( {APP_NAME} 手机号 0 ? undefined : handleSendCode} className={`border-2 border-black px-[6px] py-[4px] ${canSendCode && countdown === 0 ? 'bg-black' : 'bg-gray-200'}`} > {countdown > 0 ? `${countdown}秒` : '发送验证码'} 验证码 {loading ? ( ) : ( )} {loading ? '处理中...' : '登录'} © 2025 LOOMART. All rights reserved. 插件当前版本号: {APP_VERSION} ) }