1a47a1472SVille Immonenimport Constants from 'expo-constants';
2*9155fd2fSŁukasz Kosmatyimport * as Notifications from 'expo-notifications';
369185572SBartłomiej Bukowski
469185572SBartłomiej Bukowski// In this test app we contact the Expo push service directly. You *never*
569185572SBartłomiej Bukowski// should do this in a real app. You should always store the push tokens on your
669185572SBartłomiej Bukowski// own server or use the local notification API if you want to notify this user.
769185572SBartłomiej Bukowskiconst PUSH_ENDPOINT = 'https://expo.io/--/api/v2/push/send';
869185572SBartłomiej Bukowski
98c3c9794SEric Samelsonexport default async function registerForPushNotificationsAsync() {
1069185572SBartłomiej Bukowski  // this method assumes the user has already granted permission
11*9155fd2fSŁukasz Kosmaty  // to receive remote notifications.
1269185572SBartłomiej Bukowski
1369185572SBartłomiej Bukowski  // Get the token that uniquely identifies this device
14*9155fd2fSŁukasz Kosmaty  const { data: token } = await Notifications.getExpoPushTokenAsync();
1569185572SBartłomiej Bukowski
1669185572SBartłomiej Bukowski  // Log it so we can easily copy it if we need to work with it
1769185572SBartłomiej Bukowski  console.log(`Got this device's push token: ${token}`);
1869185572SBartłomiej Bukowski
1969185572SBartłomiej Bukowski  // POST the token to the Expo push server
2069185572SBartłomiej Bukowski  const response = await fetch(PUSH_ENDPOINT, {
2169185572SBartłomiej Bukowski    method: 'POST',
2269185572SBartłomiej Bukowski    headers: {
23*9155fd2fSŁukasz Kosmaty      Accept: 'application/json',
2469185572SBartłomiej Bukowski      'Content-Type': 'application/json',
2569185572SBartłomiej Bukowski    },
2669185572SBartłomiej Bukowski    body: JSON.stringify([
2769185572SBartłomiej Bukowski      {
2869185572SBartłomiej Bukowski        to: token,
298c3c9794SEric Samelson        title: 'Welcome to Expo!',
308c3c9794SEric Samelson        body: 'Native Component List is registered for push notifications.',
318c3c9794SEric Samelson        data: { example: 'sample data' },
3269185572SBartłomiej Bukowski        _category: `${Constants.manifest.id}:welcome`,
3369185572SBartłomiej Bukowski      },
3469185572SBartłomiej Bukowski    ]),
3569185572SBartłomiej Bukowski  });
3669185572SBartłomiej Bukowski
3769185572SBartłomiej Bukowski  const result = await response.json();
3869185572SBartłomiej Bukowski  if (result.errors) {
3969185572SBartłomiej Bukowski    for (const error of result.errors) {
4069185572SBartłomiej Bukowski      console.warn(`API error sending push notification:`, error);
4169185572SBartłomiej Bukowski    }
4269185572SBartłomiej Bukowski  }
4369185572SBartłomiej Bukowski
4469185572SBartłomiej Bukowski  const receipts = result.data;
4569185572SBartłomiej Bukowski  if (receipts) {
4669185572SBartłomiej Bukowski    const receipt = receipts[0];
4769185572SBartłomiej Bukowski    if (receipt.status === 'error') {
4869185572SBartłomiej Bukowski      if (receipt.details) {
4969185572SBartłomiej Bukowski        console.warn(
50*9155fd2fSŁukasz Kosmaty          `Expo push service reported an error sending a notification: ${receipt.details.error}`
5169185572SBartłomiej Bukowski        );
5269185572SBartłomiej Bukowski      }
5369185572SBartłomiej Bukowski      if (receipt.__debug) {
5469185572SBartłomiej Bukowski        console.warn(receipt.__debug);
5569185572SBartłomiej Bukowski      }
5669185572SBartłomiej Bukowski    }
5769185572SBartłomiej Bukowski  }
5869185572SBartłomiej Bukowski}
59