| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- import { View, Text, ScrollView, StyleSheet, Pressable } from 'react-native';
- import { useContext, useEffect, useState } from 'react';
- import { SafeAreaView } from 'react-native-safe-area-context';
- import { router } from 'expo-router';
- import { CrossLogoSvg } from '../global/SVG';
- import { AuthContext } from '../../context/AuthProvider';
- import NormalInput from '../global/normal_input';
- import NormalButton from '../global/normal_button';
- import * as SecureStore from 'expo-secure-store';
- import { authenticationService } from '../../service/authService';
- const changePasswordPageComponent = () => {
- const { user, setUser } = useContext(AuthContext);
- const [token, setToken] = useState<string | null>(null);
- const [currentPassword, setCurrentPassword] = useState<string | null>(null);
- const [newPassword, setNewPassword] = useState<string | null>(null);
- const [newConfirmPassword, setNewConfirmPassword] = useState<string | null>(null);
- const [isPasswordVerified, setIsPasswordVerified] = useState<boolean>(false);
- const [error, setError] = useState<string | null>(null);
- const [isLoading, setIsLoading] = useState(false);
- const [isLoading2, setIsLoading2] = useState(false);
- useEffect(() => {
- const getToken = async () => {
- const storedToken = await SecureStore.getItemAsync('accessToken');
- setToken(storedToken);
- };
- getToken();
- }, []);
- const handleVerifyPassword = async (currentPassword: string) => {
- try {
- setIsLoading(true);
- if (!currentPassword) {
- setError('請輸入密碼');
- return;
- }
- if (!user || !user.email) {
- setError('無法驗證用戶,請重新登錄');
- return;
- }
- const success = await authenticationService.phoneLogin(user.phone, currentPassword);
- if (success) {
- setIsPasswordVerified(true);
- setError('');
- return true;
- } else {
- setError('密碼錯誤,請稍後再試');
- }
- } catch (error) {
- console.error('Error verifying password:', error);
- setError('密碼錯誤,請稍後再試');
- return false;
- } finally {
- setIsLoading(false);
- }
- };
- const handlePasswordChange = async () => {
- try {
- setIsLoading2(true);
- if (newPassword !== newConfirmPassword) {
- setError('新密碼不相符');
- return;
- }
- if (!newConfirmPassword || !token) {
- setError('請輸入新密碼');
- return;
- }
- const success = await authenticationService.changePassword(newConfirmPassword, token);
- if (success) {
- setError('');
- router.replace('accountMainPage');
- } else {
- setError('密碼更改失敗,請稍後再試');
- }
- } catch (error) {
- console.error('Error changing password:', error);
- setError('發生錯誤,請稍後再試');
- } finally {
- setIsLoading2(false);
- }
- };
- return (
- <SafeAreaView className="flex-1 bg-white" edges={['top', 'right', 'left']}>
- <ScrollView className="flex-1 mx-[5%]" showsVerticalScrollIndicator={false}>
- <View style={{ marginTop: 25 }}>
- <Pressable
- onPress={() => {
- if (router.canGoBack()) {
- router.back();
- } else {
- router.replace('/accountMainPage');
- }
- }}
- >
- <CrossLogoSvg />
- </Pressable>
- <Text style={{ fontSize: 45, marginVertical: 25 }}>更改密碼</Text>
- <Text className="text-xl ">請輸入您現時的帳戶密碼</Text>
- <View className="py-2">
- <NormalInput
- placeholder="帳戶密碼"
- onChangeText={(t) => setCurrentPassword(t)}
- secureTextEntry={true}
- editable={!isPasswordVerified}
- />
- </View>
- <NormalButton
- title={
- <Text style={{ color: '#fff' }}>
- {isLoading ? '驗證中...' : isPasswordVerified ? '已驗證' : '下一步'}
- </Text>
- }
- onPress={() => {
- if (currentPassword) {
- handleVerifyPassword(currentPassword);
- }
- }}
- disabled={isPasswordVerified}
- extendedStyle={isPasswordVerified == true ? { backgroundColor: '#70787C' } : {}}
- />
- </View>
- {isPasswordVerified && (
- <View
- style={[
- styles.hiddenPasswordFields,
- isPasswordVerified ? styles.opacityFull : styles.opacityZero
- ]}
- >
- <NormalInput
- placeholder="新密碼"
- onChangeText={(t) => setNewPassword(t)}
- secureTextEntry={true}
- textContentType={'oneTimeCode'}
- />
- <NormalInput
- placeholder="確認密碼"
- onChangeText={(t) => setNewConfirmPassword(t)}
- secureTextEntry={true}
- textContentType={'oneTimeCode'}
- />
- <NormalButton
- title={<Text style={{ color: '#fff' }}>{isLoading2 ? '更改中...' : '確認'}</Text>}
- onPress={handlePasswordChange}
- />
- </View>
- )}
- {error && <Text style={styles.errorMessage}>{error}</Text>}
- </ScrollView>
- </SafeAreaView>
- );
- };
- const styles = StyleSheet.create({
- container: {
- flex: 1,
- marginHorizontal: 20
- },
- titleText: {
- fontSize: 24,
- fontWeight: '300'
- },
- bottomContainer: {
- flex: 3,
- paddingBottom: 100
- },
- breakline: {
- width: 24,
- height: 1,
- backgroundColor: '#000000',
- marginVertical: 17
- },
- text: {
- fontSize: 18,
- paddingBottom: 10
- },
- hiddenPasswordFields: {
- gap: 10,
- paddingTop: 10
- },
- opacityZero: {
- opacity: 0
- },
- opacityFull: {
- opacity: 1
- },
- errorMessage: {
- fontSize: 14,
- color: '#ff0033',
- fontWeight: '400',
- marginLeft: 10,
- marginTop: 10
- },
- footer: { color: '#02677D', fontSize: 16, paddingVertical: 10 }
- });
- export default changePasswordPageComponent;
- // <NormalButton
- // title={<Text className="text-white text-lg">確認</Text>}
- // onPress={() => {
- // // poSSIBLY ADD ERROR HANDLING AND LOADING
- // // authenticationService.changePassword(password, token);
- // router.replace('accountMainPage');
- // }}
- // />
|