import { Fonts } from "@/constants/Fonts"; import { Ionicons } from "@expo/vector-icons"; import { useLocalSearchParams, useRouter } from "expo-router"; import { useEffect, useState } from 'react'; import { useTranslation } from "react-i18next"; import { StyleSheet, TouchableOpacity, View } from 'react-native'; import { useAuth } from "../../contexts/auth-context"; import { fetchApi } from "../../lib/server-api-util"; import { User } from "../../types/user"; import { ThemedText } from "../ThemedText"; import PrivacyModal from "../owner/qualification/privacy"; import Button from "./ui/Button"; import TextInput from "./ui/TextInput"; interface LoginProps { updateUrlParam: (status: string, value: string) => void; setError: (error: string) => void; setShowPassword: (showPassword: boolean) => void; showPassword: boolean; setShowSecondPassword: (showSecondPassword: boolean) => void; showSecondPassword: boolean; } const SignUp = ({ updateUrlParam, setError, setShowPassword, showPassword, setShowSecondPassword, showSecondPassword }: LoginProps) => { const { t } = useTranslation(); const { login } = useAuth(); const router = useRouter(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [passwordsMatch, setPasswordsMatch] = useState(true); const [loading, setLoading] = useState(false); const [checked, setChecked] = useState(false); const [modalType, setModalType] = useState<'ai' | 'terms' | 'privacy' | 'user'>('ai'); // 协议弹窗 const [privacyModalVisible, setPrivacyModalVisible] = useState(false); // 从 URL 参数中获取 task_id 和 steps const params = useLocalSearchParams<{ task_id?: string; steps?: string }>(); const taskId = params.task_id; const handlePasswordChange = (value: string) => { setPassword(value); // 当密码或确认密码变化时,检查是否匹配 if (confirmPassword && value !== confirmPassword) { setPasswordsMatch(false); } else { setPasswordsMatch(true); } }; const handleConfirmPasswordChange = (value: string) => { setConfirmPassword(value); // 当密码或确认密码变化时,检查是否匹配 if (password && value !== password) { setPasswordsMatch(false); } else { setPasswordsMatch(true); } }; const handleSubmit = async () => { if (!email) { setError(t('auth.signup.emailPlaceholder', { ns: 'login' })); return; } if (!password) { setError(t('auth.signup.passwordPlaceholder', { ns: 'login' })); return; } // 验证两次密码是否一致 if (password !== confirmPassword) { setPasswordsMatch(false); setError(t('auth.signup.passwordNotMatch', { ns: 'login' })); return; } if (!checked) { setError(t('auth.signup.checkedRequired', { ns: 'login' })); return; } if (email) { // 校验是否符合邮箱规范 const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { setError(t('auth.signup.emailAuth', { ns: 'login' })); return; } } if (password) { // 校验密码是否符合规范 // const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/; // if (!passwordRegex.test(password)) { // setError(t('auth.signup.passwordAuth', { ns: 'login' })); // return; // } if (password.length < 6) { setError(t('auth.signup.pwdLengthError', { ns: 'login' })); return; } } setLoading(true); try { const body = { email: email, password: password }; // 这里调用实际的注册API const response = await fetchApi('/iam/register/email', { method: 'POST', body: JSON.stringify(body), headers: { 'Content-Type': 'application/json' } }, true, false); // 存储token login(response as User, response.access_token || ''); // 如果有任务ID,跳转到上传页面 if (taskId) { // 使用字符串路径格式传递参数 // router.push(`/upload?steps=${encodeURIComponent(steps || '')}&task_id=${encodeURIComponent(taskId)}`); } else { // 注册成功后跳转到首页 router.replace('/user-message'); } setLoading(false); } catch (error) { // console.error('Registration failed:', error); // 这里可以添加错误处理逻辑 setLoading(false); } }; useEffect(() => { if (!passwordsMatch) { setError(t('auth.login.passwordNotMatch', { ns: 'login' })); } }, [passwordsMatch]) // 初始化 useEffect(() => { setShowPassword(false) setShowSecondPassword(false) }, []) return ( {/* 邮箱输入 */} { setEmail(text); setError('123'); }} autoCapitalize="none" keyboardType="email-address" value={email} /> {/* 密码输入 */} { handlePasswordChange(value) setError('123') }} secureTextEntry={!showPassword} type="password" setShowPassword={setShowPassword} showPassword={showPassword} /> {/* 确认密码 */} { handleConfirmPasswordChange(value) setError('123') }} secureTextEntry={!showSecondPassword} type="password" setShowPassword={setShowSecondPassword} showPassword={showSecondPassword} /> {/* 注册按钮 */}