diff --git a/app/(tabs)/login.tsx b/app/(tabs)/login.tsx index 39dc282..fd3121a 100644 --- a/app/(tabs)/login.tsx +++ b/app/(tabs)/login.tsx @@ -2,6 +2,7 @@ import Handers from '@/assets/icons/svg/handers.svg'; import LoginIP1 from '@/assets/icons/svg/loginIp1.svg'; import LoginIP2 from '@/assets/icons/svg/loginIp2.svg'; import ForgetPwd from '@/components/login/forgetPwd'; +import Login from '@/components/login/login'; import PhoneLogin from '@/components/login/phoneLogin'; import SignUp from '@/components/login/signUp'; import { ThemedText } from '@/components/ThemedText'; @@ -19,7 +20,10 @@ const LoginScreen = () => { const [error, setError] = useState('123'); const [containerHeight, setContainerHeight] = useState(0); const { height: windowHeight } = useWindowDimensions(); + // 展示首次输入密码 const [showPassword, setShowPassword] = useState(false); + // 展示二次输入密码 + const [showSecondPassword, setShowSecondPassword] = useState(false); const [keyboardOffset, setKeyboardOffset] = useState(0); const insets = useSafeAreaInsets(); // 判断是否有白边 @@ -126,6 +130,8 @@ const LoginScreen = () => { {...commonProps} setShowPassword={setShowPassword} showPassword={showPassword} + setShowSecondPassword={setShowSecondPassword} + showSecondPassword={showSecondPassword} /> ), forgetPwd: ( @@ -134,12 +140,12 @@ const LoginScreen = () => { /> ), login: ( - // - + + // ), code: ( diff --git a/components/login/login.tsx b/components/login/login.tsx index 134e560..4a97015 100644 --- a/components/login/login.tsx +++ b/components/login/login.tsx @@ -2,7 +2,7 @@ import { Ionicons } from "@expo/vector-icons"; import { router } from "expo-router"; import { useState } from "react"; import { useTranslation } from "react-i18next"; -import { ActivityIndicator, TextInput, TouchableOpacity, View } from "react-native"; +import { ActivityIndicator, StyleSheet, TextInput, TouchableOpacity, View } from "react-native"; import { useAuth } from "../../contexts/auth-context"; import { fetchApi } from "../../lib/server-api-util"; import { User } from "../../types/user"; @@ -52,6 +52,7 @@ const Login = ({ updateUrlParam, setError, setShowPassword, showPassword }: Logi router.replace('/user-message'); } } catch (error) { + // Handle error } finally { setIsLoading(false); } @@ -64,93 +65,156 @@ const Login = ({ updateUrlParam, setError, setShowPassword, showPassword }: Logi const handleSignUp = () => { updateUrlParam('status', 'signUp'); }; - return - {/* 邮箱输入框 */} - - - {t('auth.login.email', { ns: 'login' })} - - { - setEmail(text); - setError('123'); - }} - keyboardType="email-address" - autoCapitalize="none" - /> - - {/* 密码输入框 */} - - - {t('auth.login.password', { ns: 'login' })} - - + + return ( + + + + {t('auth.login.email', { ns: 'login' })} + { - setPassword(text); + setEmail(text); setError('123'); }} - secureTextEntry={!showPassword} + autoCapitalize="none" /> - setShowPassword(!showPassword)} - > - + + + + {t('auth.login.password', { ns: 'login' })} + + + { + setPassword(text); + setError('123'); + }} + secureTextEntry={!showPassword} /> + setShowPassword(!showPassword)} + > + + + + + + + + {t('auth.login.forgotPassword', { ns: 'login' })} + + + + + {isLoading ? ( + + ) : ( + + {t('auth.login.loginButton', { ns: 'login' })} + + )} + + + + + {t('auth.login.signUpMessage', { ns: 'login' })} + + + + {t('auth.login.signUp', { ns: 'login' })} + + ); +}; - {/* 忘记密码链接 */} - - - {t('auth.login.forgotPassword', { ns: 'login' })} - - +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + inputContainer: { + marginBottom: 20, + }, + inputLabel: { + fontSize: 16, + color: '#1F2937', + marginBottom: 8, + marginLeft: 8, + }, + textInput: { + borderRadius: 12, + paddingHorizontal: 16, + paddingVertical: 12, + fontSize: 16, + textAlignVertical: 'center', + backgroundColor: '#FFF8DE' + }, + passwordInputContainer: { + position: 'relative', + }, + eyeIcon: { + position: 'absolute', + right: 12, + top: 14, + }, + forgotPassword: { + alignSelf: 'flex-end', + marginBottom: 24, + }, + forgotPasswordText: { + color: '#1F2937', + fontSize: 14, + }, + loginButton: { + width: '100%', + backgroundColor: '#E2793F', + borderRadius: 28, + padding: 16, + alignItems: 'center', + marginBottom: 24, + }, + loginButtonText: { + color: '#FFFFFF', + fontWeight: '600', + }, + signupContainer: { + flexDirection: 'row', + justifyContent: 'center', + marginTop: 8, + }, + signupText: { + color: '#1F2937', + fontSize: 14, + }, + signupLink: { + color: '#E2793F', + fontSize: 14, + fontWeight: '600', + marginLeft: 4, + }, +}); - {/* 登录按钮 */} - - {isLoading ? ( - - ) : ( - - {t('auth.login.loginButton', { ns: 'login' })} - - )} - - - {/* 注册链接 */} - - - {t('auth.login.signUpMessage', { ns: 'login' })} - - - - {t('auth.login.signUp', { ns: 'login' })} - - - - -} - - -export default Login \ No newline at end of file +export default Login; \ No newline at end of file diff --git a/components/login/signUp.tsx b/components/login/signUp.tsx index 8251b0f..ec2a608 100644 --- a/components/login/signUp.tsx +++ b/components/login/signUp.tsx @@ -14,9 +14,11 @@ interface LoginProps { setError: (error: string) => void; setShowPassword: (showPassword: boolean) => void; showPassword: boolean; + setShowSecondPassword: (showSecondPassword: boolean) => void; + showSecondPassword: boolean; } -const SignUp = ({ updateUrlParam, setError, setShowPassword, showPassword }: LoginProps) => { +const SignUp = ({ updateUrlParam, setError, setShowPassword, showPassword, setShowSecondPassword, showSecondPassword }: LoginProps) => { const { t } = useTranslation(); const { login } = useAuth(); const router = useRouter(); @@ -32,7 +34,6 @@ const SignUp = ({ updateUrlParam, setError, setShowPassword, showPassword }: Log // 从 URL 参数中获取 task_id 和 steps const params = useLocalSearchParams<{ task_id?: string; steps?: string }>(); const taskId = params.task_id; - const steps = params.steps; const handlePasswordChange = (value: string) => { setPassword(value); @@ -139,6 +140,7 @@ const SignUp = ({ updateUrlParam, setError, setShowPassword, showPassword }: Log // 初始化 useEffect(() => { setShowPassword(false) + setShowSecondPassword(false) }, []) return @@ -208,14 +210,14 @@ const SignUp = ({ updateUrlParam, setError, setShowPassword, showPassword }: Log handleConfirmPasswordChange(value) setError('123') }} - secureTextEntry={!showPassword} + secureTextEntry={!showSecondPassword} /> setShowPassword(!showPassword)} + onPress={() => setShowSecondPassword(!showSecondPassword)} className="px-3 py-2" >