@@ -56,31 +56,6 @@ final class OrderDetailsViewController: UIViewController {
5656
5757 private let notices = OrderDetailsNotices ( )
5858
59- /// Orchestrates what needs to be presented in the modal views
60- /// that provide user-facing feedback about the card present payment process.
61- private lazy var paymentAlerts : OrderDetailsPaymentAlerts = {
62- OrderDetailsPaymentAlerts ( presentingController: self )
63- } ( )
64-
65- /// Subscription that listens for connected readers while we are trying to connect to one to capture payment
66- /// We need to cancel that subscription if the process is canceled by the user or when we connect to a reader.
67- ///
68- private var cardReaderAvailableSubscription : Combine . Cancellable ? = nil
69-
70- /// Connection Controller (helps connect readers)
71- ///
72- private lazy var connectionController : CardReaderConnectionController ? = {
73- guard let siteID = viewModel? . order. siteID else {
74- return nil
75- }
76-
77- return CardReaderConnectionController (
78- forSiteID: siteID,
79- knownReaderProvider: CardReaderSettingsKnownReaderStorage ( ) ,
80- alertsProvider: CardReaderSettingsAlerts ( )
81- )
82- } ( )
83-
8459 // MARK: - View Lifecycle
8560
8661 /// Create an instance of `Self` from its corresponding storyboard.
@@ -513,10 +488,10 @@ private extension OrderDetailsViewController {
513488 case . issueRefund:
514489 issueRefundWasPressed ( )
515490 case . collectPayment:
516- guard let indexPath = indexPath else {
491+ guard indexPath != nil else {
517492 break
518493 }
519- collectPayment ( at : indexPath )
494+ collectPayment ( )
520495 case . reprintShippingLabel( let shippingLabel) :
521496 guard let navigationController = navigationController else {
522497 assertionFailure ( " Cannot reprint a shipping label because `navigationController` is nil " )
@@ -710,139 +685,24 @@ private extension OrderDetailsViewController {
710685 present ( navigationController, animated: true , completion: nil )
711686 }
712687
713- @objc private func collectPayment( at: IndexPath ) {
714- cardReaderAvailableSubscription = viewModel. cardReaderAvailable ( )
715- . sink (
716- receiveCompletion: { [ weak self] result in
717- self ? . dismiss ( animated: false , completion: {
718- self ? . collectPaymentForCurrentOrder ( )
719- } )
720- self ? . cardReaderAvailableSubscription = nil
721- } ,
722- receiveValue: { [ weak self] _ in
723- self ? . connectToCardReader ( )
724- } )
725- }
726-
727- private func collectPaymentForCurrentOrder( ) {
728- let currencyFormatter = CurrencyFormatter ( currencySettings: ServiceLocator . currencySettings)
729- let currencyCode = ServiceLocator . currencySettings. currencyCode
730- let unit = ServiceLocator . currencySettings. symbol ( from: currencyCode)
731- let value = currencyFormatter. formatAmount ( viewModel. order. total, with: unit) ?? " "
732-
733- paymentAlerts. readerIsReady ( title: viewModel. collectPaymentFrom,
734- amount: value)
735-
736- ServiceLocator . analytics. track ( . collectPaymentTapped)
737- viewModel. collectPayment (
738- onWaitingForInput: { [ weak self] in
739- self ? . paymentAlerts. tapOrInsertCard ( onCancel: {
740- self ? . viewModel. cancelPayment ( onCompletion: { _ in
741- ServiceLocator . analytics. track ( . collectPaymentCanceled)
742- } )
743- } )
744- } ,
745- onProcessingMessage: { [ weak self] in
746- self ? . paymentAlerts. processingPayment ( )
747- } ,
748- onDisplayMessage: { [ weak self] message in // display a message from the reader, e.g. "Remove Card"
749- self ? . paymentAlerts. displayReaderMessage ( message: message)
750- } ,
751- onCompletion: { [ weak self] result in
752- guard let self = self else {
753- return
754- }
755-
756- switch result {
757- case . failure( let error) :
758- ServiceLocator . analytics. track ( . collectPaymentFailed, withError: error)
759- DDLogError ( " Failed to collect payment: \( error. localizedDescription) " )
760- self . paymentAlerts. error ( error: error, tryAgain: {
761- self . retryCollectPayment ( )
762- } )
763- case . success( let receiptParameters) :
764- ServiceLocator . analytics. track ( . collectPaymentSuccess)
765- self . syncOrderAfterPaymentCollection {
766- self . refreshCardPresentPaymentEligibility ( )
767- }
768-
769- self . paymentAlerts. success ( printReceipt: {
770- self . viewModel. printReceipt ( params: receiptParameters)
771- } , emailReceipt: {
772- self . viewModel. emailReceipt ( params: receiptParameters, onContent: { emailContent in
773- self . emailReceipt ( emailContent)
774- } )
775- } , noReceiptTitle: Localization . Payments. backToOrder,
776- noReceiptAction: { } )
688+ @objc private func collectPayment( ) {
689+ viewModel. collectPayment ( rootViewController: self , backButtonTitle: Localization . Payments. backToOrder) { [ weak self] result in
690+ guard let self = self else { return }
691+ // Refresh date & view once payment has been collected.
692+ if result. isSuccess {
693+ self . syncOrderAfterPaymentCollection {
694+ self . refreshCardPresentPaymentEligibility ( )
777695 }
778696 }
779- )
780- }
781-
782- private func retryCollectPayment( ) {
783- viewModel. cancelPayment { [ weak self] result in
784- switch result {
785- case . failure( let error) :
786- self ? . paymentAlerts. nonRetryableError ( from: self , error: error)
787- case . success:
788- self ? . collectPaymentForCurrentOrder ( )
789- }
790697 }
791698 }
792699
793- private func connectToCardReader( ) {
794- connectionController? . searchAndConnect ( from: self ) { _ in
795- /// No need for logic here. Once connected, the connected reader will publish
796- /// through the `cardReaderAvailableSubscription`
797- }
798- }
799-
800- private func cancelObservingCardReader( ) {
801- cardReaderAvailableSubscription? . cancel ( )
802- cardReaderAvailableSubscription = nil
803- }
804-
805700 private func itemAddOnsButtonTapped( addOns: [ OrderItemAttribute ] ) {
806701 let addOnsViewModel = OrderAddOnListI1ViewModel ( attributes: addOns)
807702 let addOnsController = OrderAddOnsListViewController ( viewModel: addOnsViewModel)
808703 let navigationController = WooNavigationController ( rootViewController: addOnsController)
809704 present ( navigationController, animated: true , completion: nil )
810705 }
811-
812- private func emailReceipt( _ content: String ) {
813- guard MFMailComposeViewController . canSendMail ( ) else {
814- DDLogError ( " ⛔️ Failed to submit email receipt for order: \( viewModel. order. orderID) . Email is not configured " )
815- return
816- }
817-
818- let mail = MFMailComposeViewController ( )
819- mail. mailComposeDelegate = self
820-
821- mail. setSubject ( viewModel. paymentReceiptEmailSubject)
822- mail. setMessageBody ( content, isHTML: true )
823-
824- if let customerEmail = viewModel. order. billingAddress? . email {
825- mail. setToRecipients ( [ customerEmail] )
826- }
827-
828- present ( mail, animated: true )
829- }
830- }
831-
832- extension OrderDetailsViewController : MFMailComposeViewControllerDelegate {
833- func mailComposeController( _ controller: MFMailComposeViewController , didFinishWith result: MFMailComposeResult , error: Error ? ) {
834- switch result {
835- case . cancelled:
836- ServiceLocator . analytics. track ( . receiptEmailCanceled)
837- case . sent, . saved:
838- ServiceLocator . analytics. track ( . receiptEmailSuccess)
839- case . failed:
840- ServiceLocator . analytics. track ( . receiptEmailFailed, withError: error ?? UnknownEmailError ( ) )
841- @unknown default :
842- assertionFailure ( " MFMailComposeViewController finished with an unknown result type " )
843- }
844- controller. dismiss ( animated: true )
845- }
846706}
847707
848708// MARK: - UITableViewDelegate Conformance
@@ -909,12 +769,6 @@ extension OrderDetailsViewController: UITableViewDelegate {
909769 }
910770}
911771
912- extension OrderDetailsViewController : UIAdaptivePresentationControllerDelegate {
913- func presentationControllerDidDismiss( _ presentationController: UIPresentationController ) {
914- cancelObservingCardReader ( )
915- }
916- }
917-
918772// MARK: - Trackings alert
919773// Track / delete tracking alert
920774private extension OrderDetailsViewController {
0 commit comments