Yaltopia-Ticket-Admin/src/pages/admin/users/[id]/index.tsx

140 lines
5.2 KiB
TypeScript

import { useParams, useNavigate } from "react-router-dom"
import { useQuery } from "@tanstack/react-query"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { Button } from "@/components/ui/button"
import { Badge } from "@/components/ui/badge"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { ArrowLeft, Edit, Key } from "lucide-react"
import { userService } from "@/services"
import { format } from "date-fns"
export default function UserDetailsPage() {
const { id } = useParams()
const navigate = useNavigate()
const { data: user, isLoading } = useQuery({
queryKey: ['admin', 'users', id],
queryFn: () => userService.getUser(id!),
enabled: !!id,
})
if (isLoading) {
return <div className="text-center py-8">Loading user details...</div>
}
if (!user) {
return <div className="text-center py-8">User not found</div>
}
return (
<div className="space-y-6">
<div className="flex items-center gap-4">
<Button variant="ghost" size="icon" onClick={() => navigate('/admin/users')}>
<ArrowLeft className="w-4 h-4" />
</Button>
<h2 className="text-3xl font-bold">User Details</h2>
</div>
<Tabs defaultValue="info" className="space-y-4">
<TabsList>
<TabsTrigger value="info">Information</TabsTrigger>
<TabsTrigger value="statistics">Statistics</TabsTrigger>
<TabsTrigger value="activity" onClick={() => navigate(`/admin/users/${id}/activity`)}>
Activity
</TabsTrigger>
</TabsList>
<TabsContent value="info" className="space-y-4">
<Card>
<CardHeader>
<div className="flex items-center justify-between">
<CardTitle>User Information</CardTitle>
<div className="flex gap-2">
<Button variant="outline" size="sm">
<Edit className="w-4 h-4 mr-2" />
Edit
</Button>
<Button variant="outline" size="sm">
<Key className="w-4 h-4 mr-2" />
Reset Password
</Button>
</div>
</div>
</CardHeader>
<CardContent className="space-y-4">
<div className="grid grid-cols-2 gap-4">
<div>
<p className="text-sm text-muted-foreground">Email</p>
<p className="font-medium">{user.email}</p>
</div>
<div>
<p className="text-sm text-muted-foreground">Name</p>
<p className="font-medium">{user.firstName} {user.lastName}</p>
</div>
<div>
<p className="text-sm text-muted-foreground">Role</p>
<Badge>{user.role}</Badge>
</div>
<div>
<p className="text-sm text-muted-foreground">Status</p>
<Badge variant={user.isActive ? 'default' : 'secondary'}>
{user.isActive ? 'Active' : 'Inactive'}
</Badge>
</div>
<div>
<p className="text-sm text-muted-foreground">Created At</p>
<p className="font-medium">{format(new Date(user.createdAt), 'PPpp')}</p>
</div>
<div>
<p className="text-sm text-muted-foreground">Updated At</p>
<p className="font-medium">
{user.updatedAt ? format(new Date(user.updatedAt), 'PPpp') : 'N/A'}
</p>
</div>
</div>
</CardContent>
</Card>
</TabsContent>
<TabsContent value="statistics" className="space-y-4">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<Card>
<CardHeader>
<CardTitle className="text-sm font-medium">Invoices</CardTitle>
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{user._count?.invoices || 0}</div>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle className="text-sm font-medium">Reports</CardTitle>
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{user._count?.reports || 0}</div>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle className="text-sm font-medium">Documents</CardTitle>
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{user._count?.documents || 0}</div>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle className="text-sm font-medium">Payments</CardTitle>
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{user._count?.payments || 0}</div>
</CardContent>
</Card>
</div>
</TabsContent>
</Tabs>
</div>
)
}