@@ -64,31 +64,31 @@ final class SelectTransferMethodTypePresenter {
64
64
private let linkTransferMethod = " select-transfer-method "
65
65
private var selectedTransferMethodType = " "
66
66
private var hyperwalletInsights : HyperwalletInsightsProtocol
67
-
67
+
68
68
private lazy var transferMethodConfigurationRepository = {
69
69
TransferMethodRepositoryFactory . shared. transferMethodConfigurationRepository ( )
70
70
} ( )
71
-
71
+
72
72
private lazy var userRepository : UserRepository = {
73
73
UserRepositoryFactory . shared. userRepository ( )
74
74
} ( )
75
-
75
+
76
76
private( set) var sectionData = [ HyperwalletTransferMethodType] ( )
77
-
77
+
78
78
/// Initialize SelectTransferMethodPresenter
79
79
init ( _ view: SelectTransferMethodTypeView ,
80
80
_ hyperwalletInsights: HyperwalletInsightsProtocol = HyperwalletInsights . shared) {
81
81
self . view = view
82
82
self . hyperwalletInsights = hyperwalletInsights
83
83
}
84
-
84
+
85
85
/// Return the countryCurrency item composed by the tuple (title and value)
86
86
func getCountryCurrencyConfiguration( indexPath: IndexPath ) -> CountryCurrencyCellConfiguration {
87
87
let title = countryCurrencySectionData [ indexPath. row]
88
88
return CountryCurrencyCellConfiguration ( title: title. localized ( ) ,
89
89
value: countryCurrencyValues ( at: indexPath. row) )
90
90
}
91
-
91
+
92
92
/// Display all the select Country or Currency based on the index
93
93
func performShowSelectCountryOrCurrencyView( index: Int ) {
94
94
transferMethodConfigurationRepository. getKeys ( completion: self . getKeysHandler (
@@ -100,18 +100,18 @@ final class SelectTransferMethodTypePresenter {
100
100
}
101
101
} ) )
102
102
}
103
-
103
+
104
104
/// Loads the transferMethodKeys from core SDK and display the default transfer methods
105
105
///
106
106
/// - Parameter forceUpdate: Forces to refresh the data
107
107
func loadTransferMethodKeys( _ forceUpdate: Bool = false ) {
108
108
view? . showLoading ( )
109
-
109
+
110
110
if forceUpdate {
111
111
userRepository. refreshUser ( )
112
112
transferMethodConfigurationRepository. refreshKeys ( )
113
113
}
114
-
114
+
115
115
userRepository. getUser { [ weak self] getUserResult in
116
116
guard let strongSelf = self , let view = strongSelf. view else {
117
117
return
@@ -124,7 +124,7 @@ final class SelectTransferMethodTypePresenter {
124
124
pageGroup: strongSelf. pageGroup) {
125
125
strongSelf. loadTransferMethodKeys ( )
126
126
}
127
-
127
+
128
128
case . success( let user) :
129
129
strongSelf. transferMethodConfigurationRepository
130
130
. getKeys ( completion: strongSelf. getKeysHandler (
@@ -148,11 +148,11 @@ final class SelectTransferMethodTypePresenter {
148
148
view. hideLoading ( )
149
149
strongSelf. loadTransferMethodKeys ( )
150
150
} )
151
- )
151
+ )
152
152
}
153
153
}
154
154
}
155
-
155
+
156
156
/// Navigate to AddTransferMethodController
157
157
func navigateToAddTransferMethod( _ index: Int ) {
158
158
if let transferMethodTypeCode = self . sectionData [ index] . code {
@@ -163,45 +163,45 @@ final class SelectTransferMethodTypePresenter {
163
163
guard let strongSelf = self else {
164
164
return
165
165
}
166
-
166
+
167
167
if case let . success( user) = getUserResult,
168
- let profileType = user? . profileType? . rawValue {
168
+ let profileType = user? . profileType? . rawValue {
169
169
strongSelf. view?
170
170
. navigateToAddTransferMethodController (
171
171
country: strongSelf. selectedCountry,
172
172
currency: strongSelf. selectedCurrency,
173
173
profileType: profileType,
174
174
transferMethodTypeCode: strongSelf. selectedTransferMethodType
175
- )
175
+ )
176
176
}
177
177
}
178
178
}
179
-
179
+
180
180
private func countryCurrencyValues( at index: Int ) -> String {
181
181
return ( index == 0
182
- ? Locale . current. localizedString ( forRegionCode: selectedCountry) ?? selectedCountry
183
- : selectedCurrency)
182
+ ? Locale . current. localizedString ( forRegionCode: selectedCountry) ?? selectedCountry
183
+ : selectedCurrency)
184
184
}
185
-
185
+
186
186
private func getKeysHandler(
187
187
success: @escaping ( ( HyperwalletTransferMethodConfigurationKey ? ) -> Void ) ,
188
188
failure: ( ( ) -> Void ) ? = nil )
189
- -> ( Result < HyperwalletTransferMethodConfigurationKey ? , HyperwalletErrorType > ) -> Void {
189
+ -> ( Result < HyperwalletTransferMethodConfigurationKey ? , HyperwalletErrorType > ) -> Void {
190
190
return { [ weak self] ( result) in
191
191
guard let strongSelf = self , let view = strongSelf. view else {
192
192
return
193
193
}
194
-
194
+
195
195
switch result {
196
196
case . failure( let error) :
197
197
view. showError ( error, pageName: strongSelf. pageName, pageGroup: strongSelf. pageGroup, failure)
198
-
198
+
199
199
case . success( let keyResult) :
200
200
success ( keyResult)
201
201
}
202
202
}
203
203
}
204
-
204
+
205
205
/// Shows the Select Country View
206
206
private func showSelectCountryView( _ countries: [ GenericCellConfiguration ] ? ) {
207
207
if let countries = countries {
@@ -212,7 +212,7 @@ final class SelectTransferMethodTypePresenter {
212
212
filterContentHandler: filterContentHandler ( ) )
213
213
}
214
214
}
215
-
215
+
216
216
/// Shows the Select Currency View
217
217
private func showSelectCurrencyView( _ currencies: [ GenericCellConfiguration ] ? ) {
218
218
if let currencies = currencies {
@@ -223,7 +223,7 @@ final class SelectTransferMethodTypePresenter {
223
223
filterContentHandler: filterContentHandler ( ) )
224
224
}
225
225
}
226
-
226
+
227
227
private func selectCountryHandler( ) -> SelectTransferMethodTypeView . SelectItemHandler {
228
228
return { ( country) in
229
229
if let country = country. value {
@@ -240,7 +240,7 @@ final class SelectTransferMethodTypePresenter {
240
240
} ) )
241
241
}
242
242
}
243
-
243
+
244
244
private func selectCurrencyHandler( ) -> SelectTransferMethodTypeView . SelectItemHandler {
245
245
return { [ weak self] ( currency) in
246
246
guard let strongSelf = self
@@ -259,47 +259,47 @@ final class SelectTransferMethodTypePresenter {
259
259
260
260
private func retrieveTransferMethodTypesFeesAndProcessingTimes(
261
261
completion: @escaping ( [ HyperwalletTransferMethodType ] ? ) -> Void ) {
262
- transferMethodConfigurationRepository
263
- . getTransferMethodTypesFeesAndProcessingTimes ( country: selectedCountry,
264
- currency: selectedCurrency) { [ weak self] ( result) in
265
- guard let strongSelf = self , let view = strongSelf. view else {
266
- return
267
- }
268
- view. hideLoading ( )
269
- switch result {
270
- case . failure( let error) :
271
- view. showError ( error, pageName: strongSelf. pageName, pageGroup: strongSelf. pageGroup) {
272
- strongSelf. loadTransferMethodKeys ( )
262
+ transferMethodConfigurationRepository
263
+ . getTransferMethodTypesFeesAndProcessingTimes ( country: selectedCountry,
264
+ currency: selectedCurrency) { [ weak self] ( result) in
265
+ guard let strongSelf = self , let view = strongSelf. view else {
266
+ return
267
+ }
268
+ view. hideLoading ( )
269
+ switch result {
270
+ case . failure( let error) :
271
+ view. showError ( error, pageName: strongSelf. pageName, pageGroup: strongSelf. pageGroup) {
272
+ strongSelf. loadTransferMethodKeys ( )
273
+ }
274
+
275
+ case . success( let keyResult) :
276
+ completion ( keyResult? . transferMethodTypes ( countryCode: strongSelf. selectedCountry,
277
+ currencyCode: strongSelf. selectedCurrency) )
273
278
}
274
-
275
- case . success( let keyResult) :
276
- completion ( keyResult? . transferMethodTypes ( countryCode: strongSelf. selectedCountry,
277
- currencyCode: strongSelf. selectedCurrency) )
278
279
}
279
- }
280
- }
281
-
280
+ }
281
+
282
282
private func filterContentHandler( ) -> SelectTransferMethodTypeView . FilterContentHandler {
283
283
return { ( items, searchText) in
284
284
items. filter {
285
285
$0. title? . lowercased ( ) . contains ( searchText. lowercased ( ) ) ?? false ||
286
- $0. value? . lowercased ( ) . contains ( searchText. lowercased ( ) ) ?? false
286
+ $0. value? . lowercased ( ) . contains ( searchText. lowercased ( ) ) ?? false
287
287
}
288
288
}
289
289
}
290
-
290
+
291
291
private func countryMarkCellHandler( ) -> SelectTransferMethodTypeView . MarkCellHandler {
292
292
return { [ weak self] item in
293
293
self ? . selectedCountry == item. value
294
294
}
295
295
}
296
-
296
+
297
297
private func currencyMarkCellHandler( ) -> SelectTransferMethodTypeView . MarkCellHandler {
298
298
return { [ weak self] item in
299
299
self ? . selectedCurrency == item. value
300
300
}
301
301
}
302
-
302
+
303
303
private func loadSelectedCountry( _ countries: [ HyperwalletCountry ] ,
304
304
with userCountry: String ? ) {
305
305
if let userCountry = userCountry, countries. contains ( where: { $0. value == userCountry } ) {
@@ -308,17 +308,36 @@ final class SelectTransferMethodTypePresenter {
308
308
selectedCountry = countryValue
309
309
}
310
310
}
311
-
311
+
312
312
private func loadCurrency( _ keys: HyperwalletTransferMethodConfigurationKey ? ) {
313
- guard let firstCurrency = keys? . currencies ( from: selectedCountry) ? . first,
314
- let currencyCode = firstCurrency. code else {
315
- view? . showAlert ( message: String ( format: " no_currency_available_error_message " . localized ( ) , selectedCountry) )
313
+ guard let countries = keys? . countries ( ) ,
314
+ let country = countries. first ( where: { $0. code == selectedCountry } ) ,
315
+ let currencyCode = getCurrencyCode ( country, keys) else {
316
+ // Handle the case when country is not found
317
+ view? . showAlert ( message:
318
+ String ( format: " no_currency_available_error_message " . localized ( ) , selectedCountry) )
316
319
return
317
320
}
321
+
322
+ // Define selected currency
318
323
selectedCurrency = currencyCode
324
+
325
+ // Reload the view with the updated currency data
319
326
view? . reloadCountryCurrencyData ( )
320
327
}
328
+
329
+ private func getCurrencyCode( _ country: HyperwalletCountry ,
330
+ _ keys: HyperwalletTransferMethodConfigurationKey ? ) -> String ? {
331
+ if let defaultCurrencyCode = country. defaultCurrencyCode,
332
+ let defaultCurrency = keys? . currencies ( from: selectedCountry) ?
333
+ . first ( where: { $0. code == defaultCurrencyCode } ) {
334
+ // retun the country's default currency, if it present on the currency list
335
+ return defaultCurrency. code
336
+ }
321
337
338
+ return keys? . currencies ( from: selectedCountry) ? . first? . code
339
+ }
340
+
322
341
private func loadTransferMethodTypesFeesAndProcessingTimes(
323
342
_ transferMethodTypes: [ HyperwalletTransferMethodType ] ? ) {
324
343
guard let transferMethodTypes = transferMethodTypes,
0 commit comments