TelegramPWA/src/util/formatCurrency.tsx
Alexander Zinchuk a0e8eff8e3 Support TON balance (#6076)
Co-authored-by: zubiden <19638254+zubiden@users.noreply.github.com>
2025-07-29 14:33:40 +02:00

107 lines
2.9 KiB
TypeScript

import { type TeactNode } from '../lib/teact/teact';
import type { LangFn } from './localization';
import { STARS_CURRENCY_CODE, TON_CURRENCY_CODE } from '../config';
import { formatStarsAsIcon, formatTonAsIcon } from './localization/format';
export function convertCurrencyFromBaseUnit(amount: number, currency: string) {
return amount / 10 ** getCurrencyExp(currency);
}
export function convertCurrencyToBaseUnit(amount: number, currency: string) {
return amount * 10 ** getCurrencyExp(currency);
}
export function convertTonFromNanos(nanos: number): number {
return convertCurrencyFromBaseUnit(nanos, TON_CURRENCY_CODE);
}
export function convertTonToNanos(ton: number): number {
return convertCurrencyToBaseUnit(ton, TON_CURRENCY_CODE);
}
export function formatCurrency(
lang: LangFn,
totalPrice: number,
currency: string,
options?: {
shouldOmitFractions?: boolean;
iconClassName?: string;
asFontIcon?: boolean;
},
): TeactNode {
const price = convertCurrencyFromBaseUnit(totalPrice, currency);
if (currency === STARS_CURRENCY_CODE) {
return formatStarsAsIcon(lang, price, { asFont: options?.asFontIcon, className: options?.iconClassName });
}
if (currency === TON_CURRENCY_CODE) {
return formatTonAsIcon(lang, price, { asFont: options?.asFontIcon, className: options?.iconClassName });
}
return formatCurrencyAsString(totalPrice, currency, lang.code, options);
}
export function convertTonToUsd(amount: number, usdRate: number): number {
const tonInRegularUnits = convertTonFromNanos(amount);
return tonInRegularUnits * usdRate * 100;
}
export function formatCurrencyAsString(
totalPrice: number,
currency: string,
locale: string = 'en',
options?: {
shouldOmitFractions?: boolean;
},
) {
const price = convertCurrencyFromBaseUnit(totalPrice, currency);
if ((options?.shouldOmitFractions || currency === STARS_CURRENCY_CODE) && Number.isInteger(price)) {
return new Intl.NumberFormat(locale, {
style: 'currency',
currency,
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(price);
}
if (currency === TON_CURRENCY_CODE) {
return new Intl.NumberFormat(locale, {
style: 'currency',
currency,
minimumFractionDigits: 0,
maximumFractionDigits: 10,
}).format(price);
}
return new Intl.NumberFormat(locale, {
style: 'currency',
currency,
}).format(price);
}
function getCurrencyExp(currency: string) {
if (currency === TON_CURRENCY_CODE) {
return 9;
}
if (currency === 'CLF') {
return 4;
}
if (['BHD', 'IQD', 'JOD', 'KWD', 'LYD', 'OMR', 'TND'].includes(currency)) {
return 3;
}
if ([
'BIF', 'BYR', 'CLP', 'CVE', 'DJF', 'GNF', 'ISK', 'JPY', 'KMF', 'KRW', 'MGA', 'PYG', 'RWF', 'UGX', 'UYI',
'VND', 'VUV', 'XAF', 'XOF', 'XPF', STARS_CURRENCY_CODE,
].includes(currency)) {
return 0;
}
if (currency === 'MRO') {
return 1;
}
return 2;
}