-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathApp.tsx
More file actions
183 lines (167 loc) · 6.28 KB
/
App.tsx
File metadata and controls
183 lines (167 loc) · 6.28 KB
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
import React, { useCallback, useEffect, useState } from 'react';
import { SafeAreaView, StyleSheet, PermissionsAndroid, Alert, Platform, Modal, View, Text, Button } from 'react-native';
import { WebView, WebViewMessageEvent } from 'react-native-webview';
import messaging from '@react-native-firebase/messaging';
import { check, request, PERMISSIONS, RESULTS } from 'react-native-permissions';
import Tts from 'react-native-tts';
const App = () => {
const [fcmToken, setFcmToken] = useState<string | null>(null);
// FCM 토큰을 가져오는 함수
const getFcmToken = async () => {
try {
const token = await messaging().getToken();
setFcmToken(token); // 상태에 토큰 저장
} catch (error) {
console.error('FCM 토큰을 가져오는 데 실패했습니다:', error);
}
};
// 오디오 권한 요청 함수
const requestAudioPermissions = async () => {
if (Platform.OS === 'android') {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
{
title: '오디오 권한 요청',
message: '이 앱이 오디오를 녹음할 수 있도록 권한을 허용해 주세요.',
buttonNeutral: '나중에',
buttonNegative: '거부',
buttonPositive: '허용',
},
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
console.log('오디오 권한이 허용되었습니다.');
} else {
console.log('오디오 권한이 거부되었습니다.');
Alert.alert('오디오 권한이 필요합니다.');
}
} catch (err) {
console.warn(err);
}
} else if (Platform.OS === 'ios') {
const result = await check(PERMISSIONS.IOS.MICROPHONE);
if (result === RESULTS.GRANTED) {
console.log('오디오 권한이 이미 허용되었습니다.');
} else {
const requestResult = await request(PERMISSIONS.IOS.MICROPHONE);
if (requestResult === RESULTS.GRANTED) {
console.log('오디오 권한이 허용되었습니다.');
} else {
console.log('오디오 권한이 거부되었습니다.');
Alert.alert('오디오 권한이 필요합니다.');
}
}
}
};
// 연락처 권한 요청 함수
const requestContactsPermissions = async () => {
if (Platform.OS === 'android') {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.READ_CONTACTS,
{
title: '연락처 권한 요청',
message: '이 앱이 연락처에 접근할 수 있도록 권한을 허용해 주세요.',
buttonNeutral: '나중에',
buttonNegative: '거부',
buttonPositive: '허용',
},
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
console.log('연락처 권한이 허용되었습니다.');
} else {
console.log('연락처 권한이 거부되었습니다.');
Alert.alert('연락처 권한이 필요합니다.');
}
} catch (err) {
console.warn(err);
}
} else if (Platform.OS === 'ios') {
const result = await check(PERMISSIONS.IOS.CONTACTS);
if (result === RESULTS.GRANTED) {
console.log('연락처 권한이 이미 허용되었습니다.');
} else {
const requestResult = await request(PERMISSIONS.IOS.CONTACTS);
if (requestResult === RESULTS.GRANTED) {
console.log('연락처 권한이 허용되었습니다.');
} else {
console.log('연락처 권한이 거부되었습니다.');
Alert.alert('연락처 권한이 필요합니다.');
}
}
}
};
const requestCallPermissions = async () => {
if (Platform.OS === 'android') {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CALL_PHONE,
{
title: '전화 권한 요청',
message: '이 앱이 전화를 걸 수 있도록 권한을 허용해 주세요.',
buttonNeutral: '나중에',
buttonNegative: '거부',
buttonPositive: '허용',
},
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
console.log('전화 권한이 허용되었습니다.');
} else {
console.log('전화 권한이 거부되었습니다.');
Alert.alert('전화 권한이 필요합니다.');
}
} catch (err) {
console.warn(err);
}
} else if (Platform.OS === 'ios') {
// iOS에서의 권한 요청 로직 (필요시 추가)
}
};
const handleMessage = useCallback((event: WebViewMessageEvent) => { // 타입 지정
const message = event.nativeEvent.data;
console.log("handleMessage", message);
try {
const parsedMessage = JSON.parse(message);
if (parsedMessage.message === "speechSynthesis을 지원하지 않습니다.") { // 메시지 감지
console.log("감지된 메시지:", parsedMessage);
Tts.speak(parsedMessage.assistantResponse); // TTS로 assistantResponse 읽기
}
} catch (error) {
console.error("메시지 파싱 오류:", error);
}
}, []);
useEffect(() => {
Tts.setDefaultLanguage('ko-KR'); // 한국어로 설정
Tts.setDefaultRate(0.5); // 속도 설정
// 알림 권한 요청 (iOS 전용)
messaging().requestPermission().then(permission => {
if (permission) {
console.log('알림 권한이 허용되었습니다.');
getFcmToken(); // FCM 토큰 가져오기
} else {
console.log('알림 권한이 거부되었습니다.');
}
});
requestAudioPermissions();
requestContactsPermissions();
requestCallPermissions();
}, []);
return (
<SafeAreaView style={styles.container}>
<WebView
// 웹뷰에서 특정 URL 로드
source={{ uri: 'http:/192.168.0.82:3000?token=' + (fcmToken ? encodeURIComponent(fcmToken) : '') }}
style={{ flex: 1 }}
originWhitelist={['*']}
mediaPlaybackRequiresUserAction={false}
onMessage={handleMessage}
/>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
});
export default App;