@@ -10,10 +10,10 @@ import com.woocommerce.android.extensions.formatToMMMdd
10
10
import com.woocommerce.android.ui.blaze.BlazeRepository
11
11
import com.woocommerce.android.ui.blaze.BlazeRepository.Budget
12
12
import com.woocommerce.android.ui.blaze.BlazeRepository.CampaignPreview
13
- import com.woocommerce.android.ui.blaze.BlazeRepository. Device
14
- import com.woocommerce.android.ui.blaze.BlazeRepository. Interest
15
- import com.woocommerce.android.ui.blaze.BlazeRepository. Language
16
- import com.woocommerce.android.ui.blaze.BlazeRepository. Location
13
+ import com.woocommerce.android.ui.blaze.Device
14
+ import com.woocommerce.android.ui.blaze.Interest
15
+ import com.woocommerce.android.ui.blaze.Language
16
+ import com.woocommerce.android.ui.blaze.Location
17
17
import com.woocommerce.android.ui.blaze.creation.preview.BlazeCampaignCreationPreviewViewModel.AdDetailsUi.AdDetails
18
18
import com.woocommerce.android.ui.blaze.creation.preview.BlazeCampaignCreationPreviewViewModel.AdDetailsUi.Loading
19
19
import com.woocommerce.android.ui.blaze.creation.targets.BlazeTargetType
@@ -27,6 +27,7 @@ import com.woocommerce.android.viewmodel.ScopedViewModel
27
27
import com.woocommerce.android.viewmodel.getStateFlow
28
28
import com.woocommerce.android.viewmodel.navArgs
29
29
import dagger.hilt.android.lifecycle.HiltViewModel
30
+ import kotlinx.coroutines.flow.combine
30
31
import kotlinx.coroutines.flow.update
31
32
import kotlinx.coroutines.launch
32
33
import kotlinx.parcelize.Parcelize
@@ -49,40 +50,57 @@ class BlazeCampaignCreationPreviewViewModel @Inject constructor(
49
50
private val languages = blazeRepository.observeLanguages()
50
51
private val devices = blazeRepository.observeDevices()
51
52
private val interests = blazeRepository.observeInterests()
52
- private val selectedLanguages = savedStateHandle.getStateFlow<List <String >>(
53
+
54
+ private val selectedLanguageCodes = savedStateHandle.getStateFlow<List <String >>(
53
55
scope = viewModelScope,
54
56
initialValue = emptyList(),
55
57
key = " selectedLanguages"
56
58
)
57
- private val selectedDevices = savedStateHandle.getStateFlow<List <String >>(
59
+
60
+ private val selectedLanguages = combine(languages, selectedLanguageCodes) { languages, selectedCodes ->
61
+ languages.filter { it.code in selectedCodes }
62
+ }
63
+
64
+ private val selectedDeviceIds = savedStateHandle.getStateFlow<List <String >>(
58
65
scope = viewModelScope,
59
66
initialValue = emptyList(),
60
67
key = " selectedDevices"
61
68
)
62
- private val selectedInterests = savedStateHandle.getStateFlow<List <String >>(
69
+
70
+ private val selectedDevices = combine(devices, selectedDeviceIds) { devices, selectedIds ->
71
+ devices.filter { it.id in selectedIds }
72
+ }
73
+ private val selectedInterestIds = savedStateHandle.getStateFlow<List <String >>(
63
74
scope = viewModelScope,
64
75
initialValue = emptyList(),
65
76
key = " selectedInterests"
66
77
)
67
78
79
+ private val selectedInterests = combine(interests, selectedInterestIds) { interests, selectedIds ->
80
+ interests.filter { it.id in selectedIds }
81
+ }
82
+
83
+ private val selectedLocations = savedStateHandle.getStateFlow<List <Location >>(
84
+ scope = viewModelScope,
85
+ initialValue = emptyList()
86
+ )
87
+
68
88
val viewState = combine(
69
89
adDetails,
70
90
budget,
71
- languages,
72
- devices,
73
- interests,
74
91
selectedLanguages,
75
92
selectedDevices,
76
- selectedInterests
77
- ) { adDetails, budget, languages, devices, interests, selectedLanguages, selectedDevices, selectedInterests ->
93
+ selectedInterests,
94
+ selectedLocations
95
+ ) { ad, budget, selectedLanguages, selectedDevices, selectedInterests, selectedLocations ->
78
96
CampaignPreviewUiState (
79
- adDetails = adDetails ,
97
+ adDetails = ad ,
80
98
campaignDetails = campaign.toCampaignDetailsUi(
81
99
budget,
82
- languages.filter { it.code in selectedLanguages } ,
83
- devices.filter { it.id in selectedDevices } ,
84
- interests.filter { it.id in selectedInterests } ,
85
- emptyList()
100
+ selectedLanguages,
101
+ selectedDevices,
102
+ selectedInterests,
103
+ selectedLocations
86
104
)
87
105
)
88
106
}.asLiveData()
@@ -122,14 +140,18 @@ class BlazeCampaignCreationPreviewViewModel @Inject constructor(
122
140
fun onTargetSelectionUpdated (targetType : BlazeTargetType , selectedIds : List <String >) {
123
141
launch {
124
142
when (targetType) {
125
- LANGUAGE -> selectedLanguages .update { selectedIds }
126
- DEVICE -> selectedDevices .update { selectedIds }
127
- INTEREST -> selectedInterests .update { selectedIds }
143
+ LANGUAGE -> selectedLanguageCodes .update { selectedIds }
144
+ DEVICE -> selectedDeviceIds .update { selectedIds }
145
+ INTEREST -> selectedInterestIds .update { selectedIds }
128
146
else -> Unit
129
147
}
130
148
}
131
149
}
132
150
151
+ fun onTargetLocationsUpdated (locations : List <Location >) {
152
+ selectedLocations.update { locations }
153
+ }
154
+
133
155
private fun loadData () {
134
156
launch {
135
157
blazeRepository.fetchLanguages()
@@ -182,7 +204,9 @@ class BlazeCampaignCreationPreviewViewModel @Inject constructor(
182
204
displayTitle = resourceProvider.getString(string.blaze_campaign_preview_details_location),
183
205
displayValue = locations.joinToString { it.name }
184
206
.ifEmpty { resourceProvider.getString(string.blaze_campaign_preview_target_default_value) },
185
- onItemSelected = { /* TODO Add location selection */ },
207
+ onItemSelected = {
208
+ triggerEvent(NavigateToTargetLocationSelectionScreen (locations))
209
+ },
186
210
),
187
211
CampaignDetailItemUi (
188
212
displayTitle = resourceProvider.getString(string.blaze_campaign_preview_details_interests),
@@ -261,8 +285,13 @@ class BlazeCampaignCreationPreviewViewModel @Inject constructor(
261
285
)
262
286
263
287
object NavigateToBudgetScreen : MultiLiveEvent.Event()
288
+
264
289
data class NavigateToTargetSelectionScreen (
265
290
val targetType : BlazeTargetType ,
266
291
val selectedIds : List <String >
267
292
) : MultiLiveEvent.Event()
293
+
294
+ data class NavigateToTargetLocationSelectionScreen (
295
+ val locations : List <Location >
296
+ ) : MultiLiveEvent.Event()
268
297
}
0 commit comments