diff --git a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/HistoryScreen.kt b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/HistoryScreen.kt index 50b36f3e..beb12b2d 100644 --- a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/HistoryScreen.kt +++ b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/HistoryScreen.kt @@ -79,7 +79,14 @@ internal fun HistoryScreen( uiState = uiState, modifier = modifier, pagerState = pagerState, - onClickHistoryItem = { viewModel.onIntent(HistoryUiIntent.ClickItem(presentationId = it.presentationId)) }, + onClickHistoryItem = { item, pageType -> + viewModel.onIntent( + HistoryUiIntent.ClickItem( + presentationId = item.presentationId, + pageType = pageType, + ), + ) + }, onClickAddPresentation = navigateToAnalysis, ) } @@ -89,7 +96,7 @@ internal fun HistoryScreen( internal fun HistoryScreen( uiState: HistoryUiState, pagerState: PagerState, - onClickHistoryItem: (HistoryUiModel) -> Unit, + onClickHistoryItem: (HistoryUiModel, HistoryPageType) -> Unit, onClickAddPresentation: () -> Unit, modifier: Modifier = Modifier, ) { @@ -116,7 +123,7 @@ internal fun HistoryScreen( private fun HistoryContent( uiState: HistoryUiState, pagerState: PagerState, - onClickHistoryItem: (HistoryUiModel) -> Unit, + onClickHistoryItem: (HistoryUiModel, HistoryPageType) -> Unit, onClickAddPresentation: () -> Unit, ) { val tabs = persistentListOf( @@ -158,7 +165,7 @@ private fun HistoryContent( } else { HistoryItemList( items = items.toImmutableList(), - onClickItem = onClickHistoryItem, + onClickItem = { item -> onClickHistoryItem(item, pageType) }, modifier = Modifier.fillMaxSize(), ) } @@ -216,7 +223,7 @@ private fun HistoryScreenPreview() { HistoryScreen( uiState = previewState, pagerState = pagerState, - onClickHistoryItem = { }, + onClickHistoryItem = { _, _ -> }, onClickAddPresentation = {}, ) } diff --git a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/HistoryViewModel.kt b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/HistoryViewModel.kt index 55ec5245..cf212636 100644 --- a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/HistoryViewModel.kt +++ b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/HistoryViewModel.kt @@ -26,7 +26,10 @@ internal class HistoryViewModel @Inject constructor( override fun onIntent(intent: HistoryUiIntent) { when (intent) { HistoryUiIntent.FetchData -> fetchData() - is HistoryUiIntent.ClickItem -> handleClickItem(presentationId = intent.presentationId) + is HistoryUiIntent.ClickItem -> handleClickItem( + presentationId = intent.presentationId, + pageType = intent.pageType, + ) } } @@ -61,12 +64,19 @@ internal class HistoryViewModel @Inject constructor( } } - private fun handleClickItem(presentationId: Long) { - val pastItems = (currentState as? HistoryUiState.Content)?.currentPageItem(type = HistoryPageType.COMPLETED).orEmpty() - val isPast = pastItems.any { history -> history.presentationId == presentationId } + private fun handleClickItem( + presentationId: Long, + pageType: HistoryPageType, + ) { + val isPast = pageType == HistoryPageType.COMPLETED viewModelScope.launch { - sendEffect(HistoryUiEffect.NavigateToReport(presentationId = presentationId, isPast = isPast)) + sendEffect( + HistoryUiEffect.NavigateToReport( + presentationId = presentationId, + isPast = isPast, + ), + ) } } } diff --git a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/component/HistoryEmptyContent.kt b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/component/HistoryEmptyContent.kt index 38be4caa..19ecf21d 100644 --- a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/component/HistoryEmptyContent.kt +++ b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/component/HistoryEmptyContent.kt @@ -10,6 +10,7 @@ import androidx.compose.ui.unit.dp import com.team.prezel.core.designsystem.component.actions.button.PrezelButton import com.team.prezel.core.designsystem.component.actions.button.config.ButtonSize import com.team.prezel.core.designsystem.component.actions.button.config.ButtonType +import com.team.prezel.core.designsystem.icon.PrezelIcons import com.team.prezel.core.designsystem.preview.BasicPreview import com.team.prezel.core.designsystem.theme.PrezelTheme import com.team.prezel.core.ui.component.StatusView @@ -42,6 +43,7 @@ internal fun HistoryEmptyContent( { PrezelButton( text = stringResource(R.string.feature_history_impl_add_presentation), + iconResId = PrezelIcons.Plus, type = ButtonType.OUTLINED, size = ButtonSize.SMALL, isRounded = true, diff --git a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/component/HistoryPresentationCard.kt b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/component/HistoryPresentationCard.kt index 64e33e44..c6802347 100644 --- a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/component/HistoryPresentationCard.kt +++ b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/component/HistoryPresentationCard.kt @@ -3,13 +3,14 @@ package com.team.prezel.feature.history.impl.component import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.foundation.background +import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -104,13 +105,14 @@ private fun HistoryPresentationCardTitle( } @Composable -@OptIn(ExperimentalLayoutApi::class) private fun HistoryPresentationCardChips( item: HistoryUiModel, modifier: Modifier = Modifier, ) { Row( - modifier = modifier, + modifier = modifier + .fillMaxWidth() + .horizontalScroll(rememberScrollState()), horizontalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V8), verticalAlignment = Alignment.CenterVertically, ) { diff --git a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/contract/HistoryUiIntent.kt b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/contract/HistoryUiIntent.kt index 4f81513a..f233d5ae 100644 --- a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/contract/HistoryUiIntent.kt +++ b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/contract/HistoryUiIntent.kt @@ -1,11 +1,13 @@ package com.team.prezel.feature.history.impl.contract import com.team.prezel.core.ui.base.UiIntent +import com.team.prezel.feature.history.impl.model.HistoryPageType internal sealed interface HistoryUiIntent : UiIntent { data object FetchData : HistoryUiIntent data class ClickItem( val presentationId: Long, + val pageType: HistoryPageType, ) : HistoryUiIntent } diff --git a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/navigation/HistoryEntryBuilder.kt b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/navigation/HistoryEntryBuilder.kt index 6b285d3c..11a40dad 100644 --- a/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/navigation/HistoryEntryBuilder.kt +++ b/Prezel/feature/history/impl/src/main/java/com/team/prezel/feature/history/impl/navigation/HistoryEntryBuilder.kt @@ -19,7 +19,13 @@ internal fun EntryProviderScope.featureHistoryEntryBuilder() { HistoryScreen( navigateToReport = { presentationId, isPast -> - navigator.navigate(ReportNavKey(presentationId = presentationId, isPast = isPast)) + navigator.navigate( + ReportNavKey( + presentationId = presentationId, + isPast = isPast, + showBackButton = true, + ), + ) }, navigateToAnalysis = { navigator.navigate(AnalysisNavKey.Schedule()) diff --git a/Prezel/feature/report/api/src/main/java/com/team/prezel/feature/report/api/ReportNavKey.kt b/Prezel/feature/report/api/src/main/java/com/team/prezel/feature/report/api/ReportNavKey.kt index 5cb4de82..494c8044 100644 --- a/Prezel/feature/report/api/src/main/java/com/team/prezel/feature/report/api/ReportNavKey.kt +++ b/Prezel/feature/report/api/src/main/java/com/team/prezel/feature/report/api/ReportNavKey.kt @@ -7,4 +7,5 @@ import kotlinx.serialization.Serializable data class ReportNavKey( val presentationId: Long, val isPast: Boolean = false, + val showBackButton: Boolean = false, ) : NavKey diff --git a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/navigation/ReportEntryBuilder.kt b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/navigation/ReportEntryBuilder.kt index d7b1f5f4..955537e0 100644 --- a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/navigation/ReportEntryBuilder.kt +++ b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/navigation/ReportEntryBuilder.kt @@ -33,6 +33,7 @@ private fun EntryProviderScope.reportEntry() { AnalysisReportScreen( onBack = { navigator.goBack() }, + showBackButton = key.showBackButton, navigateToAnalysisScript = { presentationId, isPast -> navigator.navigateToAnalysisScript( presentationId = presentationId, diff --git a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/AnalysisReportScreen.kt b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/AnalysisReportScreen.kt index 9e60faa5..3a22a110 100644 --- a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/AnalysisReportScreen.kt +++ b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/AnalysisReportScreen.kt @@ -39,6 +39,7 @@ internal fun AnalysisReportScreen( navigateToSpeechAccuracy: (analysisResultId: Long) -> Unit, navigateToScriptMatch: (analysisResultId: Long) -> Unit, modifier: Modifier = Modifier, + showBackButton: Boolean = false, viewModel: AnalysisReportViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -74,6 +75,7 @@ internal fun AnalysisReportScreen( AnalysisReportScreen( uiState = uiState, + showBackButton = showBackButton, onBackClick = onBack, onDeleteClick = { viewModel.onIntent(AnalysisReportUiIntent.ClickDelete) }, onImprovementCardIndexChange = { index -> viewModel.onIntent(AnalysisReportUiIntent.ClickGrowthGraphItem(index)) }, @@ -104,11 +106,13 @@ internal fun AnalysisReportScreen( onSpeechAccuracyClick: () -> Unit, onScriptMatchClick: () -> Unit, modifier: Modifier = Modifier, + showBackButton: Boolean = false, ) { when (uiState) { is AnalysisReportUiState.Content -> { AnalysisReportScreenContent( uiState = uiState, + showBackButton = showBackButton, onBackClick = onBackClick, onDeleteClick = onDeleteClick, modifier = modifier, @@ -131,6 +135,7 @@ internal fun AnalysisReportScreen( @Composable private fun AnalysisReportScreenContent( uiState: AnalysisReportUiState.Content, + showBackButton: Boolean, onBackClick: () -> Unit, onDeleteClick: () -> Unit, onImprovementCardIndexChange: (index: Int) -> Unit, @@ -154,14 +159,18 @@ private fun AnalysisReportScreenContent( ReportScreenLayout( appBarTitle = uiState.presentationInfo.title, - leadingIcon = { - IconButton(onClick = onBackClick) { - Icon( - painter = painterResource(PrezelIcons.ArrowLeft), - contentDescription = stringResource(R.string.feature_report_impl_back), - tint = PrezelTheme.colors.iconRegular, - ) + leadingIcon = if (showBackButton) { + { + IconButton(onClick = onBackClick) { + Icon( + painter = painterResource(PrezelIcons.ArrowLeft), + contentDescription = stringResource(R.string.feature_report_impl_back), + tint = PrezelTheme.colors.iconRegular, + ) + } } + } else { + {} }, headerContent = { titleModifier -> ReportHeaderContent( diff --git a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/ReportBodyContent.kt b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/ReportBodyContent.kt index ff5a9bd7..78882d40 100644 --- a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/ReportBodyContent.kt +++ b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/ReportBodyContent.kt @@ -62,12 +62,14 @@ internal fun ReportBodyContent( ) GrowthGraphSection( growthGraphData = uiState.growthGraphData, + showReRecordingButton = !uiState.isPast, onCardIndexChange = onImprovementCardIndexChange, onReRecordingClick = onReRecordingClick, ) ScriptAnalysisSection( isWrittenScript = uiState.isScriptWritten, scriptAnalysisGraphData = uiState.scriptAnalysisGraphData, + showReWriteScriptButton = !uiState.isPast, onReWriteScriptClick = onReWriteScriptClick, onScriptAnalysisClick = onScriptAnalysisClick, ) diff --git a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/body/GrowthGraphSection.kt b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/body/GrowthGraphSection.kt index 6bd43026..aa5b4633 100644 --- a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/body/GrowthGraphSection.kt +++ b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/body/GrowthGraphSection.kt @@ -46,11 +46,17 @@ import kotlinx.collections.immutable.persistentListOf @Composable internal fun GrowthGraphSection( growthGraphData: GrowthGraphData, + showReRecordingButton: Boolean = true, onCardIndexChange: (Int) -> Unit, onReRecordingClick: () -> Unit, ) { ReportSection( - title = { GrowthGraphSectionTitle(onReRecordingClick = onReRecordingClick) }, + title = { + GrowthGraphSectionTitle( + showReRecordingButton = showReRecordingButton, + onReRecordingClick = onReRecordingClick, + ) + }, ) { GrowthGraphContent( growthGraphData = growthGraphData, @@ -62,7 +68,10 @@ internal fun GrowthGraphSection( } @Composable -private fun GrowthGraphSectionTitle(onReRecordingClick: () -> Unit) { +private fun GrowthGraphSectionTitle( + showReRecordingButton: Boolean, + onReRecordingClick: () -> Unit, +) { Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, @@ -86,15 +95,17 @@ private fun GrowthGraphSectionTitle(onReRecordingClick: () -> Unit) { ) } } - PrezelButton( - text = stringResource(R.string.feature_report_impl_re_recording), - iconResId = PrezelIcons.Mic, - type = ButtonType.OUTLINED, - size = ButtonSize.XSMALL, - hierarchy = ButtonHierarchy.SECONDARY, - isRounded = true, - onClick = onReRecordingClick, - ) + if (showReRecordingButton) { + PrezelButton( + text = stringResource(R.string.feature_report_impl_re_recording), + iconResId = PrezelIcons.Mic, + type = ButtonType.OUTLINED, + size = ButtonSize.XSMALL, + hierarchy = ButtonHierarchy.SECONDARY, + isRounded = true, + onClick = onReRecordingClick, + ) + } } } diff --git a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/body/ScriptAnalysisSection.kt b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/body/ScriptAnalysisSection.kt index 7493f471..d66a5ba2 100644 --- a/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/body/ScriptAnalysisSection.kt +++ b/Prezel/feature/report/impl/src/main/java/com/team/prezel/feature/report/impl/report/component/body/ScriptAnalysisSection.kt @@ -35,13 +35,14 @@ import kotlinx.collections.immutable.toPersistentMap internal fun ScriptAnalysisSection( isWrittenScript: Boolean, scriptAnalysisGraphData: ScriptAnalysisGraphData, + showReWriteScriptButton: Boolean = true, onReWriteScriptClick: () -> Unit, onScriptAnalysisClick: () -> Unit, ) { ReportSection( title = { ScriptAnalysisSectionTitle( - showReWriteButton = isWrittenScript, + showReWriteButton = isWrittenScript && showReWriteScriptButton, onReWriteScriptClick = onReWriteScriptClick, ) }, @@ -54,24 +55,32 @@ internal fun ScriptAnalysisSection( return@ReportSection } - EmptyStateContent(onReWriteScriptClick = onReWriteScriptClick) + EmptyStateContent( + showWriteScriptButton = showReWriteScriptButton, + onReWriteScriptClick = onReWriteScriptClick, + ) } } @Composable -private fun EmptyStateContent(onReWriteScriptClick: () -> Unit) { +private fun EmptyStateContent( + showWriteScriptButton: Boolean, + onReWriteScriptClick: () -> Unit, +) { EmptyStateCard(text = stringResource(R.string.feature_report_impl_script_analysis_empty_state_message)) - Spacer(modifier = Modifier.height(PrezelTheme.spacing.V16)) + if (showWriteScriptButton) { + Spacer(modifier = Modifier.height(PrezelTheme.spacing.V16)) - PrezelTextButton( - text = stringResource(R.string.feature_report_impl_write_script), - size = ButtonSize.REGULAR, - type = ButtonType.FILLED, - hierarchy = ButtonHierarchy.SECONDARY, - onClick = onReWriteScriptClick, - modifier = Modifier.fillMaxWidth(), - ) + PrezelTextButton( + text = stringResource(R.string.feature_report_impl_write_script), + size = ButtonSize.REGULAR, + type = ButtonType.FILLED, + hierarchy = ButtonHierarchy.SECONDARY, + onClick = onReWriteScriptClick, + modifier = Modifier.fillMaxWidth(), + ) + } } @Composable