import { useQuery, useMutation } from '@apollo/client' import { CenterLayout } from '@/components/layout' import { CopyInput, Input, InputSkeleton } from '@/components/form' import InputGroup from 'react-bootstrap/InputGroup' import InvoiceStatus from '@/components/invoice-status' import { useRouter } from 'next/router' import { WITHDRAWL } from '@/fragments/wallet' import Link from 'next/link' import { SSR, INVOICE_RETENTION_DAYS } from '@/lib/constants' import { numWithUnits } from '@/lib/format' import Bolt11Info from '@/components/bolt11-info' import { datePivot, timeLeft } from '@/lib/time' import { useMe } from '@/components/me' import { useToast } from '@/components/toast' import { gql } from 'graphql-tag' import { useShowModal } from '@/components/modal' import { DeleteConfirm } from '@/components/delete' import { getGetServerSideProps } from '@/api/ssrApollo' // force SSR to include CSP nonces export const getServerSideProps = getGetServerSideProps({ query: null }) export default function Withdrawl () { return ( ) } export function WithdrawlSkeleton ({ status }) { return ( <>
) } function LoadWithdrawl () { const router = useRouter() const { loading, error, data } = useQuery(WITHDRAWL, SSR ? {} : { variables: { id: router.query.id }, pollInterval: 1000, nextFetchPolicy: 'cache-and-network' }) if (error) return
error
if (!data || loading) { return } const TryMaxFee = () => try increasing max fee let status = 'pending' let variant = 'default' switch (data.withdrawl.status) { case 'CONFIRMED': status = `sent ${numWithUnits(data.withdrawl.satsPaid, { abbreviate: false })} with ${numWithUnits(data.withdrawl.satsFeePaid, { abbreviate: false })} in routing fees` variant = 'confirmed' break case 'INSUFFICIENT_BALANCE': status = <>insufficient balance contact keyan! variant = 'failed' break case 'INVALID_PAYMENT': status = 'invalid invoice' variant = 'failed' break case 'PATHFINDING_TIMEOUT': status = <>timed out finding route variant = 'failed' break case 'ROUTE_NOT_FOUND': status = <>no route variant = 'failed' break case 'UNKNOWN_FAILURE': status = <>unknown error variant = 'failed' break default: break } return ( <>
sats} />
) } function PrivacyOption ({ wd }) { if (!wd.bolt11) return const me = useMe() const keepUntil = datePivot(new Date(wd.createdAt), { days: INVOICE_RETENTION_DAYS }) const oldEnough = new Date() >= keepUntil if (!oldEnough) { return ( {`this invoice ${me.privates?.autoDropBolt11s ? 'will be auto-deleted' : 'can be deleted'} in ${timeLeft(keepUntil)}`} ) } const showModal = useShowModal() const toaster = useToast() const [dropBolt11] = useMutation( gql` mutation dropBolt11($id: ID!) { dropBolt11(id: $id) { id } }`, { update (cache) { cache.modify({ id: `Withdrawl:${wd.id}`, fields: { bolt11: () => null, hash: () => null } }) } }) return ( { showModal(onClose => { return ( { if (me) { try { await dropBolt11({ variables: { id: wd.id } }) } catch (err) { toaster.danger('unable to delete invoice: ' + err.message || err.toString?.()) throw err } finally { onClose() } } }} /> ) }) }} >delete invoice ) }