import { IMoney } from "@dashboard/utils/intl"; export { default } from "./Money"; export * from "./Money"; export function addMoney(init: IMoney, ...args: IMoney[]): IMoney { return { amount: args.reduce((acc, curr) => acc + curr.amount, init.amount), currency: init.currency, }; } export function subtractMoney(init: IMoney, ...args: IMoney[]): IMoney { return { amount: args.reduce((acc, curr) => acc - curr.amount, init.amount), currency: init.currency, }; } export const formatMoneyAmount = (money: IMoney, locale: string) => { try { const currencyFractionDigits = new Intl.NumberFormat(locale, { style: "currency", currency: money.currency, }).resolvedOptions().maximumFractionDigits; return money.amount.toLocaleString(locale, { maximumFractionDigits: currencyFractionDigits, minimumFractionDigits: currencyFractionDigits, }); } catch (e) { return money.amount.toLocaleString(locale); } }; export const formatMoney = (money: IMoney, locale: string) => { try { const formattedMoney = Intl.NumberFormat(locale, { style: "currency", currency: money.currency, }).format(money.amount); return formattedMoney; } catch (error) { return `${money.amount} ${money.currency}`; } }; export const formatMoneyRange = ( moneyFrom: IMoney, moneyTo: IMoney, locale: string, ) => { try { const formattedMoneyRange = Intl.NumberFormat(locale, { style: "currency", currency: moneyFrom.currency, }).formatRange(moneyFrom.amount, moneyTo.amount); // TODO: remove casting from formatRange when typescript // is updated to 4.7 or higher return formattedMoneyRange; } catch (error) { const formattedMoneyFrom = formatMoney(moneyFrom, locale); const formattedMoneyTo = formatMoney(moneyTo, locale); return `${formattedMoneyFrom} - ${formattedMoneyTo}`; } };