import { LoadingSpinner } from 'components/LoadingSpinner' import { ZapButtons, ZapPopUp, ZapPresets, ZapQR } from 'components/Zap' import { MetadataController, RelayController, ZapController } from 'controllers' import { useAppSelector, useDidMount } from 'hooks' import { useCallback, useState } from 'react' import { toast } from 'react-toastify' import { ModDetails, PaymentRequest } from 'types' import { abbreviateNumber, formatNumber, unformatNumber } from 'utils' type ZapProps = { modDetails: ModDetails } export const Zap = ({ modDetails }: ZapProps) => { const [isOpen, setIsOpen] = useState(false) const [hasZapped, setHasZapped] = useState(false) const userState = useAppSelector((state) => state.user) const [totalZappedAmount, setTotalZappedAmount] = useState(0) useDidMount(() => { RelayController.getInstance() .getTotalZapAmount( modDetails.author, modDetails.id, modDetails.aTag, userState.user?.pubkey as string ) .then((res) => { setTotalZappedAmount(res.accumulatedZapAmount) setHasZapped(res.hasZapped) }) .catch((err) => { toast.error(err.message || err) }) }) return ( <>
setIsOpen(true)} >

{abbreviateNumber(totalZappedAmount)}

{isOpen && ( setIsOpen(false)} lastNode={} notCloseAfterZap setTotalZapAmount={setTotalZappedAmount} /> )} ) } const ZapSite = () => { const [isLoading, setIsLoading] = useState(false) const [loadingSpinnerDesc, setLoadingSpinnerDesc] = useState('') const [amount, setAmount] = useState(0) const [paymentRequest, setPaymentRequest] = useState() const userState = useAppSelector((state) => state.user) const handleAmountChange = (event: React.ChangeEvent) => { const unformattedValue = unformatNumber(event.target.value) setAmount(unformattedValue) } const handleClose = useCallback(() => { setPaymentRequest(undefined) setIsLoading(false) }, []) const handleQRExpiry = useCallback(() => { setPaymentRequest(undefined) }, []) const generatePaymentRequest = useCallback(async (): Promise => { let userHexKey: string setIsLoading(true) setLoadingSpinnerDesc('Getting user pubkey') if (userState.auth && userState.user?.pubkey) { userHexKey = userState.user.pubkey as string } else { userHexKey = (await window.nostr?.getPublicKey()) as string } if (!userHexKey) { setIsLoading(false) toast.error('Could not get pubkey') return null } setLoadingSpinnerDesc('Getting admin metadata') const metadataController = await MetadataController.getInstance() const adminMetadata = await metadataController.findAdminMetadata() if (!adminMetadata?.lud16) { setIsLoading(false) toast.error('Lighting address (lud16) is missing in admin metadata!') return null } if (!adminMetadata?.pubkey) { setIsLoading(false) toast.error('pubkey is missing in admin metadata!') return null } const zapController = ZapController.getInstance() setLoadingSpinnerDesc('Creating zap request') return await zapController .getLightningPaymentRequest( adminMetadata.lud16, amount, adminMetadata.pubkey as string, userHexKey ) .catch((err) => { toast.error(err.message || err) return null }) .finally(() => { setIsLoading(false) }) }, [amount, userState]) const handleSend = useCallback(async () => { const pr = await generatePaymentRequest() if (!pr) return setIsLoading(true) setLoadingSpinnerDesc('Sending payment!') const zapController = ZapController.getInstance() if (await zapController.isWeblnProviderExists()) { await zapController .sendPayment(pr.pr) .then(() => { toast.success(`Successfully sent ${amount} sats!`) handleClose() }) .catch((err) => { toast.error(err.message || err) }) } else { toast.warn('Webln is not present. Use QR code to send zap.') setPaymentRequest(pr) } setIsLoading(false) }, [amount, handleClose, generatePaymentRequest]) const handleGenerateQRCode = async () => { const pr = await generatePaymentRequest() if (!pr) return setPaymentRequest(pr) } return ( <>

DEG Mods

degmods@degmods.com

Help with the development, maintenance, management, and growth of DEG Mods.

{paymentRequest && ( )}
{isLoading && } ) }