"use client"; import { FC, useEffect, useState } from "react"; import { ListingGrid, ModuleBase, Pagination, SearchFilters, Stack, } from "../../components"; import { HeadingSideModule } from "../../modules"; import { gridWrapper, moduleWrapper } from "./CardListingGridModule.styles"; import { CardListingGridModuleProps } from "./CardListingGridModule.types"; import { useSearchParams } from "next/navigation"; import { areArraysEqual } from "../../utils"; const CardListingGridModule: FC = ({ data, moduleAnims, getItems = (items?: any) => [], getQueryData = ({}) => {}, textStyles, icons, paginationButtonVariants, paginationType, showMoreText, dropdownVariant, ...props }) => { const searchParams = useSearchParams(); if (!data || !data?.filtersAndCards) return null; const { cards, cardType, currentPage = 1, displayFilters, filter = [], totalCount, totalPages, pageSize, sortByOptions, } = data?.filtersAndCards; const [filteredCards, setFilteredCards] = useState(cards); const [searchFilters, setSearchFilters] = useState(filter); const [currPage, setCurrPage] = useState(currentPage); const [currFilters, setCurrFilters] = useState([]); const [currTotal, setCurrTotal] = useState(totalPages); const isGroup = cards[0]?.moduleName?.includes("Group"); let renderCardContent = null; if (filteredCards && filteredCards.length > 0) { renderCardContent = isGroup ? ( getItems(filteredCards, isGroup) ) : ( ); } useEffect(() => { const allFilters = searchParams.getAll("filterid"); const currentPage: number = parseInt(searchParams.get("page") || "1"); const doFiltersMatch = areArraysEqual(currFilters, allFilters); // if no new card info, bail fetch if (doFiltersMatch && currPage === currentPage) return; let fetchPage = currentPage; if (!doFiltersMatch && paginationType === "showMore") { fetchPage = 1; } const hasFilters = displayFilters && filter && filter.length > 0; const filters = hasFilters ? filter .map((category: any) => { const fieldGuIds = category.filters .filter((f: any) => allFilters?.includes(f.filterGuid)) .map((f: any) => f.filterGuid); if (fieldGuIds.length > 0) { return { fieldName: category.filterValue, fieldGuIds, }; } return null; }) .filter((f: any) => f !== null) : null; const fetchData = async () => { const queryData = { filters, cardsType: cardType, pageSize, displayFilters, sortByOptions, pageNumber: fetchPage, }; try { await getQueryData({ queryData }).then((result: any) => { // if load more and pageNumber++ append cards to list, otherwise replace let updatedCards = result?.cards || []; let updatedSearchFilters = result?.filter || []; if (paginationType === "showMore" && currPage < currentPage) { updatedCards = [...filteredCards, ...result.cards]; } setFilteredCards(updatedCards); setSearchFilters(updatedSearchFilters); setCurrPage(currentPage); setCurrFilters(allFilters); setCurrTotal(result?.totalPages || 1); }); } catch (error) { console.warn(error); } }; fetchData(); }, [searchParams]); const headingData = { description: data?.description, headingTitle: data?.headingTitle, tag: data?.tag, }; return ( {displayFilters && ( )} {renderCardContent} ); }; export default CardListingGridModule;