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' import getMeta from '@/utils/meta' type resendInviteResponse = { success: boolean } type ManagedUserDropdownButtonProps = { user: User openOffboardingModalForUser: (user: User) => void groupId: string setManagedUserAlert: Dispatch> } export default function DropdownButton({ user, openOffboardingModalForUser, groupId, setManagedUserAlert, }: ManagedUserDropdownButtonProps) { const { t } = useTranslation() const { removeMember } = useGroupMembersContext() const [isOpened, setIsOpened] = useState(false) const { runAsync: runResendManagedUserInviteAsync, isLoading: isResendingManagedUserInvite, } = useAsync() const groupSSOActive = getMeta('ol-groupSSOActive') const ssoEnabledButNotAccepted = groupSSOActive && !user.enrollment?.sso const { runAsync: runResendLinkSSOInviteAsync, isLoading: isResendingSSOLinkInvite, } = useAsync() const { runAsync: runResendGroupInviteAsync, isLoading: isResendingGroupInvite, } = useAsync() const userPending = user.invite const userNotManaged = !user.isEntityAdmin && !userPending && !user.enrollment?.managedBy 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 handleResendLinkSSOInviteAsync = useCallback( async user => { try { const result = await runResendLinkSSOInviteAsync( postJSON(`/manage/groups/${groupId}/resendSSOLinkInvite/${user._id}`) ) if (result.success) { setManagedUserAlert({ variant: 'resendSSOLinkInviteSuccess', email: user.email, }) setIsOpened(false) } } catch (err) { if ((err as FetchError)?.response?.status === 429) { setManagedUserAlert({ variant: 'resendInviteTooManyRequests', email: user.email, }) } else { setManagedUserAlert({ variant: 'resendSSOLinkInviteFailed', email: user.email, }) } setIsOpened(false) } }, [setManagedUserAlert, groupId, runResendLinkSSOInviteAsync] ) 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 onResendSSOLinkInviteClick = () => { handleResendLinkSSOInviteAsync(user) } const onResendGroupInviteClick = () => { handleResendGroupInvite(user) } const onDeleteUserClick = () => { openOffboardingModalForUser(user) } const onRemoveFromGroup = () => { removeMember(user) } return ( setIsOpened(open)} >