'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 (
<>