declare global { interface Window { wp: any; // eslint-disable-line @typescript-eslint/no-explicit-any wcSettings?: { currency: Currency; shippingMethodTitles?: Record< string, string >; }; } } interface Currency { code: string; decimalSeparator: string; precision: number; priceFormat: string; symbol: string; symbolPosition: string; thousandSeparator: string; } const isCurrency = ( value: unknown ): value is Currency => { /* eslint-disable @typescript-eslint/no-explicit-any */ return ( typeof value === 'object' && value !== null && 'code' in value && 'decimalSeparator' in value && 'precision' in value && 'priceFormat' in value && 'symbol' in value && 'symbolPosition' in value && 'thousandSeparator' in value && typeof ( value as any ).code === 'string' && typeof ( value as any ).decimalSeparator === 'string' && typeof ( value as any ).precision === 'number' && typeof ( value as any ).priceFormat === 'string' && typeof ( value as any ).symbol === 'string' && typeof ( value as any ).symbolPosition === 'string' && typeof ( value as any ).thousandSeparator === 'string' ); /* eslint-enable @typescript-eslint/no-explicit-any */ }; export const getCurrencyObject = (): Currency => { const currency = window.wcSettings?.currency; if ( ! isCurrency( currency ) ) { // Fallback to USD if the currency is not valid. return { code: 'USD', decimalSeparator: '.', precision: 2, priceFormat: '%1$s %2$s', symbol: '$', symbolPosition: 'left', thousandSeparator: ',', }; } return { code: currency?.code, decimalSeparator: currency?.decimalSeparator, precision: currency?.precision, priceFormat: currency?.priceFormat, symbol: currency?.symbol, symbolPosition: currency?.symbolPosition, thousandSeparator: currency?.thousandSeparator, }; }; export function formatCurrency( number: number, currency: string ) { return new Intl.NumberFormat( 'en-US', { style: 'currency', currency, } ).format( number ); }