chore: formatting
This commit is contained in:
@ -20,12 +20,15 @@ const ConnectCashu = () => {
|
||||
}
|
||||
|
||||
const { CashuWallet } = await import("@/Wallet/Cashu");
|
||||
const connection = new CashuWallet({
|
||||
url: config,
|
||||
keys: {},
|
||||
proofs: [],
|
||||
keysets: []
|
||||
}, () => { });
|
||||
const connection = new CashuWallet(
|
||||
{
|
||||
url: config,
|
||||
keys: {},
|
||||
proofs: [],
|
||||
keysets: [],
|
||||
},
|
||||
() => {},
|
||||
);
|
||||
await connection.login();
|
||||
const info = await connection.getInfo();
|
||||
const newWallet = {
|
||||
|
@ -89,16 +89,17 @@ export default function WalletPage(props: { showHistory: boolean }) {
|
||||
|
||||
function walletList() {
|
||||
if (walletState.configs.length === 0) {
|
||||
return (<div className="flex flex-col gap-4">
|
||||
<div>
|
||||
<button onClick={() => navigate("/settings/wallet")}>
|
||||
<FormattedMessage defaultMessage="Connect Wallet" id="cg1VJ2" />
|
||||
</button>
|
||||
return (
|
||||
<div className="flex flex-col gap-4">
|
||||
<div>
|
||||
<button onClick={() => navigate("/settings/wallet")}>
|
||||
<FormattedMessage defaultMessage="Connect Wallet" id="cg1VJ2" />
|
||||
</button>
|
||||
</div>
|
||||
<small>
|
||||
<FormattedMessage defaultMessage="Connect a wallet to send instant payments" id="Yf3DwC" />
|
||||
</small>
|
||||
</div>
|
||||
<small>
|
||||
<FormattedMessage defaultMessage="Connect a wallet to send instant payments" id="Yf3DwC" />
|
||||
</small>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return (
|
||||
@ -129,9 +130,11 @@ export default function WalletPage(props: { showHistory: boolean }) {
|
||||
<h3>
|
||||
<FormattedMessage defaultMessage="Payments" id="pukxg/" description="Wallet transation history" />
|
||||
</h3>
|
||||
{history === undefined && <small>
|
||||
<FormattedMessage defaultMessage="Your sent and received payments will show up here." id="i5gBFz" />
|
||||
</small>}
|
||||
{history === undefined && (
|
||||
<small>
|
||||
<FormattedMessage defaultMessage="Your sent and received payments will show up here." id="i5gBFz" />
|
||||
</small>
|
||||
)}
|
||||
{history?.map(a => {
|
||||
const dirClassname = {
|
||||
"text-[--success]": a.direction === "in",
|
||||
@ -231,14 +234,18 @@ export default function WalletPage(props: { showHistory: boolean }) {
|
||||
/>
|
||||
</div>
|
||||
<div className="flex gap-2">
|
||||
{wallet?.canCreateInvoice() && <AsyncButton className="secondary" onClick={() => navigate("/wallet/receive")}>
|
||||
<FormattedMessage defaultMessage="Receive" id="ULXFfP" />
|
||||
<Icon name="arrow-up-right" className="rotate-180" />
|
||||
</AsyncButton>}
|
||||
{wallet?.canPayInvoice() && <AsyncButton onClick={() => navigate("/wallet/send")}>
|
||||
<FormattedMessage defaultMessage="Send" id="9WRlF4" />
|
||||
<Icon name="arrow-up-right" />
|
||||
</AsyncButton>}
|
||||
{wallet?.canCreateInvoice() && (
|
||||
<AsyncButton className="secondary" onClick={() => navigate("/wallet/receive")}>
|
||||
<FormattedMessage defaultMessage="Receive" id="ULXFfP" />
|
||||
<Icon name="arrow-up-right" className="rotate-180" />
|
||||
</AsyncButton>
|
||||
)}
|
||||
{wallet?.canPayInvoice() && (
|
||||
<AsyncButton onClick={() => navigate("/wallet/send")}>
|
||||
<FormattedMessage defaultMessage="Send" id="9WRlF4" />
|
||||
<Icon name="arrow-up-right" />
|
||||
</AsyncButton>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
{walletHistory()}
|
||||
|
@ -6,50 +6,64 @@ import { useState } from "react";
|
||||
import { FormattedMessage, useIntl } from "react-intl";
|
||||
|
||||
export function WalletReceivePage() {
|
||||
const wallets = useWallet();
|
||||
const { formatMessage } = useIntl();
|
||||
const [invoice, setInvoice] = useState("");
|
||||
const [error, setError] = useState("");
|
||||
const [amount, setAmount] = useState(0);
|
||||
const [comment, setComment] = useState("");
|
||||
const wallets = useWallet();
|
||||
const { formatMessage } = useIntl();
|
||||
const [invoice, setInvoice] = useState("");
|
||||
const [error, setError] = useState("");
|
||||
const [amount, setAmount] = useState(0);
|
||||
const [comment, setComment] = useState("");
|
||||
|
||||
return <div className="p flex flex-col gap-4">
|
||||
<div className="text-2xl font-bold">
|
||||
<FormattedMessage defaultMessage="Receive" id="ULXFfP" />
|
||||
</div>
|
||||
<p>
|
||||
<FormattedMessage defaultMessage="Receiving to <b>{wallet}</b>" id="PXQ0z0" values={{
|
||||
b: b => <b>"{b}"</b>,
|
||||
wallet: wallets.config?.info.alias
|
||||
}} />
|
||||
</p>
|
||||
<input type="text" placeholder={formatMessage({ defaultMessage: "Comment", id: 'LgbKvU' })} value={comment} onChange={e => setComment(e.target.value)} />
|
||||
<div className="flex flex-col">
|
||||
<small>
|
||||
<FormattedMessage defaultMessage="Amount in sats" id="djLctd" />
|
||||
</small>
|
||||
<input type="number" value={amount} onChange={e => setAmount(Number(e.target.value))} />
|
||||
</div>
|
||||
<AsyncButton onClick={async () => {
|
||||
try {
|
||||
if (wallets.wallet) {
|
||||
const inv = await wallets.wallet.createInvoice({
|
||||
amount: amount,
|
||||
memo: comment,
|
||||
expiry: 600
|
||||
});
|
||||
setInvoice(inv.pr);
|
||||
}
|
||||
} catch (e) {
|
||||
setError((e as Error).message);
|
||||
return (
|
||||
<div className="p flex flex-col gap-4">
|
||||
<div className="text-2xl font-bold">
|
||||
<FormattedMessage defaultMessage="Receive" id="ULXFfP" />
|
||||
</div>
|
||||
<p>
|
||||
<FormattedMessage
|
||||
defaultMessage="Receiving to <b>{wallet}</b>"
|
||||
id="PXQ0z0"
|
||||
values={{
|
||||
b: b => <b>"{b}"</b>,
|
||||
wallet: wallets.config?.info.alias,
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={formatMessage({ defaultMessage: "Comment", id: "LgbKvU" })}
|
||||
value={comment}
|
||||
onChange={e => setComment(e.target.value)}
|
||||
/>
|
||||
<div className="flex flex-col">
|
||||
<small>
|
||||
<FormattedMessage defaultMessage="Amount in sats" id="djLctd" />
|
||||
</small>
|
||||
<input type="number" value={amount} onChange={e => setAmount(Number(e.target.value))} />
|
||||
</div>
|
||||
<AsyncButton
|
||||
onClick={async () => {
|
||||
try {
|
||||
if (wallets.wallet) {
|
||||
const inv = await wallets.wallet.createInvoice({
|
||||
amount: amount,
|
||||
memo: comment,
|
||||
expiry: 600,
|
||||
});
|
||||
setInvoice(inv.pr);
|
||||
}
|
||||
} catch (e) {
|
||||
setError((e as Error).message);
|
||||
}
|
||||
}}>
|
||||
<FormattedMessage defaultMessage="Generate Invoice" id="ipHVx5" />
|
||||
</AsyncButton>
|
||||
{error && <b className="warning">{error}</b>}
|
||||
{invoice && <div className="flex flex-col gap-2 items-center">
|
||||
<QrCode data={invoice} link={`lightning:${invoice}`} />
|
||||
<Copy text={invoice} />
|
||||
</div>}
|
||||
<FormattedMessage defaultMessage="Generate Invoice" id="ipHVx5" />
|
||||
</AsyncButton>
|
||||
{error && <b className="warning">{error}</b>}
|
||||
{invoice && (
|
||||
<div className="flex flex-col gap-2 items-center">
|
||||
<QrCode data={invoice} link={`lightning:${invoice}`} />
|
||||
<Copy text={invoice} />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
}
|
||||
);
|
||||
}
|
||||
|
@ -1,75 +1,100 @@
|
||||
import AsyncButton from "@/Components/Button/AsyncButton";
|
||||
import Icon from "@/Components/Icons/Icon";
|
||||
import { formatShort } from "@/Utils/Number";
|
||||
import { WalletInvoice, useWallet } from "@/Wallet"
|
||||
import { WalletInvoice, useWallet } from "@/Wallet";
|
||||
import { LNURL } from "@snort/shared";
|
||||
import { useEffect, useState } from "react";
|
||||
import { FormattedMessage, FormattedNumber, useIntl } from "react-intl";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
|
||||
export function WalletSendPage() {
|
||||
const wallets = useWallet();
|
||||
const { formatMessage } = useIntl();
|
||||
const [invoice, setInvoice] = useState("");
|
||||
const [error, setError] = useState("");
|
||||
const [lnurl, isLnurl] = useState(true);
|
||||
const [amount, setAmount] = useState(0);
|
||||
const [comment, setComment] = useState("");
|
||||
const [result, setResult] = useState<WalletInvoice>();
|
||||
const wallets = useWallet();
|
||||
const { formatMessage } = useIntl();
|
||||
const [invoice, setInvoice] = useState("");
|
||||
const [error, setError] = useState("");
|
||||
const [lnurl, isLnurl] = useState(true);
|
||||
const [amount, setAmount] = useState(0);
|
||||
const [comment, setComment] = useState("");
|
||||
const [result, setResult] = useState<WalletInvoice>();
|
||||
|
||||
useEffect(() => {
|
||||
isLnurl(!invoice.startsWith("lnbc"))
|
||||
}, [invoice]);
|
||||
useEffect(() => {
|
||||
isLnurl(!invoice.startsWith("lnbc"));
|
||||
}, [invoice]);
|
||||
|
||||
return <div className="p flex flex-col gap-4">
|
||||
<div className="text-2xl font-bold">
|
||||
<FormattedMessage defaultMessage="Send" id="9WRlF4" />
|
||||
</div>
|
||||
<p>
|
||||
<FormattedMessage defaultMessage="Sending from <b>{wallet}</b>" id="Xnimz0" values={{
|
||||
b: b => <b>"{b}"</b>,
|
||||
wallet: wallets.config?.info.alias
|
||||
}} />
|
||||
</p>
|
||||
<input type="text" placeholder={formatMessage({ defaultMessage: "Invoice / Lightning Address", id: 'EHqHsu' })} value={invoice} onChange={e => setInvoice(e.target.value)} />
|
||||
{lnurl && <>
|
||||
<input type="text" placeholder={formatMessage({ defaultMessage: "Comment", id: 'LgbKvU' })} value={comment} onChange={e => setComment(e.target.value)} />
|
||||
<div className="flex flex-col">
|
||||
<small>
|
||||
<FormattedMessage defaultMessage="Amount in sats" id="djLctd" />
|
||||
</small>
|
||||
<input type="number" value={amount} onChange={e => setAmount(Number(e.target.value))} />
|
||||
</div>
|
||||
</>}
|
||||
<AsyncButton onClick={async () => {
|
||||
try {
|
||||
if (wallets.wallet) {
|
||||
if (!isLnurl) {
|
||||
const res = await wallets.wallet.payInvoice(invoice);
|
||||
setResult(res);
|
||||
} else {
|
||||
const lnurl = new LNURL(invoice);
|
||||
await lnurl.load();
|
||||
const pr = await lnurl.getInvoice(amount, comment);
|
||||
if (pr.pr) {
|
||||
const res = await wallets.wallet.payInvoice(pr.pr);
|
||||
setResult(res);
|
||||
}
|
||||
}
|
||||
return (
|
||||
<div className="p flex flex-col gap-4">
|
||||
<div className="text-2xl font-bold">
|
||||
<FormattedMessage defaultMessage="Send" id="9WRlF4" />
|
||||
</div>
|
||||
<p>
|
||||
<FormattedMessage
|
||||
defaultMessage="Sending from <b>{wallet}</b>"
|
||||
id="Xnimz0"
|
||||
values={{
|
||||
b: b => <b>"{b}"</b>,
|
||||
wallet: wallets.config?.info.alias,
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={formatMessage({ defaultMessage: "Invoice / Lightning Address", id: "EHqHsu" })}
|
||||
value={invoice}
|
||||
onChange={e => setInvoice(e.target.value)}
|
||||
/>
|
||||
{lnurl && (
|
||||
<>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={formatMessage({ defaultMessage: "Comment", id: "LgbKvU" })}
|
||||
value={comment}
|
||||
onChange={e => setComment(e.target.value)}
|
||||
/>
|
||||
<div className="flex flex-col">
|
||||
<small>
|
||||
<FormattedMessage defaultMessage="Amount in sats" id="djLctd" />
|
||||
</small>
|
||||
<input type="number" value={amount} onChange={e => setAmount(Number(e.target.value))} />
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
<AsyncButton
|
||||
onClick={async () => {
|
||||
try {
|
||||
if (wallets.wallet) {
|
||||
if (!isLnurl) {
|
||||
const res = await wallets.wallet.payInvoice(invoice);
|
||||
setResult(res);
|
||||
} else {
|
||||
const lnurl = new LNURL(invoice);
|
||||
await lnurl.load();
|
||||
const pr = await lnurl.getInvoice(amount, comment);
|
||||
if (pr.pr) {
|
||||
const res = await wallets.wallet.payInvoice(pr.pr);
|
||||
setResult(res);
|
||||
}
|
||||
} catch (e) {
|
||||
setError((e as Error).message);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
setError((e as Error).message);
|
||||
}
|
||||
}}>
|
||||
<FormattedMessage defaultMessage="Pay" id="lD3+8a" />
|
||||
</AsyncButton>
|
||||
{error && <b className="warning">{error}</b>}
|
||||
{result && <div className="flex gap-2">
|
||||
<Icon name="check" className="success" />
|
||||
<FormattedMessage defaultMessage="Paid {amount} sats, fee {fee} sats" id="aRex7h" values={{
|
||||
amount: <FormattedNumber value={result.amount / 1000} />,
|
||||
fee: <FormattedNumber value={result.fees / 1000} />
|
||||
}} />
|
||||
</div>}
|
||||
<FormattedMessage defaultMessage="Pay" id="lD3+8a" />
|
||||
</AsyncButton>
|
||||
{error && <b className="warning">{error}</b>}
|
||||
{result && (
|
||||
<div className="flex gap-2">
|
||||
<Icon name="check" className="success" />
|
||||
<FormattedMessage
|
||||
defaultMessage="Paid {amount} sats, fee {fee} sats"
|
||||
id="aRex7h"
|
||||
values={{
|
||||
amount: <FormattedNumber value={result.amount / 1000} />,
|
||||
fee: <FormattedNumber value={result.fees / 1000} />,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
}
|
||||
);
|
||||
}
|
||||
|
Reference in New Issue
Block a user