import "./CashuNuts.css"; import { useUserProfile } from "@snort/system-react"; import { useEffect, useState } from "react"; import { FormattedMessage, FormattedNumber } from "react-intl"; import AsyncButton from "@/Components/Button/AsyncButton"; import ECashIcon from "@/Components/Icons/ECash"; import Icon from "@/Components/Icons/Icon"; import { useCopy } from "@/Hooks/useCopy"; import useLogin from "@/Hooks/useLogin"; interface Token { token: Array<{ mint: string; proofs: Array<{ amount: number; }>; }>; memo?: string; } export default function CashuNuts({ token }: { token: string }) { const { publicKey } = useLogin(s => ({ publicKey: s.publicKey })); const profile = useUserProfile(publicKey); const { copy } = useCopy(); async function redeemToken(token: string) { const lnurl = profile?.lud16 ?? ""; const url = `https://redeem.cashu.me?token=${encodeURIComponent(token)}&lightning=${encodeURIComponent( lnurl, )}&autopay=yes`; window.open(url, "_blank"); } const [cashu, setCashu] = useState(); useEffect(() => { try { if (!token.startsWith("cashuA") || token.length < 10) { return; } import("@cashu/cashu-ts").then(({ getDecodedToken }) => { const tkn = getDecodedToken(token); setCashu(tkn); }); } catch { // ignored } }, [token]); if (!cashu) return <>{token}; const amount = cashu.token[0].proofs.reduce((acc, v) => acc + v.amount, 0); return (
), }} />
copy(token)}> redeemToken(token)}>
); }