mirror of
https://github.com/aljazceru/mutiny-web.git
synced 2025-12-20 07:44:24 +01:00
feat: add all currencies currently supported on coingecko
This commit is contained in:
@@ -22,9 +22,7 @@ import { useI18n } from "~/i18n/context";
|
|||||||
import { Network } from "~/logic/mutinyWalletSetup";
|
import { Network } from "~/logic/mutinyWalletSetup";
|
||||||
import { useMegaStore } from "~/state/megaStore";
|
import { useMegaStore } from "~/state/megaStore";
|
||||||
import { DIALOG_CONTENT, DIALOG_POSITIONER } from "~/styles/dialogs";
|
import { DIALOG_CONTENT, DIALOG_POSITIONER } from "~/styles/dialogs";
|
||||||
import { fiatToSats, satsToFiat } from "~/utils";
|
import { Currency, fiatToSats, satsToFiat } from "~/utils";
|
||||||
|
|
||||||
import { Currency } from "./ChooseCurrency";
|
|
||||||
|
|
||||||
// Checks the users locale to determine if decimals should be a "." or a ","
|
// Checks the users locale to determine if decimals should be a "." or a ","
|
||||||
const decimalDigitDivider = Number(1.0)
|
const decimalDigitDivider = Number(1.0)
|
||||||
|
|||||||
@@ -1,119 +1,37 @@
|
|||||||
import { createForm } from "@modular-forms/solid";
|
import { createForm } from "@modular-forms/solid";
|
||||||
import { createSignal, Show } from "solid-js";
|
import { createSignal, For, Show } from "solid-js";
|
||||||
import { useNavigate } from "solid-start";
|
import { useNavigate } from "solid-start";
|
||||||
|
|
||||||
import {
|
import { Button, ExternalLink, InfoBox, NiceP, VStack } from "~/components";
|
||||||
Button,
|
|
||||||
ExternalLink,
|
|
||||||
InfoBox,
|
|
||||||
NiceP,
|
|
||||||
SelectField,
|
|
||||||
VStack
|
|
||||||
} from "~/components";
|
|
||||||
import { useI18n } from "~/i18n/context";
|
import { useI18n } from "~/i18n/context";
|
||||||
import { useMegaStore } from "~/state/megaStore";
|
import { useMegaStore } from "~/state/megaStore";
|
||||||
import { eify, timeout } from "~/utils";
|
import {
|
||||||
|
BTC_OPTION,
|
||||||
export interface Currency {
|
Currency,
|
||||||
value: string;
|
eify,
|
||||||
label: string;
|
FIAT_OPTIONS,
|
||||||
hasSymbol?: string;
|
timeout,
|
||||||
maxFractionalDigits: number;
|
USD_OPTION
|
||||||
}
|
} from "~/utils";
|
||||||
|
|
||||||
type ChooseCurrencyForm = {
|
type ChooseCurrencyForm = {
|
||||||
fiatCurrency: string;
|
fiatCurrency: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
const COMBINED_OPTIONS: Currency[] = [USD_OPTION, BTC_OPTION, ...FIAT_OPTIONS];
|
||||||
* FIAT_OPTIONS is an array of possible currencies
|
|
||||||
* All available currencies can be found here https://api.coingecko.com/api/v3/simple/supported_vs_currencies
|
|
||||||
* @Currency
|
|
||||||
* @param {string} label - should be in the format {Name} {ISO code}
|
|
||||||
* @param {string} values - are uppercase ISO 4217 currency code
|
|
||||||
* @param {string?} hasSymbol - if the currency has a symbol it should be represented as a string
|
|
||||||
* @param {number} maxFractionalDigits - the standard fractional units used by the currency should be set with maxFractionalDigits
|
|
||||||
*
|
|
||||||
* Bitcoin is represented as:
|
|
||||||
* {
|
|
||||||
* label: "bitcoin BTC",
|
|
||||||
* value: "BTC",
|
|
||||||
* hasSymbol: "₿",
|
|
||||||
* maxFractionalDigits: 8
|
|
||||||
* }
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const FIAT_OPTIONS: Currency[] = [
|
|
||||||
{
|
|
||||||
label: "Bitcoin BTC",
|
|
||||||
value: "BTC",
|
|
||||||
hasSymbol: "₿",
|
|
||||||
maxFractionalDigits: 8
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "United States Dollar USD",
|
|
||||||
value: "USD",
|
|
||||||
hasSymbol: "$",
|
|
||||||
maxFractionalDigits: 2
|
|
||||||
},
|
|
||||||
{ label: "Swiss Franc CHF", value: "CHF", maxFractionalDigits: 2 },
|
|
||||||
{
|
|
||||||
label: "Chinese Yuan CNY",
|
|
||||||
value: "CNY",
|
|
||||||
hasSymbol: "¥",
|
|
||||||
maxFractionalDigits: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Euro EUR",
|
|
||||||
value: "EUR",
|
|
||||||
hasSymbol: "€",
|
|
||||||
maxFractionalDigits: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Brazilian Real BRL",
|
|
||||||
value: "BRL",
|
|
||||||
hasSymbol: "R$",
|
|
||||||
maxFractionalDigits: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "British Pound GBP",
|
|
||||||
value: "GBP",
|
|
||||||
hasSymbol: "₤",
|
|
||||||
maxFractionalDigits: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Australia Dollar AUD",
|
|
||||||
value: "AUD",
|
|
||||||
hasSymbol: "$",
|
|
||||||
maxFractionalDigits: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Japanese Yen JPY",
|
|
||||||
value: "JPY",
|
|
||||||
hasSymbol: "¥",
|
|
||||||
maxFractionalDigits: 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Korean Won KRW",
|
|
||||||
value: "KRW",
|
|
||||||
hasSymbol: "₩",
|
|
||||||
maxFractionalDigits: 0
|
|
||||||
},
|
|
||||||
{ label: "Kuwaiti Dinar KWD", value: "KWD", maxFractionalDigits: 3 }
|
|
||||||
].sort((a, b) => (a.value > b.value ? 1 : b.value > a.value ? -1 : 0));
|
|
||||||
|
|
||||||
export const USD_INDEX = FIAT_OPTIONS.findIndex((fo) => fo.value === "USD");
|
|
||||||
export const BTC_INDEX = FIAT_OPTIONS.findIndex((fo) => fo.value === "BTC");
|
|
||||||
|
|
||||||
export function ChooseCurrency() {
|
export function ChooseCurrency() {
|
||||||
const i18n = useI18n();
|
const i18n = useI18n();
|
||||||
const [error, setError] = createSignal<Error>();
|
const [error, setError] = createSignal<Error>();
|
||||||
const [state, actions] = useMegaStore();
|
const [_state, actions] = useMegaStore();
|
||||||
const [loading, setLoading] = createSignal(false);
|
const [loading, setLoading] = createSignal(false);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
function findCurrencyByValue(value: string) {
|
function findCurrencyByValue(value: string) {
|
||||||
return FIAT_OPTIONS.find((currency) => currency.value === value);
|
return (
|
||||||
|
COMBINED_OPTIONS.find((currency) => currency.value === value) ??
|
||||||
|
USD_OPTION
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const [_chooseCurrencyForm, { Form, Field }] =
|
const [_chooseCurrencyForm, { Form, Field }] =
|
||||||
@@ -135,7 +53,7 @@ export function ChooseCurrency() {
|
|||||||
const handleFormSubmit = async (f: ChooseCurrencyForm) => {
|
const handleFormSubmit = async (f: ChooseCurrencyForm) => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
try {
|
try {
|
||||||
actions.saveFiat(findCurrencyByValue(f.fiatCurrency) || state.fiat);
|
actions.saveFiat(findCurrencyByValue(f.fiatCurrency));
|
||||||
|
|
||||||
await timeout(1000);
|
await timeout(1000);
|
||||||
navigate("/");
|
navigate("/");
|
||||||
@@ -157,16 +75,17 @@ export function ChooseCurrency() {
|
|||||||
<VStack>
|
<VStack>
|
||||||
<Field name="fiatCurrency">
|
<Field name="fiatCurrency">
|
||||||
{(field, props) => (
|
{(field, props) => (
|
||||||
<SelectField
|
<select
|
||||||
{...props}
|
{...props}
|
||||||
value={field.value}
|
value={field.value}
|
||||||
error={field.error}
|
class="w-full rounded-lg bg-m-grey-750 py-2 pl-4 pr-12 text-base font-normal text-white"
|
||||||
placeholder={state.fiat.label}
|
>
|
||||||
options={FIAT_OPTIONS}
|
<For each={COMBINED_OPTIONS}>
|
||||||
label={i18n.t(
|
{({ value, label }) => (
|
||||||
"settings.currency.select_currency_label"
|
<option value={value}>{label}</option>
|
||||||
)}
|
)}
|
||||||
/>
|
</For>
|
||||||
|
</select>
|
||||||
)}
|
)}
|
||||||
</Field>
|
</Field>
|
||||||
<Show when={error()}>
|
<Show when={error()}>
|
||||||
|
|||||||
@@ -1,101 +0,0 @@
|
|||||||
import { Select as KSelect } from "@kobalte/core";
|
|
||||||
import { JSX, Show, splitProps } from "solid-js";
|
|
||||||
|
|
||||||
import check from "~/assets/icons/check.svg";
|
|
||||||
import upDown from "~/assets/icons/up-down.svg";
|
|
||||||
|
|
||||||
interface IOption {
|
|
||||||
value: string;
|
|
||||||
label: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
type SelectProps = {
|
|
||||||
options: IOption[];
|
|
||||||
multiple?: boolean;
|
|
||||||
size?: string | number;
|
|
||||||
caption?: string;
|
|
||||||
name: string;
|
|
||||||
label?: string | undefined;
|
|
||||||
placeholder?: string | undefined;
|
|
||||||
value: string | undefined;
|
|
||||||
error: string;
|
|
||||||
required?: boolean | undefined;
|
|
||||||
disabled?: boolean | undefined;
|
|
||||||
ref: (element: HTMLSelectElement) => void;
|
|
||||||
onInput: JSX.EventHandler<HTMLSelectElement, InputEvent>;
|
|
||||||
onChange: JSX.EventHandler<HTMLSelectElement, Event>;
|
|
||||||
onBlur: JSX.EventHandler<HTMLSelectElement, FocusEvent>;
|
|
||||||
};
|
|
||||||
|
|
||||||
export function SelectField(props: SelectProps) {
|
|
||||||
// Split select element props
|
|
||||||
const [rootProps, selectProps] = splitProps(
|
|
||||||
props,
|
|
||||||
["name", "placeholder", "options", "required", "disabled"],
|
|
||||||
["placeholder", "ref", "onInput", "onChange", "onBlur"]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div class="relative flex items-center">
|
|
||||||
<KSelect.Root
|
|
||||||
{...rootProps}
|
|
||||||
class="flex w-full flex-col gap-2 text-sm font-semibold"
|
|
||||||
optionValue="value"
|
|
||||||
optionTextValue="label"
|
|
||||||
sameWidth
|
|
||||||
validationState={props.error ? "invalid" : "valid"}
|
|
||||||
itemComponent={(props) => (
|
|
||||||
<KSelect.Item
|
|
||||||
item={props.item}
|
|
||||||
class="flex w-full justify-between rounded-lg p-1 hover:bg-m-grey-800"
|
|
||||||
>
|
|
||||||
<Show when={props.item.rawValue.label}>
|
|
||||||
<KSelect.ItemLabel>
|
|
||||||
{props.item.rawValue.label}
|
|
||||||
</KSelect.ItemLabel>
|
|
||||||
</Show>
|
|
||||||
<KSelect.ItemIndicator>
|
|
||||||
<img
|
|
||||||
src={check}
|
|
||||||
alt="check"
|
|
||||||
height={20}
|
|
||||||
width={20}
|
|
||||||
/>
|
|
||||||
</KSelect.ItemIndicator>
|
|
||||||
</KSelect.Item>
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<Show when={props.label}>
|
|
||||||
<KSelect.Label class="uppercase">
|
|
||||||
{props.label}
|
|
||||||
</KSelect.Label>
|
|
||||||
</Show>
|
|
||||||
<KSelect.HiddenSelect {...selectProps} />
|
|
||||||
<KSelect.Trigger
|
|
||||||
class="flex w-full justify-between rounded-lg bg-m-grey-750 px-4 py-2 text-base font-normal text-white"
|
|
||||||
aria-label="selectField"
|
|
||||||
>
|
|
||||||
<KSelect.Value<IOption>>
|
|
||||||
{(state) => state.selectedOption().label}
|
|
||||||
</KSelect.Value>
|
|
||||||
<KSelect.Icon class="ml-2 self-center">
|
|
||||||
<img src={upDown} alt="upDown" height={20} width={20} />
|
|
||||||
</KSelect.Icon>
|
|
||||||
</KSelect.Trigger>
|
|
||||||
<Show when={props.caption}>
|
|
||||||
<KSelect.Description class="text-sm font-normal text-neutral-400">
|
|
||||||
{props.caption}
|
|
||||||
</KSelect.Description>
|
|
||||||
</Show>
|
|
||||||
<KSelect.Portal>
|
|
||||||
<KSelect.Content>
|
|
||||||
<KSelect.Listbox class="w-full cursor-default rounded-lg bg-[#0a0a0a] p-2" />
|
|
||||||
</KSelect.Content>
|
|
||||||
</KSelect.Portal>
|
|
||||||
<KSelect.ErrorMessage class="text-m-red">
|
|
||||||
{props.error}
|
|
||||||
</KSelect.ErrorMessage>
|
|
||||||
</KSelect.Root>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,6 @@ export * from "./Linkify";
|
|||||||
export * from "./Misc";
|
export * from "./Misc";
|
||||||
export * from "./ProgressBar";
|
export * from "./ProgressBar";
|
||||||
export * from "./Radio";
|
export * from "./Radio";
|
||||||
export * from "./SelectField";
|
|
||||||
export * from "./TextField";
|
export * from "./TextField";
|
||||||
export * from "./ExternalLink";
|
export * from "./ExternalLink";
|
||||||
export * from "./LoadingSpinner";
|
export * from "./LoadingSpinner";
|
||||||
|
|||||||
@@ -12,12 +12,6 @@ import {
|
|||||||
import { createStore } from "solid-js/store";
|
import { createStore } from "solid-js/store";
|
||||||
import { useNavigate, useSearchParams } from "solid-start";
|
import { useNavigate, useSearchParams } from "solid-start";
|
||||||
|
|
||||||
import {
|
|
||||||
BTC_INDEX,
|
|
||||||
Currency,
|
|
||||||
FIAT_OPTIONS,
|
|
||||||
USD_INDEX
|
|
||||||
} from "~/components/ChooseCurrency";
|
|
||||||
import { checkBrowserCompatibility } from "~/logic/browserCompatibility";
|
import { checkBrowserCompatibility } from "~/logic/browserCompatibility";
|
||||||
import {
|
import {
|
||||||
doubleInitDefense,
|
doubleInitDefense,
|
||||||
@@ -27,7 +21,14 @@ import {
|
|||||||
setupMutinyWallet
|
setupMutinyWallet
|
||||||
} from "~/logic/mutinyWalletSetup";
|
} from "~/logic/mutinyWalletSetup";
|
||||||
import { ParsedParams, toParsedParams } from "~/logic/waila";
|
import { ParsedParams, toParsedParams } from "~/logic/waila";
|
||||||
import { eify, MutinyTagItem, subscriptionValid } from "~/utils";
|
import {
|
||||||
|
BTC_OPTION,
|
||||||
|
Currency,
|
||||||
|
eify,
|
||||||
|
MutinyTagItem,
|
||||||
|
subscriptionValid,
|
||||||
|
USD_OPTION
|
||||||
|
} from "~/utils";
|
||||||
|
|
||||||
const MegaStoreContext = createContext<MegaStore>();
|
const MegaStoreContext = createContext<MegaStore>();
|
||||||
|
|
||||||
@@ -97,7 +98,7 @@ export const Provider: ParentComponent = (props) => {
|
|||||||
price: 0,
|
price: 0,
|
||||||
fiat: localStorage.getItem("fiat_currency")
|
fiat: localStorage.getItem("fiat_currency")
|
||||||
? (JSON.parse(localStorage.getItem("fiat_currency")!) as Currency)
|
? (JSON.parse(localStorage.getItem("fiat_currency")!) as Currency)
|
||||||
: FIAT_OPTIONS[USD_INDEX],
|
: USD_OPTION,
|
||||||
has_backed_up: localStorage.getItem("has_backed_up") === "true",
|
has_backed_up: localStorage.getItem("has_backed_up") === "true",
|
||||||
balance: undefined as MutinyBalance | undefined,
|
balance: undefined as MutinyBalance | undefined,
|
||||||
last_sync: undefined as number | undefined,
|
last_sync: undefined as number | undefined,
|
||||||
@@ -272,7 +273,7 @@ export const Provider: ParentComponent = (props) => {
|
|||||||
balance: newBalance,
|
balance: newBalance,
|
||||||
last_sync: Date.now(),
|
last_sync: Date.now(),
|
||||||
price: 1,
|
price: 1,
|
||||||
fiat: FIAT_OPTIONS[BTC_INDEX]
|
fiat: BTC_OPTION
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { MutinyWallet } from "@mutinywallet/mutiny-wasm";
|
import { MutinyWallet } from "@mutinywallet/mutiny-wasm";
|
||||||
|
|
||||||
import { Currency } from "~/components/ChooseCurrency";
|
import { Currency } from "./currencies";
|
||||||
|
|
||||||
/** satsToFiat
|
/** satsToFiat
|
||||||
* returns a toLocaleString() based on the bitcoin price in the chosen currency
|
* returns a toLocaleString() based on the bitcoin price in the chosen currency
|
||||||
|
|||||||
296
src/utils/currencies.ts
Normal file
296
src/utils/currencies.ts
Normal file
@@ -0,0 +1,296 @@
|
|||||||
|
export interface Currency {
|
||||||
|
value: string;
|
||||||
|
label: string;
|
||||||
|
hasSymbol?: string;
|
||||||
|
maxFractionalDigits: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BTC_USD_OPTIONS is an array of BTC and USD currencies
|
||||||
|
* These are separated from the rest of the list for ease of access by the user and necessary access in the megaStore
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const BTC_OPTION: Currency = {
|
||||||
|
label: "Bitcoin BTC",
|
||||||
|
value: "BTC",
|
||||||
|
hasSymbol: "₿",
|
||||||
|
maxFractionalDigits: 8
|
||||||
|
};
|
||||||
|
|
||||||
|
export const USD_OPTION: Currency = {
|
||||||
|
label: "United States Dollar USD",
|
||||||
|
value: "USD",
|
||||||
|
hasSymbol: "$",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FIAT_OPTIONS is an array of all available currencies on the coingecko api https://api.coingecko.com/api/v3/simple/supported_vs_currencies
|
||||||
|
* @Currency
|
||||||
|
* @param {string} label - should be in the format {Name} {ISO code}
|
||||||
|
* @param {string} values - are uppercase ISO 4217 currency code
|
||||||
|
* @param {string?} hasSymbol - if the currency has a symbol it should be represented as a string
|
||||||
|
* @param {number} maxFractionalDigits - the standard fractional units used by the currency should be set with maxFractionalDigits
|
||||||
|
*
|
||||||
|
* Bitcoin is represented as:
|
||||||
|
* {
|
||||||
|
* label: "bitcoin BTC",
|
||||||
|
* value: "BTC",
|
||||||
|
* hasSymbol: "₿",
|
||||||
|
* maxFractionalDigits: 8
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const FIAT_OPTIONS: Currency[] = [
|
||||||
|
{
|
||||||
|
label: "United Arab Emirates Dirham AED",
|
||||||
|
value: "AED",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Argentine Peso ARS",
|
||||||
|
value: "ARS",
|
||||||
|
hasSymbol: "$",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Australian Dollar AUD",
|
||||||
|
value: "AUD",
|
||||||
|
hasSymbol: "$",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Bangladeshi Taka BDT",
|
||||||
|
value: "BDT",
|
||||||
|
hasSymbol: "৳",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Bahraini Dinar BHD",
|
||||||
|
value: "BHD",
|
||||||
|
hasSymbol: "BD",
|
||||||
|
maxFractionalDigits: 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Bermuda Dollar BMD",
|
||||||
|
value: "BMD",
|
||||||
|
hasSymbol: "$",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Brazilian Real BRL",
|
||||||
|
value: "BRL",
|
||||||
|
hasSymbol: "R$",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Canadian Dollar CAD",
|
||||||
|
value: "CAD",
|
||||||
|
hasSymbol: "$",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{ label: "Swiss Franc CHF", value: "CHF", maxFractionalDigits: 2 },
|
||||||
|
{
|
||||||
|
label: "Chilean Peso CLP",
|
||||||
|
value: "CLP",
|
||||||
|
hasSymbol: "$",
|
||||||
|
maxFractionalDigits: 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Chinese Yuan CNY",
|
||||||
|
value: "CNY",
|
||||||
|
hasSymbol: "¥",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Czech Koruna CZK",
|
||||||
|
value: "CZK",
|
||||||
|
hasSymbol: "Kč",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Danish Krone DKK",
|
||||||
|
value: "DKK",
|
||||||
|
hasSymbol: "kr",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Euro EUR",
|
||||||
|
value: "EUR",
|
||||||
|
hasSymbol: "€",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "British Pound GBP",
|
||||||
|
value: "GBP",
|
||||||
|
hasSymbol: "₤",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Hong Kong Dollar HKD",
|
||||||
|
value: "HKD",
|
||||||
|
hasSymbol: "$",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Hungarian Forint HUF",
|
||||||
|
value: "HUF",
|
||||||
|
hasSymbol: "Ft",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Israeli New Shekel ILS",
|
||||||
|
value: "ILS",
|
||||||
|
hasSymbol: "₪",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Indian Rupee INR",
|
||||||
|
value: "INR",
|
||||||
|
hasSymbol: "₹",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Japanese Yen JPY",
|
||||||
|
value: "JPY",
|
||||||
|
hasSymbol: "¥",
|
||||||
|
maxFractionalDigits: 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Korean Won KRW",
|
||||||
|
value: "KRW",
|
||||||
|
hasSymbol: "₩",
|
||||||
|
maxFractionalDigits: 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Kuwaiti Dinar KWD",
|
||||||
|
value: "KWD",
|
||||||
|
maxFractionalDigits: 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Sri Lankan Rupee LKR",
|
||||||
|
value: "LKR",
|
||||||
|
hasSymbol: "Rs",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Myanmar Kyat MMK",
|
||||||
|
value: "MMK",
|
||||||
|
hasSymbol: "Ks",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Mexican Peso MXN",
|
||||||
|
value: "MXN",
|
||||||
|
hasSymbol: "$",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Malaysian Ringgit MYR",
|
||||||
|
value: "MYR",
|
||||||
|
hasSymbol: "RM",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Norwegian Krone NOK",
|
||||||
|
value: "NOK",
|
||||||
|
hasSymbol: "kr",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Nigerian Naira NGN",
|
||||||
|
value: "NGN",
|
||||||
|
hasSymbol: "₦",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "New Zealand Dollar NZD",
|
||||||
|
value: "NZD",
|
||||||
|
hasSymbol: "$",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Philippine Peso PHP",
|
||||||
|
value: "PHP",
|
||||||
|
hasSymbol: "₱",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Pakistani Rupee PKR",
|
||||||
|
value: "PKR",
|
||||||
|
hasSymbol: "₨",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Polish Złoty PLN",
|
||||||
|
value: "PLN",
|
||||||
|
hasSymbol: "zł",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Russian Ruble RUB",
|
||||||
|
value: "RUB",
|
||||||
|
hasSymbol: "₽",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Saudi Riyal SAR",
|
||||||
|
value: "SAR",
|
||||||
|
hasSymbol: "SR",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Swedish Krona SEK",
|
||||||
|
value: "SEK",
|
||||||
|
hasSymbol: "kr",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Singapore Dollar SGD",
|
||||||
|
value: "SGD",
|
||||||
|
hasSymbol: "$",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Thai Baht THB",
|
||||||
|
value: "THB",
|
||||||
|
hasSymbol: "฿",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Turkish Lira TRY",
|
||||||
|
value: "TRY",
|
||||||
|
hasSymbol: "₺",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "New Taiwan Dollar TWD",
|
||||||
|
value: "TWD",
|
||||||
|
hasSymbol: "NT$",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Ukrainian Hryvnia UAH",
|
||||||
|
value: "UAH",
|
||||||
|
hasSymbol: "₴",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Venezuelan Bolívar VEF",
|
||||||
|
value: "VEF",
|
||||||
|
hasSymbol: "Bs",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Vietnamese Dong VND",
|
||||||
|
value: "VND",
|
||||||
|
hasSymbol: "₫",
|
||||||
|
maxFractionalDigits: 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "South African Rand ZAR",
|
||||||
|
value: "ZAR",
|
||||||
|
hasSymbol: "R",
|
||||||
|
maxFractionalDigits: 2
|
||||||
|
}
|
||||||
|
];
|
||||||
@@ -18,3 +18,4 @@ export * from "./fetchZaps";
|
|||||||
export * from "./vibrate";
|
export * from "./vibrate";
|
||||||
export * from "./openLinkProgrammatically";
|
export * from "./openLinkProgrammatically";
|
||||||
export * from "./nostr";
|
export * from "./nostr";
|
||||||
|
export * from "./currencies";
|
||||||
|
|||||||
Reference in New Issue
Block a user