Skip to content

Commit 8b4d781

Browse files
authored
Fix leave team button visibility (supabase#36480)
* Fix leave team button visibility * Add button type
1 parent 7acdc5d commit 8b4d781

File tree

3 files changed

+28
-84
lines changed

3 files changed

+28
-84
lines changed

apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,15 @@ import { toast } from 'sonner'
88
import * as z from 'zod'
99

1010
import { useParams } from 'common'
11+
import { ButtonTooltip } from 'components/ui/ButtonTooltip'
1112
import InformationBox from 'components/ui/InformationBox'
1213
import { useOrganizationCreateInvitationMutation } from 'data/organization-members/organization-invitation-create-mutation'
1314
import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query'
1415
import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query'
1516
import { useProjectsQuery } from 'data/projects/projects-query'
1617
import { useHasAccessToProjectLevelPermissions } from 'data/subscriptions/org-subscription-query'
17-
import {
18-
doPermissionsCheck,
19-
useCheckPermissions,
20-
useGetPermissions,
21-
} from 'hooks/misc/useCheckPermissions'
18+
import { doPermissionsCheck, useGetPermissions } from 'hooks/misc/useCheckPermissions'
19+
import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled'
2220
import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization'
2321
import { useProfile } from 'lib/profile'
2422
import {
@@ -50,9 +48,6 @@ import {
5048
SelectTrigger_Shadcn_,
5149
Select_Shadcn_,
5250
Switch,
53-
Tooltip,
54-
TooltipContent,
55-
TooltipTrigger,
5651
cn,
5752
} from 'ui'
5853
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
@@ -64,6 +59,10 @@ export const InviteMemberButton = () => {
6459
const organization = useSelectedOrganization()
6560
const { permissions: permissions } = useGetPermissions()
6661

62+
const { organizationMembersCreate: organizationMembersCreationEnabled } = useIsFeatureEnabled([
63+
'organization_members:create',
64+
])
65+
6766
const [isOpen, setIsOpen] = useState(false)
6867
const [projectDropdownOpen, setProjectDropdownOpen] = useState(false)
6968

@@ -75,10 +74,6 @@ export const InviteMemberButton = () => {
7574
const orgProjects = (projects ?? [])
7675
.filter((project) => project.organization_id === organization?.id)
7776
.sort((a, b) => a.name.localeCompare(b.name))
78-
const canReadSubscriptions = useCheckPermissions(
79-
PermissionAction.BILLING_READ,
80-
'stripe.subscriptions'
81-
)
8277

8378
const currentPlan = organization?.plan
8479
const hasAccessToProjectLevelPermissions = useHasAccessToProjectLevelPermissions(slug as string)
@@ -96,6 +91,7 @@ export const InviteMemberButton = () => {
9691

9792
const canInviteMembers =
9893
hasOrgRole &&
94+
rolesAddable.length > 0 &&
9995
orgScopedRoles.some(({ id: role_id }) =>
10096
doPermissionsCheck(
10197
permissions,
@@ -182,22 +178,24 @@ export const InviteMemberButton = () => {
182178
return (
183179
<Dialog open={isOpen} onOpenChange={setIsOpen}>
184180
<DialogTrigger asChild>
185-
<Tooltip>
186-
<TooltipTrigger asChild>
187-
<Button
188-
disabled={!canInviteMembers}
189-
className="pointer-events-auto flex-grow md:flex-grow-0"
190-
onClick={() => setIsOpen(true)}
191-
>
192-
Invite member
193-
</Button>
194-
</TooltipTrigger>
195-
{!canInviteMembers && (
196-
<TooltipContent side="bottom">
197-
You need additional permissions to invite a member to this organization
198-
</TooltipContent>
199-
)}
200-
</Tooltip>
181+
<ButtonTooltip
182+
type="primary"
183+
disabled={!canInviteMembers}
184+
className="pointer-events-auto flex-grow md:flex-grow-0"
185+
onClick={() => setIsOpen(true)}
186+
tooltip={{
187+
content: {
188+
side: 'bottom',
189+
text: !organizationMembersCreationEnabled
190+
? 'Inviting members is currently disabled'
191+
: !canInviteMembers
192+
? 'You need additional permissions to invite a member to this organization'
193+
: undefined,
194+
},
195+
}}
196+
>
197+
Invite member
198+
</ButtonTooltip>
201199
</DialogTrigger>
202200
<DialogContent size="medium">
203201
<DialogHeader>

apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import {
2929
} from 'ui'
3030
import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
3131
import { LeaveTeamButton } from './LeaveTeamButton'
32-
import { hasMultipleOwners, useGetRolesManagementPermissions } from './TeamSettings.utils'
32+
import { useGetRolesManagementPermissions } from './TeamSettings.utils'
3333
import { UpdateRolesPanel } from './UpdateRolesPanel/UpdateRolesPanel'
3434

3535
interface MemberActionsProps {
@@ -50,10 +50,6 @@ export const MemberActions = ({ member }: MemberActionsProps) => {
5050
const { data: allRoles } = useOrganizationRolesV2Query({ slug })
5151

5252
const memberIsUser = member.gotrue_id == profile?.gotrue_id
53-
const isOwner = selectedOrganization?.is_owner
54-
const roles = allRoles?.org_scoped_roles ?? []
55-
const canLeave = !isOwner || (isOwner && hasMultipleOwners(members, roles))
56-
5753
const orgScopedRoles = allRoles?.org_scoped_roles ?? []
5854
const projectScopedRoles = allRoles?.project_scoped_roles ?? []
5955
const isPendingInviteAcceptance = !!member.invited_id
@@ -151,25 +147,6 @@ export const MemberActions = ({ member }: MemberActionsProps) => {
151147
)
152148
}
153149

154-
if (!canRemoveMember || (isPendingInviteAcceptance && !canResendInvite && !canRevokeInvite)) {
155-
return (
156-
<div className="flex items-center justify-end">
157-
<ButtonTooltip
158-
disabled
159-
type="text"
160-
className="px-1.5"
161-
icon={<MoreVertical size={18} />}
162-
tooltip={{
163-
content: {
164-
side: 'bottom',
165-
text: 'You need additional permissions to manage this team member',
166-
},
167-
}}
168-
/>
169-
</div>
170-
)
171-
}
172-
173150
if (memberIsUser) {
174151
return (
175152
<div className="flex items-center justify-end">

apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Search } from 'lucide-react'
22
import { useState } from 'react'
33

4-
import { useParams } from 'common'
54
import {
65
ScaffoldActionsContainer,
76
ScaffoldActionsGroup,
@@ -10,40 +9,13 @@ import {
109
ScaffoldSectionContent,
1110
ScaffoldTitle,
1211
} from 'components/layouts/Scaffold'
13-
import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query'
14-
import { usePermissionsQuery } from 'data/permissions/permissions-query'
15-
import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled'
16-
import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization'
17-
import { useProfile } from 'lib/profile'
1812
import { Input } from 'ui-patterns/DataInputs/Input'
1913
import { InviteMemberButton } from './InviteMemberButton'
2014
import MembersView from './MembersView'
21-
import { useGetRolesManagementPermissions } from './TeamSettings.utils'
2215

2316
export const TeamSettings = () => {
24-
const { organizationMembersCreate: organizationMembersCreationEnabled } = useIsFeatureEnabled([
25-
'organization_members:create',
26-
])
27-
28-
const { slug } = useParams()
29-
const { profile } = useProfile()
30-
const selectedOrganization = useSelectedOrganization()
31-
32-
const { data: permissions } = usePermissionsQuery()
33-
const { data: rolesData } = useOrganizationRolesV2Query({ slug })
34-
35-
const roles = rolesData?.org_scoped_roles ?? []
36-
37-
const { rolesAddable } = useGetRolesManagementPermissions(
38-
selectedOrganization?.slug,
39-
roles,
40-
permissions ?? []
41-
)
42-
4317
const [searchString, setSearchString] = useState('')
4418

45-
const canAddMembers = rolesAddable.length > 0
46-
4719
return (
4820
<ScaffoldContainerLegacy>
4921
<ScaffoldTitle>Team</ScaffoldTitle>
@@ -60,10 +32,7 @@ export const TeamSettings = () => {
6032
placeholder="Filter members"
6133
/>
6234
<ScaffoldActionsGroup className="w-full md:w-auto">
63-
{organizationMembersCreationEnabled &&
64-
canAddMembers &&
65-
profile !== undefined &&
66-
selectedOrganization !== undefined && <InviteMemberButton />}
35+
<InviteMemberButton />
6736
</ScaffoldActionsGroup>
6837
</ScaffoldActionsContainer>
6938
<ScaffoldSectionContent className="w-full">

0 commit comments

Comments
 (0)