diff --git a/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailModal.tsx b/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailModal.tsx index 063bf3b1dd..2d32d66ac2 100644 --- a/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailModal.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailModal.tsx @@ -14,6 +14,7 @@ import useForm from '../../../../hooks/useForm'; import useRouting from '../../../../hooks/useRouting'; import useSortableIndexedList from '../../../../hooks/useSortableIndexedList'; import {Tier} from '../../../../types/api'; +import {currencyFromDecimal, currencyToDecimal} from '../../../../utils/currency'; import {useTiers} from '../../../providers/ServiceProvider'; interface TierDetailModalProps { @@ -34,16 +35,16 @@ const TierDetailModal: React.FC = ({tier}) => { const {formState, updateForm, handleSave} = useForm({ initialState: { ...(tier || {}), - monthly_price: tier?.monthly_price?.toString() || '', - yearly_price: tier?.monthly_price?.toString() || '', + monthly_price: tier?.monthly_price ? currencyToDecimal(tier.monthly_price).toString() : '', + yearly_price: tier?.yearly_price ? currencyToDecimal(tier.yearly_price).toString() : '', trial_days: tier?.trial_days?.toString() || '' }, onSave: async () => { const values = { ...formState, - monthly_price: parseFloat(formState.monthly_price), - yearly_price: parseFloat(formState.yearly_price), - trial_days: parseFloat(formState.trial_days) + monthly_price: currencyFromDecimal(parseFloat(formState.monthly_price)), + yearly_price: currencyFromDecimal(parseFloat(formState.yearly_price)), + trial_days: currencyFromDecimal(parseFloat(formState.trial_days)) }; if (tier?.id) { diff --git a/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailPreview.tsx b/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailPreview.tsx index f4ff6b4342..0af1efc3a4 100644 --- a/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailPreview.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailPreview.tsx @@ -1,7 +1,8 @@ +import Button from '../../../../admin-x-ds/global/Button'; import Icon from '../../../../admin-x-ds/global/Icon'; -import React from 'react'; +import React, {useState} from 'react'; import {Tier} from '../../../../types/api'; -import {getNonDecimal, getSymbol} from '../../../../utils/currency'; +import {getSymbol} from '../../../../utils/currency'; export type TierFormState = Partial> & { monthly_price: string; @@ -57,19 +58,28 @@ const DiscountLabel: React.FC<{discount: number}> = ({discount}) => { }; const TierDetailPreview: React.FC = ({tier}) => { + const [showingYearly, setShowingYearly] = useState(false); + const name = tier?.name || ''; const description = tier?.description || ''; - const monthlyPrice = getNonDecimal(parseFloat(tier?.monthly_price || '0')); const trialDays = parseFloat(tier?.trial_days || '0'); const currency = tier?.currency || 'USD'; const currencySymbol = currency ? getSymbol(currency) : '$'; const benefits = tier?.benefits || []; + const monthlyPrice = parseFloat(tier?.monthly_price || '0'); + const yearlyPrice = parseFloat(tier?.yearly_price || '0'); + const yearlyDiscount = tier?.monthly_price && tier?.yearly_price + ? Math.ceil(((monthlyPrice * 12 - yearlyPrice) / (monthlyPrice * 12)) * 100) + : 0; + return (

Tier preview

-
+
+
@@ -78,12 +88,12 @@ const TierDetailPreview: React.FC = ({tier}) => {
{currencySymbol} - {monthlyPrice} - /month + {showingYearly ? yearlyPrice : monthlyPrice} + /{showingYearly ? 'year' : 'month'}
- + {(showingYearly && yearlyDiscount > 0) && }
@@ -96,4 +106,4 @@ const TierDetailPreview: React.FC = ({tier}) => { ); }; -export default TierDetailPreview; \ No newline at end of file +export default TierDetailPreview; diff --git a/apps/admin-x-settings/src/utils/currency.ts b/apps/admin-x-settings/src/utils/currency.ts index 4098e1e85e..3618d7d3c6 100644 --- a/apps/admin-x-settings/src/utils/currency.ts +++ b/apps/admin-x-settings/src/utils/currency.ts @@ -133,6 +133,10 @@ export function getSymbol(currency: string): string { } // We currently only support decimal currencies -export function getNonDecimal(amount: number): number { - return amount / 100; -} \ No newline at end of file +export function currencyToDecimal(integerAmount: number): number { + return integerAmount / 100; +} + +export function currencyFromDecimal(decimalAmount: number): number { + return decimalAmount * 100; +}