@@ -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
8170private 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