All files / src/features/TransactionsRiskProfile/helpers parsers.ts

63.33% Statements 19/30
75% Branches 15/20
36.36% Functions 4/11
66.66% Lines 16/24

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                51x               15x 15x   15x   15x                     15x           15x 3x                 15x 3x               15x 15x   15x 3x               15x                             51x                          
import { APITransactionsGroup, IParsedData } from "../data.types";
import { useMemo } from "react";
import { additionalDetailsParser } from "./additionalDetailsParser";
import { statsParser } from "./statsParser";
import { groupTransactions } from "./transactions.helpers";
import { useAppSelector } from "@redux/hooks";
import { selectTypeFilter } from "@redux/slices/acquirer/transactionRiskProfile";
 
const useDataParser = ({
  data,
  transactions,
}: {
  data: any;
  transactions: any;
}): IParsedData => {
 
  const typeFilter = useAppSelector(selectTypeFilter);
  const level = data?.riskLevel || 0;
 
  const nextDeescalationAt = data?.lastEscalation?.nextDeescalationAt;
 
  const general = {
    countryCodeISO2: data?.ipInfo?.country_code?.toLowerCase() || "",
    countryName: data?.ipInfo?.country || "",
    ipAddress: data?.ipAddress || "",
    hasIPProbeData: !!data?.ipInfo?.security,
    updatedAt: data?.updatedAt || 0,
    isVPN:
      data?.ipInfo?.security?.anonymous ||
      data?.ipInfo?.security?.hosting,
  };
 
  const geomap = {
    latitude: data?.ipInfo?.latitude,
    longitude: data?.ipInfo?.longitude,
    timezone: `${data?.ipInfo?.timezone?.id} (${data?.ipInfo?.timezone?.abbr})`,
  };
 
  const cardsList = useMemo(() => {
    Eif (!data?.stats?.cards?.length) return [];
    return data.stats.cards.map((card: any) => ({
      cardBrand: card.brand,
      last4: card.last4,
      isDebit: card.isDebit,
      charged: card.sum / 100,
    }));
  }, [data?.stats?.cards]);
 
  const usersList = useMemo(() => {
    Eif (!data?.stats?.users?.length) return [];
    return data.stats.users.map((user: any) => ({
      imageURL: user.imageURL,
      userName: `${user.firstName} ${user.lastName}`,
      email: user.email,
    }));
  }, [data?.stats?.users]);
 
  const stats = statsParser(data);
  const additionalDetails = additionalDetailsParser(data);
 
  const transactionsList = useMemo(() => {
    Eif (!transactions?.data?.length) return [];
    const filteredData =
      typeFilter === "all"
        ? transactions.data
        : filterDataByEscalation(transactions.data);
    return groupTransactions(filteredData);
  }, [transactions?.data, typeFilter]);
 
  return {
    level,
    general,
    geomap,
    detailsPanel: {
      cardsList,
      usersList,
      stats,
    },
    additionalDetails,
    transactions: transactionsList,
    nextDeescalationAt,
  };
};
 
const filterDataByEscalation = (data: APITransactionsGroup[]) =>
  data
    .filter((thxGroup) =>
      thxGroup.transactions.some((thx) => !!thx?.eventEscalation),
    )
    .map((thxGroup) => ({
      ...thxGroup,
      transactions: thxGroup.transactions.filter(
        (thx) => !!thx?.eventEscalation,
      ),
    }));
 
export default useDataParser;