import React, { useEffect, useMemo, useRef, useState } from "react"; import { webln } from "@getalby/sdk"; import ArrowUp from "@/Components/ArrowUp"; import axios from "axios"; import PagePlaceholder from "@/Components/PagePlaceholder"; import * as secp from "@noble/secp256k1"; import SatsToUSD from "@/Components/SatsToUSD"; import { decodeUrlOrAddress, encodeLud06, getBech32, getEmptyuserMetadata, getHex, getZapper, shortenKey, } from "@/Helpers/Encryptions"; import { relaysOnPlatform } from "@/Content/Relays"; import UserProfilePic from "@/Components/UserProfilePic"; import Date_ from "@/Components/Date_"; import QRCode from "react-qr-code"; import LoadingDots from "@/Components/LoadingDots"; import { getZapEventRequest } from "@/Helpers/NostrPublisher"; import AddWallet from "@/Components/AddWallet"; import UserSearchBar from "@/Components/UserSearchBar"; import NProfilePreviewer from "@/Components/NProfilePreviewer"; import { copyText, sleepTimer } from "@/Helpers/Helpers"; import { getWallets, updateWallets } from "@/Helpers/ClientHelpers"; import { useDispatch, useSelector } from "react-redux"; import { setUserBalance } from "@/Store/Slides/UserData"; import { setToast } from "@/Store/Slides/Publishers"; import { saveUsers } from "@/Helpers/DB"; import { ndkInstance } from "@/Helpers/NDKInstance"; import { useTranslation } from "react-i18next"; import { walletWarning } from "@/Helpers/Controlers"; import EventOptions from "@/Components/ElementOptions/EventOptions"; import { SelectTabsNoIndex } from "@/Components/SelectTabsNoIndex"; import { customHistory } from "@/Helpers/History"; import { useRouter } from "next/router"; import Icon from "@/Components/Icon"; export default function LightningWallet() { const dispatch = useDispatch(); const { route } = useRouter(); const userKeys = useSelector((state) => state.userKeys); const userMetadata = useSelector((state) => state.userMetadata); const nostrAuthors = useSelector((state) => state.nostrAuthors); const { t } = useTranslation(); const [transactions, setTransactions] = useState([]); const [walletTransactions, setWalletTransactions] = useState([]); const [displayMessage, setDisplayMessage] = useState(false); const [ops, setOps] = useState(""); const [wallets, setWallets] = useState(getWallets()); const [walletBalance, setWalletBalance] = useState("N/A"); const [selectedWallet, setSelectedWallet] = useState( wallets.find((wallet) => wallet.active), ); const [isLoading, setIsLoading] = useState(false); const [showAddWallet, setShowAddWallet] = useState(false); const [showWalletsList, setShowWalletList] = useState(false); const [timestamp, setTimestamp] = useState(Date.now()); const walletListRef = useRef(null); const pageTabs = [ { display_name: t("AQtRwt6"), value: 0, }, { display_name: t("ALrBEok"), value: 1, }, ]; const checkIsLinked = (addr) => { if (userMetadata) { if (!(userMetadata.lud16 && userMetadata.lud06)) return false; if (userMetadata.lud16 && userMetadata.lud16 === addr) return true; if (userMetadata.lud06) { let decoded = decodeUrlOrAddress(userMetadata.lud06); if (decoded && decoded === addr) return true; } return false; } }; const profileHasWallet = useMemo(() => { let hasWallet = userMetadata.lud06 || userMetadata.lud16; let isWalletLinked = wallets.find((wallet) => checkIsLinked(wallet.entitle)) ? true : false; return { hasWallet, isWalletLinked, }; }, [userMetadata, wallets]); useEffect(() => { let timeout = null; let sub = null; try { if (!userKeys) { setWallets([]); setSelectedWallet(false); return; } setIsLoading(true); timeout = setTimeout(() => { let tempWallets = getWallets(); setWallets(tempWallets); setSelectedWallet(tempWallets.find((wallet) => wallet.active)); let authors = []; sub = ndkInstance.subscribe( [ { kinds: [9735], "#p": [userKeys.pub], }, ], { closeOnEose: true, cacheUsage: "CACHE_FIRST", groupable: false }, ); sub.on("event", async (event) => { let zapper = getZapper(event); authors.push(zapper.pubkey); setTransactions((prev) => { let zap = prev.find((zap) => zap.id === zapper.id); if (!zap) return [...prev, zapper]; return prev; }); }); sub.on("eose", () => { saveUsers(authors); }); }, 1000); } catch (err) { console.log(err); } return () => { if (sub) sub.stop(); if (timeout) clearTimeout(timeout); }; }, [userKeys]); useEffect(() => { if (!userKeys) return; if (userKeys && (userKeys?.ext || userKeys?.sec || userKeys?.bunker)) { let tempWallets = getWallets(); let selectedWallet_ = tempWallets.find((wallet) => wallet.active); if (selectedWallet_) { if (selectedWallet_.kind === 1) { getBalancWebLN(); } if (selectedWallet_.kind === 2) { getAlbyData(selectedWallet_); } if (selectedWallet_.kind === 3) { getNWCData(selectedWallet_); } } else { setWallets([]); setSelectedWallet(false); setWalletBalance("N/A"); } } else { setWalletBalance("N/A"); } }, [userKeys, selectedWallet, timestamp]); useEffect(() => { if (route === "/lightning-wallet" && walletBalance) { const w = getWallets(); localStorage.setItem("selectedWalletType", route); dispatch(setUserBalance(walletBalance)); setWallets(w); setSelectedWallet(w.find((wallet) => wallet.active)); } }, [route, walletBalance]); useEffect(() => { let handleOffClick = (e) => { if (walletListRef.current && !walletListRef.current.contains(e.target)) { setShowWalletList(false); } }; document.addEventListener("click", handleOffClick); return () => { document.removeEventListener("click", handleOffClick); }; }, [walletListRef]); const getBalancWebLN = async () => { try { // setIsLoading(true); await window.webln.enable(); let data = await window.webln.getBalance(); setIsLoading(false); setWalletBalance(data.balance); } catch (err) { console.log(err); setIsLoading(false); } }; const getAlbyData = async (activeWallet) => { try { // setIsLoading(true); let checkTokens = await checkAlbyToken(wallets, activeWallet); let b = await getBalanceAlbyAPI( checkTokens.activeWallet.data.access_token, ); let t = await getTransactionsAlbyAPI( checkTokens.activeWallet.data.access_token, ); setWallets(checkTokens.wallets); setWalletBalance(b); setWalletTransactions(t); setIsLoading(false); } catch (err) { console.log(err); setIsLoading(false); } }; const getBalanceAlbyAPI = async (code) => { try { const data = await axios.get("https://api.getalby.com/balance", { headers: { Authorization: `Bearer ${code}`, }, }); return data.data.balance; } catch (err) { console.log(err); return 0; } }; const getTransactionsAlbyAPI = async (code) => { try { const data = await axios.get("https://api.getalby.com/invoices", { headers: { Authorization: `Bearer ${code}`, }, }); let sendersMetadata = data.data .filter((event) => { if (event.metadata?.zap_request) return event; }) .map((event) => { return event.metadata.zap_request.pubkey; }); sendersMetadata = [...new Set(sendersMetadata)]; saveUsers(sendersMetadata); return data.data; } catch (err) { console.log(err); return 0; } }; const getNWCData = async (activeWallet) => { try { // setIsLoading(true); const nwc = new webln.NWC({ nostrWalletConnectUrl: activeWallet.data }); await nwc.enable(); const ONE_WEEK_IN_SECONDS = 60 * 60 * 24 * 90; const userBalance_ = await nwc.getBalance(); setWalletBalance(userBalance_.balance); const transactions_ = await nwc.listTransactions({ from: Math.floor(new Date().getTime() / 1000 - ONE_WEEK_IN_SECONDS), until: Math.ceil(new Date().getTime() / 1000), limit: 50, }); let sendersMetadata = transactions_.transactions .filter((event) => { if (event.metadata?.zap_request) return event; }) .map((event) => { return event.metadata.zap_request.pubkey; }); sendersMetadata = [...new Set(sendersMetadata)]; saveUsers(sendersMetadata); setWalletTransactions(transactions_.transactions); setIsLoading(false); nwc.close(); } catch (err) { console.log(err); setIsLoading(false); } }; const handleSelectWallet = (walletID) => { let index = wallets.findIndex((wallet) => wallet.id == walletID); let tempWallets = Array.from(wallets); tempWallets = tempWallets.map((wallet) => { let w = { ...wallet }; w.active = false; return w; }); tempWallets[index].active = true; setSelectedWallet(wallets[index]); setWallets(tempWallets); updateWallets(tempWallets); setOps(""); setShowWalletList(false); }; const refreshAfterDeletion = (w) => { setWallets(w); if (w.length === 0) setSelectedWallet(false); if (w.length > 0) setSelectedWallet(w[0]); }; let handleAddWallet = () => { let tempWallets = getWallets(); let selectedWallet_ = tempWallets.find((wallet) => wallet.active); setWallets(tempWallets); setSelectedWallet(selectedWallet_); setShowAddWallet(false); }; const handleSelectPageTab = (tab) => { if (tab === 1) customHistory("/cashu-wallet"); }; const onPaid = (amount) => { setOps(""); setWalletBalance(walletBalance + amount); }; return ( <> {showAddWallet && ( setShowAddWallet(false)} refresh={handleAddWallet} /> )} {ops === "send" && ( setOps("")} wallets={wallets} selectedWallet={selectedWallet} setWallets={setWallets} refreshTransactions={() => setTimestamp(Date.now())} /> )} {ops === "receive" && ( setOps("")} wallets={wallets} selectedWallet={selectedWallet} setWallets={setWallets} onPaid={onPaid} /> )}
{!(userKeys.ext || userKeys.sec || userKeys.bunker) && ( )} {(userKeys.ext || userKeys.sec || userKeys.bunker) && wallets.length === 0 && (
)} {(userKeys.ext || userKeys.sec || userKeys.bunker) && wallets.length > 0 && (
{/*

{t("AQtRwt6")}

*/}
{!isLoading && (

{t("A1yJkHJ")}

{walletBalance}

sats

|

{t("AjECxdb")}

{selectedWallet.kind !== 1 && selectedWallet.entitle.includes("@") && (
selectedWallet.entitle.includes("@") ? copyText( selectedWallet.entitle, t("ALR84Tq"), ) : walletWarning() } > {selectedWallet.entitle}
)}
)} {isLoading && (
)}

{t("AX8w9cg")}

{selectedWallet && (
setShowWalletList(!showWalletsList) } >

{selectedWallet.entitle}

)} {showWalletsList && (

{t("AnXYtQy")}

setShowAddWallet(true)} >

{t("A8fEwNq")}

{wallets.map((wallet) => { let isLinked = checkIsLinked( wallet.entitle, ); return (
{ e.stopPropagation(); handleSelectWallet(wallet.id); }} style={{ border: "none", overflow: "visible", }} >
{wallet.active && (
)}

{wallet.entitle}

{isLinked && (
{t("AqlBPla")}
)}
{wallet.kind !== 1 && ( )}
); })}
)}
{!isLoading && !( profileHasWallet.hasWallet && profileHasWallet.isWalletLinked ) && (
⚠️{" "} {!profileHasWallet.hasWallet && <>{t("AAPZe91")}} {profileHasWallet.hasWallet && !profileHasWallet.isWalletLinked && ( <>{t("AHKiPjO")} )}{" "} {t("AHTCsEO")}
)}
{isLoading && (

{t("AZhgADD")}

)} {!isLoading && ( <> {transactions.length > 0 && selectedWallet?.kind === 1 && (

{t("AzLQdQO")}

{transactions.map((transaction, index) => { let author = nostrAuthors.find( (author) => author.pubkey === transaction.pubkey, ) || getEmptyuserMetadata(transaction.pubkey); return (

{t("AdrOPfO", { name: author.display_name || author.name || author.pubkey.substring(0, 10), })} {" "} {transaction.amount}{" "} Sats

{transaction.message && (
displayMessage === transaction.id ? setDisplayMessage(false) : setDisplayMessage(transaction.id) } >
)}
{transaction.message && displayMessage === transaction.id && (

{t("AVZHXQq")}

{transaction.message}

)}
); })}
)} {transactions.length === 0 && selectedWallet?.kind === 1 && (

{t("Ag3spMM")}

{t("ABF4HcR")}

)} {walletTransactions.length > 0 && selectedWallet?.kind === 2 && (

{t("Aflt0YJ")}

{walletTransactions.map((transaction) => { let isZap = transaction.metadata?.zap_request; let author = isZap ? nostrAuthors.find( (author) => author.pubkey === transaction.metadata.zap_request.pubkey, ) : false; return (
{(!isZap || (isZap && transaction.type === "outgoing")) && ( <> {transaction.type === "outgoing" && (

)} {transaction.type !== "outgoing" && (

)} )} {isZap && transaction.type !== "outgoing" && ( <>

)}

{(!isZap || (isZap && transaction.type === "outgoing")) && ( <> {transaction.type === "outgoing" ? t("ATyFagO") : t("AyVA6Q3")} )} {(isZap || (isZap && transaction.type !== "outgoing")) && ( <> {t("AdrOPfO", { name: author ? author.display_name || author.name : getBech32( "npub", isZap.pubkey, ).substring(0, 10), })} )} {" "} {transaction.amount}{" "} Sats

{(transaction.memo || transaction.comment) && (
displayMessage === transaction.identifier ? setDisplayMessage(false) : setDisplayMessage( transaction.identifier, ) } >
)}
{(transaction.memo || transaction.comment) && displayMessage === transaction.identifier && (

{t("AVZHXQq")}

{transaction.memo || transaction.comment}

)}
); })}
)} {walletTransactions.length === 0 && selectedWallet?.kind === 2 && (

{t("Ag3spMM")}

{t("AgaoyPx")}

)} {walletTransactions.length > 0 && selectedWallet?.kind === 3 && (

{t("Aflt0YJ")}

{walletTransactions.map((transaction, index) => { let isZap = transaction.metadata?.zap_request; let author = isZap ? nostrAuthors.find( (author) => author.pubkey === transaction.metadata.zap_request.pubkey, ) : false; return (
{(!isZap || (isZap && transaction.type === "outgoing")) && ( <> {transaction.type === "outgoing" && (

)} {transaction.type !== "outgoing" && (

)} )} {isZap && transaction.type !== "outgoing" && ( <>

)}

{(!isZap || (isZap && transaction.type === "outgoing")) && ( <> {transaction.type === "outgoing" ? t("ATyFagO") : t("AyVA6Q3")} )} {(isZap || (isZap && transaction.type !== "outgoing")) && ( <> {t("AdrOPfO", { name: author ? author.display_name || author.name : getBech32( "npub", isZap.pubkey, ).substring(0, 10), })} )} {" "} {transaction.amount}{" "} Sats

{transaction.description && (
displayMessage === transaction.invoice ? setDisplayMessage(false) : setDisplayMessage( transaction.invoice, ) } >
)}
{transaction.description && displayMessage === transaction.invoice && (

{t("AVZHXQq")}

{transaction.description}

)}
); })}
)} {walletTransactions.length === 0 && selectedWallet?.kind === 3 && (

{t("Ag3spMM")}

{t("AgaoyPx")}

)} )}
)}
); } const SendPayment = ({ exit, wallets, selectedWallet, setWallets, refreshTransactions, }) => { const dispatch = useDispatch(); const userKeys = useSelector((state) => state.userKeys); const { t } = useTranslation(); const [isZap, setIsZap] = useState(false); const [invoiceData, setInvoicedata] = useState(true); const [isLoading, setIsLoading] = useState(false); const [addr, setAddr] = useState(""); const [comment, setComment] = useState(""); const [amount, setAmount] = useState(0); const [pubkey, setPubkey] = useState(""); useEffect(() => { if (addr.startsWith("lnbc")) { setInvoicedata(false); } else setInvoicedata(true); }, [addr]); const sendWithWebLN = async (addr_) => { try { setIsLoading(true); await window.webln.enable(); let res = await window.webln.sendPayment(addr_); dispatch( setToast({ type: 1, desc: t("AaQzRGG", { amount: res.route.total_amt, fees: res.route.total_fees, }), }), ); reInitParams(); setIsLoading(false); } catch (err) { console.log(err); setIsLoading(false); if (err.includes("User rejected")) return; dispatch( setToast({ type: 2, desc: t("Acr4Slu"), }), ); } }; const sendWithNWC = async (addr_) => { try { setIsLoading(true); const nwc = new webln.NWC({ nostrWalletConnectUrl: selectedWallet.data }); await nwc.enable(); const res = await nwc.sendPayment(addr_); dispatch( setToast({ type: 1, desc: t("A5n8Ifp"), }), ); reInitParams(); setIsLoading(false); nwc.close(); } catch (err) { console.log(err); setIsLoading(false); if (err.includes("User rejected")) return; dispatch( setToast({ type: 2, desc: t("Acr4Slu"), }), ); } }; const sendWithAlby = async (addr_, code) => { try { setIsLoading(true); const data = await axios.post( "https://api.getalby.com/payments/bolt11", { invoice: addr_ }, { headers: { Authorization: `Bearer ${code}`, }, }, ); setIsLoading(false); reInitParams(); refreshTransactions(); dispatch( setToast({ type: 1, desc: t("AaQzRGG", { amount: data.data.amount, fees: data.data.fee, }), }), ); return data.data; } catch (err) { console.log(err); setIsLoading(false); dispatch( setToast({ type: 2, desc: t("Acr4Slu"), }), ); return 0; } }; const handleSendPayment = async () => { if (isLoading) return; if (invoiceData) { try { let hex = pubkey; if (amount === 0) { dispatch( setToast({ type: 3, desc: t("AR2vydH"), }), ); return; } if (isZap && !pubkey) { dispatch( setToast({ type: 3, desc: t("AJbsVsG"), }), ); return; } if (pubkey.startsWith("npub")) { hex = getHex(pubkey); if (!hex) { dispatch( setToast({ type: 3, desc: t("AiHLMRi"), }), ); return; } } if ( pubkey && !pubkey.startsWith("npub") && !secp.utils.isValidPrivateKey(pubkey) ) { dispatch( setToast({ type: 3, desc: t("AiHLMRi"), }), ); return; } const data = await axios.get(decodeUrlOrAddress(addr)); const callback = data.data.callback; let addr_ = encodeLud06(decodeUrlOrAddress(addr)); let sats = amount * 1000; let event = getEvent(sats, addr_, hex); const res = isZap ? await axios( `${callback}?amount=${sats}&nostr=${event}&lnurl=${addr_}`, ) : await axios(`${callback}?amount=${sats}&lnurl=${addr_}`); if (selectedWallet.kind === 1) { sendWithWebLN(res.data.pr); } if (selectedWallet.kind === 2) { let checkTokens = await checkAlbyToken(wallets, selectedWallet); setWallets(checkTokens.wallets); sendWithAlby(addr_, checkTokens.activeWallet.data.access_token); } if (selectedWallet.kind === 3) { sendWithNWC(res.data.pr); } } catch (err) { console.log(err); dispatch( setToast({ type: 2, desc: t("AYuUnqd"), }), ); } } if (!invoiceData) { if (selectedWallet.kind === 1) sendWithWebLN(addr); if (selectedWallet.kind === 2) { let checkTokens = await checkAlbyToken(wallets, selectedWallet); setWallets(checkTokens.wallets); sendWithAlby(addr, checkTokens.activeWallet.data.access_token); } if (selectedWallet.kind === 3) sendWithNWC(addr); } }; const reInitParams = () => { setIsZap(false); setInvoicedata(true); setAddr(""); setComment(""); setAmount(0); setPubkey(""); }; const getEvent = async (sats, addr_, hex) => { let tags = [ ["relays", ...relaysOnPlatform], ["amount", sats.toString()], ["lnurl", addr_], ["p", hex], ]; const event = isZap ? await getZapEventRequest(userKeys, comment, tags) : {}; return event; }; const handleUserMetadata = (data) => { if (data.lud16) { setAddr(data.lud16); } }; return (
{ e.stopPropagation(); exit(); }} >
e.stopPropagation()} >

