From 2070e8f8fbf20482bfb85d14835a97e695106745 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 27 Dec 2022 11:47:02 +0700 Subject: [PATCH] Refactor org billing page --- .../AddPaymentMethodForm.tsx | 4 +- .../BillingSettings/BillingEmail.tsx | 24 ++++--- .../BillingSettings/BillingSettings.tsx | 20 +++--- .../BillingSettings/PaymentMethods.tsx | 5 +- .../BillingSettings/ProjectsSummary.tsx | 4 +- studio/pages/org/[slug]/billing.tsx | 63 ++++++++++++++++++- studio/pages/org/[slug]/general.tsx | 2 +- studio/pages/org/[slug]/invoices.tsx | 63 ++++++++++++++++++- studio/pages/org/[slug]/settings.tsx | 6 +- studio/pages/org/[slug]/team.tsx | 2 +- 10 files changed, 152 insertions(+), 41 deletions(-) diff --git a/studio/components/interfaces/Billing/AddNewPaymentMethodModal/AddPaymentMethodForm.tsx b/studio/components/interfaces/Billing/AddNewPaymentMethodModal/AddPaymentMethodForm.tsx index 6cc2876b3a0..864239450ac 100644 --- a/studio/components/interfaces/Billing/AddNewPaymentMethodModal/AddPaymentMethodForm.tsx +++ b/studio/components/interfaces/Billing/AddNewPaymentMethodModal/AddPaymentMethodForm.tsx @@ -64,10 +64,10 @@ const AddPaymentMethodForm: FC = ({ returnUrl, onCancel }) => {
- -
diff --git a/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx b/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx index 052285ce1fa..b9b25b40ede 100644 --- a/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx +++ b/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx @@ -1,21 +1,19 @@ -import { useContext, useEffect } from 'react' +import { useEffect } from 'react' import { Form, Input } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useStore, checkPermissions } from 'hooks' +import { useStore, checkPermissions, useParams } from 'hooks' import { API_URL } from 'lib/constants' import { patch } from 'lib/common/fetch' - import { FormActions, FormPanel, FormSection, FormSectionContent } from 'components/ui/Forms' -import { PageContext } from 'pages/org/[slug]/settings' - const BillingEmail = () => { - const { ui } = useStore() - const PageState: any = useContext(PageContext) + const { app, ui } = useStore() + const { slug } = useParams() + const { name, billing_email } = ui.selectedOrganization ?? {} const formId = 'org-billing-email' const initialValues = { - billing_email: PageState.organization?.billing_email ?? '', + billing_email: billing_email ?? '', } const canUpdateOrganization = checkPermissions(PermissionAction.UPDATE, 'organizations') @@ -30,9 +28,9 @@ const BillingEmail = () => { } setSubmitting(true) - const response = await patch(`${API_URL}/organizations/${PageState.organization.slug}`, { + const response = await patch(`${API_URL}/organizations/${slug}`, { ...values, - name: PageState.organization.name, + name, }) if (response.error) { ui.setNotification({ @@ -46,7 +44,7 @@ const BillingEmail = () => { initialValues: { billing_email }, }) - PageState.onOrgUpdated(response) + app.onOrgUpdated(response) ui.setNotification({ category: 'success', message: 'Successfully saved settings', @@ -66,9 +64,9 @@ const BillingEmail = () => { const hasChanges = JSON.stringify(values) !== JSON.stringify(initialValues) useEffect(() => { - const values = { billing_email: PageState.organization?.billing_email ?? '' } + const values = { billing_email: billing_email ?? '' } resetForm({ values, initialValues: values }) - }, [PageState.organization.slug]) + }, [slug]) return ( { + const { app, ui } = useStore() + const { slug } = useParams() -const BillingSettings: FC = ({ organization, projects = [] }) => { - const { ui } = useStore() - const { slug } = organization + const organization = ui.selectedOrganization + const projects = app.projects.list((x: Project) => x.organization_id == organization?.id) || [] const [customer, setCustomer] = useState(null) const [isLoadingCustomer, setIsLoadingCustomer] = useState(false) @@ -122,4 +122,4 @@ const BillingSettings: FC = ({ organization, projects = [] }) => { ) } -export default BillingSettings +export default observer(BillingSettings) diff --git a/studio/components/interfaces/Organization/BillingSettings/PaymentMethods.tsx b/studio/components/interfaces/Organization/BillingSettings/PaymentMethods.tsx index f5675c7620b..fd357010b70 100644 --- a/studio/components/interfaces/Organization/BillingSettings/PaymentMethods.tsx +++ b/studio/components/interfaces/Organization/BillingSettings/PaymentMethods.tsx @@ -14,7 +14,7 @@ import { import * as Tooltip from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { checkPermissions, useStore, useFlag } from 'hooks' +import { checkPermissions, useStore } from 'hooks' import { delete_, patch } from 'lib/common/fetch' import { getURL } from 'lib/helpers' import { API_URL } from 'lib/constants' @@ -39,7 +39,6 @@ const PaymentMethods: FC = ({ }) => { const { ui } = useStore() const orgSlug = ui.selectedOrganization?.slug ?? '' - const isOwner = ui.selectedOrganization?.is_owner const [selectedMethodForDefault, setSelectedMethodForDefault] = useState() const [selectedMethodToDelete, setSelectedMethodToDelete] = useState() @@ -244,7 +243,7 @@ const PaymentMethods: FC = ({ setShowAddPaymentMethodModal(false)} /> diff --git a/studio/components/interfaces/Organization/BillingSettings/ProjectsSummary.tsx b/studio/components/interfaces/Organization/BillingSettings/ProjectsSummary.tsx index 6c9ca17208d..0b2216bcb55 100644 --- a/studio/components/interfaces/Organization/BillingSettings/ProjectsSummary.tsx +++ b/studio/components/interfaces/Organization/BillingSettings/ProjectsSummary.tsx @@ -48,8 +48,8 @@ const ProjectSummary: FC = ({ project }) => { diff --git a/studio/pages/org/[slug]/billing.tsx b/studio/pages/org/[slug]/billing.tsx index 0625889a59b..81a4bd3e393 100644 --- a/studio/pages/org/[slug]/billing.tsx +++ b/studio/pages/org/[slug]/billing.tsx @@ -1,5 +1,62 @@ -const OrgBillingSettings = () => { - return
+import { useRouter } from 'next/router' +import { observer } from 'mobx-react-lite' +import { NextPage } from 'next' +import { Tabs } from 'ui' + +import { useParams, useStore } from 'hooks' +import Loading from 'components/ui/Loading' +import { AccountLayout } from 'components/layouts' +import { BillingSettings } from 'components/interfaces/Organization' + +const OrgBillingSettings: NextPage = () => { + const { ui } = useStore() + const { slug } = useParams() + const router = useRouter() + + return ( + + {ui.selectedOrganization === undefined && (ui?.permissions ?? []).length === 0 ? ( + + ) : ( +
+
+
+

+ {ui.selectedOrganization?.name ?? 'Organization'} settings +

+
+ +
+ +
+ +
+
+ )} +
+ ) } -export default OrgBillingSettings +export default observer(OrgBillingSettings) diff --git a/studio/pages/org/[slug]/general.tsx b/studio/pages/org/[slug]/general.tsx index 1d1b19e6d69..c707a5f88d0 100644 --- a/studio/pages/org/[slug]/general.tsx +++ b/studio/pages/org/[slug]/general.tsx @@ -23,7 +23,7 @@ const OrgGeneralSettings: NextPage = () => { }, ]} > - {ui.selectedOrganization === undefined ? ( + {ui.selectedOrganization === undefined && (ui?.permissions ?? []).length === 0 ? ( ) : (
diff --git a/studio/pages/org/[slug]/invoices.tsx b/studio/pages/org/[slug]/invoices.tsx index 187e1d47b64..d0d6cc21b11 100644 --- a/studio/pages/org/[slug]/invoices.tsx +++ b/studio/pages/org/[slug]/invoices.tsx @@ -1,5 +1,62 @@ -const OrgInvoices = () => { - return
+import { useRouter } from 'next/router' +import { observer } from 'mobx-react-lite' +import { NextPage } from 'next' +import { Tabs } from 'ui' + +import { useParams, useStore } from 'hooks' +import Loading from 'components/ui/Loading' +import { AccountLayout } from 'components/layouts' +import { GeneralSettings } from 'components/interfaces/Organization' + +const OrgInvoices: NextPage = () => { + const { ui } = useStore() + const { slug } = useParams() + const router = useRouter() + + return ( + + {ui.selectedOrganization === undefined ? ( + + ) : ( +
+
+
+

+ {ui.selectedOrganization?.name ?? 'Organization'} settings +

+
+ +
+ +
+ +
+
+ )} +
+ ) } -export default OrgInvoices +export default observer(OrgInvoices) diff --git a/studio/pages/org/[slug]/settings.tsx b/studio/pages/org/[slug]/settings.tsx index bf3c8afaf25..0cd174fd337 100644 --- a/studio/pages/org/[slug]/settings.tsx +++ b/studio/pages/org/[slug]/settings.tsx @@ -171,11 +171,11 @@ const OrganizationSettings: NextPageWithLayout = () => {
{selectedTab == 'GENERAL' ? ( - +
) : selectedTab == 'TEAM' ? ( - +
) : selectedTab == 'BILLING' ? ( - +
) : selectedTab == 'INVOICES' ? ( ) : null} diff --git a/studio/pages/org/[slug]/team.tsx b/studio/pages/org/[slug]/team.tsx index e3e6d53a37e..20ca909c741 100644 --- a/studio/pages/org/[slug]/team.tsx +++ b/studio/pages/org/[slug]/team.tsx @@ -23,7 +23,7 @@ const OrgTeamSettings: NextPage = () => { }, ]} > - {ui.selectedOrganization === undefined ? ( + {ui.selectedOrganization === undefined && (ui?.permissions ?? []).length === 0 ? ( ) : (