import { useMutation, useQuery } from "@tanstack/react-query"; import type { AxiosError } from "axios"; import { ChevronLeft, ChevronRight, Pencil, Plus, RefreshCw, Search, Trash2, User, } from "lucide-react"; import * as React from "react"; import { Link, useNavigate } from "react-router-dom"; import { Badge } from "../../components/ui/badge"; import { Button } from "../../components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "../../components/ui/card"; import { Input } from "../../components/ui/input"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "../../components/ui/table"; import { deleteUser, fetchUsers } from "../../lib/adminApi"; function UserListPage() { const navigate = useNavigate(); const [page, setPage] = React.useState(1); const [search, setSearch] = React.useState(""); const [searchDraft, setSearchDraft] = React.useState(""); const limit = 50; const offset = (page - 1) * limit; const query = useQuery({ queryKey: ["users", { limit, offset, search }], queryFn: () => fetchUsers(limit, offset, search), placeholderData: (previousData) => previousData, }); const deleteMutation = useMutation({ mutationFn: (userId: string) => deleteUser(userId), onSuccess: () => { query.refetch(); }, }); const handleSearch = () => { setSearch(searchDraft); setPage(1); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { handleSearch(); } }; const errorMsg = (query.error as AxiosError<{ error?: string }>)?.response ?.data?.error; const fallbackError = !errorMsg && query.isError ? "사용자 목록 조회에 실패했습니다." : null; const items = query.data?.items ?? []; const total = query.data?.total ?? 0; const totalPages = Math.ceil(total / limit); const handleDelete = (userId: string, userName: string) => { if (!window.confirm(`사용자 "${userName}"을(를) 정말 삭제하시겠습니까?`)) { return; } deleteMutation.mutate(userId); }; return (
Users / List

사용자 관리

시스템 사용자를 조회하고 관리합니다. (Local DB)

User Registry 총 {total}명의 사용자가 등록되어 있습니다.
setSearchDraft(e.target.value)} onKeyDown={handleKeyDown} />
{(errorMsg || fallbackError) && (
{errorMsg ?? fallbackError}
)}
NAME / EMAIL ROLE STATUS COMPANY / DEPT CREATED ACTIONS {query.isLoading && ( 로딩 중... )} {!query.isLoading && items.length === 0 && ( 검색 결과가 없습니다. )} {items.map((user) => (
{user.name} {user.email}
{user.role} {user.status}
{user.companyCode || "-"} {user.department || "-"}
{new Date(user.createdAt).toLocaleDateString()}
))}
{/* Pagination */} {totalPages > 1 && (
Page {page} of {totalPages}
)}
); } export default UserListPage;