pages.js

import { useState, useEffect } from 'react';
import { fetchItems } from '../../utils/api';
import DashboardLayout from '../../components/DashboardLayout';

const ItemsPage = () => {
  const [items, setItems] = useState([]);
  const [page, setPage] = useState(1);
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState(null);

  useEffect(() => {
    const loadItems = async () => {
      setIsLoading(true);
      setError(null);
      try {
        const data = await fetchItems(page);
        setItems(data.items); // Assuming the API returns an `items` array
      } catch (error) {
        setError(error.message);
      } finally {
        setIsLoading(false);
      }
    };

    loadItems();
  }, [page]);

  const handleNextPage = () => setPage((prevPage) => prevPage + 1);
  const handlePrevPage = () => setPage((prevPage) => Math.max(prevPage - 1, 1));

  return (
    <DashboardLayout>
      <h2 className="text-2xl font-bold mb-4">Items List</h2>

      {isLoading ? (
        <p>Loading...</p>
      ) : error ? (
        <p>Error: {error}</p>
      ) : (
        <ul className="space-y-2">
          {items.map((item) => (
            <li key={item.id} className="p-4 bg-white rounded shadow">
              {item.name}
            </li>
          ))}
        </ul>
      )}

      <div className="flex justify-between mt-4">
        <button
          onClick={handlePrevPage}
          disabled={page === 1}
          className="bg-gray-300 px-4 py-2 rounded disabled:opacity-50"
        >
          Previous
        </button>
        <span>Page {page}</span>
        <button
          onClick={handleNextPage}
          className="bg-gray-300 px-4 py-2 rounded"
        >
          Next
        </button>
      </div>
    </DashboardLayout>
  );
};

export default ItemsPage;

Helper function for api

export async function fetchItems(page = 1) {
  try {
    const response = await fetch(`https://dummyjsonapi.com/items?page=${page}&limit=10`);
    if (!response.ok) {
      throw new Error('Failed to fetch items');
    }
    const data = await response.json();
    return data;
  } catch (error) {
    console.error('Error fetching items:', error);
    throw error;
  }
}

0 Comments

Leave a Comment

jojobetmedyum fermanmedyummedyum simonmedyum kalendermedyum cozumjojobetmedyum fermanmedyummedyum simonmedyum kalendermedyum cozum
HacklinkHair Transplant istanbul
da pa kontrolü
marsbahis giriÅŸ
Vozol Puff
iqos terea
instagram takipçi
takipçi
antalya escort
ankara escort
bursa escort
izmit escort
viagra
kavbet
bahçelievler nakliyat
istanbul evden eve nakliyat
istanbul bahçelievler evden eve nakliyat
hair transplant
istanbul anlık haberler
extrabet
extrabet güncel
deneme bonusu
deneme bonusu veren siteler
deneme bonusu veren siteler
bonus veren siteler
grandpashabet güncel giriş
grandpashabet
grandpashabet
grandpashabet
grandpashabet
https://tipobet.bet/
deneme bonusu veren siteler
casibom
casibom giriÅŸ
casibom
casibom giriÅŸ
gamdom giriÅŸ
sightcare
betturkey giriÅŸ
betturkey giriÅŸ
gamdom
romabet
romabet
romabet
holiganbet
casibom giri?casibom giri?casibomjojobetjojobetlunabetjojobetjojobet giri?jojobet giri?fixbetfixbet g�ncel giri?jojobetjojobetjojobetfixbetcasibom giri?casibom giri?casibom giri?casibom giri?casibom giri?casibom giri?ravenbahiscasibom giri?casibombetebetpusulabett�mbetcasibom g�ncel giri?matbetperabetcasibom giri?casibom giri?casibomjojobetjojobetlunabetjojobetjojobet giri?jojobet giri?fixbetfixbet g�ncel giri?jojobetjojobetjojobetfixbetcasibom giri?casibom giri?casibom giri?casibom giri?casibom giri?casibom giri?ravenbahiscasibom giri?casibombetebetpusulabett�mbetcasibom g�ncel giri?matbetperabet