Skip to content

Commit 2d66e1e

Browse files
authored
Merge pull request #209 from DevKor-github/feat/notification
FCM token 발급 받고 웹뷰에서 서버로 보내기
2 parents d9d79bd + b3eede1 commit 2d66e1e

File tree

5 files changed

+101
-12
lines changed

5 files changed

+101
-12
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { useMutation } from '@tanstack/react-query';
2+
3+
import client from '@/common/utils/client';
4+
5+
const patchFCMToken = async (token: string) => {
6+
const response = await client.patch('/api/v1/user/fcm-token', token, {
7+
headers: {
8+
'Content-Type': 'text/plain',
9+
},
10+
});
11+
return response.data;
12+
};
13+
14+
export const usePatchFCMToken = () => {
15+
return useMutation({
16+
mutationFn: patchFCMToken,
17+
});
18+
};

src/common/apis/useTestFCMToken.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import client from '@/common/utils/client';
2+
import { useMutation } from '@tanstack/react-query';
3+
4+
const testFCMToken = async (token: string) => {
5+
const response = await client.post('/api/test/fcm', token, {
6+
headers: {
7+
'Content-Type': 'text/plain',
8+
},
9+
});
10+
return response.data;
11+
};
12+
13+
export const useTestFCMToken = () => {
14+
return useMutation({
15+
mutationFn: testFCMToken,
16+
});
17+
};
Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,50 @@
1-
import { useEffect, type PropsWithChildren } from 'react';
1+
import { isJSON } from 'es-toolkit';
2+
import { useCallback, useEffect, type PropsWithChildren } from 'react';
3+
4+
import type { NativeMessage } from '@/libs/types/native';
5+
import useGetIsLogin from '@/common/apis/useGetIsLogin';
6+
import { useFCMStore } from '@/common/store/FCMStore';
7+
import { usePatchFCMToken } from '@/common/apis/usePatchFCMToken';
28

39
const NotificationProvider = ({ children }: PropsWithChildren) => {
4-
useEffect(() => {
5-
const handleMessage = (event: MessageEvent) => {
6-
try {
7-
const data = JSON.parse(event.data);
8-
alert(data.message);
9-
} catch (e) {
10-
console.log(e);
10+
const { data: isLogin, isSuccess } = useGetIsLogin();
11+
const { mutate: patchFCMToken } = usePatchFCMToken();
12+
13+
const fcmToken = useFCMStore(state => state.fcmToken);
14+
const setFcmToken = useFCMStore(state => state.setFcmToken);
15+
16+
const isAuth = !!isLogin && isSuccess;
17+
18+
// rn에서 Webview로 보낸 값을 수신하는 함수
19+
const FCMTokenListener = useCallback(
20+
(event: MessageEvent) => {
21+
if (!isJSON(event.data)) return;
22+
23+
const data = JSON.parse(event.data) as NativeMessage<string>;
24+
25+
if (data.type === 'FCM_TOKEN') {
26+
setFcmToken(data.payload);
1127
}
12-
};
28+
},
29+
[setFcmToken],
30+
);
1331

14-
window.addEventListener('message', handleMessage);
32+
useEffect(() => {
33+
if (isAuth && fcmToken) {
34+
patchFCMToken(fcmToken);
35+
}
36+
}, [isAuth, fcmToken, patchFCMToken]);
1537

16-
return () => window.removeEventListener('message', handleMessage);
17-
}, []);
38+
useEffect(() => {
39+
// android, ios 구분하는 코드
40+
document.addEventListener('message', FCMTokenListener as EventListener);
41+
window.addEventListener('message', FCMTokenListener as EventListener);
1842

43+
return () => {
44+
document.removeEventListener('message', FCMTokenListener as EventListener);
45+
window.removeEventListener('message', FCMTokenListener as EventListener);
46+
};
47+
}, [FCMTokenListener]);
1948
return <>{children}</>;
2049
};
2150
export default NotificationProvider;

src/common/store/FCMStore.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { create } from 'zustand';
2+
import { persist } from 'zustand/middleware';
3+
4+
interface FCMStore {
5+
fcmToken: string;
6+
setFcmToken: (fcmToken: string) => void;
7+
}
8+
9+
export const useFCMStore = create<FCMStore>()(
10+
persist(
11+
set => ({
12+
fcmToken: '',
13+
setFcmToken: fcmToken => set({ fcmToken }),
14+
}),
15+
{
16+
name: 'fcm-token-storage', // name of the item in the storage (must be unique)
17+
},
18+
),
19+
);

src/libs/types/native.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export type NativeMessageType = 'FCM_TOKEN';
2+
3+
export interface NativeMessage<T> {
4+
type: NativeMessageType;
5+
payload: T;
6+
}

0 commit comments

Comments
 (0)