UNPKG

@premieroctet/next-admin

Version:

Next-Admin provides a customizable and turnkey admin dashboard for applications built with Next.js and powered by the Prisma ORM. It aims to simplify the development process by providing a turnkey admin system that can be easily integrated into your proje

67 lines (66 loc) 2.49 kB
import { useEffect, useRef, useState } from "react"; import { useConfig } from "../context/ConfigContext.mjs"; const useSearchPaginatedResource = ({ fieldName, initialOptions })=>{ const [isPending, setIsPending] = useState(false); const { apiBasePath, schema, resource } = useConfig(); const searchPage = useRef(1); const totalSearchedItems = useRef(0); const [allOptions, setAllOptions] = useState(initialOptions ?? []); const [hasNextPage, setHasNextPage] = useState(false); const runSearch = async (query, resetOptions = true)=>{ const perPage = 25; const schemaResourceProperties = schema.definitions[resource].properties; const schemaFieldEntry = Object.entries(schemaResourceProperties).find(([key])=>key === fieldName); if (!schemaFieldEntry) return; const [, schemaField] = schemaFieldEntry; const model = schemaField.__nextadmin?.type; try { setIsPending(true); const response = await fetch(`${apiBasePath}/options`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ originModel: resource, property: fieldName, model, query, page: searchPage.current, perPage }) }); if (response.ok) { const responseJson = await response.json(); if (!responseJson.error) { totalSearchedItems.current = responseJson.total; setAllOptions((old)=>{ if (resetOptions) return responseJson.data; return [ ...old, ...responseJson.data ]; }); } } } finally{ setIsPending(false); } }; useEffect(()=>{ if (allOptions?.length > 0) setHasNextPage(allOptions.length < totalSearchedItems.current); }, [ allOptions ]); return { allOptions, setAllOptions, runSearch, searchPage, totalSearchedItems, isPending, hasNextPage }; }; const hooks_useSearchPaginatedResource = useSearchPaginatedResource; export { hooks_useSearchPaginatedResource as default };