diff --git a/packages/app/src/Element/NoteFooter.tsx b/packages/app/src/Element/NoteFooter.tsx index c55790a..605a226 100644 --- a/packages/app/src/Element/NoteFooter.tsx +++ b/packages/app/src/Element/NoteFooter.tsx @@ -21,7 +21,7 @@ import { UserPreferences, setPinned, setBookmarked } from "State/Login"; import useModeration from "Hooks/useModeration"; import { TranslateHost } from "Const"; import { LNURL } from "LNURL"; - +import { DonateLNURL } from "Pages/DonatePage"; import { useWallet } from "Wallet"; import messages from "./messages"; @@ -114,11 +114,17 @@ export default function NoteFooter(props: NoteFooterProps) { if (wallet?.isReady() && lnurl) { setZapping(true); try { - const handler = new LNURL(lnurl); - await handler.load(); - const zap = handler.canZap ? await publisher.zap(prefs.defaultZapAmount * 1000, ev.PubKey, ev.Id) : undefined; - const invoice = await handler.getInvoice(prefs.defaultZapAmount, undefined, zap); - await wallet.payInvoice(unwrap(invoice.pr)); + if (prefs.fastZapDonate > 0) { + // spin off donate + const donateAmount = Math.floor(prefs.defaultZapAmount * prefs.fastZapDonate); + if (donateAmount > 0) { + console.debug(`Donating ${donateAmount} sats to ${DonateLNURL}`); + fastZapInner(DonateLNURL, donateAmount) + .then(() => console.debug("Donation sent! Thank You!")) + .catch(() => console.debug("Failed to donate")); + } + } + await fastZapInner(lnurl, prefs.defaultZapAmount); } catch (e) { console.warn("Fast zap failed", e); if (!(e instanceof Error) || e.message !== "User rejected") { @@ -132,6 +138,16 @@ export default function NoteFooter(props: NoteFooterProps) { } } + async function fastZapInner(lnurl: string, amount: number) { + if (wallet?.isReady() && lnurl) { + const handler = new LNURL(lnurl); + await handler.load(); + const zap = handler.canZap ? await publisher.zap(amount * 1000, ev.PubKey, ev.Id) : undefined; + const invoice = await handler.getInvoice(amount, undefined, zap); + await wallet.payInvoice(unwrap(invoice.pr)); + } + } + function tipButton() { const service = author?.lud16 || author?.lud06; if (service) { diff --git a/packages/app/src/Pages/DonatePage.tsx b/packages/app/src/Pages/DonatePage.tsx index f0277a9..d130caf 100644 --- a/packages/app/src/Pages/DonatePage.tsx +++ b/packages/app/src/Pages/DonatePage.tsx @@ -38,6 +38,8 @@ const Translators = [ bech32ToHex("npub10529hxckjm5t5mchss5lnpsqrmavulglxhrmu5quuu4hs6yuyh3qc9gxd5"), // aadbitcoin - ID ]; +export const DonateLNURL = "donate@snort.social"; + interface Splits { pubKey: string; split: number; @@ -105,7 +107,7 @@ const DonatePage = () => {
- + {today && ( diff --git a/packages/app/src/Pages/settings/Preferences.tsx b/packages/app/src/Pages/settings/Preferences.tsx index fd174cb..f884e86 100644 --- a/packages/app/src/Pages/settings/Preferences.tsx +++ b/packages/app/src/Pages/settings/Preferences.tsx @@ -2,6 +2,7 @@ import "./Preferences.css"; import { useDispatch, useSelector } from "react-redux"; import { FormattedMessage, useIntl } from "react-intl"; +import { Link } from "react-router-dom"; import emoji from "@jukben/emoji-search"; import { DefaultImgProxy, setPreferences, UserPreferences } from "State/Login"; @@ -154,6 +155,42 @@ const PreferencesPage = () => { /> +
+
+
+ +
+ + +
+ + + + ), + }} + /> +
+
+
+ dispatch(setPreferences({ ...perf, fastZapDonate: parseInt(e.target.value) / 100 }))} + /> +
+
diff --git a/packages/app/src/State/Login.ts b/packages/app/src/State/Login.ts index 0786123..919fbd0 100644 --- a/packages/app/src/State/Login.ts +++ b/packages/app/src/State/Login.ts @@ -80,6 +80,11 @@ export interface UserPreferences { * Default zap amount */ defaultZapAmount: number; + + /** + * For each fast zap an additional X% will be sent to Snort donate address + */ + fastZapDonate: number; } export interface LoginStore { @@ -234,6 +239,7 @@ export const InitState = { imgProxyConfig: DefaultImgProxy, defaultRootTab: "posts", defaultZapAmount: 500, + fastZapDonate: 0.0, }, } as LoginStore;