changeGenderPageComponent.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { View, Text, ScrollView, Pressable } from 'react-native';
  2. import React, { useContext, useEffect, useState } from 'react';
  3. import { SafeAreaView } from 'react-native-safe-area-context';
  4. import { router } from 'expo-router';
  5. import { CrossLogoSvg } from '../global/SVG';
  6. import { AuthContext } from '../../context/AuthProvider';
  7. import NormalButton from '../global/normal_button';
  8. import * as SecureStore from 'expo-secure-store';
  9. import { authenticationService } from '../../service/authService';
  10. import DropdownSelect from '../global/dropdown_select';
  11. const ChangeGenderPageComponent = () => {
  12. const { user, setUser } = useContext(AuthContext);
  13. const [token, setToken] = useState<string | null>(null);
  14. const [gender, setGender] = useState<string | null>(null);
  15. const [isLoading, setIsLoading] = useState(false);
  16. const [error, setError] = useState<string | null>(null);
  17. const dropdownOption = [
  18. { label: '男', value: 'man' },
  19. { label: '女', value: 'woman' }
  20. ];
  21. useEffect(() => {
  22. const getToken = async () => {
  23. const storedToken = await SecureStore.getItemAsync('accessToken');
  24. setToken(storedToken);
  25. };
  26. getToken();
  27. }, []);
  28. const handleChangeGender = async () => {
  29. if (!gender) {
  30. setError('請選擇性別');
  31. return;
  32. }
  33. if (!token) {
  34. setError('未找到有效的登錄令牌,請重新登錄');
  35. return;
  36. }
  37. setError(null);
  38. setIsLoading(true);
  39. try {
  40. const success = await authenticationService.changeGender(
  41. gender,
  42. token
  43. );
  44. if (success) {
  45. if (user) {
  46. setUser({
  47. ...user,
  48. gender: gender
  49. });
  50. }
  51. router.replace('accountMainPage');
  52. } else {
  53. setError('更新性別失敗,請稍後再試');
  54. }
  55. } catch (error) {
  56. console.error('Error changing gender:', error);
  57. setError('發生錯誤,請稍後再試');
  58. } finally {
  59. setIsLoading(false);
  60. }
  61. };
  62. return (
  63. <SafeAreaView
  64. className="flex-1 bg-white"
  65. edges={['top', 'right', 'left']}
  66. >
  67. <ScrollView className="flex-1 mx-[5%]">
  68. <View style={{ marginTop: 25 }}>
  69. <Pressable
  70. onPress={() => {
  71. if (router.canGoBack()) {
  72. router.back();
  73. } else {
  74. router.replace('/accountMainPage');
  75. }
  76. }}
  77. >
  78. <CrossLogoSvg />
  79. </Pressable>
  80. <Text style={{ fontSize: 45, marginVertical: 25 }}>
  81. 更改性別
  82. </Text>
  83. <Text className="text-xl ">請選擇新性別</Text>
  84. <View className="py-2">
  85. <View className="flex-1 ">
  86. <DropdownSelect
  87. dropdownOptions={dropdownOption}
  88. placeholder="性別"
  89. onSelect={(t) => {
  90. setGender(t);
  91. }}
  92. extendedStyle={{ width: '100%', padding: 10 }}
  93. />
  94. </View>
  95. </View>
  96. <NormalButton
  97. title={
  98. <Text className="text-white text-lg">
  99. {isLoading ? '更改中...' : '確認'}
  100. </Text>
  101. }
  102. onPress={handleChangeGender}
  103. disabled={isLoading}
  104. />
  105. {error && (
  106. <Text style={{ color: 'red', marginTop: 10 }}>
  107. {error}
  108. </Text>
  109. )}
  110. </View>
  111. </ScrollView>
  112. </SafeAreaView>
  113. );
  114. };
  115. export default ChangeGenderPageComponent;