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

istanbul medyummedyumizmir medyumankara medyum
HacklinkHair Transplant istanbul
hacklink
istanbul evden eve nakliyat
hair transplant
istanbul anl?k haberler
extrabet
cratosroyalbet
casibom
romabet
romabet
romabet
casibom
casibom
marsbahis
holiganbet
casibom
https://deneme-bonuslarim-yeni.com/
deneme bonusu veren siteler
https://deneme-bonuslari-listesi.com/
deneme bonusu veren siteler
deneme bonusu veren siteler
deneme bonusu veren siteler
deneme bonusu veren siteler
Betpas
adana escort
esenyurt masaj salonubeylikdüzü masaj salonumasaj salonuesenyurt masaj salonubeylikdüzü masaj salonuba?ak?ehir masaj salonuavc?lar masaj salonumasaj salonuesenyurt masaj salonubeylikdüzü masaj salonuavc?lar masaj salonubahçe?ehir masaj salonu?irinevler masaj salonuesenyurt masaj salonumasaj salonuesenyurt masaj salonubeylikdüzü masaj salonuesenyurt masaj salonuesenyurt masaj salonuesenyurt escortesenyurt escortesenyurt escortesenyurt masaj salonuavc?lar masaj salonubeylikdüzü masaj salonumaltepe escortescort ?spartaescort fethiye