AddUserDropdown.tsx92 lines · main
| 1 | import { PermissionAction } from '@supabase/shared-types/out/constants' |
| 2 | import { ChevronDown, Mail, UserPlus } from 'lucide-react' |
| 3 | import { parseAsBoolean, useQueryState } from 'nuqs' |
| 4 | import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from 'ui' |
| 5 | |
| 6 | import CreateUserModal from './CreateUserModal' |
| 7 | import InviteUserModal from './InviteUserModal' |
| 8 | import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' |
| 9 | import { ShortcutBadge } from '@/components/ui/ShortcutBadge' |
| 10 | import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' |
| 11 | import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' |
| 12 | import { SHORTCUT_IDS } from '@/state/shortcuts/registry' |
| 13 | |
| 14 | export const AddUserDropdown = () => { |
| 15 | const showSendInvitation = useIsFeatureEnabled('authentication:show_send_invitation') |
| 16 | |
| 17 | const { can: canInviteUsers } = useAsyncCheckPermissions( |
| 18 | PermissionAction.AUTH_EXECUTE, |
| 19 | 'invite_user' |
| 20 | ) |
| 21 | const { can: canCreateUsers } = useAsyncCheckPermissions( |
| 22 | PermissionAction.AUTH_EXECUTE, |
| 23 | 'create_user' |
| 24 | ) |
| 25 | |
| 26 | const [inviteVisible, setInviteVisible] = useQueryState( |
| 27 | 'invite', |
| 28 | parseAsBoolean.withDefault(false).withOptions({ history: 'push', clearOnDefault: true }) |
| 29 | ) |
| 30 | const [createVisible, setCreateVisible] = useQueryState( |
| 31 | 'new', |
| 32 | parseAsBoolean.withDefault(false).withOptions({ history: 'push', clearOnDefault: true }) |
| 33 | ) |
| 34 | |
| 35 | return ( |
| 36 | <> |
| 37 | <DropdownMenu> |
| 38 | <DropdownMenuTrigger asChild> |
| 39 | <Button type="primary" iconRight={<ChevronDown size={14} strokeWidth={1.5} />}> |
| 40 | Add user |
| 41 | </Button> |
| 42 | </DropdownMenuTrigger> |
| 43 | <DropdownMenuContent side="bottom" align="end" className="w-52"> |
| 44 | {showSendInvitation && ( |
| 45 | <DropdownMenuItemTooltip |
| 46 | className="gap-x-2" |
| 47 | disabled={!canInviteUsers} |
| 48 | onClick={() => { |
| 49 | if (canInviteUsers) setInviteVisible(true) |
| 50 | }} |
| 51 | tooltip={{ |
| 52 | content: { side: 'left', text: 'You need additional permissions to invite users' }, |
| 53 | }} |
| 54 | > |
| 55 | <Mail size={14} className="shrink-0" /> |
| 56 | <p className="flex-1 min-w-0">Send invitation</p> |
| 57 | {canInviteUsers && ( |
| 58 | <ShortcutBadge |
| 59 | shortcutId={SHORTCUT_IDS.AUTH_USERS_INVITE_USER} |
| 60 | className="shrink-0" |
| 61 | /> |
| 62 | )} |
| 63 | </DropdownMenuItemTooltip> |
| 64 | )} |
| 65 | |
| 66 | <DropdownMenuItemTooltip |
| 67 | className="gap-x-2 pointer-events-auto!" |
| 68 | disabled={!canCreateUsers} |
| 69 | onClick={() => { |
| 70 | if (canCreateUsers) setCreateVisible(true) |
| 71 | }} |
| 72 | tooltip={{ |
| 73 | content: { side: 'left', text: 'You need additional permissions to create users' }, |
| 74 | }} |
| 75 | > |
| 76 | <UserPlus size={14} className="shrink-0" /> |
| 77 | <p className="flex-1 min-w-0">Create new user</p> |
| 78 | {canCreateUsers && ( |
| 79 | <ShortcutBadge |
| 80 | shortcutId={SHORTCUT_IDS.AUTH_USERS_CREATE_USER} |
| 81 | className="shrink-0" |
| 82 | /> |
| 83 | )} |
| 84 | </DropdownMenuItemTooltip> |
| 85 | </DropdownMenuContent> |
| 86 | </DropdownMenu> |
| 87 | |
| 88 | <InviteUserModal visible={inviteVisible} setVisible={setInviteVisible} /> |
| 89 | <CreateUserModal visible={createVisible} setVisible={setCreateVisible} /> |
| 90 | </> |
| 91 | ) |
| 92 | } |