-
Notifications
You must be signed in to change notification settings - Fork 477
Expand file tree
/
Copy pathPushNotificationService.ts
More file actions
99 lines (84 loc) · 2.38 KB
/
Copy pathPushNotificationService.ts
File metadata and controls
99 lines (84 loc) · 2.38 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
import {Platform} from 'react-native';
import * as Device from 'expo-device';
import * as Notifications from 'expo-notifications';
import axios from 'axios';
import {
secureRetrieveItem,
secureStoreItem,
SECURE_KEYS,
} from './SecureStorageUtils';
import {REGISTER_PUSH_TOKEN} from './APIUtils';
export const registerExpoPushTokenAsync = async (): Promise<string | null> => {
if (!Device.isDevice) {
console.warn('Push notifications require a physical device.');
return null;
}
const {status: existingStatus} = await Notifications.getPermissionsAsync();
let finalStatus = existingStatus;
if (existingStatus !== 'granted') {
const {status} = await Notifications.requestPermissionsAsync();
finalStatus = status;
}
if (finalStatus !== 'granted') {
console.warn('Notification permissions not granted.');
return null;
}
if (Platform.OS === 'android') {
await Notifications.setNotificationChannelAsync('default', {
name: 'default',
importance: Notifications.AndroidImportance.MAX,
vibrationPattern: [0, 250, 250, 250],
lightColor: '#FF231F7C',
});
}
try {
const response = await Notifications.getExpoPushTokenAsync();
const token = response.data;
if (token) {
await secureStoreItem(SECURE_KEYS.EXPO_PUSH_TOKEN, token);
return token;
}
return null;
} catch (error) {
console.error('Failed to get Expo push token:', error);
return null;
}
};
export const getStoredExpoPushToken = async (): Promise<string | null> => {
return secureRetrieveItem(SECURE_KEYS.EXPO_PUSH_TOKEN);
};
export const syncExpoPushTokenWithServer = async (
userToken?: string | null,
): Promise<void> => {
if (!userToken) {
return;
}
const token = await getStoredExpoPushToken();
if (!token) {
return;
}
try {
const headers: Record<string, string> = {};
if (userToken) {
headers.Authorization = `Bearer ${userToken}`;
}
await axios.post(
REGISTER_PUSH_TOKEN,
{ expoPushToken: token },
{ headers },
);
} catch (error) {
console.error('Failed to register push token with server:', error);
}
};
export const registerAndSyncPushToken = async (
userToken?: string | null,
): Promise<void> => {
const token = await registerExpoPushTokenAsync();
if (!token) {
return;
}
if (userToken) {
await syncExpoPushTokenWithServer(userToken);
}
};