diff --git a/src/generated/client/sdk.gen.ts b/src/generated/client/sdk.gen.ts index 29d120d..1e3cff0 100644 --- a/src/generated/client/sdk.gen.ts +++ b/src/generated/client/sdk.gen.ts @@ -1,7 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts import type { Options as ClientOptions, TDataShape, Client } from '@hey-api/client-fetch'; -import type { ListQuotesData, ListQuotesResponse, ListPendingQuotesData, ListPendingQuotesResponse, AdminLookupQuoteData, AdminLookupQuoteResponse, AdminUpdateQuoteData, AdminUpdateQuoteResponse, ResolveOfferData, EnquireQuoteData, EnquireQuoteResponse, LookupQuoteData, LookupQuoteResponse, ActivateKeysetData, ActivateKeysetResponse, DebitData, CreditData, ECashBalance, OnChainBalanceData, OnChainData, KeysetInfoData, KeySetInfo, RequestToMintData, RequestToMintResponseInfo, IdentityDetailData, IdentityDetailInfo} from './types.gen'; +import type { ListQuotesData, ListQuotesResponse, ListPendingQuotesData, ListPendingQuotesResponse, AdminLookupQuoteData, AdminLookupQuoteResponse, AdminUpdateQuoteData, AdminUpdateQuoteResponse, ResolveOfferData, EnquireQuoteData, EnquireQuoteResponse, LookupQuoteData, LookupQuoteResponse, ActivateKeysetData, ActivateKeysetResponse, DebitData, CreditData, ECashBalance, OnChainBalanceData, OnChainData, KeysetInfoData, KeySetInfo, RequestToMintData, RequestToMintResponseInfo, IdentityDetailData, IdentityDetailInfo, BillPaymentData, BillPaymentState} from './types.gen'; import { client as _heyApiClient } from './client.gen'; @@ -168,3 +168,18 @@ export const identityDetail = (options?: O } }); }; + +/** + * --------------------------- BillPaymentStatus +*/ + +export const paymentStatus = (options?: Options) => { + return (_heyApiClient).get({ + url: '/v1/admin/bill/payment_status/{bill_id}', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers + } + }); +}; diff --git a/src/generated/client/types.gen.ts b/src/generated/client/types.gen.ts index 0b45d20..0b898d6 100644 --- a/src/generated/client/types.gen.ts +++ b/src/generated/client/types.gen.ts @@ -498,67 +498,102 @@ export type KeysetInfoData = { }; /** - * Request Mint - */ +* Request Mint +*/ + +export type RequestToMintRequest = { + ebill_id: string; + amount: number; +}; - export type RequestToMintRequest = { - ebill_id: string; - amount: number; - }; +export type RequestToMintResponseInfo = { + request_id: string; + request: string; +}; - export type RequestToMintResponseInfo = { - request_id: string; - request: string; - }; +export type RequestToMintResponse = { + /** + * Successful response + */ + 200: RequestToMintResponseInfo; +}; - export type RequestToMintResponse = { - /** +export type RequestToMintData = { + body?: RequestToMintRequest; + path?: never; + query?: never; + url: '/v1/admin/treasury/debit/request_to_mint_from_ebill' +}; + +/** +* Node ID +*/ + +export type IdentityDetailRequest = { +}; + +export type IdentityDetailInfo = { + node_id: string; + name: string; + email: string | null; + bitcoin_public_key: string; + npub: string; + postal_address: PostalAddress | null; + date_of_birth: string | null; + country_of_birth: string | null; + city_of_birth: string | null; + identification_number: string | null; + profile_picture_file: string | null; + identity_document_file: string | null; + nostr_relays: Array; +}; + +export type IdentityDetailResponse = { + /** * Successful response */ - 200: RequestToMintResponseInfo; - }; - - export type RequestToMintData = { - body?: RequestToMintRequest; - path?: never; - query?: never; - url: '/v1/admin/treasury/debit/request_to_mint_from_ebill' - }; + 200: IdentityDetailInfo; +}; - /** - * Node ID - */ - export type IdentityDetailRequest = { - }; +export type IdentityDetailData = { + body?: never; + path?: never; + query?: never; + url: '/v1/admin/identity/detail' +}; - export type IdentityDetailInfo = { - node_id: string; - name: string; - email: string | null; - bitcoin_public_key: string; - npub: string; - postal_address: PostalAddress | null; - date_of_birth: string | null; - country_of_birth: string | null; - city_of_birth: string | null; - identification_number: string | null; - profile_picture_file: string | null; - identity_document_file: string | null; - nostr_relays: Array; - }; +/** +* Bill Payment Status +*/ + +export type BillWaitingForPaymentState = { + time_of_request: number, + currency: string, + sum: string, + link_to_pay: string, + address_to_pay: string, + mempool_link_for_address_to_pay: string, +} - export type IdentityDetailResponse = { - /** - * Successful response - */ - 200: IdentityDetailInfo; - }; +export type BillPaymentStatus = { + time_of_request_to_pay: number | null, + requested_to_pay: boolean, + paid: boolean, + request_to_pay_timed_out: boolean, + rejected_to_pay: boolean, +} +export type BillPaymentState = { + payment_status: BillPaymentStatus, + payment_details: BillWaitingForPaymentState | null, +} - export type IdentityDetailData = { - body?: never; - path?: never; - query?: never; - url: '/v1/admin/identity/detail' +export type BillPaymentData = { + body?: never; + path: { + bill_id: string; }; + query?: never; + url: '/v1/admin/bill/payment_status/{bill_id}'; +}; diff --git a/src/pages/quotes/QuotePage.tsx b/src/pages/quotes/QuotePage.tsx index dfe3f1a..76bac68 100644 --- a/src/pages/quotes/QuotePage.tsx +++ b/src/pages/quotes/QuotePage.tsx @@ -18,7 +18,7 @@ import { adminLookupQuoteQueryKey, adminUpdateQuoteMutation, } from "@/generated/client/@tanstack/react-query.gen" -import { activateKeyset, keysetInfo, requestToMint } from "@/generated/client/sdk.gen" +import { activateKeyset, keysetInfo, paymentStatus, requestToMint } from "@/generated/client/sdk.gen" import { cn, getInitials } from "@/lib/utils" import { formatDate, humanReadableDuration } from "@/utils/dates" @@ -222,19 +222,21 @@ function QuoteActions({ isFetching, newKeyset, ebillPaid, + requestedToPay, }: { value: InfoReply isFetching: boolean newKeyset: boolean ebillPaid: boolean + requestedToPay: boolean }) { const [offerFormData, setOfferFormData] = useState() const [offerFormDrawerOpen, setOfferFormDrawerOpen] = useState(false) const [offerConfirmDrawerOpen, setOfferConfirmDrawerOpen] = useState(false) const [denyConfirmDrawerOpen, setDenyConfirmDrawerOpen] = useState(false) const [activateKeysetConfirmDrawerOpen, setActivateKeysetConfirmDrawerOpen] = useState(false) - const [requestToMintConfirmDrawerOpen, setRequestToMintConfirmDrawerOpen] = useState(false) - const [mintRequestResponse, setMintRequestResponse] = useState(null) + const [requestToPayConfirmDrawerOpen, setRequestToPayConfirmDrawerOpen] = useState(false) + const [payRequestResponse, setPayRequestResponse] = useState(null) const effectiveDiscount = useMemo(() => { if (!offerFormData) return @@ -311,7 +313,7 @@ function QuoteActions({ }, }) - const requestToMintMutation = useMutation({ + const requestToPayMutation = useMutation({ mutationFn: async () => { const { data } = await requestToMint({ body: { @@ -323,7 +325,7 @@ function QuoteActions({ return data }, onMutate: () => { - toast.loading("Requesting to pay…", { id: `quote-${value.id}-request-to-mint` }) + toast.loading("Requesting to pay…", { id: `quote-${value.id}-request-to-pay` }) }, onSettled: () => { toast.dismiss(`quote-${value.id}-request-to-pay`) @@ -334,7 +336,10 @@ function QuoteActions({ }, onSuccess: (data) => { toast.success("Payment request has been created.") - setMintRequestResponse(data) + setPayRequestResponse(data) + void queryClient.invalidateQueries({ + queryKey: ["bill_id", value.bill.id], + }) }, }) @@ -371,8 +376,8 @@ function QuoteActions({ activateKeysetMutation.mutate() } - const onRequestToMint = () => { - requestToMintMutation.mutate() + const onRequestToPay = () => { + requestToPayMutation.mutate() } return ( <> @@ -476,20 +481,20 @@ function QuoteActions({ <> )} - {value.status === "Accepted" && "keyset_id" in value && !ebillPaid && !newKeyset ? ( + {value.status === "Accepted" && "keyset_id" in value && !ebillPaid && !newKeyset && !requestedToPay ? ( { - onRequestToMint() - setRequestToMintConfirmDrawerOpen(false) + onRequestToPay() + setRequestToPayConfirmDrawerOpen(false) }} - submitButtonText="Yes, request to mint" + submitButtonText="Yes, request to pay" trigger={ - } /> @@ -498,18 +503,18 @@ function QuoteActions({ )} - {mintRequestResponse && ( + {payRequestResponse && (

Payment Request

ID - {mintRequestResponse.request_id} + {payRequestResponse.request_id}
Details
- {mintRequestResponse.request} + {payRequestResponse.request}
@@ -676,6 +681,7 @@ function Quote({ value, isFetching }: { value: InfoReply; isFetching: boolean }) const shouldFetchKeyset = (value.status === "Offered" || value.status === "Accepted") && "keyset_id" in value const keysetId = "keyset_id" in value ? value.keyset_id : "" + const billId = "bill" in value && "id" in value.bill ? value.bill.id : "" const { data: keysetData } = useQuery({ queryKey: ["keyset", keysetId], @@ -686,6 +692,18 @@ function Quote({ value, isFetching }: { value: InfoReply; isFetching: boolean }) enabled: shouldFetchKeyset, }) + const { data: paymentData } = useQuery({ + queryKey: ["bill_id", billId], + queryFn: () => + paymentStatus({ + path: { bill_id: billId }, + }), + enabled: !!billId, + }) + + const requestedToPay = paymentData?.data?.payment_status.requested_to_pay ?? false + const paymentAddress = paymentData?.data?.payment_details?.address_to_pay ?? "" + const ebillPaid = keysetData?.data && "active" in keysetData.data && keysetData.data.active === false const newKeyset = "keyset_id" in value && (!keysetData?.data || !("active" in keysetData.data)) @@ -727,6 +745,16 @@ function Quote({ value, isFetching }: { value: InfoReply; isFetching: boolean }) ) : ( <> )} + {requestedToPay ? ( + + Payment Address: + + {paymentAddress} + + + ) : ( + <> + )} Status: @@ -796,7 +824,13 @@ function Quote({ value, isFetching }: { value: InfoReply; isFetching: boolean }) - +
) }