mosh-helpdesk/client/src/pages/UsersPage.tsx
Moshfegh Hamedani 1cf3508fcb Use React Query
2026-02-16 10:35:28 -08:00

87 lines
2.2 KiB
TypeScript

import { useQuery } from "@tanstack/react-query";
import axios from "axios";
import { Alert, AlertDescription } from "@/components/ui/alert";
import { Badge } from "@/components/ui/badge";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import { AlertCircle, Loader2 } from "lucide-react";
interface User {
id: string;
name: string;
email: string;
role: "admin" | "agent";
createdAt: string;
}
export default function UsersPage() {
const { data: users, isLoading, error } = useQuery({
queryKey: ["users"],
queryFn: async () => {
const { data } = await axios.get<{ users: User[] }>("/api/users");
return data.users;
},
});
if (isLoading) {
return (
<div className="flex items-center justify-center h-64 text-muted-foreground">
<Loader2 className="animate-spin mr-2 h-5 w-5" />
Loading...
</div>
);
}
if (error) {
return (
<div>
<h1 className="text-2xl font-bold mb-6">Users</h1>
<Alert variant="destructive">
<AlertCircle className="h-4 w-4" />
<AlertDescription>Failed to fetch users</AlertDescription>
</Alert>
</div>
);
}
return (
<div>
<h1 className="text-2xl font-bold mb-6">Users</h1>
<Table>
<TableHeader>
<TableRow>
<TableHead>Name</TableHead>
<TableHead>Email</TableHead>
<TableHead>Role</TableHead>
<TableHead>Created</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{users?.map((user) => (
<TableRow key={user.id}>
<TableCell>{user.name}</TableCell>
<TableCell>{user.email}</TableCell>
<TableCell>
<Badge
variant={user.role === "admin" ? "default" : "secondary"}
>
{user.role}
</Badge>
</TableCell>
<TableCell>
{new Date(user.createdAt).toLocaleDateString()}
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</div>
);
}