import { Mail, MoreHorizontal, ShieldOff, Trash, User as UserIcon } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' import { useParams } from 'common' import { useUserDeleteMFAFactorsMutation } from 'data/auth/user-delete-mfa-factors-mutation' import { useUserDeleteMutation } from 'data/auth/user-delete-mutation' import { useUserResetPasswordMutation } from 'data/auth/user-reset-password-mutation' import { useUserSendMagicLinkMutation } from 'data/auth/user-send-magic-link-mutation' import { useUserSendOTPMutation } from 'data/auth/user-send-otp-mutation' import type { User } from 'data/auth/users-infinite-query' import { timeout } from 'lib/helpers' import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, Tooltip_Shadcn_, TooltipContent_Shadcn_, TooltipTrigger_Shadcn_, } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' interface UserDropdownProps { user: User permissions: { canRemoveUser: boolean canRemoveMFAFactors: boolean canSendMagicLink: boolean canSendRecovery: boolean canSendOtp: boolean } setSelectedUser: (user: User) => void setUserSidePanelOpen: (open: boolean) => void } const UserDropdown = ({ user, permissions, setSelectedUser, setUserSidePanelOpen, }: UserDropdownProps) => { const { ref } = useParams() const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false) const [isDeleteFactorsModalOpen, setIsDeleteFactorsModalOpen] = useState(false) const { canRemoveUser, canRemoveMFAFactors, canSendMagicLink, canSendRecovery, canSendOtp } = permissions const { mutate: resetPassword, isLoading: isResetting } = useUserResetPasswordMutation({ onSuccess: () => { toast.success(`Sent password recovery to ${user.email}`) }, }) const { mutate: sendMagicLink, isLoading: isSendingLink } = useUserSendMagicLinkMutation({ onSuccess: () => { toast.success(`Sent magic link to ${user.email}`) }, }) const { mutate: sendOTP, isLoading: isSendingOTP } = useUserSendOTPMutation({ onSuccess: () => { toast.success(`Sent OTP to ${user.phone}`) }, }) const { mutate: deleteUser, isLoading: isDeleting } = useUserDeleteMutation({ onSuccess: () => { toast.success(`Successfully deleted ${user.email}`) setIsDeleteModalOpen(false) }, }) const { mutate: deleteUserMFAFactors, isLoading: isDeletingFactors } = useUserDeleteMFAFactorsMutation({ onSuccess: () => { toast.success("Successfully deleted the user's factors") setIsDeleteFactorsModalOpen(false) }, }) const isLoading = isResetting || isSendingLink || isSendingOTP || isDeleting || isDeletingFactors const handleResetPassword = async () => { if (!ref) return console.error('Project ref is required') resetPassword({ projectRef: ref, user }) } async function handleSendMagicLink() { if (!ref) return console.error('Project ref is required') sendMagicLink({ projectRef: ref, user }) } async function handleSendOtp() { if (!ref) return console.error('Project ref is required') sendOTP({ projectRef: ref, user }) } async function handleDelete() { await timeout(200) if (!ref) return console.error('Project ref is required') deleteUser({ projectRef: ref, user }) } async function handleDeleteFactors() { await timeout(200) if (!ref) return console.error('Project ref is required') if (!user.id) return console.error('User id is required') deleteUserMFAFactors({ projectRef: ref, userId: user.id }) } const handleViewUserInfo = () => { setSelectedUser(user) setUserSidePanelOpen(true) } return ( <>