Skip to content

Commit b2b5d2f

Browse files
authored
Merge pull request #10645 from woocommerce/issue/10631-interests-selection
Blaze: Target interest selection
2 parents 35e962c + f7b6701 commit b2b5d2f

File tree

4 files changed

+45
-13
lines changed

4 files changed

+45
-13
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/extensions/FlowExtensions.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@ package com.woocommerce.android.extensions
33
import kotlinx.coroutines.flow.Flow
44

55
@Suppress("LongParameterList")
6-
inline fun <T1, T2, T3, T4, T5, T6, R> combine(
6+
inline fun <T1, T2, T3, T4, T5, T6, T7, R> combine(
77
flow: Flow<T1>,
88
flow2: Flow<T2>,
99
flow3: Flow<T3>,
1010
flow4: Flow<T4>,
1111
flow5: Flow<T5>,
1212
flow6: Flow<T6>,
13-
crossinline transform: suspend (T1, T2, T3, T4, T5, T6) -> R
13+
flow7: Flow<T7>,
14+
crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7) -> R
1415
): Flow<R> {
15-
return kotlinx.coroutines.flow.combine(flow, flow2, flow3, flow4, flow5, flow6) { args: Array<*> ->
16+
return kotlinx.coroutines.flow.combine(flow, flow2, flow3, flow4, flow5, flow6, flow7) { args: Array<*> ->
1617
@Suppress("UNCHECKED_CAST", "MagicNumber")
1718
transform(
1819
args[0] as T1,
@@ -21,22 +22,24 @@ inline fun <T1, T2, T3, T4, T5, T6, R> combine(
2122
args[3] as T4,
2223
args[4] as T5,
2324
args[5] as T6,
25+
args[6] as T7,
2426
)
2527
}
2628
}
2729

2830
@Suppress("LongParameterList")
29-
inline fun <T1, T2, T3, T4, T5, T6, T7, R> combine(
31+
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, R> combine(
3032
flow: Flow<T1>,
3133
flow2: Flow<T2>,
3234
flow3: Flow<T3>,
3335
flow4: Flow<T4>,
3436
flow5: Flow<T5>,
3537
flow6: Flow<T6>,
3638
flow7: Flow<T7>,
37-
crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7) -> R
39+
flow8: Flow<T8>,
40+
crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8) -> R
3841
): Flow<R> {
39-
return kotlinx.coroutines.flow.combine(flow, flow2, flow3, flow4, flow5, flow6, flow7) { args: Array<*> ->
42+
return kotlinx.coroutines.flow.combine(flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8) { args: Array<*> ->
4043
@Suppress("UNCHECKED_CAST", "MagicNumber")
4144
transform(
4245
args[0] as T1,
@@ -46,6 +49,7 @@ inline fun <T1, T2, T3, T4, T5, T6, T7, R> combine(
4649
args[4] as T5,
4750
args[5] as T6,
4851
args[6] as T7,
52+
args[7] as T8,
4953
)
5054
}
5155
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/BlazeRepository.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ class BlazeRepository @Inject constructor(
3535
fun observeDevices() = blazeCampaignsStore.observeBlazeTargetingDevices()
3636
.map { it.map { device -> Device(device.id, device.name) } }
3737

38-
suspend fun fetchDevices() = blazeCampaignsStore.fetchBlazeTargetingDevices()
38+
suspend fun fetchDevices() = blazeCampaignsStore.fetchBlazeTargetingTopics()
39+
40+
fun observeInterests() = blazeCampaignsStore.observeBlazeTargetingTopics()
41+
.map { it.map { interest -> Interest(interest.id, interest.description) } }
42+
43+
suspend fun fetchInterests() = blazeCampaignsStore.fetchBlazeTargetingTopics()
3944

4045
suspend fun getMostRecentCampaign() = blazeCampaignsStore.getMostRecentBlazeCampaign(selectedSite.get())
4146

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/preview/BlazeCampaignCreationPreviewViewModel.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.woocommerce.android.ui.blaze.creation.preview.BlazeCampaignCreationPr
1818
import com.woocommerce.android.ui.blaze.creation.preview.BlazeCampaignCreationPreviewViewModel.AdDetailsUi.Loading
1919
import com.woocommerce.android.ui.blaze.creation.targets.BlazeTargetType
2020
import com.woocommerce.android.ui.blaze.creation.targets.BlazeTargetType.DEVICE
21+
import com.woocommerce.android.ui.blaze.creation.targets.BlazeTargetType.INTEREST
2122
import com.woocommerce.android.ui.blaze.creation.targets.BlazeTargetType.LANGUAGE
2223
import com.woocommerce.android.util.CurrencyFormatter
2324
import com.woocommerce.android.viewmodel.MultiLiveEvent
@@ -47,6 +48,7 @@ class BlazeCampaignCreationPreviewViewModel @Inject constructor(
4748

4849
private val languages = blazeRepository.observeLanguages()
4950
private val devices = blazeRepository.observeDevices()
51+
private val interests = blazeRepository.observeInterests()
5052
private val selectedLanguages = savedStateHandle.getStateFlow<List<String>>(
5153
scope = viewModelScope,
5254
initialValue = emptyList(),
@@ -57,22 +59,29 @@ class BlazeCampaignCreationPreviewViewModel @Inject constructor(
5759
initialValue = emptyList(),
5860
key = "selectedDevices"
5961
)
62+
private val selectedInterests = savedStateHandle.getStateFlow<List<String>>(
63+
scope = viewModelScope,
64+
initialValue = emptyList(),
65+
key = "selectedInterests"
66+
)
6067

6168
val viewState = combine(
6269
adDetails,
6370
budget,
6471
languages,
6572
devices,
73+
interests,
6674
selectedLanguages,
67-
selectedDevices
68-
) { adDetails, budget, languages, devices, selectedLanguages, selectedDevices ->
75+
selectedDevices,
76+
selectedInterests
77+
) { adDetails, budget, languages, devices, interests, selectedLanguages, selectedDevices, selectedInterests ->
6978
CampaignPreviewUiState(
7079
adDetails = adDetails,
7180
campaignDetails = campaign.toCampaignDetailsUi(
7281
budget,
7382
languages.filter { it.code in selectedLanguages },
7483
devices.filter { it.id in selectedDevices },
75-
emptyList(),
84+
interests.filter { it.id in selectedInterests },
7685
emptyList()
7786
)
7887
)
@@ -115,6 +124,7 @@ class BlazeCampaignCreationPreviewViewModel @Inject constructor(
115124
when (targetType) {
116125
LANGUAGE -> selectedLanguages.update { selectedIds }
117126
DEVICE -> selectedDevices.update { selectedIds }
127+
INTEREST -> selectedInterests.update { selectedIds }
118128
else -> Unit
119129
}
120130
}
@@ -124,6 +134,8 @@ class BlazeCampaignCreationPreviewViewModel @Inject constructor(
124134
launch {
125135
blazeRepository.fetchLanguages()
126136
blazeRepository.fetchDevices()
137+
blazeRepository.fetchInterests()
138+
127139
blazeRepository.getAdSuggestions(navArgs.productId).let { suggestions ->
128140
adDetails.update {
129141
AdDetails(
@@ -176,7 +188,9 @@ class BlazeCampaignCreationPreviewViewModel @Inject constructor(
176188
displayTitle = resourceProvider.getString(string.blaze_campaign_preview_details_interests),
177189
displayValue = interests.joinToString { it.description }
178190
.ifEmpty { resourceProvider.getString(string.blaze_campaign_preview_target_default_value) },
179-
onItemSelected = { /* TODO Add interests selection */ },
191+
onItemSelected = {
192+
triggerEvent(NavigateToTargetSelectionScreen(INTEREST, interests.map { it.id }))
193+
},
180194
),
181195
),
182196
destinationUrl = CampaignDetailItemUi(

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/targets/BlazeCampaignTargetSelectionViewModel.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,22 @@ class BlazeCampaignTargetSelectionViewModel @Inject constructor(
3737
)
3838
}
3939
}
40-
else -> blazeRepository.observeDevices().map { devices ->
40+
BlazeTargetType.DEVICE -> blazeRepository.observeDevices().map { devices ->
4141
devices.map { device ->
4242
TargetItem(
4343
id = device.id,
4444
value = device.name
4545
)
4646
}
4747
}
48+
else -> blazeRepository.observeInterests().map { interests ->
49+
interests.map { interest ->
50+
TargetItem(
51+
id = interest.id,
52+
value = interest.description
53+
)
54+
}
55+
}
4856
}
4957

5058
private val selectedIds = savedStateHandle.getStateFlow(viewModelScope, navArgs.selectedIds.toSet())
@@ -55,7 +63,8 @@ class BlazeCampaignTargetSelectionViewModel @Inject constructor(
5563
selectedItems = selectedIds.map { id -> items.first { it.id == id } },
5664
title = when (navArgs.targetType) {
5765
BlazeTargetType.LANGUAGE -> resourceProvider.getString(R.string.blaze_campaign_preview_details_language)
58-
else -> resourceProvider.getString(R.string.blaze_campaign_preview_details_devices)
66+
BlazeTargetType.DEVICE -> resourceProvider.getString(R.string.blaze_campaign_preview_details_devices)
67+
else -> resourceProvider.getString(R.string.blaze_campaign_preview_details_interests)
5968
}
6069
)
6170
}.asLiveData()

0 commit comments

Comments
 (0)