Skip to content

Commit 5bedb86

Browse files
committed
Enhance user setup process by adding character selection functionality, updating API endpoints, and improving token validation in request interceptor.
1 parent aa874c7 commit 5bedb86

7 files changed

Lines changed: 193 additions & 113 deletions

File tree

src/api/client.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,13 @@ apiClient.interceptors.request.use(
2222
!config.url?.includes(API_ENDPOINTS.AUTH_LOGIN) &&
2323
!config.url?.includes(API_ENDPOINTS.AUTH_REGISTER)
2424
) {
25-
config.headers.Authorization = `Bearer ${token}`;
25+
if (token.split('.').length === 3) {
26+
config.headers.Authorization = `Bearer ${token}`;
27+
} else {
28+
console.error('Invalid token format');
29+
await AsyncStorage.removeItem('userToken');
30+
await AsyncStorage.removeItem('refreshToken');
31+
}
2632
}
2733
return config;
2834
},

src/api/endpoints.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export const API_ENDPOINTS = {
66

77
USER_ME: '/users/me',
88
USER_UPDATE: '/users/me',
9+
USER_CHARACTER: '/users/me/character',
910

1011
TRANSACTION: '/transactions',
1112
};

src/api/userService.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,24 @@ import useSWR from 'swr';
44
import {useAuth} from '../contexts/AuthContext';
55

66
interface UserProfileResponse {
7+
id: string;
8+
email: string;
9+
name: string;
10+
character: {
11+
id: string;
12+
image_url: string;
13+
};
714
wallet: {
815
diamonds: number;
916
saving: number;
1017
};
1118
}
1219

20+
interface SetCharacterRequest {
21+
character_id: string;
22+
image_url: string;
23+
}
24+
1325
export const userService = {
1426
getUserProfile: async (): Promise<UserProfileResponse> => {
1527
const response = await apiClient.get(API_ENDPOINTS.USER_ME);
@@ -20,6 +32,13 @@ export const userService = {
2032
const response = await apiClient.put(API_ENDPOINTS.USER_UPDATE, userData);
2133
return response.data;
2234
},
35+
36+
setCharacter: async (
37+
data: SetCharacterRequest,
38+
): Promise<UserProfileResponse> => {
39+
const response = await apiClient.put(API_ENDPOINTS.USER_CHARACTER, data);
40+
return response.data;
41+
},
2342
};
2443

2544
export const useUserProfile = () => {
@@ -49,10 +68,21 @@ export const useUserProfileManager = () => {
4968
}
5069
};
5170

71+
const setCharacter = async (data: SetCharacterRequest) => {
72+
try {
73+
const updatedUser = await userService.setCharacter(data);
74+
mutate(updatedUser, false);
75+
return updatedUser;
76+
} catch (error) {
77+
throw error;
78+
}
79+
};
80+
5281
return {
5382
user,
5483
isLoading,
5584
isError,
5685
updateProfile,
86+
setCharacter,
5787
};
5888
};

src/navigation/AppNavigator.tsx

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,32 @@
1-
import React, {useEffect, useState} from 'react';
2-
import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
1+
import React, {useState, useEffect} from 'react';
32
import {createStackNavigator} from '@react-navigation/stack';
4-
import AsyncStorage from '@react-native-async-storage/async-storage';
53
import {useAuth} from '../contexts/AuthContext';
6-
7-
import HomeScreen from '../screens/HomeScreen';
8-
import GachaScreen from '../screens/GachaScreen';
9-
import InvestScreen from '../screens/InvestScreen';
10-
import AnalysisScreen from '../screens/AnalysisScreen';
11-
import BagScreen from '../screens/BagScreen';
12-
import SettingsScreen from '../screens/SettingsScreen';
13-
import TransactionScreen from '../screens/TransactionScreen';
4+
import {useUserProfile} from '../api/userService';
145
import SetUp from '../screens/SetUp';
6+
import TabNavigator from './TabNavigator';
7+
import SettingsScreen from '../screens/SettingsScreen';
158

16-
const Tab = createBottomTabNavigator();
179
const Stack = createStackNavigator();
1810

19-
const TabNavigator = () => {
20-
return (
21-
<Tab.Navigator
22-
screenOptions={{
23-
headerShown: false,
24-
tabBarStyle: {display: 'none'},
25-
}}>
26-
<Tab.Screen name="Home" component={HomeScreen} />
27-
<Tab.Screen name="Gacha" component={GachaScreen} />
28-
<Tab.Screen name="Invest" component={InvestScreen} />
29-
<Tab.Screen name="Analysis" component={AnalysisScreen} />
30-
<Tab.Screen name="Bag" component={BagScreen} />
31-
<Tab.Screen name="TransactionScreen" component={TransactionScreen} />
32-
</Tab.Navigator>
33-
);
34-
};
35-
3611
const AppNavigator = () => {
3712
const {user} = useAuth();
13+
const {user: userProfile, isLoading: isUserLoading} = useUserProfile();
3814
const [initialRoute, setInitialRoute] = useState<string | null>(null);
3915

4016
useEffect(() => {
4117
const checkSetup = async () => {
42-
if (!user?.uid) {return;}
43-
const key = `setupDone-${user.uid}`;
44-
const setupDone = await AsyncStorage.getItem(key);
45-
setInitialRoute(setupDone === 'true' ? 'MainTabs' : 'SetUp');
18+
if (!user?.uid || isUserLoading) {return;}
19+
20+
if (!userProfile?.character?.id) {
21+
setInitialRoute('SetUp');
22+
} else {
23+
setInitialRoute('MainTabs');
24+
}
4625
};
4726
checkSetup();
48-
}, [user]);
27+
}, [user, userProfile, isUserLoading]);
4928

50-
if (!initialRoute) {return null;}
29+
if (!initialRoute || isUserLoading) {return null;}
5130

5231
return (
5332
<Stack.Navigator

src/navigation/TabNavigator.tsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import React from 'react';
2+
import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
3+
import HomeScreen from '../screens/HomeScreen';
4+
import GachaScreen from '../screens/GachaScreen';
5+
import InvestScreen from '../screens/InvestScreen';
6+
import AnalysisScreen from '../screens/AnalysisScreen';
7+
import BagScreen from '../screens/BagScreen';
8+
import TransactionScreen from '../screens/TransactionScreen';
9+
10+
const Tab = createBottomTabNavigator();
11+
12+
const TabNavigator = () => {
13+
return (
14+
<Tab.Navigator
15+
screenOptions={{
16+
headerShown: false,
17+
tabBarStyle: {display: 'none'},
18+
}}>
19+
<Tab.Screen name="Home" component={HomeScreen} />
20+
<Tab.Screen name="Gacha" component={GachaScreen} />
21+
<Tab.Screen name="Invest" component={InvestScreen} />
22+
<Tab.Screen name="Analysis" component={AnalysisScreen} />
23+
<Tab.Screen name="Bag" component={BagScreen} />
24+
<Tab.Screen name="TransactionScreen" component={TransactionScreen} />
25+
</Tab.Navigator>
26+
);
27+
};
28+
29+
export default TabNavigator;

0 commit comments

Comments
 (0)