@@ -37,13 +37,14 @@ final class EditAddressFormViewModel: ObservableObject {
3737 self . originalAddress = address ?? . empty
3838 self . storageManager = storageManager
3939 self . stores = stores
40- updateFieldsWithOriginalAddress ( )
41- bindNavigationTrailingItemPublisher ( )
4240
4341 // Listen only to the first emitted event.
44- onLoadTrigger. first ( ) . sink {
42+ onLoadTrigger. first ( ) . sink { [ weak self] in
43+ guard let self = self else { return }
44+ self . bindNavigationTrailingItemPublisher ( )
4545 self . bindSyncTrigger ( )
4646 self . fetchStoredCountriesAndTriggerSyncIfNeeded ( )
47+ self . updateFieldsWithOriginalAddress ( )
4748 } . store ( in: & subscriptions)
4849 }
4950
@@ -55,6 +56,10 @@ final class EditAddressFormViewModel: ObservableObject {
5556 ///
5657 @Published var fields = FormFields ( )
5758
59+ /// Tracks the current selected country
60+ ///
61+ private let selectedCountry = CurrentValueSubject < Yosemite . Country ? , Never > ( nil )
62+
5863 /// Trigger to perform any one time setups.
5964 ///
6065 let onLoadTrigger : PassthroughSubject < Void , Never > = PassthroughSubject ( )
@@ -75,7 +80,7 @@ final class EditAddressFormViewModel: ObservableObject {
7580 /// Creates a view model to be used when selecting a country
7681 ///
7782 func createCountryViewModel( ) -> CountrySelectorViewModel {
78- CountrySelectorViewModel ( siteID : siteID , countries: countriesResultsController. fetchedObjects)
83+ CountrySelectorViewModel ( countries: countriesResultsController. fetchedObjects, selected : selectedCountry )
7984 }
8085
8186 /// Update the address remotely and invoke a completion block when finished
@@ -118,7 +123,7 @@ extension EditAddressFormViewModel {
118123 var country : String = " "
119124 var state : String = " "
120125
121- mutating func update( from address: Address ) {
126+ mutating func update( from address: Address , selectedCountry : Yosemite . Country ? ) {
122127 firstName = address. firstName
123128 lastName = address. lastName
124129 email = address. email ?? " "
@@ -129,11 +134,11 @@ extension EditAddressFormViewModel {
129134 address2 = address. address2 ?? " "
130135 city = address. city
131136 postcode = address. postcode
132- country = address. country
137+ country = selectedCountry ? . name ?? address. country
133138 state = address. state
134139 }
135140
136- func toAddress( ) -> Address {
141+ func toAddress( selectedCountry : Yosemite . Country ? ) -> Address {
137142 Address ( firstName: firstName,
138143 lastName: lastName,
139144 company: company. isEmpty ? nil : company,
@@ -142,7 +147,7 @@ extension EditAddressFormViewModel {
142147 city: city,
143148 state: state,
144149 postcode: postcode,
145- country: country,
150+ country: selectedCountry ? . code ?? country,
146151 phone: phone. isEmpty ? nil : phone,
147152 email: email. isEmpty ? nil : email)
148153 }
@@ -151,18 +156,25 @@ extension EditAddressFormViewModel {
151156
152157private extension EditAddressFormViewModel {
153158 func updateFieldsWithOriginalAddress( ) {
154- fields. update ( from: originalAddress)
159+ updateSelectedCountryFromOriginalAddress ( )
160+ fields. update ( from: originalAddress, selectedCountry: selectedCountry. value)
161+ }
162+
163+ /// Updates the `selectedCountry` subject by matching the address country code in our stored countries.
164+ ///
165+ func updateSelectedCountryFromOriginalAddress( ) {
166+ selectedCountry. value = countriesResultsController. fetchedObjects. first { $0. code == originalAddress. country }
155167 }
156168
157169 /// Calculates what navigation trailing item should be shown depending on our internal state.
158170 ///
159171 func bindNavigationTrailingItemPublisher( ) {
160172 Publishers . CombineLatest ( $fields, performingNetworkRequest)
161- . map { [ originalAddress] fields, performingNetworkRequest -> NavigationItem in
173+ . map { [ originalAddress, selectedCountry ] fields, performingNetworkRequest -> NavigationItem in
162174 guard !performingNetworkRequest else {
163175 return . loading
164176 }
165- return . done( enabled: originalAddress != fields. toAddress ( ) )
177+ return . done( enabled: originalAddress != fields. toAddress ( selectedCountry : selectedCountry . value ) )
166178 }
167179 . assign ( to: & $navigationTrailingItem)
168180 }
@@ -173,6 +185,11 @@ private extension EditAddressFormViewModel {
173185 // Initial fetch
174186 try ? countriesResultsController. performFetch ( )
175187
188+ // Updates the selected country when the data store changes.
189+ countriesResultsController. onDidChangeContent = { [ weak self] in
190+ self ? . updateSelectedCountryFromOriginalAddress ( )
191+ }
192+
176193 // Trigger a sync request if there are no countries.
177194 guard !countriesResultsController. isEmpty else {
178195 return syncCountriesTrigger. send ( )
0 commit comments