From 37a5a02ce4fe239d6e78bbd079a1abb338ea5490 Mon Sep 17 00:00:00 2001 From: rahulsainani Date: Wed, 20 Sep 2023 11:00:42 +0200 Subject: [PATCH] Bug 1840113 - Display review checker info cards --- .../shopping/store/ReviewQualityCheckState.kt | 2 +- .../shopping/store/ReviewQualityCheckStore.kt | 7 ++- .../fenix/shopping/ui/ProductAnalysis.kt | 23 +++++--- .../fenix/shopping/ui/ProductAnalysisError.kt | 56 ++++++++++++++++++- .../ui/ReviewQualityCheckBottomSheet.kt | 1 + app/src/main/res/values/strings.xml | 16 +++--- .../store/ReviewQualityCheckStateTest.kt | 2 +- 7 files changed, 86 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt index a31e563af1..d3abc7d890 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt @@ -116,7 +116,7 @@ sealed interface ReviewQualityCheckState : State { * The status of the product analysis. */ enum class AnalysisStatus { - NEEDS_ANALYSIS, REANALYZING, UP_TO_DATE, COMPLETED + NEEDS_ANALYSIS, REANALYZING, UP_TO_DATE } } } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStore.kt b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStore.kt index 60a5966f87..363f1f05b2 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStore.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStore.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.shopping.store import mozilla.components.lib.state.Store +import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent.AnalysisStatus /** @@ -74,20 +75,20 @@ private fun mapStateForUpdateAction( ReviewQualityCheckAction.FetchProductAnalysis, ReviewQualityCheckAction.RetryProductAnalysis -> { state.mapIfOptedIn { - it.copy(productReviewState = ReviewQualityCheckState.OptedIn.ProductReviewState.Loading) + it.copy(productReviewState = ProductReviewState.Loading) } } ReviewQualityCheckAction.ReanalyzeProduct -> { state.mapIfOptedIn { when (it.productReviewState) { - is ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent -> { + is ProductReviewState.AnalysisPresent -> { val productReviewState = it.productReviewState.copy(analysisStatus = AnalysisStatus.REANALYZING) it.copy(productReviewState = productReviewState) } - is ReviewQualityCheckState.OptedIn.ProductReviewState.NoAnalysisPresent -> { + is ProductReviewState.NoAnalysisPresent -> { it.copy(productReviewState = it.productReviewState.copy(isReanalyzing = true)) } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt index 9bb99daf25..d03fe38b01 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt @@ -84,15 +84,27 @@ fun ProductAnalysis( ReanalysisInProgressCard() } - AnalysisStatus.COMPLETED -> { - // TBD - } - AnalysisStatus.UP_TO_DATE -> { // no-op } } + if (productAnalysis.notEnoughReviewsCardVisible) { + ReviewQualityCheckInfoCard( + title = stringResource(id = R.string.review_quality_check_no_reviews_warning_title), + description = stringResource(id = R.string.review_quality_check_no_reviews_warning_body), + type = ReviewQualityCheckInfoType.Info, + modifier = Modifier.fillMaxWidth(), + icon = { + Icon( + painter = painterResource(id = R.drawable.mozac_ic_information_fill_24), + contentDescription = null, + tint = FirefoxTheme.colors.iconPrimary, + ) + }, + ) + } + if (productAnalysis.reviewGrade != null) { ReviewGradeCard( reviewGrade = productAnalysis.reviewGrade, @@ -448,9 +460,6 @@ private class ProductAnalysisPreviewModelParameterProvider : ProductAnalysisPreviewModel( analysisStatus = AnalysisStatus.REANALYZING, ), - ProductAnalysisPreviewModel( - analysisStatus = AnalysisStatus.COMPLETED, - ), ProductAnalysisPreviewModel( reviewGrade = null, ), diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysisError.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysisError.kt index f004d6ac6f..decc44583d 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysisError.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysisError.kt @@ -10,15 +10,21 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.material.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState import org.mozilla.fenix.theme.FirefoxTheme /** * Product analysis error UI * + * @param error The error state to display. * @param productRecommendationsEnabled The current state of the product recommendations toggle. * @param onReviewGradeLearnMoreClick Invoked when the user clicks to learn more about review grades. * @param onOptOutClick Invoked when the user opts out of the review quality check feature. @@ -28,7 +34,9 @@ import org.mozilla.fenix.theme.FirefoxTheme * @param modifier Modifier to apply to the layout. */ @Composable +@Suppress("LongParameterList") fun ProductAnalysisError( + error: ProductReviewState.Error, productRecommendationsEnabled: Boolean?, onReviewGradeLearnMoreClick: (String) -> Unit, onOptOutClick: () -> Unit, @@ -40,7 +48,52 @@ fun ProductAnalysisError( modifier = modifier, verticalArrangement = Arrangement.spacedBy(16.dp), ) { - // Error UI to be done in Bug 1840113 + when (error) { + ProductReviewState.Error.GenericError -> + ReviewQualityCheckInfoCard( + title = stringResource(id = R.string.review_quality_check_generic_error_title), + description = stringResource(id = R.string.review_quality_check_generic_error_body), + type = ReviewQualityCheckInfoType.Warning, + modifier = Modifier.fillMaxWidth(), + icon = { + Icon( + painter = painterResource(id = R.drawable.mozac_ic_warning_fill_24), + contentDescription = null, + tint = FirefoxTheme.colors.iconPrimary, + ) + }, + ) + + ProductReviewState.Error.NetworkError -> + ReviewQualityCheckInfoCard( + title = stringResource(id = R.string.review_quality_check_no_connection_title), + description = stringResource(id = R.string.review_quality_check_no_connection_body), + type = ReviewQualityCheckInfoType.Warning, + modifier = Modifier.fillMaxWidth(), + icon = { + Icon( + painter = painterResource(id = R.drawable.mozac_ic_warning_fill_24), + contentDescription = null, + tint = FirefoxTheme.colors.iconPrimary, + ) + }, + ) + + ProductReviewState.Error.UnsupportedProductTypeError -> + ReviewQualityCheckInfoCard( + title = stringResource(id = R.string.review_quality_check_not_analyzable_info_title), + description = stringResource(id = R.string.review_quality_check_not_analyzable_info_body), + type = ReviewQualityCheckInfoType.Info, + modifier = Modifier.fillMaxWidth(), + icon = { + Icon( + painter = painterResource(id = R.drawable.mozac_ic_information_fill_24), + contentDescription = null, + tint = FirefoxTheme.colors.iconPrimary, + ) + }, + ) + } ReviewQualityInfoCard( onLearnMoreClick = onReviewGradeLearnMoreClick, @@ -70,6 +123,7 @@ private fun ProductAnalysisErrorPreview() { .padding(all = 16.dp), ) { ProductAnalysisError( + error = ProductReviewState.Error.NetworkError, productRecommendationsEnabled = true, onReviewGradeLearnMoreClick = {}, onOptOutClick = {}, diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckBottomSheet.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckBottomSheet.kt index f6e5b78ba8..9bd65ea76a 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckBottomSheet.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckBottomSheet.kt @@ -119,6 +119,7 @@ private fun ProductReview( is ReviewQualityCheckState.OptedIn.ProductReviewState.Error -> { ProductAnalysisError( + error = productReviewState, productRecommendationsEnabled = state.productRecommendationsPreference, onReviewGradeLearnMoreClick = onReviewGradeLearnMoreClick, onOptOutClick = onOptOutClick, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7bc3c35778..67b6df39c1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2163,9 +2163,9 @@ Check now - Not enough reviews yet + Not enough reviews yet - When this product has more reviews, we’ll be able to check their quality. + When this product has more reviews, we’ll be able to check their quality. Product is not available @@ -2183,9 +2183,9 @@ We should have info about this product’s reviews within 24 hours. Please check back. - We can’t check these reviews + We can’t check these reviews - Unfortunately, we can’t check the review quality for certain types of products. For example, gift cards and streaming video, music, and games. + Unfortunately, we can’t check the review quality for certain types of products. For example, gift cards and streaming video, music, and games. Info coming soon @@ -2195,13 +2195,13 @@ Got it - No info available right now + No info available right now - We’re working to resolve the issue. Please check back soon. + We’re working to resolve the issue. Please check back soon. - No network connection + No network connection - Check your network connection and then try reloading the page. + Check your network connection and then try reloading the page. No info about these reviews yet diff --git a/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt b/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt index aab0927f85..d6d7aff475 100644 --- a/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt +++ b/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt @@ -228,7 +228,7 @@ class ReviewQualityCheckStateTest { val analysisWithoutGrade = ProductAnalysisTestData.analysisPresent( reviewGrade = null, adjustedRating = 3.2f, - analysisStatus = AnalysisStatus.COMPLETED, + analysisStatus = AnalysisStatus.UP_TO_DATE, ) val analysisWithoutRatings = ProductAnalysisTestData.analysisPresent(