{"version":3,"sources":["../../../src/lib/user-actions-dropdown.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Member, useRolesAndConfig } from \"../api/endpoint.js\";\nimport { DeleteUserDialog } from \"./delete-user-dialog.js\";\nimport { EditUserRoleDialog } from \"./edit-user-role-dialog.js\";\nimport { DropdownMenu } from \"./elements.js\";\nimport { ResendInviteDialog } from \"./resend-invite-dialog.js\";\nimport { RevokeInviteDialog } from \"./revoke-invite-dialog.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface UserActionsDropdownProps {\n  user: Member;\n  children: React.ReactNode;\n}\n\ntype UserActionDialog =\n  | \"revoke-membership\"\n  | \"revoke-invite\"\n  | \"resend-invite\"\n  | \"edit-role\";\n\nexport const UserActionsDropdown = ({\n  user,\n  children,\n}: UserActionsDropdownProps) => {\n  const translate = useTranslation();\n  const rolesAndConfigQuery = useRolesAndConfig({\n    query: {\n      initialData: { roles: [], multipleRolesEnabled: false },\n    },\n  });\n  const { roles, multipleRolesEnabled: isMultipleRolesEnabled } =\n    rolesAndConfigQuery.data;\n  const [openDialog, setOpenDialog] = React.useState<UserActionDialog | null>(\n    null,\n  );\n\n  /**\n   * Assigns a key for each dialog based on its open state to ensure its\n   * internal state is cleared when it is closed.\n   */\n  function getDialogKey(dialog: UserActionDialog) {\n    return `${dialog}-${openDialog === dialog}-${user.id}`;\n  }\n\n  const { actions, items } = React.useMemo(() => {\n    const actions = new Set(user.actions);\n    const items: React.ReactElement[] = [];\n    if (actions.has(\"edit-role\")) {\n      items.push(\n        <DropdownMenu.Item\n          key=\"edit-role\"\n          onSelect={() => setOpenDialog(\"edit-role\")}\n          disabled={\n            rolesAndConfigQuery.isLoading ||\n            (rolesAndConfigQuery.isSuccess && roles.length <= 1)\n          }\n          title={\n            rolesAndConfigQuery.isSuccess && roles.length <= 1\n              ? translate({\n                  defaultMessage:\n                    \"You cannot update the role for this user as there is only one role available.\",\n                  id: \"rzvafM\",\n                  description:\n                    \"Tooltip explaining why role editing is disabled\",\n                })\n              : undefined\n          }\n        >\n          {isMultipleRolesEnabled ? (\n            <Translation\n              defaultMessage=\"Edit roles\"\n              id=\"yjbD6m\"\n              description=\"Menu option to edit user roles (plural)\"\n            />\n          ) : (\n            <Translation\n              defaultMessage=\"Edit role\"\n              id=\"NJqcnW\"\n              description=\"Menu option to edit user role (singular)\"\n            />\n          )}\n        </DropdownMenu.Item>,\n      );\n    }\n    if (actions.has(\"resend-invite\")) {\n      items.push(\n        <DropdownMenu.Item\n          key=\"resend-invite\"\n          onSelect={() => setOpenDialog(\"resend-invite\")}\n        >\n          <Translation\n            defaultMessage=\"Resend invitation\"\n            id=\"1fzoWe\"\n            description=\"Menu option to resend user invitation\"\n          />\n        </DropdownMenu.Item>,\n      );\n    }\n    if (actions.has(\"revoke-invite\")) {\n      items.push(\n        <DropdownMenu.Item\n          variant=\"destructive\"\n          key=\"revoke-invite\"\n          onSelect={() => setOpenDialog(\"revoke-invite\")}\n        >\n          <Translation\n            defaultMessage=\"Revoke invitation\"\n            id=\"0Ie4dM\"\n            description=\"Menu option to revoke user invitation\"\n          />\n        </DropdownMenu.Item>,\n      );\n    }\n    if (actions.has(\"revoke-membership\")) {\n      items.push(\n        <DropdownMenu.Item\n          variant=\"destructive\"\n          key=\"revoke-membership\"\n          onSelect={() => setOpenDialog(\"revoke-membership\")}\n        >\n          <Translation\n            defaultMessage=\"Remove user\"\n            id=\"qGSR1P\"\n            description=\"Menu option to remove user from organization\"\n          />\n        </DropdownMenu.Item>,\n      );\n    }\n    return {\n      actions,\n      items,\n    };\n  }, [\n    rolesAndConfigQuery,\n    user.actions,\n    isMultipleRolesEnabled,\n    roles,\n    translate,\n  ]);\n\n  if (user.isLoggedInUser || items.length === 0) {\n    return null;\n  }\n\n  return (\n    <>\n      <DropdownMenu.Root>\n        <DropdownMenu.Trigger>{children}</DropdownMenu.Trigger>\n        <DropdownMenu.Content size=\"2\" align=\"end\">\n          {items}\n        </DropdownMenu.Content>\n      </DropdownMenu.Root>\n\n      {actions.has(\"edit-role\") && (\n        <EditUserRoleDialog\n          key={getDialogKey(\"edit-role\")}\n          user={user}\n          open={openDialog === \"edit-role\"}\n          onOpenChange={(open) => !open && setOpenDialog(null)}\n        />\n      )}\n\n      {actions.has(\"revoke-membership\") && (\n        <DeleteUserDialog\n          key={getDialogKey(\"revoke-membership\")}\n          user={user}\n          open={openDialog === \"revoke-membership\"}\n          onOpenChange={(open) => !open && setOpenDialog(null)}\n        />\n      )}\n\n      {actions.has(\"revoke-invite\") && (\n        <RevokeInviteDialog\n          key={getDialogKey(\"revoke-invite\")}\n          user={user}\n          open={openDialog === \"revoke-invite\"}\n          onOpenChange={(open) => !open && setOpenDialog(null)}\n        />\n      )}\n\n      {actions.has(\"resend-invite\") && (\n        <ResendInviteDialog\n          key={getDialogKey(\"resend-invite\")}\n          user={user}\n          open={openDialog === \"resend-invite\"}\n          onOpenChange={(open) => !open && setOpenDialog(null)}\n        />\n      )}\n    </>\n  );\n};\n"],"mappings":"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","names":["actions","items"]}