-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathApp.tsx
128 lines (113 loc) · 3.56 KB
/
App.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
* 앱의 메인 컴포넌트
*
* 주요 기능:
* - 네비게이션 설정
* - 푸시 알림 처리
* - 쿼리 클라이언트 설정
*/
import {
createNavigationContainerRef,
NavigationContainer,
} from '@react-navigation/native';
import {GestureHandlerRootView} from 'react-native-gesture-handler';
import {QueryClient, QueryClientProvider} from '@tanstack/react-query';
import AppInner, {navigateToYouthListenScreen} from 'AppInner';
import {RootStackParamList} from '@type/nav/RootStackParamList';
import messaging from '@react-native-firebase/messaging';
import {useEffect} from 'react';
// import pushNoti from '@utils/pushNoti';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { StatusBar } from 'react-native';
// 쿼리 클라이언트 설정
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 30, // 30초 동안 데이터를 신선한 상태로 유지
},
},
});
// 네비게이션 참조 생성
export const navigationRef = createNavigationContainerRef<RootStackParamList>();
function App(): React.JSX.Element {
// 포그라운드 상태에서 푸시 알림 처리
useEffect(() => {
(async () => {
const role = await AsyncStorage.getItem('role');
if (role !== 'YOUTH') {
return;
}
const unsubscribe = messaging().onMessage(async remoteMessage => {
console.log('Foreground', remoteMessage);
// pushNoti.displayNoti(remoteMessage);
});
return unsubscribe;
})();
}, []);
// 앱 초기화 및 푸시 알림 설정
useEffect(() => {
(async () => {
const role = await AsyncStorage.getItem('role');
if (role !== 'YOUTH') {
return;
}
requestUserPermission();
// 종료 상태에서 알림을 통해 앱이 실행된 경우
messaging()
.getInitialNotification()
.then(remoteMessage => {
(async () => {
if (remoteMessage) {
const {alarmId} = remoteMessage.data;
// AsyncStorage에 알림 데이터 저장
await AsyncStorage.setItem('alarmId', alarmId);
}
})();
});
// 백그라운드에서 알림을 통해 앱이 실행된 경우
messaging().onNotificationOpenedApp(remoteMessage => {
(async () => {
if (remoteMessage) {
const {alarmId} = remoteMessage.data;
navigateToYouthListenScreen({
alarmId: Number(alarmId),
});
}
})();
});
})();
}, []);
//푸시 알림 권한 요청 함수
const requestUserPermission = async () => {
const authStatus = await messaging().requestPermission();
const enabled =
authStatus === messaging.AuthorizationStatus.AUTHORIZED ||
authStatus === messaging.AuthorizationStatus.PROVISIONAL;
if (enabled) {
return getToken();
}
};
/**
* FCM 토큰 가져오기 및 저장
*/
const getToken = async () => {
const fcmToken = await messaging().getToken();
console.log('디바이스 토큰값', fcmToken);
await AsyncStorage.setItem('fcmToken', fcmToken);
};
return (
<QueryClientProvider client={queryClient}>
<GestureHandlerRootView style={{flex: 1}}>
<NavigationContainer ref={navigationRef}>
<StatusBar
translucent={true}
backgroundColor="transparent"
barStyle="light-content"
/>
<AppInner />
</NavigationContainer>
</GestureHandlerRootView>
</QueryClientProvider>
);
}
export default App;