"use client"; import { ConfirmationModalProps } from "@/components/ui/ConfirmationModal"; import { useTendersInfiniteQuery } from "@/hooks/queries"; import useDebounce from "@/hooks/useDebounce"; import { TCustomer } from "@/lib/api"; import { usePathname } from "next/navigation"; import { useEffect, useRef, useState } from "react"; import { useInView } from "react-intersection-observer"; import { z } from "zod"; const useTenderListPresenter = () => { const [isModalOpen, setIsModalOpen] = useState(false); const [currentTender, setCurrentTender] = useState(null); const [search, setSearch] = useState(""); const [modalConfig, setModalConfig] = useState< Partial >({}); const [params, setParams] = useState>({ sort: "created_at", }); const debouncedSearch = useDebounce(search, 1000); const pathName = usePathname(); const { data, error, isPending, fetchNextPage, hasNextPage, isFetchingNextPage, } = useTendersInfiniteQuery(params); const { inView } = useInView({ threshold: 0.5 }); useEffect(() => { if (inView && hasNextPage && data && data.pages.length < 5) { fetchNextPage(); } }, [inView, hasNextPage, data, fetchNextPage]); useEffect(() => { const result = z.string().safeParse(debouncedSearch); if (result.success) { setParams((prevParams) => ({ ...prevParams, q: result.data, })); } }, [debouncedSearch]); const handleFilterChange = (e: React.ChangeEvent) => { setSearch(e.target.value); }; const onConfirmDelete = () => { if (currentTender) { deleteTender(currentTender.id); } }; const allTenders = data?.pages.flatMap((page) => page.data.tenders) ?? []; return { currentTender, setCurrentTender, search, handleFilterChange, onConfirmDelete, allTenders, error, isPending, hasNextPage, data, fetchNextPage, isFetchingNextPage, pathName, isModalOpen, setIsModalOpen, modalConfig, setModalConfig, }; }; export default useTenderListPresenter;