Skip to content

Instantly share code, notes, and snippets.

@koke
Created February 11, 2022 15:29
Show Gist options
  • Save koke/1a6cef8f1a0012719cd757875542a4df to your computer and use it in GitHub Desktop.
Save koke/1a6cef8f1a0012719cd757875542a4df to your computer and use it in GitHub Desktop.
diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Issue Refunds/IssueRefundViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Issue Refunds/IssueRefundViewModel.swift
index 8267b4902..a364969ad 100644
--- a/WooCommerce/Classes/ViewRelated/Orders/Order Details/Issue Refunds/IssueRefundViewModel.swift
+++ b/WooCommerce/Classes/ViewRelated/Orders/Order Details/Issue Refunds/IssueRefundViewModel.swift
@@ -1,3 +1,4 @@
+import Combine
import Foundation
import Yosemite
@@ -119,9 +120,27 @@ final class IssueRefundViewModel {
fetchCharge()
}
+ private var cancelables = Set<AnyCancellable>()
+
/// Creates the `ViewModel` to be used when navigating to the page where the user can
/// confirm and submit the refund.
func createRefundConfirmationViewModel() -> RefundConfirmationViewModel {
+ let siteID = state.order.siteID
+ EntityListener(storageManager: ServiceLocator.storageManager, readOnlyEntity: state.order)
+ .publisher
+ .flatMap { order -> AnyPublisher<WCPayCharge?, Never> in
+ guard let chargeID = order?.chargeID,
+ let charge = ServiceLocator.storageManager.viewStorage.loadWCPayCharge(siteID: siteID, chargeID: chargeID)?.toReadOnly() else {
+ return Just(nil).eraseToAnyPublisher()
+ }
+
+ return EntityListener(storageManager: ServiceLocator.storageManager, readOnlyEntity: charge).publisher.eraseToAnyPublisher()
+ }
+ .sink(receiveValue: { charge in
+ // Update UI with charge details
+ })
+ .store(in: &cancelables)
+
let details = RefundConfirmationViewModel.Details(order: state.order,
charge: charge,
amount: "\(calculateRefundTotal())",
diff --git a/Yosemite/Yosemite.xcodeproj/project.pbxproj b/Yosemite/Yosemite.xcodeproj/project.pbxproj
index 1821ca91f..06bc5b529 100644
--- a/Yosemite/Yosemite.xcodeproj/project.pbxproj
+++ b/Yosemite/Yosemite.xcodeproj/project.pbxproj
@@ -356,6 +356,7 @@
DEFD6D9326443A4000E51E0D /* SitePluginAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFD6D9226443A4000E51E0D /* SitePluginAction.swift */; };
DEFD6D9526443CA100E51E0D /* SitePluginStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFD6D9426443CA100E51E0D /* SitePluginStore.swift */; };
DEFD6D972644423100E51E0D /* SitePlugin+ReadOnlyConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEFD6D962644423100E51E0D /* SitePlugin+ReadOnlyConvertible.swift */; };
+ E10EA77F27B6B744006186D6 /* WCPayCharge+ReadOnly.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10EA77E27B6B744006186D6 /* WCPayCharge+ReadOnly.swift */; };
E138D4FA269EE5BD006EA5C6 /* CardPresentPaymentsOnboardingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = E138D4F9269EE5BD006EA5C6 /* CardPresentPaymentsOnboardingState.swift */; };
FE28F6EE268440B1004465C7 /* UserAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28F6ED268440B1004465C7 /* UserAction.swift */; };
FE28F6F026844231004465C7 /* UserStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28F6EF26844231004465C7 /* UserStore.swift */; };
@@ -752,6 +753,7 @@
DEFD6D9226443A4000E51E0D /* SitePluginAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SitePluginAction.swift; sourceTree = "<group>"; };
DEFD6D9426443CA100E51E0D /* SitePluginStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SitePluginStore.swift; sourceTree = "<group>"; };
DEFD6D962644423100E51E0D /* SitePlugin+ReadOnlyConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SitePlugin+ReadOnlyConvertible.swift"; sourceTree = "<group>"; };
+ E10EA77E27B6B744006186D6 /* WCPayCharge+ReadOnly.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WCPayCharge+ReadOnly.swift"; sourceTree = "<group>"; };
E138D4F9269EE5BD006EA5C6 /* CardPresentPaymentsOnboardingState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentPaymentsOnboardingState.swift; sourceTree = "<group>"; };
FE28F6ED268440B1004465C7 /* UserAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAction.swift; sourceTree = "<group>"; };
FE28F6EF26844231004465C7 /* UserStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserStore.swift; sourceTree = "<group>"; };
@@ -1223,6 +1225,7 @@
74B260202188B5F30041793A /* Note+ReadOnlyType.swift */,
B52E0031211A440D00700FDE /* Order+ReadOnlyType.swift */,
74858DB321C02B5A00754F3E /* OrderNote+ReadOnlyType.swift */,
+ E10EA77E27B6B744006186D6 /* WCPayCharge+ReadOnly.swift */,
CE3B7AD82229C3570050FE4B /* OrderStatus+ReadOnlyType.swift */,
74937501224968F8007D85D1 /* Product+ReadOnlyType.swift */,
D849A1442320E565006CB84F /* ProductReview+ReadOnlyType.swift */,
@@ -1998,6 +2001,7 @@
7493751222498B2C007D85D1 /* ProductTag+ReadOnlyConvertible.swift in Sources */,
03FBDA26263296A100ACE257 /* CouponStore.swift in Sources */,
7499936420EFBC1B00CF01CD /* OrderNoteAction.swift in Sources */,
+ E10EA77F27B6B744006186D6 /* WCPayCharge+ReadOnly.swift in Sources */,
7455D4692141B59E00FA8C1F /* TopEarnerStatsItem+ReadOnlyConvertible.swift in Sources */,
D8C11A5222DF2DA200D4A88D /* StatsActionV4.swift in Sources */,
CE179D55235F4E1700C24EB3 /* RefundAction.swift in Sources */,
diff --git a/Yosemite/Yosemite/Model/ReadOnly/WCPayCharge+ReadOnly.swift b/Yosemite/Yosemite/Model/ReadOnly/WCPayCharge+ReadOnly.swift
new file mode 100644
index 000000000..7a7f99252
--- /dev/null
+++ b/Yosemite/Yosemite/Model/ReadOnly/WCPayCharge+ReadOnly.swift
@@ -0,0 +1,18 @@
+import Foundation
+import Storage
+
+
+// MARK: - Yosemite.WCPayCharge: ReadOnlyType
+//
+extension Yosemite.WCPayCharge: ReadOnlyType {
+
+ /// Indicates if the receiver is a representation of a specified Storage.Entity instance.
+ ///
+ public func isReadOnlyRepresentation(of storageEntity: Any) -> Bool {
+ guard let storageCharge = storageEntity as? Storage.WCPayCharge else {
+ return false
+ }
+
+ return siteID == Int(storageOrder.siteID) && id == Int(storageCharge.chargeID)
+ }
+}
diff --git a/Yosemite/Yosemite/Tools/EntityListener.swift b/Yosemite/Yosemite/Tools/EntityListener.swift
index 6bdd7db15..76113e5dc 100644
--- a/Yosemite/Yosemite/Tools/EntityListener.swift
+++ b/Yosemite/Yosemite/Tools/EntityListener.swift
@@ -1,4 +1,5 @@
import Foundation
+import Combine
import CoreData
import Storage
@@ -28,6 +29,12 @@ public class EntityListener<T: ReadOnlyType> {
///
public var onDelete: (() -> Void)?
+ private let subject: CurrentValueSubject<T?, Never>
+
+ public var publisher: AnyPublisher<T?, Never> {
+ subject.eraseToAnyPublisher()
+ }
+
/// Designated Initializer.
///
@@ -38,6 +45,7 @@ public class EntityListener<T: ReadOnlyType> {
self.viewContext = viewContext
self.readOnlyEntity = readOnlyEntity
+ self.subject = CurrentValueSubject(readOnlyEntity)
self.notificationsToken = startObservingChangeNotifications(in: viewContext)
}
@@ -76,12 +84,14 @@ private extension EntityListener {
let updatedEntity = storageEntity.toTypeErasedReadOnly() as? T {
readOnlyEntity = updatedEntity
onUpsert?(readOnlyEntity)
+ subject.send(readOnlyEntity)
}
/// Scenario: Nuked
///
if let _ = readOnlyConvertible(from: note.deletedObjects, representing: readOnlyEntity) {
onDelete?()
+ subject.send(nil)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment