From 84daf5b2d67ba29bb77c29156a7d95dd781520a6 Mon Sep 17 00:00:00 2001 From: xenticore Date: Wed, 16 Apr 2025 14:53:34 -0400 Subject: [PATCH] fix, feat: add currency conversion stub uses proper JS api for currency formatting and preparations for showing other currencies based on page locale --- src/content/uiRenderer.ts | 26 ++++++++++++++++------- src/content/utils/currency.ts | 39 +++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/content/uiRenderer.ts b/src/content/uiRenderer.ts index c62f1ba..0b268e0 100644 --- a/src/content/uiRenderer.ts +++ b/src/content/uiRenderer.ts @@ -1,7 +1,8 @@ import { ItemPriceData } from "./priceService"; -import { convertTF2PriceToUSD } from "./utils/currency"; +import { convertTF2PriceToUSD, defaultCurrencyForPageLocale, convertUSD } from "./utils/currency"; import { formatPrice } from "./utils/formatting"; import { $T } from "./utils/localization"; +import { logError } from "./utils/log"; export function createPriceRow(qualityName: string, data: ItemPriceData, keyPrice: ItemPriceData, locale: string, wikiPage: string = null): HTMLTableRowElement { const priceRow = document.createElement("tr"); @@ -23,14 +24,25 @@ export function createPriceRow(qualityName: string, data: ItemPriceData, keyPric var priceString: string = '' if(data) { - const currencyFormatter = new Intl.NumberFormat(locale, { - minimumFractionDigits: 2, - maximumFractionDigits: 2, - }); + const gamePrice = formatPrice(data.keys, data.metal, keyPrice.metal, locale).trim() + const realPriceUSD = convertTF2PriceToUSD(data.keys, data.metal, keyPrice.metal) + + const USDFormatter = new Intl.NumberFormat(locale, { style: "currency", currency: 'USD' }) + var realPriceString = USDFormatter.format(realPriceUSD) + const currency = defaultCurrencyForPageLocale(locale) ?? 'USD' + if(currency !== 'USD') { + try { + const realPrice = convertUSD(realPriceUSD, currency) + const currencyFormatter = new Intl.NumberFormat(locale, { style: "currency", currency: currency }) + realPriceString = currencyFormatter.format(realPrice).replace(/\s+/g, '') + } catch (e) { + logError(`Failed to convert USD ${realPriceUSD} to ${currency}`, e) + } + } priceString += [ - formatPrice(data.keys, data.metal, keyPrice.metal, locale).trim(), - '(US$' + currencyFormatter.format(convertTF2PriceToUSD(data.keys, data.metal, keyPrice.metal)) + ')' + gamePrice, + '(' + realPriceString + ')' ].join(' ').trim() } else { priceString += $T('Data unavailable') diff --git a/src/content/utils/currency.ts b/src/content/utils/currency.ts index a84202f..8a7f122 100644 --- a/src/content/utils/currency.ts +++ b/src/content/utils/currency.ts @@ -1,8 +1,47 @@ import { conversion_ref_usd } from '../config'; +export function defaultCurrencyForPageLocale(locale: string): string | null { + switch (locale) { + case 'de': + case 'fr': + case 'it': + case 'nl': + case 'hu': + return 'EUR'; + case 'ja': + return 'JPY'; + case 'tr': + return 'TRY'; + case 'da': + return 'DKK'; + case 'pt-br': + return 'BRL'; + case 'zh-hans': + case 'zh-hant': + return 'CNY'; + case 'ko': + return 'KRW'; + case 'cs': + return 'CZK'; + case 'ru': + return 'RUB'; + case 'pl': + return 'PLN'; + default: + return null; + } +} + export function convertTF2PriceToUSD(keys: number, metal: number, keyPrice: number): number { const pureMetal = (keys * keyPrice) + metal; // Round price up to nearest cent return Math.ceil(pureMetal * conversion_ref_usd * 100) / 100 } + +export function convertUSD(usd: number, currency: string): number { + const cur = currency.toUpperCase() + if(cur === 'USD') return usd + + throw new Error(`Not implemented`) +}