Skip to content

Commit e250a98

Browse files
authored
merge: 닉네임 Storage저장 로직 추가 (#17)
merge: 닉네임 Storage저장 로직 추가 (#17)
2 parents ff6ef85 + c503ac2 commit e250a98

File tree

10 files changed

+125
-6
lines changed

10 files changed

+125
-6
lines changed

packages/react-native/ios/Podfile.lock

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,6 +1233,8 @@ PODS:
12331233
- React-logger (= 0.74.3)
12341234
- React-perflogger (= 0.74.3)
12351235
- React-utils (= 0.74.3)
1236+
- RNCAsyncStorage (1.24.0):
1237+
- React-Core
12361238
- RNGestureHandler (2.17.1):
12371239
- DoubleConversion
12381240
- glog
@@ -1372,6 +1374,7 @@ DEPENDENCIES:
13721374
- React-runtimescheduler (from `../../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`)
13731375
- React-utils (from `../../../node_modules/react-native/ReactCommon/react/utils`)
13741376
- ReactCommon/turbomodule/core (from `../../../node_modules/react-native/ReactCommon`)
1377+
- "RNCAsyncStorage (from `../../../node_modules/@react-native-async-storage/async-storage`)"
13751378
- RNGestureHandler (from `../../../node_modules/react-native-gesture-handler`)
13761379
- RNPermissions (from `../../../node_modules/react-native-permissions`)
13771380
- RNReanimated (from `../../../node_modules/react-native-reanimated`)
@@ -1504,6 +1507,8 @@ EXTERNAL SOURCES:
15041507
:path: "../../../node_modules/react-native/ReactCommon/react/utils"
15051508
ReactCommon:
15061509
:path: "../../../node_modules/react-native/ReactCommon"
1510+
RNCAsyncStorage:
1511+
:path: "../../../node_modules/@react-native-async-storage/async-storage"
15071512
RNGestureHandler:
15081513
:path: "../../../node_modules/react-native-gesture-handler"
15091514
RNPermissions:
@@ -1579,6 +1584,7 @@ SPEC CHECKSUMS:
15791584
React-runtimescheduler: 0c80752bceb80924cb8a4babc2a8e3ed70d41e87
15801585
React-utils: a06061b3887c702235d2dac92dacbd93e1ea079e
15811586
ReactCommon: f00e436b3925a7ae44dfa294b43ef360fbd8ccc4
1587+
RNCAsyncStorage: ec53e44dc3e75b44aa2a9f37618a49c3bc080a7a
15821588
RNGestureHandler: 8dbcccada4a7e702e7dec9338c251b1cf393c960
15831589
RNPermissions: 4da8c626e4ac9d71c1a199d500d52dd54da62e38
15841590
RNReanimated: 7e6fc1e80f412285a16ac3879b9e4672ffa91cef

packages/react-native/ios/SPOTClient/PrivacyInfo.xcprivacy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
1010
<key>NSPrivacyAccessedAPITypeReasons</key>
1111
<array>
12-
<string>3B52.1</string>
1312
<string>C617.1</string>
13+
<string>3B52.1</string>
1414
</array>
1515
</dict>
1616
<dict>

packages/react-native/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
},
1818
"dependencies": {
1919
"@gorhom/bottom-sheet": "^4.6.4",
20+
"@react-native-async-storage/async-storage": "^1.24.0",
2021
"@react-native-camera-roll/camera-roll": "^7.8.1",
2122
"@react-navigation/bottom-tabs": "^6.6.0",
2223
"@react-navigation/material-top-tabs": "^6.6.14",
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { useRef } from 'react';
2+
import { useQuery } from '@tanstack/react-query';
3+
import { AppStorage } from '@/utils/storage';
4+
5+
interface UseNicknameQueryReturn {
6+
nickname: string;
7+
isLoading: boolean;
8+
isError: boolean;
9+
refetch: () => void;
10+
}
11+
12+
export default function useNicknameQuery() {
13+
const ref = useRef({} as UseNicknameQueryReturn);
14+
15+
const { data, refetch, isLoading, isError } = useQuery({
16+
queryKey: ['nickname'],
17+
queryFn: async () => {
18+
const savedNickname = await AppStorage.getData('nickname');
19+
if (savedNickname) {
20+
return savedNickname;
21+
}
22+
23+
// TODO: 서버데이터 패칭 로직 추가 필요
24+
return '';
25+
},
26+
});
27+
28+
ref.current.nickname = data;
29+
ref.current.isError = isError;
30+
ref.current.isLoading = isLoading;
31+
ref.current.refetch = refetch;
32+
33+
return ref.current;
34+
}

packages/react-native/src/pages/Home.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import SearchBar from '@components/common/SearchBar';
55
import { SpotData } from '@/types/spot';
66
import { HomeStackNavigation } from '@/types/navigation';
77
import BackGroundGradient from '@/layouts/BackGroundGradient';
8+
import useNicknameQuery from '@/apis/queries/useNicknameQuery';
89

910
const mockData: SpotData[] = [
1011
{
@@ -63,12 +64,14 @@ interface HomeScreenProps {
6364
}
6465

6566
export default function Home({ navigation }: HomeScreenProps) {
67+
const { nickname } = useNicknameQuery();
68+
6669
return (
6770
<BackGroundGradient>
6871
<View className="flex flex-col gap-10 p-4">
6972
<View>
7073
<Font type="title1" color="white">
71-
안녕하세요, 아무개님.{'\n'}오늘은 어디로 가 볼까요?
74+
안녕하세요, {nickname}{'\n'}오늘은 어디로 가 볼까요?
7275
</Font>
7376
{/* FIXME: 추후 삭제 */}
7477
<Button onPress={() => navigation.navigate('Camera')}>

packages/react-native/src/pages/Login/Login.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,24 @@ import LinearGradient from 'react-native-linear-gradient';
33
import SPOTLogo from '@assets/SPOTLogo';
44
import { SocialLogin } from 'design-system';
55
import { ScreenNavigationProp } from '@/types/navigation';
6+
import { AppStorage } from '@/utils/storage';
67

78
interface LoginPageProps {
89
navigation: ScreenNavigationProp<'Login'>;
910
}
1011

1112
export default function Login({ navigation }: LoginPageProps) {
13+
const handleLogin = async () => {
14+
// TODO: 토큰 검사로 변경되어야함
15+
const nickname = await AppStorage.getData('nickname');
16+
17+
if (!nickname) {
18+
return navigation.navigate('Signup');
19+
}
20+
21+
return navigation.navigate('Main');
22+
};
23+
1224
return (
1325
<LinearGradient
1426
colors={['#FF1919', '#000000']}
@@ -19,10 +31,10 @@ export default function Login({ navigation }: LoginPageProps) {
1931
<SPOTLogo />
2032
<View className="flex flex-col w-full px-4 gap-4">
2133
<View>
22-
<SocialLogin.Apple onPress={() => navigation.navigate('Signup')} />
34+
<SocialLogin.Apple onPress={handleLogin} />
2335
</View>
2436
<View>
25-
<SocialLogin.Kakao onPress={() => navigation.navigate('Signup')} />
37+
<SocialLogin.Kakao onPress={handleLogin} />
2638
</View>
2739
</View>
2840
</SafeAreaView>

packages/react-native/src/pages/MyPage.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ import Badge from '@/components/mypage/Badge';
66
import EditButton from '@/components/common/EditButton';
77
import MyPageTabNavigator from '@/routes/MyPageTabNavigator';
88
import { MyPageStackNavigation } from '@/types/navigation';
9+
import useNicknameQuery from '@/apis/queries/useNicknameQuery';
910

1011
interface MyPageProps {
1112
navigation: MyPageStackNavigation<'myPage/profile'>;
1213
}
1314

1415
export default function MyPage({ navigation }: MyPageProps) {
16+
const { nickname } = useNicknameQuery();
1517
return (
1618
<BackGroundGradient marginTop={40}>
1719
<View className="flex">
@@ -32,7 +34,7 @@ export default function MyPage({ navigation }: MyPageProps) {
3234
<View className="mt-2">
3335
{/* FIXME: 실제 닉네임 받아와서 설정 */}
3436
<Font type="mainTitle" color="white">
35-
닉네임네임
37+
{nickname}
3638
</Font>
3739
</View>
3840
</View>

packages/react-native/src/pages/Signup/Profile.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import Overlay from '@/components/signup/common/Overlay';
66
import { SignupRouteProps, SignupStackNavigation } from '@/types/navigation';
77
import useProfileImage from '@/hooks/useProfileImage';
88
import SignupHeader from '@/components/signup/common/Header';
9+
import { AppStorage } from '@/utils/storage';
910

1011
interface ProfileProps {
1112
navigation: SignupStackNavigation<'Signup/Profile'>;
@@ -16,9 +17,10 @@ export default function Profile({ navigation }: ProfileProps) {
1617
const route = useRoute<SignupRouteProps<'Signup/Profile'>>();
1718
const { nickname } = route.params;
1819

19-
const handleNext = () => {
20+
const handleNext = async () => {
2021
if (!photoUri) return;
2122

23+
await AppStorage.saveData({ key: 'nickname', value: nickname });
2224
navigation.navigate('Main');
2325
};
2426

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import AsyncStorage from '@react-native-async-storage/async-storage';
2+
3+
// Storage에 안전하게 데이터를 저장하기 위한 타입입니다.
4+
// key에는 리터럴타입, value는 저장할 데이터 타입을 지정해주세요.
5+
interface NicknameStorage {
6+
key: 'nickname';
7+
value: string;
8+
}
9+
10+
// 위에서 작성한 타입을 유니온 타입형태로 여기에 추가해주세요. key, value를 갖는 인터페이스여야합니다.
11+
type StorageData = NicknameStorage;
12+
13+
const getData = async (key: StorageData['key']) => {
14+
const stringData = await AsyncStorage.getItem(key);
15+
16+
if (stringData) {
17+
return JSON.parse(stringData);
18+
}
19+
20+
return null;
21+
};
22+
23+
const saveData = async ({ key, value }: StorageData) => {
24+
const stringifiedObject = JSON.stringify(value);
25+
await AsyncStorage.setItem(key, stringifiedObject);
26+
};
27+
28+
export const AppStorage = {
29+
getData,
30+
saveData,
31+
};

yarn.lock

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2956,6 +2956,17 @@ __metadata:
29562956
languageName: node
29572957
linkType: hard
29582958

2959+
"@react-native-async-storage/async-storage@npm:^1.24.0":
2960+
version: 1.24.0
2961+
resolution: "@react-native-async-storage/async-storage@npm:1.24.0"
2962+
dependencies:
2963+
merge-options: ^3.0.4
2964+
peerDependencies:
2965+
react-native: ^0.0.0-0 || >=0.60 <1.0
2966+
checksum: 7e56a2e97f48332f57c56ebf473b763c7ca2b1ef82f4b5f8e1c73350231ec91b8eafc4e4d1f972c4c1005da0d304816fa725dc6f07a8a7543e90f8bd16c22ab4
2967+
languageName: node
2968+
linkType: hard
2969+
29592970
"@react-native-camera-roll/camera-roll@npm:^7.8.1":
29602971
version: 7.8.1
29612972
resolution: "@react-native-camera-roll/camera-roll@npm:7.8.1"
@@ -11039,6 +11050,13 @@ __metadata:
1103911050
languageName: node
1104011051
linkType: hard
1104111052

11053+
"is-plain-obj@npm:^2.1.0":
11054+
version: 2.1.0
11055+
resolution: "is-plain-obj@npm:2.1.0"
11056+
checksum: cec9100678b0a9fe0248a81743041ed990c2d4c99f893d935545cfbc42876cbe86d207f3b895700c690ad2fa520e568c44afc1605044b535a7820c1d40e38daa
11057+
languageName: node
11058+
linkType: hard
11059+
1104211060
"is-plain-object@npm:5.0.0":
1104311061
version: 5.0.0
1104411062
resolution: "is-plain-object@npm:5.0.0"
@@ -12453,6 +12471,15 @@ __metadata:
1245312471
languageName: node
1245412472
linkType: hard
1245512473

12474+
"merge-options@npm:^3.0.4":
12475+
version: 3.0.4
12476+
resolution: "merge-options@npm:3.0.4"
12477+
dependencies:
12478+
is-plain-obj: ^2.1.0
12479+
checksum: d86ddb3dd6e85d558dbf25dc944f3527b6bacb944db3fdda6e84a3f59c4e4b85231095f58b835758b9a57708342dee0f8de0dffa352974a48221487fe9f4584f
12480+
languageName: node
12481+
linkType: hard
12482+
1245612483
"merge-stream@npm:^2.0.0":
1245712484
version: 2.0.0
1245812485
resolution: "merge-stream@npm:2.0.0"
@@ -14833,6 +14860,7 @@ __metadata:
1483314860
"@babel/runtime": ^7.20.0
1483414861
"@gorhom/bottom-sheet": ^4.6.4
1483514862
"@jest/globals": ^29.7.0
14863+
"@react-native-async-storage/async-storage": ^1.24.0
1483614864
"@react-native-camera-roll/camera-roll": ^7.8.1
1483714865
"@react-native-community/eslint-config": ^3.2.0
1483814866
"@react-native/babel-preset": 0.74.84

0 commit comments

Comments
 (0)