import React, { Dispatch, SetStateAction, useEffect, useState } from "react"; import FilterSearchDropdown from "./FilterSearchDropdown"; import SortDropdown from "./SortDropdown"; import ViewDropdown from "./ViewDropdown"; import { TFunction } from "i18next"; import BulkDeleteLinksModal from "./ModalContent/BulkDeleteLinksModal"; import BulkEditLinksModal from "./ModalContent/BulkEditLinksModal"; import toast from "react-hot-toast"; import useCollectivePermissions from "@/hooks/useCollectivePermissions"; import { useRouter } from "next/router"; import useLinkStore from "@/store/links"; import { Sort } from "@/types/global"; type Props = { children: React.ReactNode; t: TFunction<"translation", undefined>; viewMode: string; setViewMode: Dispatch>; searchFilter?: { name: boolean; url: boolean; description: boolean; tags: boolean; textContent: boolean; }; setSearchFilter?: (filter: { name: boolean; url: boolean; description: boolean; tags: boolean; textContent: boolean; }) => void; sortBy: Sort; setSortBy: Dispatch>; editMode?: boolean; setEditMode?: (mode: boolean) => void; }; const LinkListOptions = ({ children, t, viewMode, setViewMode, searchFilter, setSearchFilter, sortBy, setSortBy, editMode, setEditMode, }: Props) => { const { links, selectedLinks, setSelectedLinks, deleteLinksById } = useLinkStore(); const router = useRouter(); const [bulkDeleteLinksModal, setBulkDeleteLinksModal] = useState(false); const [bulkEditLinksModal, setBulkEditLinksModal] = useState(false); useEffect(() => { if (editMode && setEditMode) return setEditMode(false); }, [router]); const collectivePermissions = useCollectivePermissions( selectedLinks.map((link) => link.collectionId as number) ); const handleSelectAll = () => { if (selectedLinks.length === links.length) { setSelectedLinks([]); } else { setSelectedLinks(links.map((link) => link)); } }; const bulkDeleteLinks = async () => { const load = toast.loading(t("deleting_selections")); const response = await deleteLinksById( selectedLinks.map((link) => link.id as number) ); toast.dismiss(load); response.ok && toast.success( selectedLinks.length === 1 ? t("link_deleted") : t("links_deleted", { count: selectedLinks.length }) ); }; return ( <>
{children}
{links.length > 0 && editMode !== undefined && setEditMode && (
{ setEditMode(!editMode); setSelectedLinks([]); }} className={`btn btn-square btn-sm btn-ghost ${ editMode ? "bg-primary/20 hover:bg-primary/20" : "hover:bg-neutral/20" }`} >
)} {searchFilter && setSearchFilter && ( )}
{editMode && links.length > 0 && (
{links.length > 0 && (
handleSelectAll()} checked={ selectedLinks.length === links.length && links.length > 0 } /> {selectedLinks.length > 0 ? ( {selectedLinks.length === 1 ? t("link_selected") : t("links_selected", { count: selectedLinks.length })} ) : ( {t("nothing_selected")} )}
)}
)} {bulkDeleteLinksModal && ( { setBulkDeleteLinksModal(false); }} /> )} {bulkEditLinksModal && ( { setBulkEditLinksModal(false); }} /> )} ); }; export default LinkListOptions;