export default function usePaginatedTableState()

in projects/Aligned-Platform-EnergizeAI/app/src/lib/use-paginated-table-state.ts [8:87]


export default function usePaginatedTableState() {
  const router = useRouter()
  const searchParams = useSearchParams()
  const pathname = usePathname()

  const [search, setSearchState] = useState<string | undefined>(searchParams.get("search") ?? undefined)
  const debouncedSearch = useDebounce(search, 500)

  const size = searchParams.get("size") ?? "10"
  const [pageSize, setPageSize] = useState<number>(size && !isNaN(parseInt(size)) ? parseInt(size) : 10)

  const page = searchParams.get("page")
  const [pageIndex, setPageIndex] = useState<number>(
    Math.max(page && !isNaN(parseInt(page)) ? parseInt(page) - 1 : 0, 0),
  )

  const debouncedPageIndex = useDebounce(pageIndex, 500)
  const debouncedPageSize = useDebounce(pageSize, 500)

  // Create query string
  const createQueryString = useCallback(
    (params: Record<string, string | number | null>) => {
      const newSearchParams = new URLSearchParams(searchParams?.toString())

      for (const [key, value] of Object.entries(params)) {
        if (value === null) {
          newSearchParams.delete(key)
        } else {
          newSearchParams.set(key, String(value))
        }
      }

      return newSearchParams.toString()
    },
    [searchParams],
  )

  const setPagination = (v: PaginationState) => {
    if (v.pageIndex === pageIndex && v.pageSize === pageSize) {
      return
    }

    if (v.pageSize === pageSize) {
      setPageIndex(v.pageIndex)
    } else {
      setPageIndex(0)
    }
    setPageSize(v.pageSize)

    router.push(
      `${pathname}?${createQueryString({
        page: v.pageSize === pageSize ? v.pageIndex + 1 : 1,
        size: v.pageSize,
      })}`,
    )
  }

  const setSearch = (v: string) => {
    setPageIndex(0)
    setSearchState(v)

    router.push(
      `${pathname}?${createQueryString({
        search: v,
        page: 1,
      })}`,
    )
  }

  return {
    search,
    setSearch,
    debouncedSearch,
    pageIndex,
    setPagination,
    debouncedPageIndex,
    pageSize,
    debouncedPageSize,
  }
}