diff --git a/apps/meteor/client/views/admin/subscription/SubscriptionCalloutLimits.tsx b/apps/meteor/client/views/admin/subscription/SubscriptionCalloutLimits.tsx index d82bb6cd3d28..8982492bb4a8 100644 --- a/apps/meteor/client/views/admin/subscription/SubscriptionCalloutLimits.tsx +++ b/apps/meteor/client/views/admin/subscription/SubscriptionCalloutLimits.tsx @@ -62,13 +62,12 @@ export const SubscriptionCalloutLimits = () => { const map = (key: keyof typeof limits) => t(`subscription.callout.${key}`); - const handleClick = (e: React.MouseEvent) => { + const handleClick = (params: Record) => (e: React.MouseEvent) => { e.preventDefault(); if (mutation.isLoading) { return; } - - mutation.mutate(); + mutation.mutate(params); }; return ( @@ -77,7 +76,14 @@ export const SubscriptionCalloutLimits = () => { Your workspace reached the <>{{ val: start_fair_policy.map(map) }} limit. - + Manage your subscription to increase limits. @@ -88,7 +94,14 @@ export const SubscriptionCalloutLimits = () => { Your workspace exceeded the <>{{ val: prevent_action.map(map) }} license limit. - + Manage your subscription to increase limits. @@ -100,9 +113,16 @@ export const SubscriptionCalloutLimits = () => { Your workspace exceeded the <>{{ val: disable_modules.map(map) }} license limit. - + Manage your subscription - {' '} + to increase limits. @@ -112,7 +132,14 @@ export const SubscriptionCalloutLimits = () => { Your workspace exceeded the <>{{ val: invalidate_license.map(map) }} license limit. - + Manage your subscription to increase limits. diff --git a/apps/meteor/client/views/admin/subscription/SubscriptionPage.tsx b/apps/meteor/client/views/admin/subscription/SubscriptionPage.tsx index a1178dc1a2ba..e6b03b0237a4 100644 --- a/apps/meteor/client/views/admin/subscription/SubscriptionPage.tsx +++ b/apps/meteor/client/views/admin/subscription/SubscriptionPage.tsx @@ -72,7 +72,7 @@ const SubscriptionPage = () => { {syncLicenseUpdate.isLoading ? : t('Sync_license_update')} )} - + {t(isEnterprise ? 'Manage_subscription' : 'Upgrade')} diff --git a/apps/meteor/client/views/admin/subscription/components/FeatureUsageCard.tsx b/apps/meteor/client/views/admin/subscription/components/FeatureUsageCard.tsx index eca4b58695de..bcde39d701fd 100644 --- a/apps/meteor/client/views/admin/subscription/components/FeatureUsageCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/FeatureUsageCard.tsx @@ -3,7 +3,6 @@ import type { ReactElement, ReactNode } from 'react'; import React, { memo } from 'react'; import InfoTextIconModal from './InfoTextIconModal'; -import UpgradeButton from './UpgradeButton'; type FeatureUsageCardProps = { children?: ReactNode; @@ -13,11 +12,11 @@ type FeatureUsageCardProps = { export type CardProps = { title: string; infoText?: string; - upgradeButtonText?: string; + upgradeButton?: ReactNode; }; const FeatureUsageCard = ({ children, card }: FeatureUsageCardProps): ReactElement => { - const { title, infoText, upgradeButtonText } = card; + const { title, infoText, upgradeButton } = card; return ( @@ -28,11 +27,7 @@ const FeatureUsageCard = ({ children, card }: FeatureUsageCardProps): ReactEleme {children} - {upgradeButtonText && ( - - {upgradeButtonText} - - )} + {upgradeButton && {upgradeButton}} ); }; diff --git a/apps/meteor/client/views/admin/subscription/components/UpgradeButton.tsx b/apps/meteor/client/views/admin/subscription/components/UpgradeButton.tsx index e6a89240b73d..7c28094ff58a 100644 --- a/apps/meteor/client/views/admin/subscription/components/UpgradeButton.tsx +++ b/apps/meteor/client/views/admin/subscription/components/UpgradeButton.tsx @@ -5,7 +5,15 @@ import React, { memo } from 'react'; import { useCheckoutUrlAction } from '../hooks/useCheckoutUrl'; -const UpgradeButton = ({ children, ...props }: Partial): ReactElement => { +const UpgradeButton = ({ + children, + target = '_blank', + action, + ...props +}: Partial & { + target: string; + action: string; +}): ReactElement => { const mutation = useCheckoutUrlAction(); const handleBtnClick = () => { @@ -13,7 +21,10 @@ const UpgradeButton = ({ children, ...props }: Partial): ReactEleme return; } - mutation.mutate(); + mutation.mutate({ + target, + action, + }); }; return ( diff --git a/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsCard.tsx b/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsCard.tsx index 74f50474f7ec..fbd850f262ba 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsCard.tsx @@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next'; import { useActiveConnections } from '../../../../hooks/useActiveConnections'; import type { CardProps } from '../FeatureUsageCard'; import FeatureUsageCard from '../FeatureUsageCard'; +import UpgradeButton from '../UpgradeButton'; const getLimits = ({ max, current }: { max: number; current: number }) => { const total = max || 0; @@ -30,6 +31,7 @@ const ActiveSessionsCard = (): ReactElement => { title: t('ActiveSessions'), infoText: t('ActiveSessions_InfoText'), }; + if (result.isLoading || result.isError) { return ( @@ -45,7 +47,11 @@ const ActiveSessionsCard = (): ReactElement => { card={{ ...card, ...(exceedLimit && { - upgradeButtonText: t('Upgrade'), + upgradeButton: ( + + {t('Upgrade')} + + ), }), }} > diff --git a/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsPeakCard.tsx b/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsPeakCard.tsx index 6806e02edec4..f62ec2ad164c 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsPeakCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/ActiveSessionsPeakCard.tsx @@ -7,6 +7,7 @@ import { useFormatDate } from '../../../../../hooks/useFormatDate'; import { useStatistics } from '../../../../hooks/useStatistics'; import type { CardProps } from '../FeatureUsageCard'; import FeatureUsageCard from '../FeatureUsageCard'; +import UpgradeButton from '../UpgradeButton'; const ActiveSessionsPeakCard = (): ReactElement => { const { t } = useTranslation(); @@ -24,7 +25,11 @@ const ActiveSessionsPeakCard = (): ReactElement => { title: t('ActiveSessionsPeak'), infoText: t('ActiveSessionsPeak_InfoText'), ...(exceedLimit && { - upgradeButtonText: t('Upgrade'), + upgradeButton: ( + + {t('Upgrade')} + + ), }), }; diff --git a/apps/meteor/client/views/admin/subscription/components/cards/AppsUsageCard.tsx b/apps/meteor/client/views/admin/subscription/components/cards/AppsUsageCard.tsx index a8d3891c8570..0043e12d02d1 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/AppsUsageCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/AppsUsageCard.tsx @@ -5,6 +5,7 @@ import { useTranslation } from 'react-i18next'; import type { CardProps } from '../FeatureUsageCard'; import FeatureUsageCard from '../FeatureUsageCard'; +import UpgradeButton from '../UpgradeButton'; type AppsUsageCardProps = { privateAppsLimit?: { value?: number; max: number }; @@ -26,7 +27,11 @@ const AppsUsageCard = ({ privateAppsLimit, marketplaceAppsLimit }: AppsUsageCard title: t('Apps'), infoText: t('Apps_InfoText'), ...((marketplaceAppsPercentage || 0) >= 80 && { - upgradeButtonText: t('Upgrade'), + upgradeButton: ( + + {t('Upgrade')} + + ), }), }; diff --git a/apps/meteor/client/views/admin/subscription/components/cards/MACCard.tsx b/apps/meteor/client/views/admin/subscription/components/cards/MACCard.tsx index 14aa76db0eb0..e22231294fae 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/MACCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/MACCard.tsx @@ -5,6 +5,7 @@ import { useTranslation } from 'react-i18next'; import type { CardProps } from '../FeatureUsageCard'; import FeatureUsageCard from '../FeatureUsageCard'; +import UpgradeButton from '../UpgradeButton'; import UsagePieGraph from '../UsagePieGraph'; const MACCard = ({ @@ -30,11 +31,19 @@ const MACCard = ({ const card: CardProps = { title: t('Monthly_active_contacts'), infoText: t('MAC_InfoText'), + ...(hideManageSubscription && { + upgradeButton: ( + + {t('Buy_more')} + + ), - ...(!hideManageSubscription && { - upgradeButtonText: t('Buy_more'), ...(nearLimit && { - upgradeButtonText: t('Upgrade'), + upgradeButton: ( + + {t('Upgrade')} + + ), }), }), }; diff --git a/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardTrial.tsx b/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardTrial.tsx index d7a3ef2f0189..f1d3001bd508 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardTrial.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/PlanCard/PlanCardTrial.tsx @@ -49,7 +49,7 @@ const PlanCardTrial = ({ licenseInformation }: PlanCardProps): ReactElement => { - + {isSalesAssisted ? t('Finish_purchase') : t('Contact_sales')} diff --git a/apps/meteor/client/views/admin/subscription/components/cards/SeatsCard.tsx b/apps/meteor/client/views/admin/subscription/components/cards/SeatsCard.tsx index bdcca7d44bae..34a58fb1791c 100644 --- a/apps/meteor/client/views/admin/subscription/components/cards/SeatsCard.tsx +++ b/apps/meteor/client/views/admin/subscription/components/cards/SeatsCard.tsx @@ -5,6 +5,7 @@ import { useTranslation } from 'react-i18next'; import type { CardProps } from '../FeatureUsageCard'; import FeatureUsageCard from '../FeatureUsageCard'; +import UpgradeButton from '../UpgradeButton'; import UsagePieGraph from '../UsagePieGraph'; type SeatsCardProps = { @@ -26,9 +27,13 @@ const SeatsCard = ({ value, max, hideManageSubscription }: SeatsCardProps): Reac const card: CardProps = { title: t('Seats'), infoText: t('Seats_InfoText'), - ...(!hideManageSubscription && + ...(hideManageSubscription && nearLimit && { - upgradeButtonText: t('Buy_more'), + upgradeButton: ( + + {t('Buy_more')} + + ), }), }; diff --git a/apps/meteor/client/views/admin/subscription/hooks/useCheckoutUrl.ts b/apps/meteor/client/views/admin/subscription/hooks/useCheckoutUrl.ts index 56ef0396e93e..e4ea7ef042bd 100644 --- a/apps/meteor/client/views/admin/subscription/hooks/useCheckoutUrl.ts +++ b/apps/meteor/client/views/admin/subscription/hooks/useCheckoutUrl.ts @@ -9,12 +9,29 @@ export const useCheckoutUrlAction = () => { const handleExternalLink = useExternalLink(); return useMutation({ - mutationFn: async () => { + mutationFn: async (extraData?: Record) => { const { url } = await getCheckoutUrl(); - handleExternalLink(url); + + const extraUrlParams = new URL(url); + + if (extraData) { + Object.entries(extraData).forEach(([key, value]) => { + extraUrlParams.searchParams.append(key, value.toString()); + }); + } + + handleExternalLink(extraUrlParams.toString()); }, - onError: () => { - handleExternalLink(CONTACT_SALES_LINK); + onError: (_e, extraData) => { + const extraUrlParams = new URL(CONTACT_SALES_LINK); + + if (extraData) { + Object.entries(extraData).forEach(([key, value]) => { + extraUrlParams.searchParams.append(key, value.toString()); + }); + } + + handleExternalLink(extraUrlParams.toString()); }, }); };