1.1.3 • Published 3 years ago

nestjs-expo-sdk v1.1.3

Weekly downloads
-
License
ISC
Repository
github
Last release
3 years ago

NestJs + Expo push notifications

A little module to make push notifications with react native in nestjs a bit easier work, hand by hand with expo-server-sdk.

Feel free to use it, if you like it! :D

Ready to use

Just npm install nestjs-expo-sdk this package use expo-server-sdk under the hood, then

import { ExpoSdkModule } from 'nestjs-expo-sdk';

@Module()
imports: [
  // Create a new Expo SDK client
  // optionally providing an access token if you have
  enabled push security
  // second optional arg boolean to define if
  // this module is global or not. True by default
  ExpoSdkModule.forRoot(
    {
      accessToken: process.env.EXPO_ACCESS_TOKEN,
    },
    true,
  ),
],

ExpoSdkModule also includes forRootAsync method to pass args asynchronously

ExpoSdkModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: (configService: ConfigService) => ({
    accessToken: configService.get<string>('SOME_ENV_VAR'),
  }),
  inject: [ConfigService],
}),

now it's time to use it in your provider

@Injectable()
export class AppService {
  // You can inject expo now and use as any or
  // Expo if you have previously installed expo-server-sdk
  // just to get types, declarations or another functions :D
  constructor(@InjectExpo() private expo: any) {}

  async sendPush(somePushTokens): Promise<any> {
    let messages = [];
    for (let pushToken of somePushTokens) {
      // Each push token looks like ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]

      // Check that all your push tokens appear to be valid Expo push tokens
      if (!Expo.isExpoPushToken(pushToken)) {
        console.error(`Push token ${pushToken} is not a valid Expo push token`);
        continue;
      }

      // Construct a message
      messages.push({
        to: pushToken,
        sound: 'default',
        body: 'This is a test notification',
        data: { withSome: 'data' },
      });
    }

    let chunks = this.expo.chunkPushNotifications(messages);
    let tickets = [];

    for (let chunk of chunks) {
      try {
        let ticketChunk = await this.expo.sendPushNotificationsAsync(messages);
        console.log(ticketChunk);
        console.log(ticketChunk);
        tickets.push(...ticketChunk);
        // NOTE: If a ticket contains an error code in ticket.details.error, you
        // must handle it appropriately. The error codes are listed in the Expo
        // documentation
      } catch (error) {
        console.error(error);
      }
    }
  }
}

and you are ready to go.

Note: if you need more info feel free to read Expo Docs

TODO

  • Add maybe more fuctionality.
  • Add test

DONE

  • Make this module an npm package just for fun, and educative purposes.
  • Added more functions for flexibility
  • Added more documentation.
  • Added changelog.
  • Added tags.