import { type Transaction, getTransactionsHistory } from "@/utils/requests/transactions"; import type { PaymentCode } from "@/utils/requests/types"; import { LOG } from "@logger"; import { useQuery } from "@tanstack/react-query"; import { useCallback, useMemo, useState } from "react"; const log = LOG.extend("useTransactionsHistory"); // biome-ignore lint/style/useNamingConvention: export type OperatorsFilter = { [key in PaymentCode]: boolean }; const useTransactionsHistory = () => { log.verbose("useTransactionsHistory"); const [referenceFilter, setReferenceFilter] = useState(""); // biome-ignore lint/style/useNamingConvention: const [operatorsFilter, setOperatorsFilter] = useState({ // biome-ignore lint/style/useNamingConvention: OM: true, // biome-ignore lint/style/useNamingConvention: MTN: true, // biome-ignore lint/style/useNamingConvention: FLOOZ: true, // biome-ignore lint/style/useNamingConvention: WAVE: true, // biome-ignore lint/style/useNamingConvention: CB: true, }); const { data, isLoading, error, refetch } = useQuery({ queryKey: ["transactionsHistory"], queryFn: getTransactionsHistory, }); const filterByReference = useCallback( (reference: string) => { if (!data?.length) return []; return data.filter( (transaction) => transaction.reference.includes(reference) && transaction.reference, ); }, [data], ); const filterDataByReference = (data: Transaction[], reference: string) => { if (!data?.length) return []; return data.filter( (transaction) => transaction.reference.includes(reference) && transaction.reference, ); }; const filterByOperators = (data: Transaction[]) => { if (!data?.length) return []; // create a set const set = new Set(); for (const key of Object.keys(operatorsFilter)) { if (operatorsFilter[key as keyof OperatorsFilter]) { set.add(key as PaymentCode); } } return data.filter((transaction) => { // return true if the set is empty, as there is no need to check if (set.size === 0) return true; // return true if the set contains the value return set.has(transaction.type_paiement_label); }); }; const transactionsHistory: Transaction[] = useMemo(() => { if (!data) return []; const filteredByOperators = filterByOperators(data); const filteredByReference = filterDataByReference(filteredByOperators, referenceFilter); return filteredByReference; // return filterByReference(referenceFilter); }, [data, referenceFilter, filterByOperators, filterDataByReference]); return { transactionsHistory, isLoading, error, refetch, setReferenceFilter, operatorsFilter, setOperatorsFilter, }; }; export default useTransactionsHistory;