All files / src/features/Merchants/MerchantSidePanel/WithRepository/Challenges useChallengesRepository.tsx

84.84% Statements 28/33
60% Branches 9/15
71.42% Functions 5/7
96.55% Lines 28/29

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 118 119 120 121 122 123 124 125 126 127                            21x     22x         21x 25x   25x                             25x                   25x           21x 6x       6x       6x   6x   6x                 21x             5x 5x 7x   5x     5x     5x 5x 5x 5x         5x   5x 5x     5x                     21x            
import { useAppSelector } from "@redux/hooks";
import { useMerchantSidePanelContext } from "../../Provider/MerchantSidePanelProvider";
import { createComponentRepository } from "../createComponentRepository";
import { IComponentRepository, RepositoryConfigs } from "../types";
import { useRepository } from "../WithRepositoryContext";
import {
  TCategoryStats,
  TChallange,
  TChallengeCategory,
  TChallengeRepositories,
  TChallengeStatus,
} from "./types";
import { selectQueryString } from "@redux/slices/search";
 
export const useChallengesRepository = <K extends keyof TChallengeRepositories>(
  tag: K,
) => {
  return useRepository<keyof TChallengeRepositories, TChallengeRepositories, K>(
    tag,
  );
};
 
export const useConfigureChallenges = () => {
  const { id } = useMerchantSidePanelContext();
 
  const configs = {
    all_challenges: {
      baseUrl: `/merchants/${id}/underwriting-challenges`,
      tag: "all_challenges",
    },
    challenges_categories: {
      baseUrl: `/merchants/${id}/underwriting-challenge-categories`,
      tag: "challenges_categories",
    },
    challenges_stats: {
      baseUrl: `/merchants/${id}/underwriting-challenges/stats`,
      tag: "challenges_stats",
    },
  } satisfies RepositoryConfigs<keyof TChallengeRepositories>;
 
  const repositories = {
    challenges_categories: createComponentRepository<TChallengeCategory>(),
    challenges_stats: createComponentRepository<TCategoryStats>(),
    all_challenges: createComponentRepository<TChallange>(),
  } satisfies {
    [K in keyof TChallengeRepositories]: IComponentRepository<
      TChallengeRepositories[K]
    >;
  };
 
  return {
    repositories,
    configs,
  };
};
 
export const useGetChallenges = (filter = "") => {
  const { useGetItems: useGetChallengesCategories } = useChallengesRepository(
    "challenges_categories",
  );
  const { useGetItems: useGetChallengesStats } =
    useChallengesRepository("challenges_stats");
  const {
    data: challengesCategoriesData,
    isLoading: areChallengesCategoriesLoading,
  } = useGetChallengesCategories(`?${filter}sort=sortOrderPriority`);
  const { data: challengesStatsData, isLoading: areChallengesStatsLoading } =
    useGetChallengesStats("");
 
  return {
    data: {
      challengesStatsData,
      challengesCategoriesData,
    },
    isLoading: areChallengesStatsLoading || areChallengesCategoriesLoading,
  };
};
 
export const useGetSpecificChallengeData = (
  challengeIdentifier: string,
  statusFilters: TChallengeStatus[],
  userTaggedInFilter: string,
  hasUnreadMessagesFilter: string,
) => {
  const { useGetItems: useGetChallengesList } =
    useChallengesRepository("all_challenges");
  const searchText = useAppSelector((state) =>
    selectQueryString(state, "items_all_challenges"),
  );
  const status = statusFilters.flatMap((status) =>
    filterMapper[status].map((value) => `statusName:"${value}"`),
  );
  let filterParam = challengeIdentifier
    ? `?filter=%3B(categoryName:"${challengeIdentifier}")`
    : "";
  Iif (status.length > 0) filterParam += `%3B(${status.join(",")})`;
  Iif (hasUnreadMessagesFilter) filterParam += hasUnreadMessagesFilter;
  Iif (userTaggedInFilter) filterParam += userTaggedInFilter;
  const searchParam = searchText ? `&q="${searchText}"` : "";
  const {
    data: challengesList,
    isLoading: isChallengesListLoading,
    error,
  } = useGetChallengesList(`${filterParam}${searchParam}`);
 
  const { useGetItems } = useChallengesRepository("challenges_categories");
  const { data: categories, isLoading: areStatsLoading } = useGetItems(
    "?sort=sortOrderPriority",
  );
  return {
    data: {
      categories,
      challengesList,
    },
    isLoading: areStatsLoading && isChallengesListLoading,
    isLoadingList: isChallengesListLoading,
    error,
  };
};
 
const filterMapper = {
  open: [1],
  ready_for_verification: [2],
  closed: [3, 5],
  rejected: [4], //currently this is not used for filtering, but caused a type error
};