Skip to content

Commit d5367ff

Browse files
Ecarrionealeksandrov
authored andcommitted
Encapsulate fields into a mutable object so observation is easier
1 parent 4a3f073 commit d5367ff

File tree

2 files changed

+73
-71
lines changed

2 files changed

+73
-71
lines changed

WooCommerce/Classes/ViewRelated/Orders/Order Details/Address Edit/EditAddressForm.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,28 +42,28 @@ struct EditAddressForm: View {
4242
VStack(spacing: 0) {
4343
TitleAndTextFieldRow(title: Localization.firstNameField,
4444
placeholder: "",
45-
text: $viewModel.firstName,
45+
text: $viewModel.fields.firstName,
4646
symbol: nil,
4747
keyboardType: .default)
4848
Divider()
4949
.padding(.leading, Constants.dividerPadding)
5050
TitleAndTextFieldRow(title: Localization.lastNameField,
5151
placeholder: "",
52-
text: $viewModel.lastName,
52+
text: $viewModel.fields.lastName,
5353
symbol: nil,
5454
keyboardType: .default)
5555
Divider()
5656
.padding(.leading, Constants.dividerPadding)
5757
TitleAndTextFieldRow(title: Localization.emailField,
5858
placeholder: "",
59-
text: $viewModel.email,
59+
text: $viewModel.fields.email,
6060
symbol: nil,
6161
keyboardType: .emailAddress)
6262
Divider()
6363
.padding(.leading, Constants.dividerPadding)
6464
TitleAndTextFieldRow(title: Localization.phoneField,
6565
placeholder: "",
66-
text: $viewModel.phone,
66+
text: $viewModel.fields.phone,
6767
symbol: nil,
6868
keyboardType: .phonePad)
6969
}
@@ -76,35 +76,35 @@ struct EditAddressForm: View {
7676
Group {
7777
TitleAndTextFieldRow(title: Localization.companyField,
7878
placeholder: Localization.placeholderOptional,
79-
text: $viewModel.company,
79+
text: $viewModel.fields.company,
8080
symbol: nil,
8181
keyboardType: .default)
8282
Divider()
8383
.padding(.leading, Constants.dividerPadding)
8484
TitleAndTextFieldRow(title: Localization.address1Field,
8585
placeholder: "",
86-
text: $viewModel.address1,
86+
text: $viewModel.fields.address1,
8787
symbol: nil,
8888
keyboardType: .default)
8989
Divider()
9090
.padding(.leading, Constants.dividerPadding)
9191
TitleAndTextFieldRow(title: Localization.address2Field,
9292
placeholder: "Optional",
93-
text: $viewModel.address2,
93+
text: $viewModel.fields.address2,
9494
symbol: nil,
9595
keyboardType: .default)
9696
Divider()
9797
.padding(.leading, Constants.dividerPadding)
9898
TitleAndTextFieldRow(title: Localization.cityField,
9999
placeholder: "",
100-
text: $viewModel.city,
100+
text: $viewModel.fields.city,
101101
symbol: nil,
102102
keyboardType: .default)
103103
Divider()
104104
.padding(.leading, Constants.dividerPadding)
105105
TitleAndTextFieldRow(title: Localization.postcodeField,
106106
placeholder: "",
107-
text: $viewModel.postcode,
107+
text: $viewModel.fields.postcode,
108108
symbol: nil,
109109
keyboardType: .default)
110110
Divider()

WooCommerce/Classes/ViewRelated/Orders/Order Details/Address Edit/EditAddressFormViewModel.swift

Lines changed: 64 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -10,38 +10,23 @@ final class EditAddressFormViewModel: ObservableObject {
1010
init(siteID: Int64, address: Address?) {
1111
self.siteID = siteID
1212
self.originalAddress = address ?? .empty
13-
self.updatedAddress = address ?? .empty
1413
updateFieldsWithOriginalAddress()
15-
bindAllFieldsToUpdatedAddressPublisher()
1614
bindNavigationTrailingItemPublisher()
1715
}
1816

1917
/// Original `Address` model.
2018
///
2119
private let originalAddress: Address
2220

23-
/// Updated `Address` model.
24-
///
25-
@Published var updatedAddress: Address
26-
2721
/// Tracks if a network request is being performed.
2822
///
2923
private let performingNetworkRequest: CurrentValueSubject<Bool, Never> = .init(false)
3024

31-
// MARK: User Fields
32-
33-
@Published var firstName: String = ""
34-
@Published var lastName: String = ""
35-
@Published var email: String = ""
36-
@Published var phone: String = ""
25+
// MARK: Form Fields
3726

38-
// MARK: Address Fields
39-
40-
@Published var company: String = ""
41-
@Published var address1: String = ""
42-
@Published var address2: String = ""
43-
@Published var city: String = ""
44-
@Published var postcode: String = ""
27+
/// Address form fields
28+
///
29+
@Published var fields = FormFields()
4530

4631
// MARK: Navigation and utility
4732

@@ -61,6 +46,10 @@ final class EditAddressFormViewModel: ObservableObject {
6146
func updateRemoteAddress(onFinish: @escaping (Bool) -> Void) {
6247
// TODO: perform network request
6348
// TODO: add success/failure notice
49+
50+
// To corroborate that the fields are getting updated
51+
print("Address to update: \(fields)")
52+
6453
performingNetworkRequest.send(true)
6554
DispatchQueue.main.asyncAfter(deadline: .now() + 3) { [weak self] in
6655
self?.performingNetworkRequest.send(false)
@@ -80,58 +69,71 @@ extension EditAddressFormViewModel {
8069

8170
private extension EditAddressFormViewModel {
8271
func updateFieldsWithOriginalAddress() {
83-
firstName = originalAddress.firstName
84-
lastName = originalAddress.lastName
85-
email = originalAddress.email ?? ""
86-
phone = originalAddress.phone ?? ""
87-
88-
company = originalAddress.company ?? ""
89-
address1 = originalAddress.address1
90-
address2 = originalAddress.address2 ?? ""
91-
city = originalAddress.city
92-
postcode = originalAddress.postcode
93-
94-
// TODO: Add country and state init
95-
}
96-
97-
/// Updates `updatedAddress` after any field change.
98-
///
99-
func bindAllFieldsToUpdatedAddressPublisher() {
100-
Publishers.CombineLatest3(Publishers.CombineLatest4($firstName,
101-
$lastName,
102-
$email,
103-
$phone),
104-
Publishers.CombineLatest3($company,
105-
$address1,
106-
$address2),
107-
Publishers.CombineLatest($city,
108-
$postcode))
109-
.map { [originalAddress] firstSection, secondSection, thirdSection -> Address in
110-
Address(firstName: firstSection.0,
111-
lastName: firstSection.1,
112-
company: secondSection.0,
113-
address1: secondSection.1,
114-
address2: secondSection.2,
115-
city: thirdSection.0,
116-
state: originalAddress.state, // TODO: bind to local value
117-
postcode: thirdSection.1,
118-
country: originalAddress.country, // TODO: bind to local value
119-
phone: firstSection.3,
120-
email: firstSection.2)
121-
}
122-
.assign(to: &$updatedAddress)
72+
fields.update(from: originalAddress)
12373
}
12474

12575
/// Calculates what navigation trailing item should be shown depending on our internal state.
12676
///
12777
func bindNavigationTrailingItemPublisher() {
128-
Publishers.CombineLatest($updatedAddress, performingNetworkRequest)
129-
.map { [originalAddress] updatedAddress, performingNetworkRequest -> NavigationItem in
78+
Publishers.CombineLatest($fields, performingNetworkRequest)
79+
.map { [originalAddress] fields, performingNetworkRequest -> NavigationItem in
13080
guard !performingNetworkRequest else {
13181
return .loading
13282
}
133-
return .done(enabled: originalAddress != updatedAddress)
83+
return .done(enabled: originalAddress != fields.toAddress())
13484
}
13585
.assign(to: &$navigationTrailingItem)
13686
}
13787
}
88+
89+
90+
extension EditAddressFormViewModel {
91+
/// Type to hold values from all the form fields
92+
///
93+
struct FormFields {
94+
// MARK: User Fields
95+
var firstName: String = ""
96+
var lastName: String = ""
97+
var email: String = ""
98+
var phone: String = ""
99+
100+
// MARK: Address Fields
101+
102+
var company: String = ""
103+
var address1: String = ""
104+
var address2: String = ""
105+
var city: String = ""
106+
var postcode: String = ""
107+
var country: String = ""
108+
var state: String = ""
109+
110+
mutating func update(from address: Address) {
111+
firstName = address.firstName
112+
lastName = address.lastName
113+
email = address.email ?? ""
114+
phone = address.phone ?? ""
115+
116+
company = address.company ?? ""
117+
address1 = address.address1
118+
address2 = address.address2 ?? ""
119+
city = address.city
120+
postcode = address.postcode
121+
country = address.country
122+
state = address.state
123+
}
124+
125+
func toAddress() -> Address {
126+
Address(firstName: firstName,
127+
lastName: lastName,
128+
company: company,
129+
address1: address1,
130+
address2: address2,
131+
city: city,
132+
state: state,
133+
postcode: postcode,
134+
country: country,
135+
phone: phone,
136+
email: email)
137+
}
138+
}
139+
}

0 commit comments

Comments
 (0)