140 lines
5.2 KiB
TypeScript
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>
|
|
)
|
|
}
|
|
|