import { useState } from 'react'; import { Sheet, SheetContent, SheetHeader, SheetTitle, } from '@/components/ui/sheet'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Textarea } from '@/components/ui/textarea'; import { Separator } from '@/components/ui/separator'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip'; import { User, Mail, Phone, MapPin, Shield, Ticket, CheckCircle2, KeyRound, Eye, MessageSquare, Ban, Copy, MoreHorizontal, MoreVertical, Clock, AlertTriangle, Plus, Tag, } from 'lucide-react'; import type { User as UserType } from '@/lib/types/user'; import { getUserBookings, getUserNotes, } from '../data/mockUserCrmData'; import { formatCurrency } from '@/data/mockData'; import { ActionButtons } from './ActionButtons'; import { OverviewTab } from './tabs/OverviewTab'; import { BookingsTab } from './tabs/BookingsTab'; import { SecurityTab } from './tabs/SecurityTab'; import { SupportTab } from './tabs/SupportTab'; import { AuditTab } from './tabs/AuditTab'; import { toast } from 'sonner'; import { cn } from '@/lib/utils'; interface UserInspectorSheetProps { user: UserType | null; open: boolean; onOpenChange: (open: boolean) => void; onEditUser: (user: UserType) => void; onSendNotification: (user: UserType) => void; } export function UserInspectorSheet({ user, open, onOpenChange, onEditUser, onSendNotification, }: UserInspectorSheetProps) { const [activeTab, setActiveTab] = useState('overview'); if (!user) return null; // Fetch related data const bookings = getUserBookings(user.id); const notes = getUserNotes(user.id); // Derived Metrics const successBookings = bookings.filter(b => b.status === 'Attended' || b.status === 'Confirmed').length; const cancelledBookings = bookings.filter(b => b.status === 'Cancelled' || b.status === 'Refunded').length; const isHighRisk = user.refundRate > 5; const copyToClipboard = (text: string) => { navigator.clipboard.writeText(text); toast.success('Copied to clipboard'); }; const handleAction = (label: string) => { toast.success(`${label} action triggered`); }; return ( {/* Section A: The Header (Compact) */}
{user.name.charAt(0)}

{user.name}

{user.isVerified && ( )}
copyToClipboard(user.id)} title="Click to copy ID" > {user.id} Joined {new Date(user.createdAt).toLocaleDateString('en-IN', { month: 'short', year: 'numeric' })} {user.role}
{user.status} onEditUser(user)}>Edit Profile handleAction('Archive')}>Archive User handleAction('Delete')}>Delete User
{/* Section B: Key Metrics Grid */}

LTV

50000 && "text-amber-600")}> {formatCurrency(user.totalSpent)}

Bookings

{user.bookingsCount}

{successBookings} Success{cancelledBookings} Cancelled

Avg. Ticket

{formatCurrency(user.averageOrderValue)}

Refund Risk

{user.refundRate}% {isHighRisk ? 'High' : 'Low'}
{/* Section C: Action Toolbar */}
handleAction('Suspend')} onSendNotification={() => onSendNotification(user)} />
{/* Section D: Tabbed Content */}
Overview Orders Security Support Audit
{/* Tab 1: Overview */} 0 ? notes[0].content : ''} /> {/* Tab 2: Orders */} {/* Tab 3: Security */} {/* Tab 4: Support */} {/* Tab 5: Audit (Admin Notes / Activity) */}
); }