diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/BlazeRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/BlazeRepository.kt index efd3ac350b7..d80e91cfbc8 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/BlazeRepository.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/BlazeRepository.kt @@ -1,12 +1,14 @@ package com.woocommerce.android.ui.blaze import android.os.Parcelable +import com.woocommerce.android.OnChangedException import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.products.ProductDetailRepository import com.woocommerce.android.util.TimezoneProvider +import com.woocommerce.android.util.WooLog import kotlinx.coroutines.flow.map import kotlinx.parcelize.Parcelize -import org.wordpress.android.fluxc.persistence.blaze.BlazeCampaignsDao.BlazeAdSuggestionEntity +import org.wordpress.android.fluxc.model.blaze.BlazeAdSuggestion import org.wordpress.android.fluxc.store.blaze.BlazeCampaignsStore import java.util.Date import javax.inject.Inject @@ -30,33 +32,82 @@ class BlazeRepository @Inject constructor( fun observeLanguages() = blazeCampaignsStore.observeBlazeTargetingLanguages() .map { it.map { language -> Language(language.id, language.name) } } - suspend fun fetchLanguages() = blazeCampaignsStore.fetchBlazeTargetingLanguages() + suspend fun fetchLanguages(): Result { + val result = blazeCampaignsStore.fetchBlazeTargetingLanguages(selectedSite.get()) + + return when { + result.isError -> { + WooLog.w(WooLog.T.BLAZE, "Failed to fetch languages: ${result.error}") + Result.failure(OnChangedException(result.error)) + } + else -> Result.success(Unit) + } + } fun observeDevices() = blazeCampaignsStore.observeBlazeTargetingDevices() .map { it.map { device -> Device(device.id, device.name) } } - suspend fun fetchDevices() = blazeCampaignsStore.fetchBlazeTargetingDevices() + suspend fun fetchDevices(): Result { + val result = blazeCampaignsStore.fetchBlazeTargetingDevices(selectedSite.get()) + + return when { + result.isError -> { + WooLog.w(WooLog.T.BLAZE, "Failed to fetch devices: ${result.error}") + Result.failure(OnChangedException(result.error)) + } + else -> Result.success(Unit) + } + } fun observeInterests() = blazeCampaignsStore.observeBlazeTargetingTopics() .map { it.map { interest -> Interest(interest.id, interest.description) } } - suspend fun fetchInterests() = blazeCampaignsStore.fetchBlazeTargetingTopics() + suspend fun fetchInterests(): Result { + val result = blazeCampaignsStore.fetchBlazeTargetingTopics(selectedSite.get()) + + return when { + result.isError -> { + WooLog.w(WooLog.T.BLAZE, "Failed to fetch interests: ${result.error}") + Result.failure(OnChangedException(result.error)) + } + else -> Result.success(Unit) + } + } - suspend fun fetchLocations(query: String) = blazeCampaignsStore.fetchBlazeTargetingLocations(query).model - ?.map { location -> Location(location.id, location.name, location.parent?.name, location.type) } + suspend fun fetchLocations(query: String): Result> { + val result = blazeCampaignsStore.fetchBlazeTargetingLocations( + selectedSite.get(), + query + ) + + return when { + result.isError -> { + WooLog.w(WooLog.T.BLAZE, "Failed to fetch locations: ${result.error}") + Result.failure(OnChangedException(result.error)) + } + else -> Result.success( + result.model?.map { location -> + Location(location.id, location.name, location.parent?.name, location.type) + } ?: emptyList() + ) + } + } suspend fun getMostRecentCampaign() = blazeCampaignsStore.getMostRecentBlazeCampaign(selectedSite.get()) - suspend fun getAdSuggestions(productId: Long): List? { - fun List.mapToUiModel(): List { + suspend fun fetchAdSuggestions(productId: Long): Result> { + fun List.mapToUiModel(): List { return map { AiSuggestionForAd(it.tagLine, it.description) } } - val suggestions = blazeCampaignsStore.getBlazeAdSuggestions(selectedSite.get(), productId) - return if (suggestions.isNotEmpty()) { - suggestions.mapToUiModel() - } else { - blazeCampaignsStore.fetchBlazeAdSuggestions(selectedSite.get(), productId).model?.mapToUiModel() + val result = blazeCampaignsStore.fetchBlazeAdSuggestions(selectedSite.get(), productId) + + return when { + result.isError -> { + WooLog.w(WooLog.T.BLAZE, "Failed to fetch ad suggestions: ${result.error}") + Result.failure(OnChangedException(result.error)) + } + else -> Result.success(result.model?.mapToUiModel() ?: emptyList()) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/ad/BlazeCampaignCreationEditAdViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/ad/BlazeCampaignCreationEditAdViewModel.kt index b396fe82b6b..8236ecc09d3 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/ad/BlazeCampaignCreationEditAdViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/ad/BlazeCampaignCreationEditAdViewModel.kt @@ -43,7 +43,7 @@ class BlazeCampaignCreationEditAdViewModel @Inject constructor( private fun loadSuggestions() { viewModelScope.launch { - blazeRepository.getAdSuggestions(navArgs.productId)?.let { list -> + blazeRepository.fetchAdSuggestions(navArgs.productId).getOrNull()?.let { list -> val index = list.indexOfFirst { it.tagLine == navArgs.tagline && it.description == navArgs.description } val suggestions = list.map { AiSuggestionForAd(it.tagLine, it.description) } if (index != -1) { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/preview/BlazeCampaignCreationPreviewViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/preview/BlazeCampaignCreationPreviewViewModel.kt index ebc0aeb9f39..56b2a8bf08f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/preview/BlazeCampaignCreationPreviewViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/preview/BlazeCampaignCreationPreviewViewModel.kt @@ -158,7 +158,7 @@ class BlazeCampaignCreationPreviewViewModel @Inject constructor( blazeRepository.fetchDevices() blazeRepository.fetchInterests() - blazeRepository.getAdSuggestions(navArgs.productId).let { suggestions -> + blazeRepository.fetchAdSuggestions(navArgs.productId).getOrNull().let { suggestions -> adDetails.update { AdDetails( productId = navArgs.productId, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/targets/BlazeCampaignTargetLocationSelectionViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/targets/BlazeCampaignTargetLocationSelectionViewModel.kt index c493da7a7b0..01c5cfc8825 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/targets/BlazeCampaignTargetLocationSelectionViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/targets/BlazeCampaignTargetLocationSelectionViewModel.kt @@ -72,6 +72,7 @@ class BlazeCampaignTargetLocationSelectionViewModel @Inject constructor( } private suspend fun fetchLocations(query: String) = blazeRepository.fetchLocations(query) + .getOrNull() ?.asSequence() ?.filterNot { location -> location.id in items.value.map { it.location.id } diff --git a/build.gradle b/build.gradle index d900807ffac..b10433143a6 100644 --- a/build.gradle +++ b/build.gradle @@ -96,7 +96,7 @@ tasks.register("installGitHooks", Copy) { } ext { - fluxCVersion = '2.65.0' + fluxCVersion = 'trunk-6b2c6fc5022e2f14570bd5e126da1f8409965830' glideVersion = '4.13.2' coilVersion = '2.1.0' constraintLayoutVersion = '1.2.0'