diff --git a/design_system/src/main/java/com/moscow/cineverse/designSystem/component/card/InfoCard.kt b/design_system/src/main/java/com/moscow/cineverse/designSystem/component/card/InfoCard.kt index 363ab4106..daf36b3ec 100644 --- a/design_system/src/main/java/com/moscow/cineverse/designSystem/component/card/InfoCard.kt +++ b/design_system/src/main/java/com/moscow/cineverse/designSystem/component/card/InfoCard.kt @@ -30,6 +30,7 @@ fun InfoCard( ) { Box( modifier = modifier + .padding(horizontal = 16.dp) .fillMaxWidth() .background( color = Theme.colors.background.card, diff --git a/presentation/src/main/java/com/moscow/cineverse/component/MediaPosterCard.kt b/presentation/src/main/java/com/moscow/cineverse/component/MediaPosterCard.kt index 1d31de48c..2d9a0bdd8 100644 --- a/presentation/src/main/java/com/moscow/cineverse/component/MediaPosterCard.kt +++ b/presentation/src/main/java/com/moscow/cineverse/component/MediaPosterCard.kt @@ -30,14 +30,12 @@ import androidx.compose.material3.Icon import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow @@ -48,6 +46,7 @@ import com.moscow.cineverse.designSystem.component.blur.OnBlurContent import com.moscow.cineverse.designSystem.theme.Theme import com.moscow.cineverse.image_viewer.component.SafeImageViewer import com.moscow.cineverse.mapper.formatDate +import com.moscow.cineverse.mapper.formatRating import com.moscow.cineverse.screen.details.common.InfoSection import com.moscow.cineverse.utlis.ViewMode import com.moscow.cinverse.presentation.R @@ -195,9 +194,9 @@ private fun GridMovieCard( interactionSource = remember { MutableInteractionSource() } ) { - onMovieClick(movie.id) + onMovieClick(movie.id) - }, + }, isBlurEnabled = enableBlur, placeholderContent = { RemoteImagePlaceholder( @@ -236,7 +235,7 @@ private fun GridMovieCard( verticalAlignment = Alignment.CenterVertically ) { Text( - text = "%.1f".format(movie.rating), + text = movie.rating.formatRating(LocalContext.current), color = Theme.colors.shade.primary, style = Theme.textStyle.label.medium.medium ) @@ -276,7 +275,7 @@ private fun GridMovieCard( indication = null, interactionSource = remember { MutableInteractionSource() }, onClick = { - onMovieClick(movie.id) + onMovieClick(movie.id) } ) ) @@ -290,7 +289,8 @@ private fun GridMovieCard( ) { with(sharedTransitionScope) { DurationAndDateSection( - releaseDate = movie.releaseDate?.formatDate() ?: "", + releaseDate = movie.releaseDate?.formatDate(context = LocalContext.current) + ?: "", modifier = Modifier.sharedElement( sharedContentState = rememberSharedContentState(key = detailsKey), animatedVisibilityScope = this@AnimatedVisibility, @@ -331,8 +331,8 @@ private fun GridMovieCard( indication = null, interactionSource = remember { MutableInteractionSource() } ) { - onMovieClick(movie.id) - }, + onMovieClick(movie.id) + }, isBlurEnabled = enableBlur, placeholderContent = { RemoteImagePlaceholder( @@ -365,7 +365,7 @@ private fun GridMovieCard( verticalAlignment = Alignment.CenterVertically ) { Text( - text = "%.1f".format(movie.rating), + text = movie.rating.formatRating(LocalContext.current), color = Theme.colors.shade.primary, style = Theme.textStyle.label.medium.medium ) @@ -400,7 +400,7 @@ private fun GridMovieCard( indication = null, interactionSource = remember { MutableInteractionSource() }, onClick = { - onMovieClick(movie.id) + onMovieClick(movie.id) } ) ) @@ -504,7 +504,8 @@ private fun ListMovieCard( ) DurationAndDateSection( - releaseDate = movie.releaseDate?.formatDate() ?: "", + releaseDate = movie.releaseDate?.formatDate(context = LocalContext.current) + ?: "", modifier = Modifier.sharedElement( sharedContentState = rememberSharedContentState(key = detailsKey), animatedVisibilityScope = animatedVisibilityScope, @@ -530,7 +531,7 @@ private fun ListMovieCard( verticalAlignment = Alignment.CenterVertically ) { Text( - text = "%.1f".format(movie.rating), + text = movie.rating.formatRating(LocalContext.current), color = Theme.colors.shade.primary, style = Theme.textStyle.label.small.medium ) @@ -612,7 +613,8 @@ private fun ListMovieCard( ) DurationAndDateSection( - releaseDate = movie.releaseDate?.formatDate() ?: "" + releaseDate = movie.releaseDate?.formatDate(context = LocalContext.current) + ?: "" ) } } @@ -629,7 +631,7 @@ private fun ListMovieCard( verticalAlignment = Alignment.CenterVertically ) { Text( - text = "%.1f".format(movie.rating), + text = movie.rating.formatRating(LocalContext.current), color = Theme.colors.shade.primary, style = Theme.textStyle.label.small.medium ) diff --git a/presentation/src/main/java/com/moscow/cineverse/mapper/CommonMapper.kt b/presentation/src/main/java/com/moscow/cineverse/mapper/CommonMapper.kt index 677134d4e..b37385f7d 100644 --- a/presentation/src/main/java/com/moscow/cineverse/mapper/CommonMapper.kt +++ b/presentation/src/main/java/com/moscow/cineverse/mapper/CommonMapper.kt @@ -1,13 +1,17 @@ package com.moscow.cineverse.mapper +import android.content.Context import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import com.moscow.cineverse.common_ui_state.DurationUiState import com.moscow.cineverse.design_system.R import kotlinx.datetime.LocalDate -import kotlinx.datetime.toJavaLocalDate -import java.time.format.DateTimeFormatter +import java.text.NumberFormat +import java.text.DecimalFormat +import java.text.DecimalFormatSymbols import java.util.Locale +import java.time.format.DateTimeFormatter +import java.time.format.DecimalStyle @Composable @@ -20,11 +24,84 @@ fun DurationUiState.formatDuration(): String { } } -fun LocalDate.formatDate(): String { +fun Float.formatRating(context: Context, decimalPlaces: Int = 1): String { + return try { + val appLocale = context.resources.configuration.locales[0] + val isArabicApp = appLocale.language == "ar" + + val formatter = if (isArabicApp) { + val arabicLocale = Locale.Builder() + .setLanguage("ar") + .setRegion("SA") + .build() + val arabicDecimalStyle = DecimalStyle.of(arabicLocale) + (NumberFormat.getNumberInstance(arabicLocale) as DecimalFormat).apply { + minimumFractionDigits = decimalPlaces + maximumFractionDigits = decimalPlaces + decimalFormatSymbols = DecimalFormatSymbols(arabicLocale).apply { + decimalSeparator = arabicDecimalStyle.decimalSeparator + zeroDigit = arabicDecimalStyle.zeroDigit + } + } + } else { + NumberFormat.getNumberInstance(appLocale).apply { + minimumFractionDigits = decimalPlaces + maximumFractionDigits = decimalPlaces + } + } + formatter.format(this) + } catch (e: Exception) { + this.toString() + } +} + +fun Int.formatInt(context: Context): String { return try { - val formatter = DateTimeFormatter.ofPattern("yyyy, MMM dd", Locale.getDefault()) - val dateString = this.toJavaLocalDate().format(formatter) - dateString + val appLocale = context.resources.configuration.locales[0] + val isArabicApp = appLocale.language == "ar" + + val formatter = if (isArabicApp) { + val arabicLocale = Locale.Builder() + .setLanguage("ar") + .setRegion("SA") + .build() + (NumberFormat.getNumberInstance(arabicLocale) as DecimalFormat).apply { + minimumFractionDigits = 0 + maximumFractionDigits = 0 + decimalFormatSymbols = DecimalFormatSymbols(arabicLocale).apply { + zeroDigit = DecimalStyle.of(arabicLocale).zeroDigit + } + } + } else { + NumberFormat.getNumberInstance(appLocale).apply { + minimumFractionDigits = 0 + maximumFractionDigits = 0 + } + } + formatter.format(this) + } catch (e: Exception) { + this.toString() + } +} + +fun LocalDate.formatDate(context: Context): String { + return try { + val appLocale = context.resources.configuration.locales[0] + val javaLocalDate = java.time.LocalDate.of(this.year, this.monthNumber, this.dayOfMonth) + val isArabicApp = appLocale.language == "ar" + + val formatter = if (isArabicApp) { + val arabicLocale = Locale.Builder() + .setLanguage("ar") + .setRegion("SA") + .build() + val arabicDecimalStyle = DecimalStyle.of(arabicLocale) + DateTimeFormatter.ofPattern("yyyy, MMM dd", appLocale) + .withDecimalStyle(arabicDecimalStyle) + } else { + DateTimeFormatter.ofPattern("yyyy, MMM dd", appLocale) + } + javaLocalDate.format(formatter) } catch (_: Exception) { "" } diff --git a/presentation/src/main/java/com/moscow/cineverse/screen/cast_detials/components/ActorMainDetailsSection.kt b/presentation/src/main/java/com/moscow/cineverse/screen/cast_detials/components/ActorMainDetailsSection.kt index 49d194e53..cf51c0d0c 100644 --- a/presentation/src/main/java/com/moscow/cineverse/screen/cast_detials/components/ActorMainDetailsSection.kt +++ b/presentation/src/main/java/com/moscow/cineverse/screen/cast_detials/components/ActorMainDetailsSection.kt @@ -25,6 +25,7 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.moscow.cineverse.designSystem.component.blur.OnBlurContent @@ -50,7 +51,7 @@ fun ActorMainDetailsSection( name = actor.name, date = stringResource( R.string.born_on, - actor.birthDate?.formatDate()?:"" + actor.birthDate?.formatDate(context = LocalContext.current) ?: "" ), location = actor.placeOfBirth, scrollState = null, diff --git a/presentation/src/main/java/com/moscow/cineverse/screen/collection_details/CollectionDetailsScreen.kt b/presentation/src/main/java/com/moscow/cineverse/screen/collection_details/CollectionDetailsScreen.kt index 0b9afc46b..48c40f37d 100644 --- a/presentation/src/main/java/com/moscow/cineverse/screen/collection_details/CollectionDetailsScreen.kt +++ b/presentation/src/main/java/com/moscow/cineverse/screen/collection_details/CollectionDetailsScreen.kt @@ -130,8 +130,6 @@ private fun CollectionDetailsScreenContent( LazyColumn( modifier = Modifier.padding( top = 16.dp, - start = 16.dp, - end = 16.dp ) ) { if (uiState.showTip) { @@ -171,7 +169,9 @@ private fun CollectionDetailsScreenContent( }, showTitle = true, showBackdrop = true, - enableBlur = uiState.enableBlur + enableBlur = uiState.enableBlur, + modifier = Modifier.padding(horizontal = 16.dp) + ) } } diff --git a/presentation/src/main/java/com/moscow/cineverse/screen/details/common/InfoSection.kt b/presentation/src/main/java/com/moscow/cineverse/screen/details/common/InfoSection.kt index 642838a88..997620b84 100644 --- a/presentation/src/main/java/com/moscow/cineverse/screen/details/common/InfoSection.kt +++ b/presentation/src/main/java/com/moscow/cineverse/screen/details/common/InfoSection.kt @@ -11,6 +11,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow @@ -19,6 +20,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.moscow.cineverse.designSystem.theme.Theme import com.moscow.cineverse.design_system.R +import com.moscow.cineverse.mapper.formatRating @Composable fun InfoSection( @@ -56,7 +58,7 @@ fun InfoSection( verticalAlignment = Alignment.CenterVertically ) { Text( - text = "%.1f".format(rating), + text = rating.formatRating(LocalContext.current), color = Theme.colors.shade.primary, style = Theme.textStyle.label.medium.medium, fontSize = 12.sp diff --git a/presentation/src/main/java/com/moscow/cineverse/screen/details/common/MediaHeader.kt b/presentation/src/main/java/com/moscow/cineverse/screen/details/common/MediaHeader.kt index d4362cd9d..cbf52321a 100644 --- a/presentation/src/main/java/com/moscow/cineverse/screen/details/common/MediaHeader.kt +++ b/presentation/src/main/java/com/moscow/cineverse/screen/details/common/MediaHeader.kt @@ -36,6 +36,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.moscow.cineverse.common_ui_state.DurationUiState @@ -273,7 +274,7 @@ fun MediaHeader( releaseDate?.let { date -> InfoTextWithIcon( R.drawable.due_tone_calendar, - date.formatDate(), + date.formatDate(context = LocalContext.current), Theme.colors.shade.secondary ) } diff --git a/presentation/src/main/java/com/moscow/cineverse/screen/details/movie_details/MovieScreenState.kt b/presentation/src/main/java/com/moscow/cineverse/screen/details/movie_details/MovieScreenState.kt index 336b82cdb..8ef1d3f26 100644 --- a/presentation/src/main/java/com/moscow/cineverse/screen/details/movie_details/MovieScreenState.kt +++ b/presentation/src/main/java/com/moscow/cineverse/screen/details/movie_details/MovieScreenState.kt @@ -4,6 +4,7 @@ import com.moscow.cineverse.common_ui_state.CastUiState import com.moscow.cineverse.common_ui_state.DurationUiState import com.moscow.cineverse.common_ui_state.MediaItemUiState import com.moscow.cineverse.common_ui_state.ReviewUiState +import com.moscow.cineverse.screen.details.movie_details.MovieScreenState.MovieDetailsUiState import kotlinx.datetime.LocalDate @@ -39,4 +40,17 @@ data class MovieScreenState( val duration: DurationUiState, val description: String ) -} \ No newline at end of file +} + + +fun MovieDetailsUiState.toMediaItem() = + MediaItemUiState( + id = this.id, + title = this.title, + posterPath = this.posterUrl, + rating = this.rating.toFloatOrNull() ?: 0.0f, // Convert string rating to float + genres = this.genres, + releaseDate = this.releaseDate, + backdropPath = this.posterUrl, // Using posterUrl as backdrop (you may want to add a separate backdropUrl field) + mediaType = MediaItemUiState.MediaType.Movie + ) \ No newline at end of file diff --git a/presentation/src/main/java/com/moscow/cineverse/screen/details/movie_details/component/MovieReviewsSection.kt b/presentation/src/main/java/com/moscow/cineverse/screen/details/movie_details/component/MovieReviewsSection.kt index ed2d6c4a5..f36c4818d 100644 --- a/presentation/src/main/java/com/moscow/cineverse/screen/details/movie_details/component/MovieReviewsSection.kt +++ b/presentation/src/main/java/com/moscow/cineverse/screen/details/movie_details/component/MovieReviewsSection.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import coil3.compose.rememberAsyncImagePainter import com.moscow.cineverse.common_ui_state.ReviewUiState @@ -37,7 +38,7 @@ fun MovieReviewsSection( review.username, review.reviewContent, review.rate, - review.date?.formatDate() ?: "", + review.date?.formatDate(context = LocalContext.current) ?: "", if (review.userImageUrl.isEmpty()) null else rememberAsyncImagePainter(model = review.userImageUrl), modifier = Modifier.padding( start = 16.dp, diff --git a/presentation/src/main/java/com/moscow/cineverse/screen/details/series_details/series_seasons/SeasonCard.kt b/presentation/src/main/java/com/moscow/cineverse/screen/details/series_details/series_seasons/SeasonCard.kt index 256616cf3..52295aed2 100644 --- a/presentation/src/main/java/com/moscow/cineverse/screen/details/series_details/series_seasons/SeasonCard.kt +++ b/presentation/src/main/java/com/moscow/cineverse/screen/details/series_details/series_seasons/SeasonCard.kt @@ -23,6 +23,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow @@ -32,6 +33,8 @@ import com.moscow.cineverse.designSystem.component.blur.RemoteImagePlaceholder import com.moscow.cineverse.designSystem.component.wrapper.MovieText import com.moscow.cineverse.designSystem.theme.Theme import com.moscow.cineverse.image_viewer.component.SafeImageViewer +import com.moscow.cineverse.mapper.formatInt +import com.moscow.cineverse.mapper.formatRating import com.moscow.cinverse.presentation.R import kotlinx.datetime.LocalDate @@ -119,25 +122,26 @@ fun SeasonCard( verticalAlignment = Alignment.CenterVertically ) { if (rate != 0f) { + val movie = null SeasonInfo( icon = R.drawable.due_tone_star, iconTint = Theme.colors.additional.primary.yellow, iconDescription = stringResource(R.string.rate_icon), - title = rate.toString() + title = rate.formatRating(LocalContext.current) ) } SeasonInfo( icon = R.drawable.due_tone_video_library, iconTint = Theme.colors.shade.secondary, iconDescription = stringResource(R.string.episodes_icon), - title = episodeCount.toString() + " " + stringResource(R.string.episodes) + title = episodeCount.formatInt(LocalContext.current) + " " + stringResource(R.string.episodes) ) airDate?.let { SeasonInfo( icon = R.drawable.due_tone_calendar, iconTint = Theme.colors.shade.secondary, iconDescription = stringResource(R.string.air_date_icon), - title = airDate.year.toString() + title = airDate.year.formatInt(LocalContext.current) ) } } diff --git a/presentation/src/main/java/com/moscow/cineverse/screen/match/composable/MatchCarouselAnimation.kt b/presentation/src/main/java/com/moscow/cineverse/screen/match/composable/MatchCarouselAnimation.kt index 6ab650d55..b9ace0703 100644 --- a/presentation/src/main/java/com/moscow/cineverse/screen/match/composable/MatchCarouselAnimation.kt +++ b/presentation/src/main/java/com/moscow/cineverse/screen/match/composable/MatchCarouselAnimation.kt @@ -1,19 +1,21 @@ package com.moscow.cineverse.screen.match.composable +import android.util.Log import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.Spring import androidx.compose.animation.core.spring +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.RoundedCornerShape @@ -24,6 +26,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp @@ -57,7 +61,8 @@ fun MatchCarouselAnimation( initialPage = 0, pageCount = { movies.size } ) - + val screenWidth = LocalConfiguration.current.screenWidthDp + val paddingHorizontal = (screenWidth - screenWidth * .70f) / 2 LaunchedEffect(pagerState) { while (true) { delay(3000) @@ -75,7 +80,12 @@ fun MatchCarouselAnimation( } if (movies.isEmpty()) { - Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + Log.e("hdhdhd", "MatchCarouselAnimation: mmmmmmm") + Box( + modifier = modifier + .fillMaxSize() + .background(Theme.colors.background.screen), contentAlignment = Alignment.Center + ) { EmptyState( icon = painterResource(R.drawable.ic_search), title = stringResource(R.string.nothing_found), @@ -91,13 +101,13 @@ fun MatchCarouselAnimation( Box( modifier = modifier .fillMaxWidth() - .height(350.dp), + .fillMaxHeight(.45f), contentAlignment = Alignment.Center ) { HorizontalPager( state = pagerState, - modifier = Modifier.fillMaxSize(), - contentPadding = PaddingValues(horizontal = 60.dp), + modifier = Modifier.fillMaxWidth(), + contentPadding = PaddingValues(horizontal = paddingHorizontal.dp), pageSpacing = (-80).dp, verticalAlignment = Alignment.CenterVertically, beyondViewportPageCount = 2 @@ -126,7 +136,8 @@ fun MatchCarouselAnimation( imageUrl = movies[page].posterUrl, modifier = Modifier .alpha(cardAlpha) - .size(width = animatedWidth, height = animatedHeight) + .fillMaxWidth() + .fillMaxHeight() .clip(RoundedCornerShape(Theme.radius.extraLarge)) .offset( x = when { @@ -163,7 +174,7 @@ fun MatchCarouselAnimation( genres = movies[pagerState.currentPage].genres.joinToString(", "), rating = movies[pagerState.currentPage].rating, duration = if (movies[pagerState.currentPage].duration.hours == 0 && movies[pagerState.currentPage].duration.minutes == 0) "null" else movies[pagerState.currentPage].duration.toString(), - releaseDate = movies[pagerState.currentPage].releaseDate?.formatDate() + releaseDate = movies[pagerState.currentPage].releaseDate?.formatDate(LocalContext.current) ?: "", type = stringResource(R.string.movie), onSaveClick = { onSaveClick(movies[pagerState.currentPage].id) }, diff --git a/presentation/src/main/java/com/moscow/cineverse/screen/reviews/ReviewsScreen.kt b/presentation/src/main/java/com/moscow/cineverse/screen/reviews/ReviewsScreen.kt index a74598616..3046c8ee5 100644 --- a/presentation/src/main/java/com/moscow/cineverse/screen/reviews/ReviewsScreen.kt +++ b/presentation/src/main/java/com/moscow/cineverse/screen/reviews/ReviewsScreen.kt @@ -11,6 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel @@ -81,7 +82,7 @@ fun ReviewsContent( username = review.username, reviewText = review.reviewContent, rating = review.rate, - date = if (review.date != null) review.date.formatDate() else "", + date = if (review.date != null) review.date.formatDate(context = LocalContext.current) else "", avatar = if (review.userImageUrl.isEmpty()) null else rememberAsyncImagePainter( model = review.userImageUrl ),