Skip to content

Commit 15cd478

Browse files
committed
Move DomainSettingsViewModel to a separate file. Add comments.
1 parent e65dae1 commit 15cd478

File tree

3 files changed

+78
-72
lines changed

3 files changed

+78
-72
lines changed

WooCommerce/Classes/ViewRelated/Dashboard/Settings/Domains/DomainSettingsView.swift

Lines changed: 2 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import SwiftUI
22

33
/// Hosting controller that wraps the `DomainSettingsView` view.
44
final class DomainSettingsHostingController: UIHostingController<DomainSettingsView> {
5-
/// - Parameters:
6-
/// - viewModel: View model for the domain settings.
75
init(viewModel: DomainSettingsViewModel) {
86
super.init(rootView: DomainSettingsView(viewModel: viewModel))
97
}
@@ -19,73 +17,7 @@ final class DomainSettingsHostingController: UIHostingController<DomainSettingsV
1917
}
2018
}
2119

22-
final class DomainSettingsViewModel: ObservableObject {
23-
struct Domain {
24-
/// Whether the domain is the site's primary domain.
25-
let isPrimary: Bool
26-
27-
/// The address of the domain.
28-
let name: String
29-
30-
// The next renewal date.
31-
let autoRenewalDate: Date?
32-
}
33-
34-
struct FreeStagingDomain {
35-
/// Whether the domain is the site's primary domain.
36-
let isPrimary: Bool
37-
38-
/// The address of the domain.
39-
let name: String
40-
}
41-
42-
@Published private(set) var hasDomainCredit: Bool = false
43-
@Published private(set) var domains: [Domain] = []
44-
@Published private(set) var freeStagingDomain: FreeStagingDomain?
45-
46-
private let siteID: Int64
47-
private let stores: StoresManager
48-
49-
init(siteID: Int64, stores: StoresManager = ServiceLocator.stores) {
50-
self.siteID = siteID
51-
self.stores = stores
52-
}
53-
54-
func onAppear() {
55-
stores.dispatch(DomainAction.loadDomains(siteID: siteID) { [weak self] result in
56-
self?.handleDomainsResult(result)
57-
})
58-
59-
stores.dispatch(PaymentAction.loadSiteCurrentPlan(siteID: siteID) { [weak self] result in
60-
self?.handleSiteCurrentPlanResult(result)
61-
})
62-
}
63-
}
64-
65-
private extension DomainSettingsViewModel {
66-
func handleDomainsResult(_ result: Result<[SiteDomain], Error>) {
67-
switch result {
68-
case .success(let domains):
69-
let stagingDomain = domains.first(where: { $0.renewalDate == nil })
70-
freeStagingDomain = stagingDomain
71-
.map { FreeStagingDomain(isPrimary: $0.isPrimary, name: $0.name) }
72-
self.domains = domains.filter { $0 != stagingDomain }
73-
.map { Domain(isPrimary: $0.isPrimary, name: $0.name, autoRenewalDate: $0.renewalDate) }
74-
case .failure(let error):
75-
DDLogError("⛔️ Error retrieving domains for siteID \(siteID): \(error)")
76-
}
77-
}
78-
79-
func handleSiteCurrentPlanResult(_ result: Result<WPComSitePlan, Error>) {
80-
switch result {
81-
case .success(let sitePlan):
82-
hasDomainCredit = sitePlan.hasDomainCredit
83-
case .failure(let error):
84-
DDLogError("⛔️ Error retrieving site plan for siteID \(siteID): \(error)")
85-
}
86-
}
87-
}
88-
20+
/// Shows a site's domains with actions to add a domain or redeem a domain credit.
8921
struct DomainSettingsView: View {
9022
@ObservedObject private var viewModel: DomainSettingsViewModel
9123

@@ -158,7 +90,7 @@ private extension DomainSettingsView {
15890
import Yosemite
15991
import enum Networking.DotcomError
16092

161-
/// StoresManager that specifically handles `DomainAction` for `DomainSettingsView` previews.
93+
/// StoresManager that specifically handles actions for `DomainSettingsView` previews.
16294
final class DomainSettingsViewStores: DefaultStoresManager {
16395
private let domainsResult: Result<[SiteDomain], Error>
16496
private let sitePlanResult: Result<WPComSitePlan, Error>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import Foundation
2+
import Yosemite
3+
4+
/// View model for `DomainSettingsView`.
5+
final class DomainSettingsViewModel: ObservableObject {
6+
struct Domain {
7+
/// Whether the domain is the site's primary domain.
8+
let isPrimary: Bool
9+
10+
/// The address of the domain.
11+
let name: String
12+
13+
// The next renewal date.
14+
let autoRenewalDate: Date?
15+
}
16+
17+
struct FreeStagingDomain {
18+
/// Whether the domain is the site's primary domain.
19+
let isPrimary: Bool
20+
21+
/// The address of the domain.
22+
let name: String
23+
}
24+
25+
@Published private(set) var hasDomainCredit: Bool = false
26+
@Published private(set) var domains: [Domain] = []
27+
@Published private(set) var freeStagingDomain: FreeStagingDomain?
28+
29+
private let siteID: Int64
30+
private let stores: StoresManager
31+
32+
init(siteID: Int64, stores: StoresManager = ServiceLocator.stores) {
33+
self.siteID = siteID
34+
self.stores = stores
35+
}
36+
37+
func onAppear() {
38+
stores.dispatch(DomainAction.loadDomains(siteID: siteID) { [weak self] result in
39+
self?.handleDomainsResult(result)
40+
})
41+
42+
stores.dispatch(PaymentAction.loadSiteCurrentPlan(siteID: siteID) { [weak self] result in
43+
self?.handleSiteCurrentPlanResult(result)
44+
})
45+
}
46+
}
47+
48+
private extension DomainSettingsViewModel {
49+
func handleDomainsResult(_ result: Result<[SiteDomain], Error>) {
50+
switch result {
51+
case .success(let domains):
52+
let stagingDomain = domains.first(where: { $0.renewalDate == nil })
53+
freeStagingDomain = stagingDomain
54+
.map { FreeStagingDomain(isPrimary: $0.isPrimary, name: $0.name) }
55+
self.domains = domains.filter { $0 != stagingDomain }
56+
.map { Domain(isPrimary: $0.isPrimary, name: $0.name, autoRenewalDate: $0.renewalDate) }
57+
case .failure(let error):
58+
DDLogError("⛔️ Error retrieving domains for siteID \(siteID): \(error)")
59+
}
60+
}
61+
62+
func handleSiteCurrentPlanResult(_ result: Result<WPComSitePlan, Error>) {
63+
switch result {
64+
case .success(let sitePlan):
65+
hasDomainCredit = sitePlan.hasDomainCredit
66+
case .failure(let error):
67+
DDLogError("⛔️ Error retrieving site plan for siteID \(siteID): \(error)")
68+
}
69+
}
70+
}

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,9 +396,9 @@
396396
02C2756F24F5F5EE00286C04 /* ProductShippingSettingsViewModel+ProductVariationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C2756E24F5F5EE00286C04 /* ProductShippingSettingsViewModel+ProductVariationTests.swift */; };
397397
02C27BCE282CB52F0065471A /* CardPresentPaymentReceiptEmailCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C27BCD282CB52F0065471A /* CardPresentPaymentReceiptEmailCoordinator.swift */; };
398398
02C27BD0282CDF9E0065471A /* CardPresentPaymentReceiptEmailCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C27BCF282CDF9E0065471A /* CardPresentPaymentReceiptEmailCoordinatorTests.swift */; };
399+
02C37B79296694A900F0CF9E /* StoreCreationCategoryQuestionOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C37B78296694A900F0CF9E /* StoreCreationCategoryQuestionOptions.swift */; };
399400
02C37B7B2967096800F0CF9E /* DomainSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C37B7A2967096800F0CF9E /* DomainSettingsView.swift */; };
400401
02C37B7D2967B72A00F0CF9E /* FreeStagingDomainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C37B7C2967B72A00F0CF9E /* FreeStagingDomainView.swift */; };
401-
02C37B79296694A900F0CF9E /* StoreCreationCategoryQuestionOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C37B78296694A900F0CF9E /* StoreCreationCategoryQuestionOptions.swift */; };
402402
02C3FACE282A93020095440A /* WooAnalyticsEvent+Dashboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C3FACD282A93020095440A /* WooAnalyticsEvent+Dashboard.swift */; };
403403
02C3FDEA251091CE009569EE /* ProductFactoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C3FDE9251091CE009569EE /* ProductFactoryTests.swift */; };
404404
02C8876D24501FAC00E4470F /* FilterListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C8876B24501FAC00E4470F /* FilterListViewController.swift */; };
@@ -425,6 +425,7 @@
425425
02DD81FA242CAA400060E50B /* Media+WPMediaAsset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02DD81F6242CAA3F0060E50B /* Media+WPMediaAsset.swift */; };
426426
02DD81FB242CAA400060E50B /* WordPressMediaLibraryPickerDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02DD81F7242CAA3F0060E50B /* WordPressMediaLibraryPickerDataSource.swift */; };
427427
02DD81FC242CAA400060E50B /* WordPressMediaLibraryImagePickerViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02DD81F8242CAA400060E50B /* WordPressMediaLibraryImagePickerViewController.xib */; };
428+
02DE39D92968647100BB31D4 /* DomainSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02DE39D82968647100BB31D4 /* DomainSettingsViewModel.swift */; };
428429
02DE5CA9279F857D007CBEF3 /* Double+Rounding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02DE5CA8279F857D007CBEF3 /* Double+Rounding.swift */; };
429430
02DE5CAB279F8754007CBEF3 /* Double+RoundingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02DE5CAA279F8754007CBEF3 /* Double+RoundingTests.swift */; };
430431
02DEA23328810B7A0057FC40 /* LoginOnboardingScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02DEA23228810B7A0057FC40 /* LoginOnboardingScreen.swift */; };
@@ -2456,9 +2457,9 @@
24562457
02C2756E24F5F5EE00286C04 /* ProductShippingSettingsViewModel+ProductVariationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProductShippingSettingsViewModel+ProductVariationTests.swift"; sourceTree = "<group>"; };
24572458
02C27BCD282CB52F0065471A /* CardPresentPaymentReceiptEmailCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentPaymentReceiptEmailCoordinator.swift; sourceTree = "<group>"; };
24582459
02C27BCF282CDF9E0065471A /* CardPresentPaymentReceiptEmailCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentPaymentReceiptEmailCoordinatorTests.swift; sourceTree = "<group>"; };
2460+
02C37B78296694A900F0CF9E /* StoreCreationCategoryQuestionOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreCreationCategoryQuestionOptions.swift; sourceTree = "<group>"; };
24592461
02C37B7A2967096800F0CF9E /* DomainSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomainSettingsView.swift; sourceTree = "<group>"; };
24602462
02C37B7C2967B72A00F0CF9E /* FreeStagingDomainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FreeStagingDomainView.swift; sourceTree = "<group>"; };
2461-
02C37B78296694A900F0CF9E /* StoreCreationCategoryQuestionOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreCreationCategoryQuestionOptions.swift; sourceTree = "<group>"; };
24622463
02C3FACD282A93020095440A /* WooAnalyticsEvent+Dashboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WooAnalyticsEvent+Dashboard.swift"; sourceTree = "<group>"; };
24632464
02C3FDE9251091CE009569EE /* ProductFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductFactoryTests.swift; sourceTree = "<group>"; };
24642465
02C8876B24501FAC00E4470F /* FilterListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterListViewController.swift; sourceTree = "<group>"; };
@@ -2485,6 +2486,7 @@
24852486
02DD81F6242CAA3F0060E50B /* Media+WPMediaAsset.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Media+WPMediaAsset.swift"; sourceTree = "<group>"; };
24862487
02DD81F7242CAA3F0060E50B /* WordPressMediaLibraryPickerDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordPressMediaLibraryPickerDataSource.swift; sourceTree = "<group>"; };
24872488
02DD81F8242CAA400060E50B /* WordPressMediaLibraryImagePickerViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WordPressMediaLibraryImagePickerViewController.xib; sourceTree = "<group>"; };
2489+
02DE39D82968647100BB31D4 /* DomainSettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomainSettingsViewModel.swift; sourceTree = "<group>"; };
24882490
02DE5CA8279F857D007CBEF3 /* Double+Rounding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+Rounding.swift"; sourceTree = "<group>"; };
24892491
02DE5CAA279F8754007CBEF3 /* Double+RoundingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+RoundingTests.swift"; sourceTree = "<group>"; };
24902492
02DEA23228810B7A0057FC40 /* LoginOnboardingScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginOnboardingScreen.swift; sourceTree = "<group>"; };
@@ -4529,6 +4531,7 @@
45294531
02DAE7FB291B7B8B009342B7 /* DomainSelectorViewModel.swift */,
45304532
02C37B7A2967096800F0CF9E /* DomainSettingsView.swift */,
45314533
02C37B7C2967B72A00F0CF9E /* FreeStagingDomainView.swift */,
4534+
02DE39D82968647100BB31D4 /* DomainSettingsViewModel.swift */,
45324535
);
45334536
path = Domains;
45344537
sourceTree = "<group>";
@@ -10729,6 +10732,7 @@
1072910732
579CDEFF274D7E7900E8903D /* StoreStatsUsageTracksEventEmitter.swift in Sources */,
1073010733
74F9E9CE214C036400A3F2D2 /* NoPeriodDataTableViewCell.swift in Sources */,
1073110734
314DC4BD268D158F00444C9E /* CardReaderSettingsKnownReadersProvider.swift in Sources */,
10735+
02DE39D92968647100BB31D4 /* DomainSettingsViewModel.swift in Sources */,
1073210736
576EA39225264C7400AFC0B3 /* RefundConfirmationViewController.swift in Sources */,
1073310737
2688641B25D3202B00821BA5 /* EditAttributesViewController.swift in Sources */,
1073410738
B50911302049E27A007D25DC /* DashboardViewController.swift in Sources */,

0 commit comments

Comments
 (0)