'use client' import { useState } from 'react' import Link from 'next/link' import { useRouter } from 'next/navigation' import { trpc } from '@/lib/trpc/client' import { Button } from '@/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog' import { toast } from 'sonner' import { MoreHorizontal, Mail, UserCog, Trash2, Loader2, } from 'lucide-react' interface UserActionsProps { userId: string userEmail: string userStatus: string } export function UserActions({ userId, userEmail, userStatus }: UserActionsProps) { const router = useRouter() const [showDeleteDialog, setShowDeleteDialog] = useState(false) const [isSending, setIsSending] = useState(false) const sendInvitation = trpc.user.sendInvitation.useMutation() const deleteUser = trpc.user.delete.useMutation() const handleSendInvitation = async () => { if (userStatus !== 'INVITED') { toast.error('User has already accepted their invitation') return } setIsSending(true) try { await sendInvitation.mutateAsync({ userId }) toast.success(`Invitation sent to ${userEmail}`) } catch (error) { toast.error(error instanceof Error ? error.message : 'Failed to send invitation') } finally { setIsSending(false) } } const handleDelete = async () => { try { await deleteUser.mutateAsync({ id: userId }) toast.success('User deleted successfully') setShowDeleteDialog(false) router.refresh() } catch (error) { toast.error(error instanceof Error ? error.message : 'Failed to delete user') } } return ( <> Edit {isSending ? 'Sending...' : 'Send Invite'} setShowDeleteDialog(true)} > Remove Delete User Are you sure you want to delete {userEmail}? This action cannot be undone and will remove all their assignments and evaluations. Cancel {deleteUser.isPending ? ( ) : null} Delete ) } interface UserMobileActionsProps { userId: string userEmail: string userStatus: string } export function UserMobileActions({ userId, userEmail, userStatus, }: UserMobileActionsProps) { const [isSending, setIsSending] = useState(false) const sendInvitation = trpc.user.sendInvitation.useMutation() const handleSendInvitation = async () => { if (userStatus !== 'INVITED') { toast.error('User has already accepted their invitation') return } setIsSending(true) try { await sendInvitation.mutateAsync({ userId }) toast.success(`Invitation sent to ${userEmail}`) } catch (error) { toast.error(error instanceof Error ? error.message : 'Failed to send invitation') } finally { setIsSending(false) } } return (
) }