@@ -227,6 +227,17 @@ struct AppScene: View {
227227 guard configuration == nil else { return }
228228 Task { await presentNextIncomingPaykitPaymentRequest ( ) }
229229 }
230+ . onChange ( of: paykitPaymentRequestManager. pendingRequests) { _, requests in
231+ guard let request = app. contactPaymentContext? . incomingPaymentRequest,
232+ request. isExpired ( at: Date ( ) ) ,
233+ !requests. contains ( where: { $0. id == request. id } ) ,
234+ sheets. activeSheetConfiguration? . id == . send
235+ else { return }
236+
237+ app. resetSendState ( )
238+ wallet. resetSendState ( speed: settings. defaultTransactionSpeed)
239+ sheets. hideSheetIfActive ( . send, reason: " Incoming payment request expired " )
240+ }
230241 . onChange ( of: navigation. currentRoute) { oldRoute, newRoute in
231242 guard shouldDiscardPendingImport ( currentRoute: oldRoute, destination: newRoute) else {
232243 return
@@ -740,37 +751,71 @@ struct AppScene: View {
740751 private func presentNextIncomingPaykitPaymentRequest( ) async {
741752 guard !isPresentingPaykitPaymentRequest,
742753 sheets. activeSheetConfiguration == nil ,
743- let request = paykitPaymentRequestManager . nextRequestForPresentation ( )
754+ app . contactPaymentContext == nil
744755 else { return }
745756
757+ let requests = paykitPaymentRequestManager. requestsForPresentation ( )
758+ guard !requests. isEmpty else { return }
759+
746760 isPresentingPaykitPaymentRequest = true
747761 defer { isPresentingPaykitPaymentRequest = false }
748762
749- do {
750- let result = try await PrivatePaykitService . shared. beginPaymentRequest ( request, wallet: wallet)
751- guard case let . opened( paymentTarget, privatePaymentContext) = result,
752- sheets. activeSheetConfiguration == nil
753- else { return }
754-
755- try await app. handleScannedData ( paymentTarget)
756- guard sheets. activeSheetConfiguration == nil ,
757- PaymentNavigationHelper . appropriateSendRoute ( app: app, currency: currency, settings: settings) != nil
758- else { return }
759-
760- app. contactPaymentContext = ContactPaymentContext (
761- publicKey: request. counterparty,
762- privatePaymentContext: privatePaymentContext,
763- incomingPaymentRequest: request
764- )
765- wallet. sendAmountSats = request. amountSats
766- paykitPaymentRequestManager. markPresented ( request)
763+ for request in requests {
764+ do {
765+ let result = try await PrivatePaykitService . shared. beginPaymentRequest ( request)
766+ guard sheets. activeSheetConfiguration == nil , app. contactPaymentContext == nil else { return }
767+ guard case let . opened( paymentTarget, privatePaymentContext) = result else { continue }
768+
769+ let contactPaymentContext = ContactPaymentContext (
770+ publicKey: request. counterparty,
771+ privatePaymentContext: privatePaymentContext,
772+ incomingPaymentRequest: request
773+ )
774+ guard app. claimContactPaymentContext ( contactPaymentContext) else { return }
775+
776+ do {
777+ try await app. handleScannedData (
778+ paymentTarget,
779+ claimedContactPaymentContext: contactPaymentContext
780+ )
781+ guard app. ownsContactPaymentContext ( contactPaymentContext) ,
782+ sheets. activeSheetConfiguration == nil
783+ else { return }
784+ guard PaymentNavigationHelper . appropriateSendRoute ( app: app, currency: currency, settings: settings) != nil else {
785+ app. resetSendState ( )
786+ wallet. resetSendState ( speed: settings. defaultTransactionSpeed)
787+ continue
788+ }
767789
768- let route : SendRoute = app. lnurlPayData == nil ? . confirm : . lnurlPayConfirm
769- sheets. showSheet ( . send, data: SendConfig ( view: route) )
770- } catch is CancellationError {
771- return
772- } catch {
773- Logger . warn ( " Failed to present incoming Paykit payment request: \( error) " , context: " AppScene " )
790+ guard paykitPaymentRequestManager. markPresentedIfPending ( request) else {
791+ app. resetSendState ( )
792+ wallet. resetSendState ( speed: settings. defaultTransactionSpeed)
793+ continue
794+ }
795+ } catch is CancellationError {
796+ if app. ownsContactPaymentContext ( contactPaymentContext) {
797+ app. resetSendState ( )
798+ wallet. resetSendState ( speed: settings. defaultTransactionSpeed)
799+ }
800+ return
801+ } catch {
802+ guard app. ownsContactPaymentContext ( contactPaymentContext) else { return }
803+ Logger . warn ( " Failed to present incoming Paykit payment request: \( error) " , context: " AppScene " )
804+ app. resetSendState ( )
805+ wallet. resetSendState ( speed: settings. defaultTransactionSpeed)
806+ continue
807+ }
808+
809+ wallet. sendAmountSats = request. amountSats
810+
811+ let route : SendRoute = app. lnurlPayData == nil ? . confirm : . lnurlPayConfirm
812+ sheets. showSheet ( . send, data: SendConfig ( view: route) )
813+ return
814+ } catch is CancellationError {
815+ return
816+ } catch {
817+ Logger . warn ( " Failed to present incoming Paykit payment request: \( error) " , context: " AppScene " )
818+ }
774819 }
775820 }
776821
0 commit comments