import { useState, type ComponentProps, useCallback, type Dispatch, type SetStateAction, } from 'react' import { useTranslation } from 'react-i18next' import { Dropdown, MenuItem } from 'react-bootstrap' import { User } from '../../../../../../types/group-management/user' import useAsync from '../../../../shared/hooks/use-async' import { type FetchError, postJSON, } from '../../../../infrastructure/fetch-json' import Icon from '../../../../shared/components/icon' import { ManagedUserAlert } from '../../utils/types' import { useGroupMembersContext } from '../../context/group-members-context' type resendInviteResponse = { success: boolean } type ManagedUserDropdownButtonProps = { user: User openOffboardingModalForUser: (user: User) => void groupId: string setManagedUserAlert: Dispatch> } export default function ManagedUserDropdownButton({ user, openOffboardingModalForUser, groupId, setManagedUserAlert, }: ManagedUserDropdownButtonProps) { const { t } = useTranslation() const { removeMember } = useGroupMembersContext() const [isOpened, setIsOpened] = useState(false) const { runAsync: runResendManagedUserInviteAsync, isLoading: isResendingManagedUserInvite, } = useAsync() const { runAsync: runResendGroupInviteAsync, isLoading: isResendingGroupInvite, } = useAsync() const userNotManaged = !user.isEntityAdmin && !user.invite && !user.enrollment?.managedBy const userPending = user.invite const handleResendManagedUserInvite = useCallback( async user => { try { const result = await runResendManagedUserInviteAsync( postJSON( `/manage/groups/${groupId}/resendManagedUserInvite/${user._id}` ) ) if (result.success) { setManagedUserAlert({ variant: 'resendManagedUserInviteSuccess', email: user.email, }) setIsOpened(false) } } catch (err) { if ((err as FetchError)?.response?.status === 429) { setManagedUserAlert({ variant: 'resendInviteTooManyRequests', email: user.email, }) } else { setManagedUserAlert({ variant: 'resendManagedUserInviteFailed', email: user.email, }) } setIsOpened(false) } }, [setManagedUserAlert, groupId, runResendManagedUserInviteAsync] ) const handleResendGroupInvite = useCallback( async user => { try { await runResendGroupInviteAsync( postJSON(`/manage/groups/${groupId}/resendInvite/`, { body: { email: user.email, }, }) ) setManagedUserAlert({ variant: 'resendGroupInviteSuccess', email: user.email, }) setIsOpened(false) } catch (err) { if ((err as FetchError)?.response?.status === 429) { setManagedUserAlert({ variant: 'resendInviteTooManyRequests', email: user.email, }) } else { setManagedUserAlert({ variant: 'resendGroupInviteFailed', email: user.email, }) } setIsOpened(false) } }, [setManagedUserAlert, groupId, runResendGroupInviteAsync] ) const onResendManagedUserInviteClick = () => { handleResendManagedUserInvite(user) } const onResendGroupInviteClick = () => { handleResendGroupInvite(user) } const onDeleteUserClick = () => { openOffboardingModalForUser(user) } const onRemoveFromGroup = () => { removeMember(user) } return ( setIsOpened(open)} >