Skip to content

Instantly share code, notes, and snippets.

@kouameYao
Created August 26, 2024 12:36
Show Gist options
  • Save kouameYao/83a6f0d55871484b59a83188bdc60a98 to your computer and use it in GitHub Desktop.
Save kouameYao/83a6f0d55871484b59a83188bdc60a98 to your computer and use it in GitHub Desktop.
Pour Christian
export const getAdminTransactions = async (
    paginationArg: TPaginationArgs = { limit: 10, page: 1 },
    filters?: Record<string, any>,
): Promise<TGetListTransactions> => {
    const { limit, page } = paginationArg;
    const filtersToStr = getFilterPath(filters);

    try {
        const response = await axios.get<any, TGetListTransactions>(
            `/transaction/admin${filtersToStr?.path}`,
            {
                params: {
                    perPage: limit,
                    page,
                },
            },
        );

        return response;
    } catch (error) {
        throw error;
    }
};
import dayjs from "dayjs";

export const getFilterPath = (filters?: Record<string, any>) => {
    let path = "?";
    const { date, status } = filters as any;

    if (date[0]) {
        const startDate = dayjs(date[0]).toISOString();
        path = `${path}&startDate=${startDate}`;
    }

    if (date[1]) {
        const endDate = dayjs(date[1]).toISOString();
        path = `${path}&endDate=${endDate}`;
    }

    if (status) {
        path = `${path}&status=${status}`;
    }

    if (path === "?") {
        path = "";
    }

    return { path };
};
"use client";

import ListTransactions from "../list-transactions";
import TransactionsTableFilters from "./transactions-table-filters";
import { useTable } from "@/hooks/use-table";
import { useColumn } from "@/hooks/use-column";
import { useEffect, useMemo, useState } from "react";
import { getColumns } from "./transactions-table-columns";
import { usePagination } from "@/hooks/use-pagination";
import { FiSearch } from "react-icons/fi";

import { downloadTransactions, getAdminTransactions } from "@/api/administration/transactions.api";
import { exportTransactionToExcel } from "@/utils/download-transactions";
import { $toastify } from "@/utils/toastify";
import { useQuery } from "@tanstack/react-query";
import { INITIAL_DATA } from "../../utils";
import { TTransaction } from "@/interfaces";
import { Button } from "rizzui";

const filterState = {
    date: [null, null],
    status: "",
};

export default function AllTransactions() {
    const { setCurrentPage, setPageSize, pageSize, currentPage } = usePagination();
    const [isDownloading, setIsDownloading] = useState(false);
    const pagination = { page: currentPage, limit: pageSize };
    const [data, setData] = useState<TTransaction[]>([]);
    const [newFilters, setNewFilters] = useState<Record<string, any>>(filterState);

    useEffect(() => {
        setCurrentPage(1);
    }, []);

    const {
        isFiltered,
        updateFilter,
        handleReset,
        filters,
        searchTerm,
        handleSearch,
        sortConfig,
        handleSort,
    } = useTable(data, pageSize, filterState);

    const { data: transactions, isFetching } = useQuery({
        queryKey: ["get-list-transactions", pagination, newFilters],
        queryFn: () => getAdminTransactions(pagination, newFilters),
        initialData: INITIAL_DATA,
    });

    const columns = useMemo(
        () => getColumns({ sortConfig, onHeaderCellClick }),
        // eslint-disable-next-line react-hooks/exhaustive-deps
        [sortConfig.key, sortConfig.direction],
    );

    const { checkedColumns, setCheckedColumns } = useColumn(columns);

    function onHeaderCellClick(value: string) {
        return {
            onClick: () => {
                handleSort(value);
            },
        };
    }

    const handleDownloadTransactions = async () => {
        setIsDownloading(true);
        const response = await downloadTransactions(filters);
        setIsDownloading(false);
        if (response?.length <= 0) {
            $toastify("success", "Aucune donnée trouvée");
        } else {
            exportTransactionToExcel(response);
        }
    };

    useEffect(() => {
        setData(transactions?.data);
    }, [transactions?.data]);

    return (
        <ListTransactions
            filterElement={
                <>
                    <TransactionsTableFilters
                        isFiltered={isFiltered}
                        filters={filters}
                        updateFilter={updateFilter}
                        handleReset={handleReset}
                    />
                    <Button
                        variant="outline"
                        className="px-5"
                        onClick={() => setNewFilters(filters)}
                    >
                        <FiSearch className="mr-2" />
                        Rechercher
                    </Button>
                </>
            }
            setPageSize={setPageSize}
            setCurrentPage={setCurrentPage}
            pageSize={pageSize}
            currentPage={currentPage}
            data={transactions.data}
            totalItems={transactions.pagination.totalCount}
            isLoading={isFetching}
            enablePagination={true}
            title="Liste de toutes les transactions"
            variant="modern"
            filterOptions={{
                searchTerm,
                onSearchClear: () => {
                    handleSearch("");
                },
                onSearchChange: (event) => {
                    handleSearch(event.target.value);
                },
                hasSearched: isFiltered,
                checkedColumns,
                columns,
                setCheckedColumns,
                drawerTitle: "Filtres",
                canDownload: true,
                handleDownload: handleDownloadTransactions,
                isDownloading,
            }}
        />
    );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment