Created
February 11, 2022 15:29
-
-
Save koke/1a6cef8f1a0012719cd757875542a4df to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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