diff --git a/App/App_macOS.swift b/App/App_macOS.swift index d695b261..727b8ad9 100644 --- a/App/App_macOS.swift +++ b/App/App_macOS.swift @@ -18,6 +18,7 @@ import UserNotifications import Combine import Defaults import CoreKiwix +import PassKit #if os(macOS) final class AppDelegate: NSObject, NSApplicationDelegate { @@ -109,6 +110,7 @@ struct RootView: View { private let tabCloses = NotificationCenter.default.publisher(for: NSWindow.willCloseNotification) /// Close other tabs then the ones received private let keepOnlyTabs = NotificationCenter.default.publisher(for: .keepOnlyTabs) + private let payment = Payment() var body: some View { NavigationSplitView { @@ -127,6 +129,21 @@ struct RootView: View { } } } + .safeAreaInset(edge: .bottom) { + if PKPaymentAuthorizationController.canMakePayments( + usingNetworks: Payment.supportedNetworks, + capabilities: Payment.capabilities + ) { + PayWithApplePayButton( + .donate, + request: payment.donationRequest(), + onPaymentAuthorizationChange: payment.onPaymentAuthPhase(phase:), + onMerchantSessionRequested: payment.onMerchantSessionUpdate + ) + .frame(width: 200, height: 30, alignment: .center) + .padding() + } + } .frame(minWidth: 150) } detail: { switch navigation.currentItem { diff --git a/Model/Payment.swift b/Model/Payment.swift new file mode 100644 index 00000000..d7d722ea --- /dev/null +++ b/Model/Payment.swift @@ -0,0 +1,67 @@ +// This file is part of Kiwix for iOS & macOS. +// +// Kiwix is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// any later version. +// +// Kiwix is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Kiwix; If not, see https://www.gnu.org/licenses/. + +import Foundation +import PassKit +import SwiftUI + +struct Payment { + + static let merchantId = "merchant.org.kiwix" + static let supportedNetworks: [PKPaymentNetwork] = [.masterCard, .visa, .discover, .amex, .chinaUnionPay, .electron, .girocard] + static let capabilities: PKMerchantCapability = [.threeDSecure, .credit, .debit, .emv] + + func donationRequest() -> PKPaymentRequest { + let request = PKPaymentRequest() + request.merchantIdentifier = Self.merchantId + request.merchantCapabilities = Self.capabilities + request.countryCode = "CH" + request.currencyCode = "USD" + request.supportedNetworks = Self.supportedNetworks + request.paymentSummaryItems = [ + PKPaymentSummaryItem(label: "Kiwix", amount: 15, type: .final) + ] + return request + } + + func onPaymentAuthPhase(phase: PayWithApplePayButtonPaymentAuthorizationPhase) { + debugPrint("onPaymentAuthPhase: \(phase)") + switch phase { + case .willAuthorize: + break + case .didAuthorize(let payment, let resultHandler): +// server.process(with: payment) { serverResult in +// guard case .success = serverResult else { +// // handle error +// resultHandler(PKPaymentAuthorizationResult(status: .failure, errors: Error())) +// return +// } +// // handle success +// let result = PKPaymentAuthorizationResult(status: .success, errors: nil) +// resultHandler(result) +// } + break + case .didFinish: + break + @unknown default: + break + } + } + + @available(macOS 13.0, *) + func onMerchantSessionUpdate() async -> PKPaymentRequestMerchantSessionUpdate { + .init(status: .success, merchantSession: nil) + } +}