All files / src/components/ProfileMenu/modals/utils groupAlerts.ts

97.05% Statements 33/34
78.57% Branches 11/14
100% Functions 7/7
97.05% Lines 33/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117                        9x 30x   30x 569x   569x 1196x 29x   1167x 1134x 1134x             1134x     33x 33x 33x 33x     33x                           30x     9x         1134x 1134x 1134x 1134x                                       9x 1134x       1134x 2115x           1134x   1134x           1134x     9x 1134x 1134x       1134x    
import { shouldBeHidden } from "@constants/constants";
import { getTitleAndSubTitle } from ".";
import {
  APIResponseAlert,
  TGroupDataGenerator,
  TGroupedAlerts,
  TGroupAlertsOptions,
  BooleanObject,
  TParsedAlert,
} from "../types";
import { ALERT_NAMES_ENUM } from "@features/Notifications/NotificationsCenter/types";
 
export const groupAlerts: TGroupDataGenerator = (data, options) => {
  let groupedData: any = {};
 
  data.forEach((alert) => {
    const alertId = alert.id;
 
    alert.receiverList.forEach((receiver) => {
      if (receiver === "submerchant" && alert.displayName === "Transaction")
        return;
 
      if (!groupedData[receiver]?.[alertId]) {
        const parsedAlert = alertParser(alert, receiver, options);
        groupedData = {
          ...groupedData,
          [receiver]: {
            ...groupedData[receiver],
            [alertId]: parsedAlert,
          },
        };
        return;
      }
 
      const savedAlert = groupedData[receiver][alertId];
      const method = alert.assignedMethods?.[0];
      Eif (method) {
        const isAssigned = Object.assign(savedAlert.isAssigned, {
          [method]: alert.isAssigned,
        });
        groupedData = {
          ...groupedData,
          [receiver]: {
            ...groupedData[receiver],
            [alertId]: {
              ...savedAlert,
              isAssigned,
            },
          },
        };
      }
    });
  }, {} as TGroupedAlerts);
 
  return groupedData;
};
 
const alertParser = (
  alert: APIResponseAlert,
  receiver: string,
  options?: TGroupAlertsOptions,
): TParsedAlert => {
  const texts = getTitleAndSubTitle(alert, receiver);
  const isAssigned = getIsAssigned(alert);
  const disabled = getIsDisabled(alert, options);
  return {
    id: alert.id,
    name: alert.name,
    title: texts.title,
    subTitle: texts.subTitle,
    highlight: texts?.highlight || "",
    hidden: {
      email: false,
      push: shouldBeHidden.pushNotificationSettings,
    },
    disabled,
    isAssigned,
  };
};
 
type THelper = (
  alert: APIResponseAlert,
  options?: TGroupAlertsOptions,
) => BooleanObject;
 
const getIsDisabled: THelper = (alert, options) => {
  const initial = {
    email: true,
    push: true,
  };
  const enabledMethods = alert.methods.reduce(
    (acc, key) => ({
      ...acc,
      [key]: false,
    }),
    {},
  );
  const disabled = Object.assign(initial, enabledMethods);
  //for sponsor this email should be always disabled, and BE asked to handle this FE side for now
  Iif (
    options?.isSponsor &&
    alert.name?.trim() === ALERT_NAMES_ENUM.MERCHANT_OWNER_UNDERWRITING_APPROVAL
  ) {
    return { ...disabled, email: true };
  }
  return disabled;
};
 
const getIsAssigned: THelper = (alert) => {
  const method = alert.assignedMethods?.[0];
  const initial = {
    email: false,
    push: false,
  };
  return Object.assign(initial, { [method]: alert.isAssigned });
};