changeGenderPageComponent.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. import { useTranslation } from '../../util/hooks/useTranslation';
  12. const ChangeGenderPageComponent = () => {
  13. const { user, setUser } = useContext(AuthContext);
  14. const [token, setToken] = useState<string | null>(null);
  15. const [gender, setGender] = useState<string | null>(null);
  16. const [isLoading, setIsLoading] = useState(false);
  17. const [error, setError] = useState<string | null>(null);
  18. const { t } = useTranslation();
  19. const dropdownOption = [
  20. { label: t('accountSettings.change_gender.male'), value: 'man' },
  21. { label: t('accountSettings.change_gender.female'), value: 'woman' }
  22. ];
  23. useEffect(() => {
  24. const getToken = async () => {
  25. const storedToken = await SecureStore.getItemAsync('accessToken');
  26. setToken(storedToken);
  27. };
  28. getToken();
  29. }, []);
  30. const handleChangeGender = async () => {
  31. if (!gender) {
  32. setError(t('accountSettings.change_gender.select_gender_error'));
  33. return;
  34. }
  35. if (!token) {
  36. setError(t('accountSettings.change_gender.no_token_error'));
  37. return;
  38. }
  39. setError(null);
  40. setIsLoading(true);
  41. try {
  42. const success = await authenticationService.changeGender(
  43. gender,
  44. token
  45. );
  46. if (success) {
  47. if (user) {
  48. setUser({
  49. ...user,
  50. gender: gender
  51. });
  52. }
  53. router.replace('accountMainPage');
  54. } else {
  55. setError(t('accountSettings.change_gender.update_failed'));
  56. }
  57. } catch (error) {
  58. console.error('Error changing gender:', error);
  59. setError(t('accountSettings.change_gender.general_error'));
  60. } finally {
  61. setIsLoading(false);
  62. }
  63. };
  64. return (
  65. <SafeAreaView
  66. className="flex-1 bg-white"
  67. edges={['top', 'right', 'left']}
  68. >
  69. <ScrollView className="flex-1 mx-[5%]">
  70. <View style={{ marginTop: 25 }}>
  71. <Pressable
  72. onPress={() => {
  73. if (router.canGoBack()) {
  74. router.back();
  75. } else {
  76. router.replace('/accountMainPage');
  77. }
  78. }}
  79. >
  80. <CrossLogoSvg />
  81. </Pressable>
  82. <Text style={{ fontSize: 45, marginVertical: 25 }}>
  83. {t('accountSettings.change_gender.change_gender_title')}
  84. </Text>
  85. <Text className="text-xl ">{t('accountSettings.change_gender.select_new_gender')}</Text>
  86. <View className="py-2">
  87. <View className="flex-1 ">
  88. <DropdownSelect
  89. dropdownOptions={dropdownOption}
  90. placeholder={t('accountSettings.change_gender.gender')}
  91. onSelect={(t) => {
  92. setGender(t);
  93. }}
  94. extendedStyle={{ width: '100%', padding: 10 }}
  95. />
  96. </View>
  97. </View>
  98. <NormalButton
  99. title={
  100. <Text className="text-white text-lg">
  101. {isLoading ? t('accountSettings.change_gender.changing') : t('common.confirm')}
  102. </Text>
  103. }
  104. onPress={handleChangeGender}
  105. disabled={isLoading}
  106. />
  107. {error && (
  108. <Text style={{ color: 'red', marginTop: 10 }}>
  109. {error}
  110. </Text>
  111. )}
  112. </View>
  113. </ScrollView>
  114. </SafeAreaView>
  115. );
  116. };
  117. export default ChangeGenderPageComponent;