changeNamePageComponent.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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 NormalInput from '../global/normal_input';
  8. import NormalButton from '../global/normal_button';
  9. import { authenticationService } from '../../service/authService';
  10. import * as SecureStore from 'expo-secure-store';
  11. import { useTranslation } from '../../util/hooks/useTranslation';
  12. const ChangeNamePageComponent = () => {
  13. const { user, setUser } = useContext(AuthContext);
  14. const [token, setToken] = useState<string | null>(null);
  15. const [name, setName] = useState<string | null>(null);
  16. const [isLoading, setIsLoading] = useState(false);
  17. const [error, setError] = useState<string | null>(null);
  18. const { t } = useTranslation();
  19. useEffect(() => {
  20. const getToken = async () => {
  21. const storedToken = await SecureStore.getItemAsync('accessToken');
  22. setToken(storedToken);
  23. };
  24. getToken();
  25. }, []);
  26. const handleChangeName = async () => {
  27. if (!name) {
  28. setError(t('accountSettings.change_name.enter_new_nickname_error'));
  29. return;
  30. }
  31. if (!token) {
  32. setError(t('accountSettings.change_name.no_token_error'));
  33. return;
  34. }
  35. setError(null);
  36. setIsLoading(true);
  37. try {
  38. const success = await authenticationService.changeName(name, token);
  39. if (success) {
  40. if (user) {
  41. setUser({
  42. ...user,
  43. nickname: name
  44. });
  45. }
  46. router.replace('accountMainPage');
  47. } else {
  48. setError(t('accountSettings.change_name.update_failed'));
  49. }
  50. } catch (error) {
  51. console.error('Error changing name:', error);
  52. setError(t('accountSettings.change_name.general_error'));
  53. } finally {
  54. setIsLoading(false);
  55. }
  56. };
  57. return (
  58. <SafeAreaView
  59. className="flex-1 bg-white"
  60. edges={['top', 'right', 'left']}
  61. >
  62. <ScrollView className="flex-1 mx-[5%]">
  63. <View style={{ marginTop: 25 }}>
  64. <Pressable
  65. onPress={() => {
  66. if (router.canGoBack()) {
  67. router.back();
  68. } else {
  69. router.replace('/accountMainPage');
  70. }
  71. }}
  72. >
  73. <CrossLogoSvg />
  74. </Pressable>
  75. <Text style={{ fontSize: 45, marginVertical: 25 }}>
  76. {t('accountSettings.change_name.change_nickname_title')}
  77. </Text>
  78. <Text className="text-xl ">{t('accountSettings.change_name.enter_new_name')}</Text>
  79. <View className="py-2">
  80. <NormalInput
  81. placeholder={user?.nickname || ''}
  82. onChangeText={(t) => setName(t)}
  83. editable={!isLoading}
  84. />
  85. </View>
  86. {error && (
  87. <Text className="text-red-500 py-2">{error}</Text>
  88. )}
  89. <NormalButton
  90. title={
  91. <Text className="text-white">
  92. {isLoading ? t('accountSettings.change_name.changing') : t('common.confirm')}
  93. </Text>
  94. }
  95. disabled={isLoading}
  96. onPress={handleChangeName}
  97. />
  98. </View>
  99. </ScrollView>
  100. </SafeAreaView>
  101. );
  102. };
  103. export default ChangeNamePageComponent;