| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import { SubscriptionPricingState } from '@recurly/recurly-js'
- import { PriceForDisplayData } from '../../../../../types/subscription/plan'
- import { currencies, CurrencyCode } from '../data/currency'
- import { getRecurlyGroupPlanCode } from './recurly-group-plan-code'
- function queryRecurlyPlanPrice(planCode: string, currency: CurrencyCode) {
- return new Promise(resolve => {
- recurly.Pricing.Subscription()
- .plan(planCode, { quantity: 1 })
- .currency(currency)
- .catch(function (error) {
- console.error(error)
- })
- .done(response => {
- if (response) {
- resolve(response)
- } else {
- resolve(undefined)
- }
- })
- })
- }
- function priceToWithCents(price: number) {
- return price % 1 !== 0 ? price.toFixed(2) : price
- }
- export function formatPriceForDisplayData(
- price: string,
- taxRate: number,
- currencyCode: CurrencyCode
- ): PriceForDisplayData {
- const currencySymbol = currencies[currencyCode]
- const totalPriceExTax = parseFloat(price)
- let taxAmount = totalPriceExTax * taxRate
- if (isNaN(taxAmount)) {
- taxAmount = 0
- }
- const totalWithTax = totalPriceExTax + taxAmount
- return {
- totalForDisplay: `${currencySymbol}${priceToWithCents(totalWithTax)}`,
- totalAsNumber: totalWithTax,
- subtotal: `${currencySymbol}${totalPriceExTax.toFixed(2)}`,
- tax: `${currencySymbol}${taxAmount.toFixed(2)}`,
- includesTax: taxAmount !== 0,
- }
- }
- function getPerUserDisplayPrice(
- totalPrice: number,
- currencySymbol: string,
- size: string
- ): string {
- return `${currencySymbol}${priceToWithCents(totalPrice / parseInt(size))}`
- }
- export async function loadDisplayPriceWithTaxPromise(
- planCode: string,
- currencyCode: CurrencyCode,
- taxRate: number
- ) {
- if (!recurly) return
- const price = (await queryRecurlyPlanPrice(
- planCode,
- currencyCode
- )) as SubscriptionPricingState['price']
- if (price)
- return formatPriceForDisplayData(price.next.total, taxRate, currencyCode)
- }
- export async function loadGroupDisplayPriceWithTaxPromise(
- groupPlanCode: string,
- currencyCode: CurrencyCode,
- taxRate: number,
- size: string,
- usage: string
- ) {
- if (!recurly) return
- const planCode = getRecurlyGroupPlanCode(groupPlanCode, size, usage)
- const price = await loadDisplayPriceWithTaxPromise(
- planCode,
- currencyCode,
- taxRate
- )
- if (price) {
- const currencySymbol = currencies[currencyCode]
- price.perUserDisplayPrice = getPerUserDisplayPrice(
- price.totalAsNumber,
- currencySymbol,
- size
- )
- }
- return price
- }
|