javascriptandroidreact-nativeexpoexpo-notifications

React Native schedulePushNotification


I have this code to schedule a notification using expo notification

export async function schedulePushNotification( rotina, horas, minutos, dias ) {
const notifId = await Notifications.scheduleNotificationAsync({
  content: {
    title: "Rotina agendada",
    subtitle: "Mensagem de Rotinagem",
    body: `Não se esqueça, você definiu ${rotina} as ${horas}:${minutos}`,
    vibrate: true | 1000,
    priority: AndroidNotificationPriority.HIGH,
    // sound: 'default',
  },
  trigger: {
    hour: horas,
    minute: minutos,
    repeats: true,
  },
});
return notifId;

}

Now i have a list with de days, dias = [1, 2, 4, 7]

I want to set a notification in this especific days, the weekday parameter is a number in range from 1 to 7, 1 is sunday, 2 is monday...

I want if possible just one idNotification to this days, but if impossible i want a list of idNotification.

I tried but I couldn't

I've tried to pass a list in the weekDay parameter, but do not accept, and i've tried a list of idNotification, but i receive a dictionary with random letters


Solution

  • Each weekday should be scheduled separately.

    Schedule Weekday List:

    async function scheduleWeeklyReminderListAsync(
      content,
      list = [1, 2, 4, 7],
      triggerBase = { hour: 0, minute: 0, repeats: true }
    ) {
      const identifierList = [];
    
      for (const weekday of list) {
        const identifier = await Notifications.scheduleNotificationAsync({
          content,
          trigger: { ...triggerBase, weekday },
        });
        identifierList.push(identifier);
      }
    
      return identifierList;
    }
    

    Refactored Version:

    async function scheduleWeeklyReminderListAsync(
      content,
      list = [1, 2, 4, 7],
      triggerBase = { hour: 0, minute: 0, repeats: true }
    ) {
      const scheduleAsync = (weekday) =>
        Notifications.scheduleNotificationAsync({
          content,
          trigger: { ...triggerBase, weekday },
        });
    
      return Promise.all(list.map(scheduleAsync));
    }
    

    More General Solution:

    const trigger1 = { hour: 12, minute: 0, repeats: true };
    const trigger2 = { hour: 8, minute: 0, repeats: true, weekday: 1 };
    const trigger3 = { hour: 8, minute: 0, repeats: true, weekday: 4 };
    
    async function scheduleReminderListAsync(
      content,
      triggerList = [trigger1, trigger2, trigger3]
    ) {
      const scheduleAsync = (trigger) =>
        Notifications.scheduleNotificationAsync({
          content,
          trigger,
        });
    
      return Promise.all(triggerList.map(scheduleAsync));
    }