adapt billing banners according to user's permissions (#12005)
closes https://github.com/twentyhq/twenty/issues/11951
This commit is contained in:
@ -1,9 +1,14 @@
|
|||||||
import { useRedirect } from '@/domain-manager/hooks/useRedirect';
|
import { useRedirect } from '@/domain-manager/hooks/useRedirect';
|
||||||
import { InformationBanner } from '@/information-banner/components/InformationBanner';
|
import { InformationBanner } from '@/information-banner/components/InformationBanner';
|
||||||
|
import { useSettingsPermissionMap } from '@/settings/roles/hooks/useSettingsPermissionMap';
|
||||||
import { SettingsPath } from '@/types/SettingsPath';
|
import { SettingsPath } from '@/types/SettingsPath';
|
||||||
import { useBillingPortalSessionQuery } from '~/generated/graphql';
|
import { t } from '@lingui/core/macro';
|
||||||
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
|
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
import {
|
||||||
|
SettingPermissionType,
|
||||||
|
useBillingPortalSessionQuery,
|
||||||
|
} from '~/generated/graphql';
|
||||||
|
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
|
||||||
|
|
||||||
export const InformationBannerBillingSubscriptionPaused = () => {
|
export const InformationBannerBillingSubscriptionPaused = () => {
|
||||||
const { redirect } = useRedirect();
|
const { redirect } = useRedirect();
|
||||||
@ -14,6 +19,10 @@ export const InformationBannerBillingSubscriptionPaused = () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const {
|
||||||
|
[SettingPermissionType.WORKSPACE]: hasPermissionToUpdateBillingDetails,
|
||||||
|
} = useSettingsPermissionMap();
|
||||||
|
|
||||||
const openBillingPortal = () => {
|
const openBillingPortal = () => {
|
||||||
if (isDefined(data) && isDefined(data.billingPortalSession.url)) {
|
if (isDefined(data) && isDefined(data.billingPortalSession.url)) {
|
||||||
redirect(data.billingPortalSession.url);
|
redirect(data.billingPortalSession.url);
|
||||||
@ -23,8 +32,12 @@ export const InformationBannerBillingSubscriptionPaused = () => {
|
|||||||
return (
|
return (
|
||||||
<InformationBanner
|
<InformationBanner
|
||||||
variant="danger"
|
variant="danger"
|
||||||
message={'Trial expired. Please update your billing details'}
|
message={
|
||||||
buttonTitle="Update"
|
hasPermissionToUpdateBillingDetails
|
||||||
|
? t`Trial expired. Please update your billing details.`
|
||||||
|
: t`Trial expired. Please contact your admin`
|
||||||
|
}
|
||||||
|
buttonTitle={hasPermissionToUpdateBillingDetails ? t`Update` : undefined}
|
||||||
buttonOnClick={() => openBillingPortal()}
|
buttonOnClick={() => openBillingPortal()}
|
||||||
isButtonDisabled={loading || !isDefined(data)}
|
isButtonDisabled={loading || !isDefined(data)}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -1,16 +1,25 @@
|
|||||||
import { useEndSubscriptionTrialPeriod } from '@/billing/hooks/useEndSubscriptionTrialPeriod';
|
import { useEndSubscriptionTrialPeriod } from '@/billing/hooks/useEndSubscriptionTrialPeriod';
|
||||||
import { InformationBanner } from '@/information-banner/components/InformationBanner';
|
import { InformationBanner } from '@/information-banner/components/InformationBanner';
|
||||||
|
import { useSettingsPermissionMap } from '@/settings/roles/hooks/useSettingsPermissionMap';
|
||||||
import { useLingui } from '@lingui/react/macro';
|
import { useLingui } from '@lingui/react/macro';
|
||||||
|
import { SettingPermissionType } from '~/generated-metadata/graphql';
|
||||||
|
|
||||||
export const InformationBannerEndTrialPeriod = () => {
|
export const InformationBannerEndTrialPeriod = () => {
|
||||||
const { endTrialPeriod, isLoading } = useEndSubscriptionTrialPeriod();
|
const { endTrialPeriod, isLoading } = useEndSubscriptionTrialPeriod();
|
||||||
const { t } = useLingui();
|
const { t } = useLingui();
|
||||||
|
|
||||||
|
const { [SettingPermissionType.WORKSPACE]: hasPermissionToEndTrialPeriod } =
|
||||||
|
useSettingsPermissionMap();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<InformationBanner
|
<InformationBanner
|
||||||
variant="danger"
|
variant="danger"
|
||||||
message={t`No free workflow executions left. End trial period and activate your billing to continue.`}
|
message={
|
||||||
buttonTitle={t`Activate`}
|
hasPermissionToEndTrialPeriod
|
||||||
|
? t`No free workflow executions left. End trial period and activate your billing to continue.`
|
||||||
|
: t`No free workflow executions left. Please contact your admin.`
|
||||||
|
}
|
||||||
|
buttonTitle={hasPermissionToEndTrialPeriod ? t`Activate` : undefined}
|
||||||
buttonOnClick={async () => await endTrialPeriod()}
|
buttonOnClick={async () => await endTrialPeriod()}
|
||||||
isButtonDisabled={isLoading}
|
isButtonDisabled={isLoading}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -1,9 +1,14 @@
|
|||||||
import { useRedirect } from '@/domain-manager/hooks/useRedirect';
|
import { useRedirect } from '@/domain-manager/hooks/useRedirect';
|
||||||
import { InformationBanner } from '@/information-banner/components/InformationBanner';
|
import { InformationBanner } from '@/information-banner/components/InformationBanner';
|
||||||
|
import { useSettingsPermissionMap } from '@/settings/roles/hooks/useSettingsPermissionMap';
|
||||||
import { SettingsPath } from '@/types/SettingsPath';
|
import { SettingsPath } from '@/types/SettingsPath';
|
||||||
import { useBillingPortalSessionQuery } from '~/generated/graphql';
|
import { t } from '@lingui/core/macro';
|
||||||
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
|
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
import {
|
||||||
|
SettingPermissionType,
|
||||||
|
useBillingPortalSessionQuery,
|
||||||
|
} from '~/generated/graphql';
|
||||||
|
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
|
||||||
|
|
||||||
export const InformationBannerFailPaymentInfo = () => {
|
export const InformationBannerFailPaymentInfo = () => {
|
||||||
const { redirect } = useRedirect();
|
const { redirect } = useRedirect();
|
||||||
@ -14,6 +19,10 @@ export const InformationBannerFailPaymentInfo = () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const {
|
||||||
|
[SettingPermissionType.WORKSPACE]: hasPermissionToUpdateBillingDetails,
|
||||||
|
} = useSettingsPermissionMap();
|
||||||
|
|
||||||
const openBillingPortal = () => {
|
const openBillingPortal = () => {
|
||||||
if (isDefined(data) && isDefined(data.billingPortalSession.url)) {
|
if (isDefined(data) && isDefined(data.billingPortalSession.url)) {
|
||||||
redirect(data.billingPortalSession.url);
|
redirect(data.billingPortalSession.url);
|
||||||
@ -23,8 +32,12 @@ export const InformationBannerFailPaymentInfo = () => {
|
|||||||
return (
|
return (
|
||||||
<InformationBanner
|
<InformationBanner
|
||||||
variant="danger"
|
variant="danger"
|
||||||
message={'Last payment failed. Please update your billing details.'}
|
message={
|
||||||
buttonTitle="Update"
|
hasPermissionToUpdateBillingDetails
|
||||||
|
? t`Last payment failed. Please update your billing details.`
|
||||||
|
: t`Last payment failed. Please contact your admin.`
|
||||||
|
}
|
||||||
|
buttonTitle={hasPermissionToUpdateBillingDetails ? t`Update` : undefined}
|
||||||
buttonOnClick={() => openBillingPortal()}
|
buttonOnClick={() => openBillingPortal()}
|
||||||
isButtonDisabled={loading || !isDefined(data)}
|
isButtonDisabled={loading || !isDefined(data)}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
import { BILLING_CHECKOUT_SESSION_DEFAULT_VALUE } from '@/billing/constants/BillingCheckoutSessionDefaultValue';
|
import { BILLING_CHECKOUT_SESSION_DEFAULT_VALUE } from '@/billing/constants/BillingCheckoutSessionDefaultValue';
|
||||||
import { useHandleCheckoutSession } from '@/billing/hooks/useHandleCheckoutSession';
|
import { useHandleCheckoutSession } from '@/billing/hooks/useHandleCheckoutSession';
|
||||||
import { InformationBanner } from '@/information-banner/components/InformationBanner';
|
import { InformationBanner } from '@/information-banner/components/InformationBanner';
|
||||||
|
import { useSettingsPermissionMap } from '@/settings/roles/hooks/useSettingsPermissionMap';
|
||||||
|
import { t } from '@lingui/core/macro';
|
||||||
|
import { SettingPermissionType } from '~/generated-metadata/graphql';
|
||||||
|
|
||||||
export const InformationBannerNoBillingSubscription = () => {
|
export const InformationBannerNoBillingSubscription = () => {
|
||||||
const { handleCheckoutSession, isSubmitting } = useHandleCheckoutSession({
|
const { handleCheckoutSession, isSubmitting } = useHandleCheckoutSession({
|
||||||
@ -9,11 +12,18 @@ export const InformationBannerNoBillingSubscription = () => {
|
|||||||
requirePaymentMethod: true,
|
requirePaymentMethod: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const { [SettingPermissionType.WORKSPACE]: hasPermissionToSubscribe } =
|
||||||
|
useSettingsPermissionMap();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<InformationBanner
|
<InformationBanner
|
||||||
variant="danger"
|
variant="danger"
|
||||||
message={`Your workspace does not have an active subscription`}
|
message={
|
||||||
buttonTitle="Subscribe"
|
hasPermissionToSubscribe
|
||||||
|
? t`Your workspace doesn't have an active subscription.`
|
||||||
|
: t`Your workspace doesn't have an active subscription. Please contact your admin.`
|
||||||
|
}
|
||||||
|
buttonTitle={hasPermissionToSubscribe ? t`Subscribe` : undefined}
|
||||||
buttonOnClick={() => handleCheckoutSession()}
|
buttonOnClick={() => handleCheckoutSession()}
|
||||||
isButtonDisabled={isSubmitting}
|
isButtonDisabled={isSubmitting}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user