Files
mutiny-web/src/utils/conversions.ts

106 lines
3.3 KiB
TypeScript

import { MutinyWallet } from "@mutinywallet/mutiny-wasm";
import { Currency } from "./currencies";
/** satsToFiat
* returns a toLocaleString() based on the bitcoin price in the chosen currency
* @param {number} amount - Takes a number as a string to parse the formatted value
* @param {number} price - Finds the Price from the megaStore state
* @param {Currency} fiat - Takes {@link Currency} object options to determine how to format the amount input
*/
export function satsToFiat(
amount: number | undefined,
price: number,
fiat: Currency
): string {
if (typeof amount !== "number" || isNaN(amount)) {
return "";
}
try {
const btc = MutinyWallet.convert_sats_to_btc(
BigInt(Math.floor(amount))
);
const fiatPrice = btc * price;
const roundedFiat = Math.round(fiatPrice);
if (
(fiat.value !== "BTC" &&
roundedFiat * 100 === Math.round(fiatPrice * 100)) ||
fiatPrice === 0
) {
return fiatPrice.toFixed(0);
} else {
return fiatPrice.toFixed(fiat.maxFractionalDigits);
}
} catch (e) {
console.error(e);
return "";
}
}
/** satsToFormattedFiat
* returns a toLocaleString() based on the bitcoin price in the chosen currency with its appropriate currency prefix
* @param {number} amount - Takes a number as a string to parse the formatted value
* @param {number} price - Finds the Price from the megaStore state
* @param {Currency} fiat - Takes {@link Currency} object options to determine how to format the amount input
*/
export function satsToFormattedFiat(
amount: number | undefined,
price: number,
fiat: Currency
): string {
if (typeof amount !== "number" || isNaN(amount)) {
return "";
}
try {
const btc = MutinyWallet.convert_sats_to_btc(
BigInt(Math.floor(amount))
);
const fiatPrice = btc * price;
//Handles currencies not supported by .toLocaleString() like BTC
//Returns a string with a currency symbol and a number with decimals equal to the maxFractionalDigits
if (fiat.hasSymbol) {
return (
fiat.hasSymbol +
fiatPrice.toLocaleString(navigator.languages[0] || "en-US", {
minimumFractionDigits:
fiatPrice === 0 ? 0 : fiat.maxFractionalDigits,
maximumFractionDigits: fiat.maxFractionalDigits
})
);
//Handles currencies with no symbol only an ISO code
} else {
return fiatPrice.toLocaleString(navigator.languages[0], {
minimumFractionDigits:
fiatPrice === 0 ? 0 : fiat.maxFractionalDigits
});
}
} catch (e) {
console.error(e);
return "";
}
}
export function fiatToSats(
amount: number | undefined,
price: number,
formatted: boolean
): string {
if (typeof amount !== "number" || isNaN(amount)) {
return "";
}
try {
const btc = price / amount;
const sats = MutinyWallet.convert_btc_to_sats(btc);
if (formatted) {
return parseInt(sats.toString()).toLocaleString();
} else {
return sats.toString();
}
} catch (e) {
console.error(e);
return "";
}
}