diff --git a/src/pages/Directory/Directory.jsx b/src/pages/Directory/Directory.jsx index e7396339..b78a0bc3 100644 --- a/src/pages/Directory/Directory.jsx +++ b/src/pages/Directory/Directory.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useMemo, useState } from "react"; import Breadcrumb from "../../components/common/Breadcrumb"; import IconButton from "../../components/common/IconButton"; import GlobalModel from "../../components/common/GlobalModel"; @@ -9,13 +9,21 @@ import { DirectoryRepository } from "../../repositories/DirectoryRepository"; import { getCachedData } from "../../slices/apiDataManager"; import showToast from "../../services/toastService"; import UpdateContact from "../../components/Directory/UpdateContact"; +import CardViewDirectory from "../../components/Directory/CardViewDirectory"; +import { useContactCategory } from "../../hooks/masterHook/useMaster"; +import usePagination from "../../hooks/usePagination"; const Directory = () => { const [isOpenModal, setIsOpenModal] = useState(false); const [selectedContact, setSelectedContact] = useState(null); const [ContatList, setContactList] = useState([]); + const [contactCategories, setContactCategories] = useState([]); + const [ searchText, setSearchText ] = useState( "" ); + const [listView, setListView] = useState(false); const { contacts, loading } = useDirectory(); + const { contactCategory, loading: contactCategoryLoading } = + useContactCategory(); const submitContact = async (data) => { try { let response; @@ -23,13 +31,12 @@ const Directory = () => { const contacts_cache = getCachedData("contacts") || []; if (selectedContact) { - response = await DirectoryRepository.UpdateContact(data.id, data); updatedContacts = contacts_cache.map((contact) => contact.id === data.id ? response.data : contact ); showToast("Contact updated successfully", "success"); - setIsOpenModal( false ); + setIsOpenModal(false); setSelectedContact(null); } else { response = await DirectoryRepository.CreateContact(data); @@ -55,6 +62,40 @@ const Directory = () => { useEffect(() => { setContactList(contacts); }, [contacts]); + + const [selectedCategoryIds, setSelectedCategoryIds] = useState( + contactCategory.map((category) => category.id) + ); + + const usedCategoryIds = [ + ...new Set(contacts.map((c) => c.contactCategory?.id)), + ]; + const filteredCategories = contactCategory.filter((category) => + usedCategoryIds.includes(category.id) + ); + const handleCategoryChange = (id) => { + setSelectedCategoryIds((prev) => + prev.includes(id) ? prev.filter((cid) => cid !== id) : [...prev, id] + ); + }; + const filteredContacts = useMemo(() => { + return contacts + .filter((c) => { + const matchesSearch = + c.name.toLowerCase().includes(searchText.toLowerCase()) || + c.organization.toLowerCase().includes(searchText.toLowerCase()); + const matchesCategory = + selectedCategoryIds.length === 0 || + selectedCategoryIds.includes(c.contactCategory?.id); + return matchesSearch && matchesCategory; + }) + .sort((a, b) => a.name.localeCompare(b.name)); + }, [contacts, searchText, selectedCategoryIds]); + const { currentPage, totalPages, currentItems, paginate } = usePagination( + filteredContacts, + 10 + ); + return (
Apply Filter
+ {filteredCategories.map(({ id, name }) => ( +|
-
-
- Category
-
- {/*
-
|
+ Category | { |
|---|