import React, { useCallback } from 'react' import type { OrderCardActionProps } from '@packages/shared' import { createFileRoute, useNavigate } from '@tanstack/react-router' import { ChevronLeft, ChevronRight, CircleAlert, User as UserIcon, Clock, ShoppingBag } from 'lucide-react' import { AppContainer, p as MyText, Checkbox } from 'web-components' import { trpc } from '@/lib/trpc-client' import { formatDistanceToNow } from 'date-fns' import dayjs from 'dayjs' import { UserIncidentsView } from '../components/UserIncidentsView' export const Route = createFileRoute('/dashboard/users/$id')({ component: UserDetails, }) interface Order { id: number readableId: number totalAmount: string createdAt: string status: string isFlashDelivery: boolean itemCount: number } interface OrderItemProps extends OrderCardActionProps { } const getStatusColor = (status: string) => { switch (status) { case 'delivered': return 'text-green-600 bg-green-50 border-green-100' case 'cancelled': return 'text-red-600 bg-red-50 border-red-100' default: return 'text-yellow-600 bg-yellow-50 border-yellow-100' } } const OrderItem: React.FC = ({ order, onPress }) => { const statusStyle = getStatusColor(order.status) return (
{ if (e.key === 'Enter') onPress() }} className="mb-3 cursor-pointer rounded-xl border border-gray-100 bg-white p-4 text-left shadow-sm transition-colors hover:bg-gray-50" >
#{order.readableId} {order.isFlashDelivery && ( )}
{order.status}
{dayjs(order.createdAt).format('MMM DD, YYYY • h:mm A')} {order.itemCount} {order.itemCount === 1 ? 'item' : 'items'}
₹{order.totalAmount}
View Order Details
) } function UserDetails() { const navigate = useNavigate() const { id } = Route.useParams() as { id: string } const userId = id ? parseInt(id) : 0 const { data, isLoading, error, refetch } = trpc.admin.user.getUserDetails.useQuery( { userId }, { enabled: !!userId } ) const updateSuspension = trpc.admin.user.updateUserSuspension.useMutation({ onSuccess: () => { refetch() }, }) const handleOrderPress = useCallback((orderId: number) => { navigate({ to: '/dashboard/orders/$id', params: { id: String(orderId) } }) }, [navigate]) const handleSuspensionToggle = useCallback((isSuspended: boolean) => { updateSuspension.mutate({ userId, isSuspended }) }, [userId, updateSuspension]) if (isLoading) { return (
Loading user details...
) } if (error || !data) { return (
Error {error?.message || 'Failed to load user details'}
) } const { user, orders } = data const displayName = user.name || 'Unnamed User' return (
User Details
{user.mobile || 'No Mobile'} {user.isSuspended && ( Suspended )}
{displayName}
Registered {formatDistanceToNow(new Date(user.createdAt), { addSuffix: true })}
Suspend User Prevent user from placing orders
{updateSuspension.isPending ? (
) : ( handleSuspensionToggle(!user.isSuspended)} size={28} /> )}
Order History {orders.length} {orders.length === 1 ? 'order' : 'orders'}
{orders.length === 0 ? (
No orders yet
) : ( orders.map((order) => ( handleOrderPress(order.id)} /> )) )}
) }