Skip to content

Commit 4e3ec01

Browse files
committed
update
1 parent db23881 commit 4e3ec01

File tree

2 files changed

+266
-0
lines changed

2 files changed

+266
-0
lines changed

_posts/ReactNative/2023-05-08-18 사진공유앱시작.md

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,113 @@ useReducer라는게 있음.
116116
const [state, dispatch] = useReducer(reducer, init);
117117
```
118118

119+
```
120+
state: 상태 변수
121+
dispatch : reducer로 action 을 전달하는 함수
122+
action : 현재 상태를 어떻게 변경해야하는지에 대한 행동 지침
123+
reducer : state와 action을 받아서 변경된 상태를 변환하는 함수
124+
125+
```
126+
127+
사용예시는 다음과 같다.
128+
129+
```jsx
130+
const init = 0;
131+
const CountType = {
132+
INCREMENT: 'INCREMENT',
133+
DECREMENT: 'DECREMENT',
134+
};
135+
const reducer = (state, action) => {
136+
switch (action) {
137+
case 'INCREMENT':
138+
return state + 1;
139+
case 'DECREMENT':
140+
return state - 1;
141+
default:
142+
return state;
143+
}
144+
};
145+
146+
...
147+
148+
const [resultVal, dispatch] = useReducer(reducer, init);
149+
150+
return (
151+
<View style={styles.container}>
152+
<Text style={styles.title}>{resultVal}</Text>
153+
<Button title={'+'} onPress={() => dispatch(CountType.INCREMENT)} />
154+
<Button title={'-'} onPress={() => dispatch(CountType.DECREMENT)} />
155+
</View>
156+
);
157+
```
158+
159+
위와 같이 사용하면 dispatch 를 통해 action 값을 전달해주고
160+
reducer 안에서 action을 받아서 그에 따라 동작하게 만들어주면 됨.
161+
162+
더 직관적으로 사용할 수 있게 된다.
163+
값을 전달할수도 있어서, 전달된 값을 더하거나 뺄 수도 있다.
164+
165+
reducer는 반드시 순수함수여야한다.
166+
167+
순수함수란 입력데이터를 의존하지 않고, 외부 데이터를 변형하지 않는다.
168+
그냥 받아서 사용하기만 하면 됨.
169+
state나 action을 변형시키면 안됨
170+
그냥 딱 result 만 줘야 함.
171+
172+
순수함수가 아니면??
173+
동작하지 않는다.
174+
175+
원리에 대해서도 확인해주는데
176+
객체를 변경할 때, 주소값을 변경해주기 때문에
177+
어차피 변경되는 것이 없다고 판단한다..
178+
179+
## 화면전환에 흰화면 뜸
180+
181+
화면 구동 시...
182+
파일을 읽어오는데 구동되는데 시간이 걸리므로
183+
캐싱함.
184+
185+
assets를 cache에 넣으려면?
186+
187+
SplashScreen 이라는걸 사용하면 됨.
188+
189+
App.js 에
190+
191+
```jsx
192+
useEffect(() => {
193+
(async () => {
194+
try {
195+
SplashScreen.preventAutoHideAsync();
196+
// Image 캐싱
197+
} catch (error) {
198+
console.log(error);
199+
}
200+
})();
201+
}, []);
202+
```
203+
204+
위코드를 두면
205+
preventAutoHideAsync에 의해서
206+
처음에 빌드가 다 되어도 SplashScreen을 계속 띄운다.
207+
208+
최종 코드
209+
210+
```jsx
211+
useEffect(() => {
212+
(async () => {
213+
try {
214+
await SplashScreen.preventAutoHideAsync();
215+
await Asset.fromModule(
216+
require('../assets/cover.png'),
217+
).downloadAsync();
218+
// Image 캐싱
219+
} catch (error) {
220+
console.log(error);
221+
} finally {
222+
setIsReady(true);
223+
}
224+
})();
225+
}, []);
226+
```
227+
119228
{%endraw%}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
---
2+
layout: post
3+
title: Firebase 연동하기
4+
subtitle: React Native 강의 19강
5+
tags: [React Native]
6+
author: Young
7+
comments: True
8+
---
9+
10+
{%raw%}
11+
12+
```js
13+
import { initializeApp } from 'firebase/app';
14+
import { firebaseConfig } from '../env';
15+
16+
export const initFirebase = () => {
17+
return initializeApp(firebaseConfig);
18+
};
19+
```
20+
21+
위와 같이 사용하면 됨.
22+
결과는 key 값들 가져옴.
23+
24+
app.js에서 가져오는게 좋겠고
25+
26+
## 인증하기
27+
28+
Firebase -> Authentification
29+
30+
#### 1. 시작하기
31+
32+
이메일 비밀번호, 사용하고 저장해주면 됨
33+
34+
#### 2. 사용하는 방법
35+
36+
firebase 문서에서 `signInWithEmailAndPassword` 를 찾아 아래와 같이 사용한다.
37+
38+
auth.js
39+
40+
```jsx
41+
import { getAuth, signInWithEmailAndPassword } from 'firebase/auth';
42+
43+
export const signIn = async ({ email, password }) => {
44+
const { user } = await signInWithEmailAndPassword(
45+
getAuth(),
46+
email,
47+
password,
48+
);
49+
return user;
50+
};
51+
```
52+
53+
저러면 user 정보로 잘 가져오는 것을 확인할 수 있다.
54+
55+
## LogBox 무시
56+
57+
```jsx
58+
LogBox.ignoreLogs(['AsyncStorage has been extracted from react-native core']);
59+
```
60+
61+
위와 같이 사용하면 LogBox를 무시할 수 있다.
62+
당연히 남용은 금물
63+
64+
## 로그인 실패 시 Alert
65+
66+
```jsx
67+
export const getAuthErrorMessage = errorCode => {
68+
switch (errorCode) {
69+
case AuthErrorCodes.USER_DELETED:
70+
return '계정을 찾을 수 없습니다.';
71+
case AuthErrorCodes.INVALID_EMAIL:
72+
return '유효하지 않은 이메일 주소입니다.';
73+
case AuthErrorCodes.INVALID_PASSWORD:
74+
return '잘못된 비밀번호입니다.';
75+
default:
76+
return '로그인에 실패하였습니다.';
77+
}
78+
};
79+
```
80+
81+
위와 같이 AuthErrorCodes 에서 Validate 넘겨서
82+
Alert Message 만들어주면 됨.
83+
84+
```jsx
85+
try {
86+
const user = await signIn(form);
87+
console.log(user);
88+
} catch (error) {
89+
const message = getAuthErrorMessage(error.code);
90+
Alert.alert('로그인 실패', message);
91+
}
92+
```
93+
94+
## 회원가입 기능 만들기
95+
96+
`createUserWithEmailAndPassword` 를 사용하면 됨.
97+
98+
```jsx
99+
export const signUp = async ({ email, password }) => {
100+
const { user } = await createUserWithEmailAndPassword(
101+
getAuth(),
102+
email,
103+
password,
104+
);
105+
return user;
106+
};
107+
```
108+
109+
그 외엔 로그인과 동일하게 처리해주면 됨.
110+
111+
## 상태변수 수정에 대하여
112+
113+
예를들어 아래와 같은 코드가 있다고 가정하자.
114+
115+
```jsx
116+
dispatch({ type: AuthFormTypes.TOGGLE_LOADING });
117+
try {
118+
const user = await signUp(form);
119+
setUser(user);
120+
} catch (error) {
121+
const message = getAuthErrorMessage(error.code);
122+
Alert.alert('회원가입 실패', message);
123+
}
124+
dispatch({ type: AuthFormTypes.TOGGLE_LOADING });
125+
```
126+
127+
그러면 setUser가 정상적으로 진행되었을 때
128+
Stack 자체가 하나는 unmount 하나는 mount 되면서
129+
130+
그 이후에 dispatch 함수는 실행이 되지 않는다. (상태변수는 수정이 되지 않는다.)
131+
132+
그래서 실패한 경우에만 dispatch를 넣어주면 된다.
133+
134+
```jsx
135+
dispatch({ type: AuthFormTypes.TOGGLE_LOADING });
136+
try {
137+
const user = await signUp(form);
138+
setUser(user);
139+
} catch (error) {
140+
const message = getAuthErrorMessage(error.code);
141+
Alert.alert('회원가입 실패', message, [
142+
{
143+
text: '확인',
144+
onPress: () => dispatch({ type: AuthFormTypes.TOGGLE_LOADING }),
145+
},
146+
]);
147+
}
148+
```
149+
150+
## 로그인 유지하기
151+
152+
firebase에서 로그인 유지하는 기능이 있음.
153+
154+
`onAuthStateChanged()`를 사용할 것!
155+
그리구 expo48 버전부터는 AsyncStorage랑 같이 써야한다고 함.
156+
157+
{%endraw%}

0 commit comments

Comments
 (0)