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;
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;
}
}
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;
}
}