123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- import { useState, useEffect, useRef } from 'react';
- import { Text, View, Button, Platform } from 'react-native';
- import * as Device from 'expo-device';
- import * as Notifications from 'expo-notifications';
- import Constants from 'expo-constants';
-
-
- Notifications.setNotificationHandler({
- handleNotification: async () => ({
- shouldShowAlert: true,
- shouldPlaySound: true,
- shouldSetBadge: true,
- }),
- });
-
-
-
- // async function sendPushNotification(expoPushToken: string) {
- // const message = {
- // to: expoPushToken,
- // sound: 'default',
- // title: 'Original Title',
- // body: 'And here is the body!',
- // data: { someData: 'goes here' },
- // };
-
- // await fetch('https://exp.host/--/api/v2/push/send', {
- // method: 'POST',
- // headers: {
- // Accept: 'application/json',
- // 'Accept-encoding': 'gzip, deflate',
- // 'Content-Type': 'application/json',
- // },
- // body: JSON.stringify(message),
- // });
- // }
-
-
- function handleRegistrationError(errorMessage: string) {
- alert(errorMessage);
- throw new Error(errorMessage);
- }
-
- async function registerForPushNotificationsAsync() {
- if (Platform.OS === 'android') {
- Notifications.setNotificationChannelAsync('default', {
- name: 'default',
- importance: Notifications.AndroidImportance.MAX,
- vibrationPattern: [0, 250, 250, 250],
- lightColor: '#FF231F7C',
- });
- }
-
- if (Device.isDevice) {
- const { status: existingStatus } = await Notifications.getPermissionsAsync();
- let finalStatus = existingStatus;
- if (existingStatus !== 'granted') {
- const { status } = await Notifications.requestPermissionsAsync();
- finalStatus = status;
- }
- if (finalStatus !== 'granted') {
- handleRegistrationError('Permission not granted to get push token for push notification!');
- return;
- }
- const projectId = "1111cd70-7f71-4435-9db3-1c131ada169d";
- //Constants?.expoConfig?.extra?.eas?.projectId ?? Constants?.easConfig?.projectId;
- if (!projectId) {
- handleRegistrationError('Project ID not found');
- }
- try {
- const pushTokenString = (
- await Notifications.getExpoPushTokenAsync({
- projectId,
- })
- ).data;
- console.log(pushTokenString);
- return pushTokenString;
- } catch (e: unknown) {
- handleRegistrationError(`${e}`);
- }
- } else {
- handleRegistrationError('Must use physical device for push notifications');
- }
- }
-
- export default function PushNotification() {
- const [expoPushToken, setExpoPushToken] = useState('');
- const [notification, setNotification] = useState<Notifications.Notification | undefined>(
- undefined
- );
- const notificationListener = useRef<Notifications.EventSubscription>();
- const responseListener = useRef<Notifications.EventSubscription>();
-
- useEffect(() => {
- registerForPushNotificationsAsync()
- .then(token => setExpoPushToken(token ?? ''))
- .catch((error: any) => setExpoPushToken(`${error}`));
-
- notificationListener.current = Notifications.addNotificationReceivedListener(notification => {
- setNotification(notification);
- });
-
- responseListener.current = Notifications.addNotificationResponseReceivedListener(response => {
- console.log(response);
- });
-
- return () => {
- notificationListener.current &&
- Notifications.removeNotificationSubscription(notificationListener.current);
- responseListener.current &&
- Notifications.removeNotificationSubscription(responseListener.current);
- };
- }, []);
-
- return (
- <View style={{ flex: 1, alignItems: 'center', justifyContent: 'space-around' }}>
- <Text>Your Expo push token: {expoPushToken}</Text>
- <View style={{ alignItems: 'center', justifyContent: 'center' }}>
- <Text>Title: {notification && notification.request.content.title} </Text>
- <Text>Body: {notification && notification.request.content.body}</Text>
- <Text>Data: {notification && JSON.stringify(notification.request.content.data)}</Text>
- </View>
- {/* <Button
- title="Press to Send Notification"
- onPress={async () => {
- await sendPushNotification(expoPushToken);
- }}
- /> */}
- </View>
- );
- }
|