'use client'; import { useState, useEffect } from 'react'; import Link from 'next/link'; import Image from 'next/image'; import { useRouter, useSearchParams } from 'next/navigation'; import DeleteButton from './DeleteButton'; import Pagination from '@/lib/components/Pagination'; interface User { id: string; username: string; avatar: string | null; createdAt: string; modifiedAt: string; } interface PaginationInfo { page: number; pageSize: number; totalCount: number; totalPages: number; } interface UsersResponse { data: User[]; pagination: PaginationInfo; } export default function AdminUsers() { const router = useRouter(); const searchParams = useSearchParams(); // Get pagination values from URL params const initialPage = parseInt(searchParams.get('page') || '1'); const initialPageSize = parseInt(searchParams.get('pageSize') || '10'); // State for pagination const [page, setPage] = useState(initialPage); const [pageSize, setPageSize] = useState(initialPageSize); // State for data const [users, setUsers] = useState([]); const [pagination, setPagination] = useState({ page: initialPage, pageSize: initialPageSize, totalCount: 0, totalPages: 0 }); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); // Fetch users with pagination useEffect(() => { const fetchUsers = async () => { setIsLoading(true); setError(null); try { // Build query string with pagination const params = new URLSearchParams(); params.append('page', initialPage.toString()); params.append('pageSize', initialPageSize.toString()); const response = await fetch(`/api/users?${params.toString()}`); if (!response.ok) { throw new Error('Failed to fetch users'); } const responseData: UsersResponse = await response.json(); setUsers(responseData.data); setPagination(responseData.pagination); } catch (err) { console.error('Error fetching users:', err); setError(err instanceof Error ? err.message : 'An error occurred'); } finally { setIsLoading(false); } }; fetchUsers(); }, [initialPage, initialPageSize]); // Handle page change const handlePageChange = (newPage: number) => { setPage(newPage); // Build query string with new page const params = new URLSearchParams(searchParams.toString()); params.set('page', newPage.toString()); // Update URL with new page router.push(`/admin/users?${params.toString()}`); }; return (

Users

Add New User
{/* Error Message */} {error && (

{error}

)} {/* Loading State */} {isLoading ? (

Loading users...

) : (
{users.length > 0 ? ( users.map((user) => ( )) ) : ( )}
Username Avatar Created Modified Actions
{user.username} {user.avatar ? ( {user.username} ) : (
{user.username.charAt(0).toUpperCase()}
)}
{new Date(user.createdAt).toLocaleDateString()} {new Date(user.modifiedAt).toLocaleDateString()} Edit
No users found. Create your first user!
{/* Pagination */}
)}
); }