You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.js 1.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { Box } from '@mui/system';
  2. import Head from 'next/head';
  3. import { useState } from 'react';
  4. import FilterSort from '../../components/filter-sort/FilterSort';
  5. import LoadingSpinner from '../../components/loader/basic-spinner/LoadSpinner';
  6. import ProductsGrid from '../../components/products-grid/ProductsGrid';
  7. import ProductsHero from '../../components/products-hero/ProductsHero';
  8. import { useInfiniteProducts } from '../../hooks/useInfiniteQuery';
  9. const Products = () => {
  10. const [filter, setFilter] = useState('');
  11. const [sort, setSort] = useState('');
  12. const { data, isLoading, fetchNextPage, hasNextPage } = useInfiniteProducts(
  13. filter,
  14. sort
  15. );
  16. const handleProductTypeChange = (event) => {
  17. const filterText = event.target.value;
  18. setFilter(filterText);
  19. };
  20. const handleSortChange = (event) => {
  21. const sort = event.target.value;
  22. setSort(sort);
  23. };
  24. if (isLoading) {
  25. return <LoadingSpinner />;
  26. }
  27. return (
  28. <Box
  29. sx={{
  30. display: 'flex',
  31. flexDirection: 'column',
  32. }}
  33. >
  34. <Head>
  35. <title>NextJS template</title>
  36. <meta name="description" content="Random data with pagination..." />
  37. </Head>
  38. <ProductsHero />
  39. <FilterSort
  40. handleProductTypeChange={handleProductTypeChange}
  41. productType={filter}
  42. sort={sort}
  43. handleSortChange={handleSortChange}
  44. />
  45. <ProductsGrid
  46. allProducts={data}
  47. sort={sort}
  48. productType={filter}
  49. fetchNextPage={fetchNextPage}
  50. hasNextPage={hasNextPage}
  51. />
  52. </Box>
  53. );
  54. };
  55. export default Products;