import { observer } from "mobx-react"; import * as React from "react"; import { useTranslation } from "react-i18next"; import { useMenuState } from "reakit/Menu"; import { toast } from "sonner"; import User from "~/models/User"; import ContextMenu from "~/components/ContextMenu"; import OverflowMenuButton from "~/components/ContextMenu/OverflowMenuButton"; import Template from "~/components/ContextMenu/Template"; import { UserChangeToAdminDialog, UserChangeToMemberDialog, UserChangeToViewerDialog, UserSuspendDialog, UserChangeNameDialog, } from "~/components/UserDialogs"; import { actionToMenuItem } from "~/actions"; import { deleteUserActionFactory } from "~/actions/definitions/users"; import useActionContext from "~/hooks/useActionContext"; import usePolicy from "~/hooks/usePolicy"; import useStores from "~/hooks/useStores"; type Props = { user: User; }; function UserMenu({ user }: Props) { const { users, dialogs } = useStores(); const { t } = useTranslation(); const menu = useMenuState({ modal: true, }); const can = usePolicy(user.id); const context = useActionContext({ isContextMenu: true, }); const handlePromote = React.useCallback( (ev: React.SyntheticEvent) => { ev.preventDefault(); dialogs.openModal({ title: t("Change role to admin"), isCentered: true, content: ( ), }); }, [dialogs, t, user] ); const handleMember = React.useCallback( (ev: React.SyntheticEvent) => { ev.preventDefault(); dialogs.openModal({ title: t("Change role to member"), isCentered: true, content: ( ), }); }, [dialogs, t, user] ); const handleViewer = React.useCallback( (ev: React.SyntheticEvent) => { ev.preventDefault(); dialogs.openModal({ title: t("Change role to viewer"), isCentered: true, content: ( ), }); }, [dialogs, t, user] ); const handleChangeName = React.useCallback( (ev: React.SyntheticEvent) => { ev.preventDefault(); dialogs.openModal({ title: t("Change name"), isCentered: true, content: ( ), }); }, [dialogs, t, user] ); const handleSuspend = React.useCallback( (ev: React.SyntheticEvent) => { ev.preventDefault(); dialogs.openModal({ title: t("Suspend user"), isCentered: true, content: ( ), }); }, [dialogs, t, user] ); const handleRevoke = React.useCallback( async (ev: React.SyntheticEvent) => { ev.preventDefault(); await users.delete(user); }, [users, user] ); const handleResendInvite = React.useCallback( async (ev: React.SyntheticEvent) => { ev.preventDefault(); try { await users.resendInvite(user); toast.success(t(`Invite was resent to ${user.name}`)); } catch (err) { toast.error( err.message ?? t(`An error occurred while sending the invite`) ); } }, [users, user, t] ); const handleActivate = React.useCallback( async (ev: React.SyntheticEvent) => { ev.preventDefault(); await users.activate(user); }, [users, user] ); return ( <>