import { useState, useMemo, useEffect, useRef } from "react"; import { useUsers } from "@/hooks/useUsers"; import { useTranslation } from "react-i18next"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { Trash2, ArrowUpDown, ArrowUp, ArrowDown, ChevronLeft, ChevronRight } from "lucide-react"; type SortField = "firstName" | "lastName" | "email" | "phoneNumber"; type SortOrder = "asc" | "desc" | null; type TabType = "customers" | "couriers"; const UserTable = ({ users, onDelete, isDeleting, t, page, size, totalCount, totalPages, onPageChange, onSizeChange, loading, }: { users: any[]; onDelete: (user: any) => void; isDeleting: string | null; t: any; page: number; size: number; totalCount: number; totalPages: number; onPageChange: (page: number) => void; onSizeChange: (size: number) => void; loading: boolean; }) => { const [sortField, setSortField] = useState(null); const [sortOrder, setSortOrder] = useState(null); const handleSort = (field: SortField) => { if (sortField === field) { if (sortOrder === "asc") { setSortOrder("desc"); } else if (sortOrder === "desc") { setSortOrder(null); setSortField(null); } } else { setSortField(field); setSortOrder("asc"); } }; // Sortuj użytkowników (bez filtrowania, bo filtrowanie już robi backend) const displayedUsers = useMemo(() => { const displayList = [...users]; if (sortField && sortOrder) { displayList.sort((a, b) => { const aValue = (a[sortField] || "").toString().toLowerCase(); const bValue = (b[sortField] || "").toString().toLowerCase(); if (aValue < bValue) return sortOrder === "asc" ? -1 : 1; if (aValue > bValue) return sortOrder === "asc" ? 1 : -1; return 0; }); } return displayList; }, [users, sortField, sortOrder]); return (
{loading && (

{t("common.loading")}

)} {t("admin.users.id") || "ID"} {t("admin.users.createdAt") || "Data Utworzenia"} {t("common.actions") || "Akcje"} {displayedUsers.length > 0 ? ( displayedUsers.map((user) => ( {user.id} {user.firstName || "-"} {user.lastName || "-"} {user.email} {user.phoneNumber || "-"} {user.createdAt ? new Date(user.createdAt).toLocaleDateString("pl-PL") : "-"} )) ) : ( {t("admin.users.noUsers") || "Brak użytkowników"} )}
{/* Pagination Controls */}
{t("admin.users.totalUsers") || "Razem użytkowników"}: {totalCount}
{Array.from({ length: totalPages }, (_, i) => i).map((p) => ( ))}
); }; export const AdminPage = () => { const { t } = useTranslation(); const { users, loading, error, deleteUser, page, size, totalCount, totalPages, countByType, fetchUsersByTypePaged, searchUsersByType, } = useUsers(); const [activeTab, setActiveTab] = useState("customers"); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [userToDelete, setUserToDelete] = useState<{ id: string; email: string } | null>(null); const [isDeleting, setIsDeleting] = useState(null); const [searchTerm, setSearchTerm] = useState(""); const debounceTimer = useRef(null); // Pobierz użytkowników po typie gdy zmienia się aktywna zakladka useEffect(() => { const userType = activeTab === "customers" ? "CUSTOMER" : "COURIER"; setSearchTerm(""); fetchUsersByTypePaged(userType, 0, size); }, [activeTab]); // Wyszukuj użytkowników gdy zmienia się searchTerm - z debouncing useEffect(() => { if (debounceTimer.current) { clearTimeout(debounceTimer.current); } const userType = activeTab === "customers" ? "CUSTOMER" : "COURIER"; debounceTimer.current = setTimeout(() => { if (searchTerm.trim()) { searchUsersByType(userType, searchTerm, 0, size); } else { fetchUsersByTypePaged(userType, 0, size); } }, 300); // Czeka 300ms zanim wyśle żądanie return () => { if (debounceTimer.current) { clearTimeout(debounceTimer.current); } }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchTerm]); // Niestandardowe handlery paginacji dla wyszukiwania const handlePageChangeWithSearch = (newPage: number) => { const userType = activeTab === "customers" ? "CUSTOMER" : "COURIER"; if (searchTerm.trim()) { searchUsersByType(userType, searchTerm, newPage, size); } else { fetchUsersByTypePaged(userType, newPage, size); } }; const handleSizeChangeWithSearch = (newSize: number) => { const userType = activeTab === "customers" ? "CUSTOMER" : "COURIER"; if (searchTerm.trim()) { searchUsersByType(userType, searchTerm, 0, newSize); } else { fetchUsersByTypePaged(userType, 0, newSize); } }; const handleDeleteClick = (user: any) => { setUserToDelete({ id: user.id, email: user.email }); setDeleteDialogOpen(true); }; const handleConfirmDelete = async () => { if (!userToDelete) return; setIsDeleting(userToDelete.id); const result = await deleteUser(userToDelete.id); if (result.success) { setDeleteDialogOpen(false); setUserToDelete(null); } else { console.error("Delete failed:", result.error); } setIsDeleting(null); }; return (
{error && (

{t("common.error")}

{error}

)}

{t("admin.users.title") || "Zarządzanie Użytkownikami"}

{t("admin.users.manageDesc") || "Zarządzaj użytkownikami systemu, dodawaj, edytuj i usuwaj konta"}

{/* Stats Cards */} {countByType && (
{t("admin.users.totalUsers") || "Razem Użytkowników"}
{countByType.totalUsers}
{t("admin.users.customers") || "Klienci"}
{countByType.customerCount}
{t("admin.users.couriers") || "Kurierzy"}
{countByType.courierCount}
{t("admin.users.admins") || "Administratorzy"}
{countByType.adminCount}
)} {/* Search */}
setSearchTerm(e.target.value)} className="max-w-sm" />
{/* Tab Navigation */}
{/* Customers Tab */} {activeTab === "customers" && ( {t("admin.users.customers") || "Klienci"} {t("admin.users.customersDesc") || "Lista wszystkich zarejestrowanych klientów"} )} {/* Couriers Tab */} {activeTab === "couriers" && ( {t("admin.users.couriers") || "Kurierzy"} {t("admin.users.couriersDesc") || "Lista wszystkich zarejestrowanych kurierów"} )} {/* Delete User Dialog */} {t("common.confirmDelete") || "Potwierdzenie usunięcia"} {t("admin.users.deleteWarning") || "Czy na pewno chcesz usunąć tego użytkownika"}{" "} {userToDelete?.email} {t("admin.users.deleteWarningDetails") || "? Ta operacja nie może być cofnięta."} {isDeleting ? t("common.deleting") || "Usuwanie..." : t("common.delete") || "Usuń"} {t("common.cancel") || "Anuluj"}
); };