{t("A14LwWS")}

{ setInvoicedata(!invoiceData); setAddr(""); }} >

{t("AI19tdC")}

setAddr(e.target.value)} /> {invoiceData && ( <> {!pubkey && ( )} {pubkey && ( setPubkey("")} setMetataData={handleUserMetadata} /> )} )} {invoiceData && ( <>

{t("AcDgXKI")}

5 ? `${80 - (amount.toString().length - 6) * 10}px` : "80px" },50px)`, height: "80px", }} value={amount} onChange={(e) => setAmount(parseInt(e.target.value))} autoFocus />

Sats

setComment(e.target.value)} placeholder={t("Ark6BLW")} /> )}
); }; const ReceivePayment = ({ exit, wallets, selectedWallet, setWallets, onPaid, }) => { const dispatch = useDispatch(); const { t } = useTranslation(); const [comment, setComment] = useState(""); const [amount, setAmount] = useState(0); const [isLoading, setIsLoading] = useState(false); const [invoiceRequest, setInvoiceRequest] = useState(false); const [triggerNWC, setTriggerNWC] = useState(false); useEffect(() => { let cancelled = false; let nwcInstance = null; const generateWithNWC = async () => { try { if (!triggerNWC) return; setIsLoading(true); const nwc = new webln.NWC({ nostrWalletConnectUrl: selectedWallet.data, }); nwcInstance = nwc; await nwc.enable(); if (cancelled) return; const invoice = await nwc.makeInvoice({ defaultMemo: comment, amount, }); if (cancelled) return; setIsLoading(false); setInvoiceRequest(invoice.paymentRequest); while (!cancelled) { const lookup = await nwc.lookupInvoice(invoice); console.log(lookup.paid); if (cancelled) break; if (lookup.preimage) { onPaid(amount); break; } await sleepTimer(2000); } nwc.close(); } catch (err) { console.log(err); if (!cancelled) { setIsLoading(false); if (err?.includes("User rejected")) return; dispatch( setToast({ type: 2, desc: t("Acr4Slu"), }), ); } } }; generateWithNWC(); return () => { cancelled = true; if (nwcInstance) nwcInstance.close(); }; }, [triggerNWC]); const generateWithWebLN = async () => { try { setIsLoading(true); await window.webln.enable(); let invoice = await window.webln.makeInvoice({ defaultMemo: comment, amount, }); setIsLoading(false); setInvoiceRequest(invoice.paymentRequest); } catch (err) { console.log(err); setIsLoading(false); if (err?.includes("User rejected")) return; dispatch( setToast({ type: 2, desc: t("Acr4Slu"), }), ); } }; // const generateWithNWC = async () => { // try { // setIsLoading(true); // const nwc = new webln.NWC({ nostrWalletConnectUrl: selectedWallet.data }); // await nwc.enable(); // const invoice = await nwc.makeInvoice({ // defaultMemo: comment, // amount, // }); // setIsLoading(false); // setInvoiceRequest(invoice.paymentRequest); // let t = 0; // while (t !== 1) { // const lookup = await nwc.lookupInvoice(invoice); // if (lookup.preimage) { // t = -1; // } else t = t + 1; // await sleepTimer(2000); // } // nwc.close(); // } catch (err) { // console.log(err); // setIsLoading(false); // if (err?.includes("User rejected")) return; // dispatch( // setToast({ // type: 2, // desc: t("Acr4Slu"), // }), // ); // } // }; const generateWithAlby = async (code) => { try { setIsLoading(true); const data = await axios.post( "https://api.getalby.com/invoices", { amount, comment, description: comment, memo: comment }, { headers: { Authorization: `Bearer ${code}`, }, }, ); setIsLoading(false); setInvoiceRequest(data.data.payment_request); return data.data; } catch (err) { console.log(err); setIsLoading(false); return 0; } }; const generateInvoice = async () => { if (isLoading) return; if (selectedWallet.kind === 1) { generateWithWebLN(); } if (selectedWallet.kind === 2) { let checkTokens = await checkAlbyToken(wallets, selectedWallet); setWallets(checkTokens.wallets); generateWithAlby(checkTokens.activeWallet.data.access_token); } if (selectedWallet.kind === 3) { setTriggerNWC(Date.now()); // generateWithNWC(); } }; const copyText = (key) => { navigator.clipboard.writeText(key); dispatch( setToast({ type: 1, desc: `${t("AS0m8W5")} 👏`, }), ); }; return ( <> {invoiceRequest && (
copyText(invoiceRequest)} >

{shortenKey(invoiceRequest)}

{triggerNWC && (

{t("AJ99n5o")}

{" "}
)}
)}
{ e.stopPropagation(); exit(); }} >
e.stopPropagation()} >

{t("AuOH50L")}

{t("AcDgXKI")}

5 ? `${80 - (amount.toString().length - 6) * 10}px` : "80px" },50px)`, height: "80px", }} value={amount} onChange={(e) => setAmount(parseInt(e.target.value))} autoFocus />

Sats

setComment(e.target.value)} placeholder={t("Ark6BLW")} />
); }; const checkAlbyToken = async (wallets, activeWallet) => { let tokenExpiry = activeWallet.data.created_at + activeWallet.data.expires_in; let currentTime = Math.floor(Date.now() / 1000); if (tokenExpiry > currentTime) return { wallets, activeWallet, }; try { let fd = new FormData(); fd.append("refresh_token", activeWallet.data.refresh_token); fd.append("grant_type", "refresh_token"); const access_token = await axios.post( "https://api.getalby.com/oauth/token", fd, { auth: { username: import.meta.env.VITE_ALBY_CLIENT_ID, password: import.meta.env.VITE_ALBY_SECRET_ID, }, headers: { "Content-Type": "multipart/form-data", }, }, ); let tempWallet = { ...activeWallet }; tempWallet.data = { ...access_token.data, created_at: Math.floor(Date.now() / 1000), }; let tempWallets = Array.from(wallets); let index = wallets.findIndex((item) => item.id === activeWallet.id); tempWallets[index] = tempWallet; updateWallets(tempWallets); return { wallets: tempWallets, activeWallet: tempWallet, }; } catch (err) { console.log(err); return { wallets, activeWallet, }; } };