Use rates
This commit is contained in:
@ -13,7 +13,8 @@ import QrCode from "./qr-code";
|
|||||||
import { useLogin } from "hooks/login";
|
import { useLogin } from "hooks/login";
|
||||||
import Copy from "./copy";
|
import Copy from "./copy";
|
||||||
import { defaultRelays } from "const";
|
import { defaultRelays } from "const";
|
||||||
import { FormattedMessage } from "react-intl";
|
import { FormattedMessage, FormattedNumber } from "react-intl";
|
||||||
|
import { useRates } from "hooks/rates";
|
||||||
|
|
||||||
export interface LNURLLike {
|
export interface LNURLLike {
|
||||||
get name(): string;
|
get name(): string;
|
||||||
@ -33,8 +34,6 @@ export interface SendZapsProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function SendZaps({ lnurl, pubkey, aTag, eTag, targetName, onFinish }: SendZapsProps) {
|
export function SendZaps({ lnurl, pubkey, aTag, eTag, targetName, onFinish }: SendZapsProps) {
|
||||||
const UsdRate = 28_000;
|
|
||||||
|
|
||||||
const satsAmounts = [
|
const satsAmounts = [
|
||||||
21, 69, 121, 420, 1_000, 2_100, 4_200, 10_000, 21_000, 42_000, 69_000, 100_000, 210_000, 500_000, 1_000_000,
|
21, 69, 121, 420, 1_000, 2_100, 4_200, 10_000, 21_000, 42_000, 69_000, 100_000, 210_000, 500_000, 1_000_000,
|
||||||
];
|
];
|
||||||
@ -45,6 +44,7 @@ export function SendZaps({ lnurl, pubkey, aTag, eTag, targetName, onFinish }: Se
|
|||||||
const [comment, setComment] = useState("");
|
const [comment, setComment] = useState("");
|
||||||
const [invoice, setInvoice] = useState("");
|
const [invoice, setInvoice] = useState("");
|
||||||
const login = useLogin();
|
const login = useLogin();
|
||||||
|
const rate = useRates("BTCUSD");
|
||||||
const relays = Object.keys(defaultRelays);
|
const relays = Object.keys(defaultRelays);
|
||||||
const name = targetName ?? svc?.name;
|
const name = targetName ?? svc?.name;
|
||||||
async function loadService(lnurl: string) {
|
async function loadService(lnurl: string) {
|
||||||
@ -52,6 +52,7 @@ export function SendZaps({ lnurl, pubkey, aTag, eTag, targetName, onFinish }: Se
|
|||||||
await s.load();
|
await s.load();
|
||||||
setSvc(s);
|
setSvc(s);
|
||||||
}
|
}
|
||||||
|
const usdRate = rate.time ? rate.ask : 26_000;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!svc) {
|
if (!svc) {
|
||||||
@ -72,7 +73,7 @@ export function SendZaps({ lnurl, pubkey, aTag, eTag, targetName, onFinish }: Se
|
|||||||
isAnon = true;
|
isAnon = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const amountInSats = isFiat ? Math.floor((amount / UsdRate) * 1e8) : amount;
|
const amountInSats = isFiat ? Math.floor((amount / usdRate) * 1e8) : amount;
|
||||||
let zap: NostrEvent | undefined;
|
let zap: NostrEvent | undefined;
|
||||||
if (pubkey) {
|
if (pubkey) {
|
||||||
zap = await pub.zap(amountInSats * 1000, pubkey, relays, undefined, comment, eb => {
|
zap = await pub.zap(amountInSats * 1000, pubkey, relays, undefined, comment, eb => {
|
||||||
@ -132,6 +133,18 @@ export function SendZaps({ lnurl, pubkey, aTag, eTag, targetName, onFinish }: Se
|
|||||||
defaultMessage="Zap amount in {currency}"
|
defaultMessage="Zap amount in {currency}"
|
||||||
values={{ currency: isFiat ? "USD" : "SATS" }}
|
values={{ currency: isFiat ? "USD" : "SATS" }}
|
||||||
/>
|
/>
|
||||||
|
{isFiat && (
|
||||||
|
<>
|
||||||
|
|
||||||
|
<FormattedMessage
|
||||||
|
defaultMessage="@ {rate}"
|
||||||
|
description="Showing zap amount in USD @ rate"
|
||||||
|
values={{
|
||||||
|
rate: <FormattedNumber value={usdRate} />,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</small>
|
</small>
|
||||||
<div className="amounts">
|
<div className="amounts">
|
||||||
{(isFiat ? usdAmounts : satsAmounts).map(a => (
|
{(isFiat ? usdAmounts : satsAmounts).map(a => (
|
||||||
|
32
src/hooks/rates.ts
Normal file
32
src/hooks/rates.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import { bech32ToHex } from "@snort/shared";
|
||||||
|
import { EventKind, ReplaceableNoteStore, RequestBuilder } from "@snort/system";
|
||||||
|
import { useRequestBuilder } from "@snort/system-react";
|
||||||
|
import { useMemo } from "react";
|
||||||
|
|
||||||
|
// Snort backend publishes rates
|
||||||
|
const SnortPubkey = "npub1sn0rtcjcf543gj4wsg7fa59s700d5ztys5ctj0g69g2x6802npjqhjjtws";
|
||||||
|
|
||||||
|
export function useRates(symbol: string, leaveOpen = true) {
|
||||||
|
const sub = useMemo(() => {
|
||||||
|
const rb = new RequestBuilder(`rates:${symbol}`);
|
||||||
|
rb.withOptions({
|
||||||
|
leaveOpen,
|
||||||
|
});
|
||||||
|
rb.withFilter()
|
||||||
|
.kinds([1009 as EventKind])
|
||||||
|
.authors([bech32ToHex(SnortPubkey)])
|
||||||
|
.tag("d", [symbol]);
|
||||||
|
return rb;
|
||||||
|
}, [symbol]);
|
||||||
|
|
||||||
|
const data = useRequestBuilder(ReplaceableNoteStore, sub);
|
||||||
|
|
||||||
|
const tag = data?.data?.tags.find(a => a[0] === "d" && a[1] === symbol);
|
||||||
|
return {
|
||||||
|
time: data.data?.created_at,
|
||||||
|
ask: Number(tag?.[2]),
|
||||||
|
bid: Number(tag?.[3]),
|
||||||
|
low: Number(tag?.[4]),
|
||||||
|
hight: Number(tag?.[5]),
|
||||||
|
};
|
||||||
|
}
|
@ -239,6 +239,10 @@
|
|||||||
"X2PZ7D": {
|
"X2PZ7D": {
|
||||||
"defaultMessage": "Create Goal"
|
"defaultMessage": "Create Goal"
|
||||||
},
|
},
|
||||||
|
"YPh5Nq": {
|
||||||
|
"defaultMessage": "@ {rate}",
|
||||||
|
"description": "Showing zap amount in USD @ rate"
|
||||||
|
},
|
||||||
"Z8ZOEY": {
|
"Z8ZOEY": {
|
||||||
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
|
"defaultMessage": "This method is insecure. We recommend using a {nostrlink}"
|
||||||
},
|
},
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Зап Тревога"
|
"defaultMessage": "Зап Тревога"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "জ্যাপ অ্যালার্ট"
|
"defaultMessage": "জ্যাপ অ্যালার্ট"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,6 +79,7 @@
|
|||||||
"VA/Z1S": "Hide",
|
"VA/Z1S": "Hide",
|
||||||
"W9355R": "Unmute",
|
"W9355R": "Unmute",
|
||||||
"X2PZ7D": "Create Goal",
|
"X2PZ7D": "Create Goal",
|
||||||
|
"YPh5Nq": "@ {rate}",
|
||||||
"Z8ZOEY": "This method is insecure. We recommend using a {nostrlink}",
|
"Z8ZOEY": "This method is insecure. We recommend using a {nostrlink}",
|
||||||
"ZmqxZs": "You can change this later",
|
"ZmqxZs": "You can change this later",
|
||||||
"acrOoz": "Continue",
|
"acrOoz": "Continue",
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Alerta de Zap"
|
"defaultMessage": "Alerta de Zap"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "هشدار زپ"
|
"defaultMessage": "هشدار زپ"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap-hälytys"
|
"defaultMessage": "Zap-hälytys"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Alerte Zap"
|
"defaultMessage": "Alerte Zap"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Riadó"
|
"defaultMessage": "Zap Riadó"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "ザップアラート"
|
"defaultMessage": "ザップアラート"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Alerta Zap"
|
"defaultMessage": "Alerta Zap"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Оповещение о запе"
|
"defaultMessage": "Оповещение о запе"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Tahadhari ya Zap"
|
"defaultMessage": "Tahadhari ya Zap"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "Zap Alert"
|
"defaultMessage": "Zap Alert"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "打闪提示"
|
"defaultMessage": "打闪提示"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,4 +414,3 @@
|
|||||||
"defaultMessage": "打閃提示"
|
"defaultMessage": "打閃提示"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user