query-params.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { useLogger } from "@pythnetwork/app-logger";
  2. import {
  3. parseAsString,
  4. parseAsInteger,
  5. useQueryStates,
  6. createSerializer,
  7. } from "nuqs";
  8. import { useCallback } from "react";
  9. const queryParams = {
  10. assetClass: parseAsString.withDefault(""),
  11. page: parseAsInteger.withDefault(1),
  12. pageSize: parseAsInteger.withDefault(30),
  13. search: parseAsString.withDefault(""),
  14. };
  15. export const serialize = createSerializer(queryParams);
  16. export const useQueryParams = () => {
  17. const logger = useLogger();
  18. const [{ search, page, pageSize, assetClass }, setQuery] =
  19. useQueryStates(queryParams);
  20. const updateQuery = useCallback(
  21. (...params: Parameters<typeof setQuery>) => {
  22. setQuery(...params).catch((error: unknown) => {
  23. logger.error("Failed to update query", error);
  24. });
  25. },
  26. [setQuery, logger],
  27. );
  28. const updateSearch = useCallback(
  29. (newSearch: string) => {
  30. updateQuery({ page: 1, search: newSearch });
  31. },
  32. [updateQuery],
  33. );
  34. const updatePage = useCallback(
  35. (newPage: number) => {
  36. updateQuery({ page: newPage });
  37. },
  38. [updateQuery],
  39. );
  40. const updatePageSize = useCallback(
  41. (newPageSize: number) => {
  42. updateQuery({ page: 1, pageSize: newPageSize });
  43. },
  44. [updateQuery],
  45. );
  46. const updateAssetClass = useCallback(
  47. (newAssetClass: string) => {
  48. updateQuery({ page: 1, assetClass: newAssetClass });
  49. },
  50. [updateQuery],
  51. );
  52. return {
  53. search,
  54. page,
  55. pageSize,
  56. assetClass,
  57. updateSearch,
  58. updatePage,
  59. updatePageSize,
  60. updateAssetClass,
  61. };
  62. };