Remove enablePermissions flag

This commit is contained in:
Joshen Lim committed 2022-12-06 10:53:02 +08:00
1 parent af925000ab
commit 6064b9d8a8
21 files changed
+125 -211

No files matched your search

@@ -33,7 +33,7 @@ const PortalToast = () => (
<>
{icon}
<div className="flex items-center">
<div className="w-full break-all">{message}</div>
<div className="toast-message w-full">{message}</div>
{t.type !== 'loading' && (
<div className="ml-4">
<Button className="!p-1" type="text" onClick={() => toast.dismiss(t.id)}>
@@ -71,12 +71,11 @@ const PaymentSummaryPanel: FC<Props> = ({
}) => {
const { ui } = useStore()
const projectRegion = ui.selectedProject?.region
const isOwner = ui.selectedOrganization?.is_owner
const enablePermissions = useFlag('enablePermissions')
const canUpdatePaymentMethods = enablePermissions
? checkPermissions(PermissionAction.BILLING_WRITE, 'stripe.payment_methods')
: isOwner
const canUpdatePaymentMethods = checkPermissions(
PermissionAction.BILLING_WRITE,
'stripe.payment_methods'
)
const [showConfirmModal, setShowConfirmModal] = useState(false)
@@ -311,9 +310,8 @@ const PaymentSummaryPanel: FC<Props> = ({
].join(' ')}
>
<span className="text-xs text-scale-1200">
{enablePermissions
? 'You need additional permissions to add new payment methods to this organization'
: 'Only organization owners can add new payment methods'}
You need additional permissions to add new payment methods to this
organization
</span>
</div>
</Tooltip.Content>
@@ -36,13 +36,13 @@ const Subscription: FC<Props> = ({
const router = useRouter()
const { ref } = router.query
const enablePermissions = useFlag('enablePermissions')
const projectUpdateDisabled = useFlag('disableProjectCreationAndUpdate')
const canReadSubscription = checkPermissions(PermissionAction.READ, 'subscriptions')
const canUpdateSubscription = enablePermissions
? checkPermissions(PermissionAction.BILLING_WRITE, 'stripe.subscriptions')
: ui.selectedOrganization?.is_owner
const canUpdateSubscription = checkPermissions(
PermissionAction.BILLING_WRITE,
'stripe.subscriptions'
)
const { usage, isLoading: loadingUsage } = useProjectUsage(ref as string)
@@ -112,10 +112,8 @@ const Subscription: FC<Props> = ({
<br />
Our engineers are working on a fix.
</>
) : !canUpdateSubscription && enablePermissions ? (
) : !canUpdateSubscription ? (
'You need additional permissions to amend subscriptions'
) : !canUpdateSubscription && !enablePermissions ? (
'Only the organization owner can amend subscriptions'
) : (
''
)}
@@ -4,7 +4,7 @@ import { Dictionary } from 'components/grid'
import { Form, Input, Button, Listbox } from 'ui'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { checkPermissions, useStore, useFlag } from 'hooks'
import { checkPermissions, useStore } from 'hooks'
import { patch } from 'lib/common/fetch'
import { API_URL } from 'lib/constants'
import { COUNTRIES } from './BillingAddress.constants'
@@ -22,11 +22,11 @@ const BillingAddress: FC<Props> = ({ loading, address, onAddressUpdated }) => {
const orgSlug = ui.selectedOrganization?.slug ?? ''
const { city, country, line1, line2, postal_code, state } = address
const enablePermissions = useFlag('enablePermissions')
const canReadBillingAddress = checkPermissions(PermissionAction.BILLING_READ, 'stripe.customer')
const canUpdateBillingAddress = enablePermissions
? checkPermissions(PermissionAction.BILLING_WRITE, 'stripe.customer')
: ui.selectedOrganization?.is_owner
const canUpdateBillingAddress = checkPermissions(
PermissionAction.BILLING_WRITE,
'stripe.customer'
)
const [isDirty, setIsDirty] = useState(false)
const initialValues = {
@@ -1,17 +1,11 @@
import { useContext, useEffect } from 'react'
import { Form, Input } from 'ui'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { useFlag, useStore, checkPermissions } from 'hooks'
import { useStore, checkPermissions } from 'hooks'
import { API_URL } from 'lib/constants'
import { patch } from 'lib/common/fetch'
import {
FormActions,
FormPanel,
FormSection,
FormSectionContent,
FormSectionLabel,
} from 'components/ui/Forms'
import { FormActions, FormPanel, FormSection, FormSectionContent } from 'components/ui/Forms'
import { PageContext } from 'pages/org/[slug]/settings'
@@ -24,12 +18,7 @@ const BillingEmail = () => {
billing_email: PageState.organization?.billing_email ?? '',
}
const enablePermissions = useFlag('enablePermissions')
const canUpdateOrganization = enablePermissions
? checkPermissions(PermissionAction.UPDATE, 'organizations')
: ui.selectedOrganization?.is_owner
const canUpdateOrganization = checkPermissions(PermissionAction.UPDATE, 'organizations')
const canReadBillingEmail = checkPermissions(PermissionAction.READ, 'organizations')
const onUpdateOrganization = async (values: any, { setSubmitting, resetForm }: any) => {
@@ -1,6 +1,6 @@
import { FC, useState, useEffect } from 'react'
import { useFlag, useStore, checkPermissions } from 'hooks'
import { useStore } from 'hooks'
import { API_URL } from 'lib/constants'
import { get } from 'lib/common/fetch'
@@ -9,7 +9,6 @@ import CreditBalance from './CreditBalance'
import PaymentMethods from './PaymentMethods'
import BillingAddress from './BillingAddress/BillingAddress'
import TaxID from './TaxID/TaxID'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import BillingEmail from './BillingEmail'
interface Props {
@@ -39,14 +38,6 @@ const BillingSettings: FC<Props> = ({ organization, projects = [] }) => {
? customerBalance.toString().replace('-', '')
: customerBalance
const enablePermissions = useFlag('enablePermissions')
const canUpdateOrganization = enablePermissions
? checkPermissions(PermissionAction.UPDATE, 'organizations')
: ui.selectedOrganization?.is_owner
const canReadBillingEmail = checkPermissions(PermissionAction.READ, 'organizations')
useEffect(() => {
getCustomerProfile()
getPaymentMethods()
@@ -46,15 +46,14 @@ const PaymentMethods: FC<Props> = ({
const [showAddPaymentMethodModal, setShowAddPaymentMethodModal] = useState(false)
const [isUpdatingPaymentMethod, setIsUpdatingPaymentMethod] = useState(false)
const enablePermissions = useFlag('enablePermissions')
const canReadPaymentMethods = checkPermissions(
PermissionAction.BILLING_READ,
'stripe.payment_methods'
)
const canUpdatePaymentMethods = enablePermissions
? checkPermissions(PermissionAction.BILLING_WRITE, 'stripe.payment_methods')
: isOwner
const canUpdatePaymentMethods = checkPermissions(
PermissionAction.BILLING_WRITE,
'stripe.payment_methods'
)
const onConfirmMakeDefaultPaymentMethod = async () => {
try {
@@ -120,9 +119,7 @@ const PaymentMethods: FC<Props> = ({
<div className="flex w-full justify-between">
{!canUpdatePaymentMethods ? (
<p className="text-sm text-scale-1000">
{enablePermissions
? "You need additional permissions to manage this organization's payment methods"
: 'Only organization owners can update payment methods'}
You need additional permissions to manage this organization's payment methods
</p>
) : (
<div />
@@ -50,12 +50,8 @@ const TaxID: FC<Props> = ({ loading, taxIds, onTaxIdsUpdated }) => {
}, [taxIds])
const hasChanges = !isEqual(taxIdValues, formattedTaxIds)
const enablePermissions = useFlag('enablePermissions')
const canReadTaxIds = checkPermissions(PermissionAction.BILLING_READ, 'stripe.tax_ids')
const canUpdateTaxIds = enablePermissions
? checkPermissions(PermissionAction.BILLING_WRITE, 'stripe.tax_ids')
: ui.selectedOrganization?.is_owner
const canUpdateTaxIds = checkPermissions(PermissionAction.BILLING_WRITE, 'stripe.tax_ids')
const onUpdateTaxId = (id: string, key: string, value: string) => {
const updatedTaxIds = taxIdValues.map((taxId: any) => {
@@ -3,7 +3,7 @@ import { observer } from 'mobx-react-lite'
import { Form, Input } from 'ui'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { useFlag, useStore, checkPermissions } from 'hooks'
import { useStore, checkPermissions } from 'hooks'
import { API_URL } from 'lib/constants'
import { patch } from 'lib/common/fetch'
@@ -24,16 +24,8 @@ const GeneralSettings = observer(() => {
const formId = 'org-general-settings'
const initialValues = { name: PageState.organization.name }
const enablePermissions = useFlag('enablePermissions')
const canUpdateOrganization = enablePermissions
? checkPermissions(PermissionAction.UPDATE, 'organizations')
: ui.selectedOrganization?.is_owner
const canDeleteOrganization = enablePermissions
? checkPermissions(PermissionAction.UPDATE, 'organizations')
: ui.selectedOrganization?.is_owner
const canUpdateOrganization = checkPermissions(PermissionAction.UPDATE, 'organizations')
const canDeleteOrganization = checkPermissions(PermissionAction.UPDATE, 'organizations')
const onUpdateOrganization = async (values: any, { setSubmitting, resetForm }: any) => {
if (!canUpdateOrganization) {
@@ -1,12 +1,8 @@
import { IconAlertCircle } from 'ui'
import { useFlag } from 'hooks'
import InformationBox from 'components/ui/InformationBox'
// [Joshen] This can just use NoPermission component i think
const NotOrganizationOwnerWarning = () => {
const enablePermissions = useFlag('enablePermissions')
return (
<div className="mt-4">
<InformationBox
@@ -17,9 +13,7 @@ const NotOrganizationOwnerWarning = () => {
description={
<div className="space-y-3">
<p className="text-sm leading-normal">
{enablePermissions
? 'Contact your organization owner or adminstrator to create a new project.'
: 'Only the organization owner can create new projects. Contact your organization owner to create a new project for this organization.'}
Contact your organization owner or adminstrator to create a new project.
</p>
</div>
}
@@ -6,7 +6,7 @@ import * as Tooltip from '@radix-ui/react-tooltip'
import { Button, Form, IconMail, Input, Modal, Select } from 'ui'
import { Member, User, Role } from 'types'
import { checkPermissions, useFlag, useOrganizationDetail, useStore } from 'hooks'
import { checkPermissions, useOrganizationDetail, useStore } from 'hooks'
import { post } from 'lib/common/fetch'
import { API_URL } from 'lib/constants'
import { PermissionAction } from '@supabase/shared-types/out/constants'
@@ -23,8 +23,6 @@ const InviteMemberButton: FC<Props> = ({ user, members = [], roles = [], rolesAd
const router = useRouter()
const { slug } = router.query
const enablePermissions = useFlag('enablePermissions')
const [isOpen, setIsOpen] = useState(false)
const { mutateOrgMembers } = useOrganizationDetail((slug as string) || '')
@@ -57,16 +55,14 @@ const InviteMemberButton: FC<Props> = ({ user, members = [], roles = [], rolesAd
}
}
const roleId = enablePermissions
? Number(values.role)
: roles.find((role) => role.name === 'Developer')?.id ?? roles[0].id
const roleId = Number(values.role)
setSubmitting(true)
const response = await post(`${API_URL}/organizations/${slug}/members/invite`, {
invited_email: values.email.toLowerCase(),
owner_id: user.id,
...(enablePermissions ? { role_id: roleId } : {}),
role_id: roleId,
})
if (response.error) {
@@ -141,9 +137,7 @@ const InviteMemberButton: FC<Props> = ({ user, members = [], roles = [], rolesAd
}, [roles])
const selectedRole = roles.find((role) => role.id === Number(values.role))
const invalidRoleSelected = enablePermissions
? values.role && !rolesAddable.includes(Number(values.role))
: false
const invalidRoleSelected = values.role && !rolesAddable.includes(Number(values.role))
return (
<>
@@ -151,7 +145,7 @@ const InviteMemberButton: FC<Props> = ({ user, members = [], roles = [], rolesAd
<div className="w-full py-4">
<div className="space-y-4">
<div className="space-y-2">
{roles && enablePermissions && (
{roles && (
<Select
name="role"
label="Member role"
@@ -5,7 +5,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants'
import { Button, Dropdown, IconTrash, IconMoreHorizontal } from 'ui'
import { Member, Role } from 'types'
import { useStore, useOrganizationDetail, useFlag, checkPermissions } from 'hooks'
import { useStore, useOrganizationDetail, checkPermissions } from 'hooks'
import { delete_, post } from 'lib/common/fetch'
import { API_URL } from 'lib/constants'
import TextConfirmModal from 'components/ui/Modals/TextConfirmModal'
@@ -27,7 +27,6 @@ const MemberActions: FC<Props> = ({ members, member, roles }) => {
const { rolesRemovable } = getRolesManagementPermissions(roles)
const { app, ui } = useStore()
const enablePermissions = useFlag('enablePermissions')
const { mutateOrgMembers } = useOrganizationDetail(ui.selectedOrganization?.slug || '')
const [loading, setLoading] = useState(false)
@@ -37,9 +36,7 @@ const MemberActions: FC<Props> = ({ members, member, roles }) => {
const isPendingInviteAcceptance = member.invited_id
const roleId = member.role_ids?.[0] ?? -1
const canRemoveMember = enablePermissions
? rolesRemovable.includes((member?.role_ids ?? [-1])[0])
: true
const canRemoveMember = rolesRemovable.includes((member?.role_ids ?? [-1])[0])
const canResendInvite = checkPermissions(PermissionAction.CREATE, 'user_invites', {
resource: { role_id: roleId },
})
@@ -54,11 +51,9 @@ const MemberActions: FC<Props> = ({ members, member, roles }) => {
onAsyncConfirm: async () => {
setLoading(true)
const response = enablePermissions
? await delete_(`${API_URL}/organizations/${slug}/members/${member.gotrue_id}`)
: await delete_(`${API_URL}/organizations/${slug}/members/remove`, {
member_id: member.id,
})
const response = await delete_(
`${API_URL}/organizations/${slug}/members/${member.gotrue_id}`
)
if (response.error) {
ui.setNotification({
@@ -67,9 +62,7 @@ const MemberActions: FC<Props> = ({ members, member, roles }) => {
})
setLoading(false)
} else {
const updatedMembers = enablePermissions
? members.filter((m) => m.gotrue_id !== member.gotrue_id)
: members.filter((m) => m.id !== member.id)
const updatedMembers = members.filter((m) => m.gotrue_id !== member.gotrue_id)
mutateOrgMembers(updatedMembers)
ui.setNotification({
@@ -117,7 +110,7 @@ const MemberActions: FC<Props> = ({ members, member, roles }) => {
const response = await post(`${API_URL}/organizations/${slug}/members/invite`, {
invited_email: member.primary_email,
owner_id: member.invited_id,
...(enablePermissions ? { role_id: roleId } : {}),
role_id: roleId,
})
if (response.error) {
@@ -189,7 +182,7 @@ const MemberActions: FC<Props> = ({ members, member, roles }) => {
align="end"
overlay={
<>
{!enablePermissions && !isPendingInviteAcceptance && (
{!isPendingInviteAcceptance && (
<>
<Dropdown.Item onClick={() => setOwnerTransferIsVisible(!ownerTransferIsVisible)}>
<div className="flex flex-col">
@@ -5,7 +5,7 @@ import { observer } from 'mobx-react-lite'
import { Badge, Button, Loading, Listbox, IconUser, Modal } from 'ui'
import { Member, Role } from 'types'
import { useStore, useFlag, useOrganizationDetail } from 'hooks'
import { useStore, useOrganizationDetail } from 'hooks'
import { patch } from 'lib/common/fetch'
import { API_URL } from 'lib/constants'
import { isInviteExpired, getUserDisplayName } from '../Organization.utils'
@@ -28,17 +28,13 @@ const MembersView = () => {
const { ui } = useStore()
const slug = ui.selectedOrganization?.slug || ''
const isOwner = ui.selectedOrganization?.is_owner
const enablePermissions = useFlag('enablePermissions')
const { mutateOrgMembers } = useOrganizationDetail(slug)
const [loading, setLoading] = useState(false)
const [selectedMember, setSelectedMember] = useState<SelectedMember>()
const [userRoleChangeModalVisible, setUserRoleChangeModalVisible] = useState(false)
const hasAccessToMemberActions = enablePermissions ? true : isOwner
const getRoleNameById = (id: number | undefined) => {
if (!roles) return id
return roles.find((x: any) => x.id === id)?.name
@@ -87,7 +83,7 @@ const MembersView = () => {
<Table.th key="header-status"></Table.th>,
<Table.th key="header-role" className="flex items-center space-x-2">
<span>Role</span>
{enablePermissions && <RolesHelperModal />}
<RolesHelperModal />
</Table.th>,
<Table.th key="header-action"></Table.th>,
]}
@@ -157,71 +153,64 @@ const MembersView = () => {
</Table.td>
<Table.td>
{!role && !enablePermissions && <p>{x.is_owner ? 'Owner' : 'Developer'}</p>}
{!role && <p>{x.is_owner ? 'Owner' : 'Developer'}</p>}
{role && (
<>
{!enablePermissions ? (
<p>{role?.name ?? 'Developer'}</p>
) : (
<Tooltip.Root delayDuration={0}>
<Tooltip.Trigger>
<Listbox
className={disableRoleEdit ? 'pointer-events-none' : ''}
<Tooltip.Root delayDuration={0}>
<Tooltip.Trigger>
<Listbox
className={disableRoleEdit ? 'pointer-events-none' : ''}
disabled={disableRoleEdit}
value={role.id}
onChange={validateSelectedRoleToChange}
>
{roles.map((r: any) => (
<Listbox.Option
key={r.id}
value={r.id}
label={r.name}
disabled={disableRoleEdit}
value={role.id}
onChange={validateSelectedRoleToChange}
>
{roles.map((r: any) => (
<Listbox.Option
key={r.id}
value={r.id}
label={r.name}
disabled={disableRoleEdit}
>
{r.name}
</Listbox.Option>
))}
</Listbox>
</Tooltip.Trigger>
{memberIsPendingInvite ? (
<Tooltip.Content side="bottom">
<Tooltip.Arrow className="radix-tooltip-arrow" />
<div
className={[
'rounded bg-scale-100 py-1 px-2 leading-none shadow', // background
'border border-scale-200 ', //border
].join(' ')}
>
<span className="text-xs text-scale-1200">
Role can only be changed after the user has accepted the
invite
</span>
</div>
</Tooltip.Content>
) : !memberIsUser && !canRemoveRole ? (
<Tooltip.Content side="bottom">
<Tooltip.Arrow className="radix-tooltip-arrow" />
<div
className={[
'rounded bg-scale-100 py-1 px-2 leading-none shadow', // background
'border border-scale-200 ', //border
].join(' ')}
>
<span className="text-xs text-scale-1200">
You need additional permissions to manage this team member
</span>
</div>
</Tooltip.Content>
) : (
<></>
)}
</Tooltip.Root>
{r.name}
</Listbox.Option>
))}
</Listbox>
</Tooltip.Trigger>
{memberIsPendingInvite ? (
<Tooltip.Content side="bottom">
<Tooltip.Arrow className="radix-tooltip-arrow" />
<div
className={[
'rounded bg-scale-100 py-1 px-2 leading-none shadow', // background
'border border-scale-200 ', //border
].join(' ')}
>
<span className="text-xs text-scale-1200">
Role can only be changed after the user has accepted the invite
</span>
</div>
</Tooltip.Content>
) : !memberIsUser && !canRemoveRole ? (
<Tooltip.Content side="bottom">
<Tooltip.Arrow className="radix-tooltip-arrow" />
<div
className={[
'rounded bg-scale-100 py-1 px-2 leading-none shadow', // background
'border border-scale-200 ', //border
].join(' ')}
>
<span className="text-xs text-scale-1200">
You need additional permissions to manage this team member
</span>
</div>
</Tooltip.Content>
) : (
<></>
)}
</>
</Tooltip.Root>
)}
</Table.td>
<Table.td>
{hasAccessToMemberActions && !memberIsUser && (
{!memberIsUser && (
<MemberActions members={PageState.members} member={x} roles={roles} />
)}
</Table.td>
@@ -2,7 +2,7 @@ import { useState, useContext } from 'react'
import { observer } from 'mobx-react-lite'
import { Button, Input, IconSearch } from 'ui'
import { useFlag, useStore } from 'hooks'
import { useStore } from 'hooks'
import { post } from 'lib/common/fetch'
import { API_URL } from 'lib/constants'
import InviteMemberButton from './InviteMemberButton'
@@ -21,10 +21,8 @@ const TeamSettings = observer(() => {
const slug = ui.selectedOrganization?.slug ?? ''
const isOwner = ui.selectedOrganization?.is_owner
const enablePermissions = useFlag('enablePermissions')
const [isLeaving, setIsLeaving] = useState(false)
const canAddMembers = enablePermissions ? rolesAddable.length > 0 : isOwner
const canAddMembers = rolesAddable.length > 0
function onFilterMemberChange(e: any) {
PageState.membersFilterString = e.target.value
@@ -4,7 +4,7 @@ import { Button, Input } from 'ui'
import * as Tooltip from '@radix-ui/react-tooltip'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { useStore, checkPermissions, useFlag } from 'hooks'
import { useStore, checkPermissions } from 'hooks'
import { API_URL, PRICING_TIER_PRODUCT_IDS } from 'lib/constants'
import { delete_, post } from 'lib/common/fetch'
import TextConfirmModal from 'components/ui/Modals/TextConfirmModal'
@@ -17,13 +17,10 @@ interface Props {
const DeleteProjectButton: FC<Props> = ({ type = 'danger' }) => {
const router = useRouter()
const { app, ui } = useStore()
const enablePermissions = useFlag('enablePermissions')
const project = ui.selectedProject
const projectRef = project?.ref
const projectTier = project?.subscription_tier ?? PRICING_TIER_PRODUCT_IDS.FREE
const isOwner = ui.selectedOrganization?.is_owner
const isFree = projectTier === PRICING_TIER_PRODUCT_IDS.FREE
const [isOpen, setIsOpen] = useState(false)
@@ -38,9 +35,7 @@ const DeleteProjectButton: FC<Props> = ({ type = 'danger' }) => {
}
}, [isOpen])
const canDeleteProject = enablePermissions
? checkPermissions(PermissionAction.UPDATE, 'projects')
: isOwner
const canDeleteProject = checkPermissions(PermissionAction.UPDATE, 'projects')
const toggle = () => {
if (loading) return
@@ -2,7 +2,7 @@ import { FC } from 'react'
import { Form, Input } from 'ui'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { useStore, checkPermissions, useFlag } from 'hooks'
import { useStore, checkPermissions } from 'hooks'
import { API_URL } from 'lib/constants'
import { post } from 'lib/common/fetch'
import {
@@ -20,16 +20,11 @@ const General: FC<Props> = ({}) => {
const { app, ui } = useStore()
const project = ui.selectedProject
const enablePermissions = useFlag('enablePermissions')
const isOwner = ui.selectedOrganization?.is_owner
const formId = 'project-general-settings'
const initialValues = { name: project?.name ?? '', ref: project?.ref ?? '' }
const canUpdateProject = enablePermissions
? checkPermissions(PermissionAction.UPDATE, 'projects')
: isOwner
const canUpdateProject = checkPermissions(PermissionAction.UPDATE, 'projects')
const onSubmit = async (values: any, { setSubmitting, resetForm }: any) => {
const onSubmit = async (values: any, { resetForm }: any) => {
const response = await post(`${API_URL}/projects/${project?.ref}/update`, { name: values.name })
if (response.error) {
ui.setNotification({
@@ -5,7 +5,7 @@ import * as Tooltip from '@radix-ui/react-tooltip'
import { Button, IconPause } from 'ui'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { checkPermissions, useStore, useFlag } from 'hooks'
import { checkPermissions, useStore } from 'hooks'
import { post } from 'lib/common/fetch'
import { API_URL, PROJECT_STATUS } from 'lib/constants'
import ConfirmModal from 'components/ui/Dialogs/ConfirmDialog'
@@ -21,15 +21,13 @@ const PauseProjectButton: FC<Props> = observer(({ projectRef, projectId }) => {
const [loading, setLoading] = useState(false)
const [isModalOpen, setIsModalOpen] = useState(false)
const enablePermissions = useFlag('enablePermissions')
const isOwner = ui.selectedOrganization?.is_owner
const openModal = () => setIsModalOpen(true)
const closeModal = () => setIsModalOpen(false)
const canPauseProject = enablePermissions
? checkPermissions(PermissionAction.INFRA_EXECUTE, 'queue_jobs.projects.pause')
: isOwner
const canPauseProject = checkPermissions(
PermissionAction.INFRA_EXECUTE,
'queue_jobs.projects.pause'
)
const requestPauseProject = async () => {
if (!canPauseProject) {
@@ -16,21 +16,19 @@ interface Props {
const ProjectPausedState: FC<Props> = ({ project }) => {
const { ui, app } = useStore()
const isOwner = ui.selectedOrganization?.is_owner
const orgSlug = ui.selectedOrganization?.slug
const kpsEnabled = useFlag('initWithKps')
const enablePermissions = useFlag('enablePermissions')
const { membersExceededLimit } = useFreeProjectLimitCheck(orgSlug)
const hasMembersExceedingFreeTierLimit = (membersExceededLimit || []).length > 0
const [showConfirmRestore, setShowConfirmRestore] = useState(false)
const [showFreeProjectLimitWarning, setShowFreeProjectLimitWarning] = useState(false)
const { membersExceededLimit } = useFreeProjectLimitCheck(orgSlug)
const hasMembersExceedingFreeTierLimit = (membersExceededLimit || []).length > 0
const canResumeProject = enablePermissions
? checkPermissions(PermissionAction.INFRA_EXECUTE, 'queue_jobs.projects.initialize_or_resume')
: isOwner
const canResumeProject = checkPermissions(
PermissionAction.INFRA_EXECUTE,
'queue_jobs.projects.initialize_or_resume'
)
const onSelectRestore = () => {
if (!canResumeProject) {
+1 -7
View File
@@ -45,7 +45,6 @@ const Wizard: NextPageWithLayout = () => {
const { slug } = router.query
const { app, ui } = useStore()
const enablePermissions = useFlag('enablePermissions')
const projectCreationDisabled = useFlag('disableProjectCreationAndUpdate')
const kpsEnabled = useFlag('initWithKps')
const subscriptionStats = useSubscriptionStats()
@@ -66,13 +65,8 @@ const Wizard: NextPageWithLayout = () => {
const currentOrg = organizations.find((o: any) => o.slug === slug)
const stripeCustomerId = currentOrg?.stripe_customer_id
const isOrganizationOwner = ui.selectedOrganization?.is_owner
const availableRegions = getAvailableRegions()
const isAdmin = enablePermissions
? checkPermissions(PermissionAction.CREATE, 'projects')
: isOrganizationOwner
const isAdmin = checkPermissions(PermissionAction.CREATE, 'projects')
const isInvalidSlug = isUndefined(currentOrg)
const isEmptyOrganizations = organizations.length <= 0 && app.organizations.isInitialized
const isEmptyPaymentMethod = paymentMethods ? !paymentMethods.length : false
@@ -42,10 +42,7 @@ const ResetDbPassword: FC<any> = () => {
const { ui } = useStore()
const projectRef = ui.selectedProject?.ref
const enablePermissions = useFlag('enablePermissions')
const canResetDbPassword = enablePermissions
? checkPermissions(PermissionAction.UPDATE, 'projects')
: ui.selectedOrganization?.is_owner
const canResetDbPassword = checkPermissions(PermissionAction.UPDATE, 'projects')
const [showResetDbPass, setShowResetDbPass] = useState<boolean>(false)
const [isUpdatingPassword, setIsUpdatingPassword] = useState<boolean>(false)
+8
View File
@@ -552,4 +552,12 @@
animation-name: Toastify__slideOutDown;
}
.toast-message {
max-width: 258px;
div[role='status'] {
@apply justify-start w-full break-words;
word-break: break-word;
}
}
/*# sourceMappingURL=ReactToastify.css.map */