diff --git a/.idea/compiler.xml b/.idea/compiler.xml index fb7f4a8a..357fd146 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,13 @@ - + + + + + + + + \ No newline at end of file diff --git a/core/ui/src/main/java/ru/yeahub/core_ui/component/PopoverQuestion.kt b/core/ui/src/main/java/ru/yeahub/core_ui/component/PopoverQuestion.kt index e75bccb9..25515fec 100644 --- a/core/ui/src/main/java/ru/yeahub/core_ui/component/PopoverQuestion.kt +++ b/core/ui/src/main/java/ru/yeahub/core_ui/component/PopoverQuestion.kt @@ -104,38 +104,39 @@ fun PopoverQuestion( verticalArrangement = Arrangement.spacedBy(rowSpacing), ) { // Первый ряд: Изучить, Повторить, Избранное - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceEvenly - ) { - IconWithText( - iconResId = R.drawable.student, - text = stringResource(R.string.learn), - contentDescription = stringResource(R.string.learn), - isClickable = onLearnClick != null, - onItemClickListener = { onLearnClick?.invoke() }, - screenWidth = screenWidth - ) - IconWithText( - iconResId = R.drawable.clockcounterclockwise, - text = stringResource(R.string.repeat), - contentDescription = stringResource(R.string.repeat), - isClickable = onRepeatClick != null, - onItemClickListener = { onRepeatClick?.invoke() }, - screenWidth = screenWidth - ) - IconWithText( - iconResId = getFavoriteIconRes(favoriteState), - text = stringResource(R.string.favorite), - contentDescription = stringResource(R.string.favorite), - isClickable = favoriteState.isClickable, - iconColor = getFavoriteIconColor(favoriteState), - textColor = getFavoriteTextColor(favoriteState), - onItemClickListener = { onFavoriteClick?.invoke() }, - screenWidth = screenWidth - ) + if (false) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceEvenly, + ) { + IconWithText( + iconResId = R.drawable.student, + text = stringResource(R.string.learn), + contentDescription = stringResource(R.string.learn), + isClickable = onLearnClick != null, + onItemClickListener = { onLearnClick?.invoke() }, + screenWidth = screenWidth + ) + IconWithText( + iconResId = R.drawable.clockcounterclockwise, + text = stringResource(R.string.repeat), + contentDescription = stringResource(R.string.repeat), + isClickable = onRepeatClick != null, + onItemClickListener = { onRepeatClick?.invoke() }, + screenWidth = screenWidth + ) + IconWithText( + iconResId = getFavoriteIconRes(favoriteState), + text = stringResource(R.string.favorite), + contentDescription = stringResource(R.string.favorite), + isClickable = favoriteState.isClickable, + iconColor = getFavoriteIconColor(favoriteState), + textColor = getFavoriteTextColor(favoriteState), + onItemClickListener = { onFavoriteClick?.invoke() }, + screenWidth = screenWidth + ) + } } - // Второй ряд: Назад, Вперед Row( modifier = Modifier.fillMaxWidth(), diff --git a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/DetailQuestionFeatureImpl.kt b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/DetailQuestionFeatureImpl.kt index a0ffa6f9..7b8b0e68 100644 --- a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/DetailQuestionFeatureImpl.kt +++ b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/DetailQuestionFeatureImpl.kt @@ -13,6 +13,7 @@ import ru.yeahub.detail_question.impl.presentation.view.DetailQuestionScreen import ru.yeahub.navigation_api.FeatureApi import ru.yeahub.navigation_api.FeatureRoute import ru.yeahub.navigation_api.NavigationPathManager +import timber.log.Timber class DetailQuestionFeatureImpl : FeatureApi { @@ -28,50 +29,111 @@ class DetailQuestionFeatureImpl : FeatureApi { ) { val detailQuestionRoute = pathManager.createParametrizedPath( featureName = getFeatureName(), - "questionId" + "questionIds", + "currentIndex" ) navGraphBuilder.composable( route = detailQuestionRoute, arguments = listOf( - navArgument("questionId") { type = NavType.LongType } + navArgument("questionIds") { type = NavType.StringType }, + navArgument("currentIndex") { type = NavType.IntType } ) ) { backStackEntry -> - val questionId = backStackEntry.arguments?.getLong("questionId") ?: 0L + val questionIdsString = backStackEntry.arguments?.getString("questionIds") ?: "" + val questionIds = questionIdsString.split(",").map { it.toLongOrNull() ?: 0L } + val currentIndex = backStackEntry.arguments?.getInt("currentIndex") ?: 0 + val currentQuestionId = questionIds.getOrNull(currentIndex) ?: 0L + + // Извлекаем родительский путь из текущего маршрута, а не из pathManager + val currentRoute = backStackEntry.destination.route ?: "" + val parentPathFromRoute = extractParentPath(currentRoute) + + Timber.tag("DetailQuestionFeature") + .d("Current route: $currentRoute, Parent path: $parentPathFromRoute") + DetailQuestionScreen( onResult = { result -> when (result) { - DetailQuestionResult.BackClick -> handleBackNavigation( - pathManager, - navController - ) + is DetailQuestionResult.BackClick -> handleBackNavigation(navController) + is DetailQuestionResult.UrlClick -> { val intent = Intent(Intent.ACTION_VIEW, result.url.toUri()) navController.context.startActivity(intent) } + + is DetailQuestionResult.NavigateToQuestion -> handleQuestionNavigation( + navController, + questionIds, + result.newIndex, + parentPathFromRoute + ) } }, - questionId = questionId + questionId = currentQuestionId, + questionIds = questionIds, + currentIndex = currentIndex ) } } } private fun handleBackNavigation( - pathManager: NavigationPathManager, navController: NavHostController ) { - val parentPath = pathManager.getParentPath() - - pathManager.setCurrentPath(parentPath) + // Используем navigateUp для возврата на предыдущий экран (список вопросов) + Timber.tag("DetailQuestion") + .d("handleBackNavigation: Using navigateUp to return to questions list") + navController.navigateUp() +} - if (parentPath.isEmpty()) { - navController.navigateUp() +private fun handleQuestionNavigation( + navController: NavHostController, + questionIds: List, + newIndex: Int, + parentPath: String +) { + val questionIdsParam = questionIds.joinToString(",") + val concretePath = if (parentPath.isEmpty()) { + "${FeatureRoute.DetailQuestionFeature.FEATURE_NAME}/$questionIdsParam/$newIndex" } else { - navController.navigate(parentPath) { - popUpTo(parentPath) { + "$parentPath/${FeatureRoute.DetailQuestionFeature.FEATURE_NAME}/$questionIdsParam/$newIndex" + } + + Timber.tag("DetailQuestionFeature") + .d("Navigating to: $concretePath (parent: $parentPath)") + + // Получаем текущий маршрут из стека для popUpTo + val currentRoute = navController.currentBackStackEntry?.destination?.route + + navController.navigate(concretePath) { + // Удаляем текущий экран детального вопроса из стека + if (currentRoute != null) { + popUpTo(currentRoute) { inclusive = true } } + // Предотвращаем создание нескольких копий одного экрана + launchSingleTop = true + } +} + +/** + * Извлекает родительский путь из текущего маршрута. + * Например, из "questions/detail_question/{questionIds}/{currentIndex}" + * извлечет "questions" + */ +private fun extractParentPath(route: String): String { + if (route.isEmpty()) return "" + + // Удаляем параметры маршрута (все что после /) + val featureName = FeatureRoute.DetailQuestionFeature.FEATURE_NAME + val featureIndex = route.indexOf(featureName) + + return if (featureIndex > 0) { + // Возвращаем все до имени фичи detail_question (без последнего /) + route.substring(0, featureIndex - 1) + } else { + "" } } \ No newline at end of file diff --git a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionCommand.kt b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionCommand.kt index 7870d0a4..0fd5dec9 100644 --- a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionCommand.kt +++ b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionCommand.kt @@ -3,4 +3,5 @@ package ru.yeahub.detail_question.impl.presentation.intents internal sealed class DetailQuestionCommand { data object NavigateBack : DetailQuestionCommand() data class OpenUrl(val url: String) : DetailQuestionCommand() + data class NavigateToQuestion(val newIndex: Int) : DetailQuestionCommand() } \ No newline at end of file diff --git a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionEvent.kt b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionEvent.kt index e6cbb684..fa0a549c 100644 --- a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionEvent.kt +++ b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionEvent.kt @@ -5,4 +5,6 @@ internal sealed class DetailQuestionEvent { data object OnBackClick : DetailQuestionEvent() data class OnTelegramClick(val url: String) : DetailQuestionEvent() data class OnYoutubeClick(val url: String) : DetailQuestionEvent() + data class OnPreviousQuestionClick(val currentQuestionId: Long) : DetailQuestionEvent() + data class OnNextQuestionClick(val currentQuestionId: Long) : DetailQuestionEvent() } \ No newline at end of file diff --git a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionResult.kt b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionResult.kt index 73b06bf9..31dd389a 100644 --- a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionResult.kt +++ b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/intents/DetailQuestionResult.kt @@ -3,4 +3,5 @@ package ru.yeahub.detail_question.impl.presentation.intents sealed class DetailQuestionResult { data object BackClick : DetailQuestionResult() data class UrlClick(val url: String) : DetailQuestionResult() + data class NavigateToQuestion(val newIndex: Int) : DetailQuestionResult() } \ No newline at end of file diff --git a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/view/DetailQuestionScreen.kt b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/view/DetailQuestionScreen.kt index 6d0e4c42..7c53d902 100644 --- a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/view/DetailQuestionScreen.kt +++ b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/view/DetailQuestionScreen.kt @@ -47,17 +47,24 @@ const val ELLIPSIS_LENGTH = 3 @Composable fun DetailQuestionScreen( onResult: (DetailQuestionResult) -> Unit, - questionId: Long + questionId: Long, + questionIds: List, + currentIndex: Int = 0 ) { val viewModel: DetailQuestionViewModel = koinViewModel() - LaunchedEffect(Unit) { + LaunchedEffect(questionId) { viewModel.handleEvents(DetailQuestionEvent.LoadQuestion(questionId)) } DetailQuestionScreenView( onBackClick = { viewModel.handleEvents(DetailQuestionEvent.OnBackClick) }, - viewModel = viewModel + viewModel = viewModel, + questionIds = questionIds, + currentIndex = currentIndex, + onNavigateToQuestion = { newIndex -> + onResult(DetailQuestionResult.NavigateToQuestion(newIndex)) + } ) HandleCommands(viewModel.commands, onResult) @@ -71,8 +78,11 @@ internal fun HandleCommands( LaunchedEffect(Unit) { commands.collect { command -> when (command) { - DetailQuestionCommand.NavigateBack -> onResult(DetailQuestionResult.BackClick) + is DetailQuestionCommand.NavigateBack -> onResult(DetailQuestionResult.BackClick) is DetailQuestionCommand.OpenUrl -> onResult(DetailQuestionResult.UrlClick(command.url)) + is DetailQuestionCommand.NavigateToQuestion -> onResult( + DetailQuestionResult.NavigateToQuestion(command.newIndex) + ) } } } @@ -82,9 +92,14 @@ internal fun HandleCommands( @Composable fun DetailQuestionScreenView( onBackClick: () -> Unit, - viewModel: DetailQuestionViewModel + viewModel: DetailQuestionViewModel, + questionIds: List, + currentIndex: Int = 0, + onNavigateToQuestion: (Int) -> Unit = {} ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() + val hasPrevious = currentIndex > 0 + val hasNext = currentIndex < questionIds.size - 1 val configuration = LocalConfiguration.current val isLandscape = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE Scaffold( @@ -137,6 +152,16 @@ fun DetailQuestionScreenView( ) } }, + onPreviousQuestionClick = { + if (hasPrevious) { + onNavigateToQuestion(currentIndex - 1) + } + }, + onNextQuestionClick = { + if (hasNext) { + onNavigateToQuestion(currentIndex + 1) + } + }, padding = PaddingValues( top = paddingValues.calculateTopPadding() ) @@ -150,6 +175,8 @@ fun DetailQuestionScreenState( onBackClick: () -> Unit, onTelegramClick: () -> Unit, onYoutubeClick: () -> Unit, + onPreviousQuestionClick: () -> Unit, + onNextQuestionClick: () -> Unit, padding: PaddingValues ) { when (uiState) { @@ -158,6 +185,8 @@ fun DetailQuestionScreenState( uiState.data, onTelegramClick, onYoutubeClick, + onPreviousQuestionClick, + onNextQuestionClick, padding, TextOrResource.Resource(R.string.guru_description_text) ) @@ -286,7 +315,9 @@ fun StatesDetailQuestionPreview(params: DetailQuestionScreenStateParams) { padding = params.padding, onTelegramClick = {}, onYoutubeClick = {}, - onBackClick = {} + onBackClick = {}, + onPreviousQuestionClick = {}, + onNextQuestionClick = {} ) } @@ -396,5 +427,6 @@ fun DetailQuestionScreenDynamicPreview() { DetailQuestionScreenView( onBackClick = {}, viewModel = mockViewModel, + questionIds = emptyList() ) } \ No newline at end of file diff --git a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/view/QuestionContent.kt b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/view/QuestionContent.kt index 922de7c4..20369dc3 100644 --- a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/view/QuestionContent.kt +++ b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/view/QuestionContent.kt @@ -18,8 +18,10 @@ import androidx.compose.ui.unit.dp import ru.yeahub.core_ui.component.DetailHeaderQuestion import ru.yeahub.core_ui.component.DetailedQuestionAnswer import ru.yeahub.core_ui.component.DetailedQuestionAnswerBlock +import ru.yeahub.core_ui.component.FavoriteState import ru.yeahub.core_ui.component.GuruCard import ru.yeahub.core_ui.component.GuruData +import ru.yeahub.core_ui.component.PopoverQuestion import ru.yeahub.core_ui.component.ShortQuestionAnswer import ru.yeahub.core_ui.example.staticPreview.StaticPreview import ru.yeahub.core_utils.common.TextOrResource @@ -34,6 +36,8 @@ fun QuestionContent( question: DetailQuestionState.Success.PublicQuestionVO, onTelegramClick: () -> Unit, onYoutubeClick: () -> Unit, + onPreviousQuestionClick: () -> Unit, + onNextQuestionClick: () -> Unit, padding: PaddingValues, guruDescriptionText: TextOrResource ) { @@ -62,6 +66,18 @@ fun QuestionContent( ) } } + item { + PopoverQuestion( + onLearnClick = null, + onRepeatClick = null, + onFavoriteClick = null, + onPreviousClick = onPreviousQuestionClick, + onNextClick = onNextQuestionClick, + favoriteState = FavoriteState.DISABLED, + modifier = Modifier + .padding(start = 16.dp, end = 16.dp, bottom = 20.dp) + ) + } item { Box( modifier = Modifier @@ -374,6 +390,8 @@ fun StatesQuestionContentPreview(params: QuestionContentParams) { padding = params.padding, guruDescriptionText = TextOrResource.Text("Guru – это эксперты YeaHub, которые помогают развивать комьюнити."), onTelegramClick = {}, - onYoutubeClick = {} + onYoutubeClick = {}, + onPreviousQuestionClick = {}, + onNextQuestionClick = {} ) } \ No newline at end of file diff --git a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/viewmodel/DetailQuestionViewModel.kt b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/viewmodel/DetailQuestionViewModel.kt index 4163a742..9caff41a 100644 --- a/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/viewmodel/DetailQuestionViewModel.kt +++ b/feature/detail-question/impl/src/main/java/ru/yeahub/detail_question/impl/presentation/viewmodel/DetailQuestionViewModel.kt @@ -26,9 +26,11 @@ class DetailQuestionViewModel( internal fun handleEvents(event: DetailQuestionEvent) { when (event) { is DetailQuestionEvent.LoadQuestion -> getQuestionById(event.id) - DetailQuestionEvent.OnBackClick -> handleBackClick() + is DetailQuestionEvent.OnBackClick -> handleBackClick() is DetailQuestionEvent.OnTelegramClick -> handleTelegramClick(event.url) is DetailQuestionEvent.OnYoutubeClick -> handleYoutubeClick(event.url) + is DetailQuestionEvent.OnPreviousQuestionClick -> handlePreviousQuestionClick(event.currentQuestionId) + is DetailQuestionEvent.OnNextQuestionClick -> handleNextQuestionClick(event.currentQuestionId) } } @@ -62,4 +64,18 @@ class DetailQuestionViewModel( _commands.emit(DetailQuestionCommand.OpenUrl(url)) } } + + private fun handlePreviousQuestionClick(currentQuestionId: Long) { + viewModelScopeSafe.launch { + val previousQuestionId = if (currentQuestionId > 1) currentQuestionId - 1 else currentQuestionId + _commands.emit(DetailQuestionCommand.NavigateToQuestion(previousQuestionId.toInt())) + } + } + + private fun handleNextQuestionClick(currentQuestionId: Long) { + viewModelScopeSafe.launch { + val nextQuestionId = currentQuestionId + 1 + _commands.emit(DetailQuestionCommand.NavigateToQuestion(nextQuestionId.toInt())) + } + } } \ No newline at end of file diff --git a/feature/public-collections/impl/src/main/java/ru/yeahub/public_collections/PublicCollectionsFeatureImpl.kt b/feature/public-collections/impl/src/main/java/ru/yeahub/public_collections/PublicCollectionsFeatureImpl.kt index ac02565f..74e0b1b2 100644 --- a/feature/public-collections/impl/src/main/java/ru/yeahub/public_collections/PublicCollectionsFeatureImpl.kt +++ b/feature/public-collections/impl/src/main/java/ru/yeahub/public_collections/PublicCollectionsFeatureImpl.kt @@ -49,7 +49,6 @@ class PublicCollectionsFeatureImpl : FeatureApi { ) is PublicCollectionsScreenResult.NavigateToQuestions -> handleQuestionsNavigation( - pathManager, navController, result.collectionId.toString(), result.title, @@ -64,7 +63,6 @@ class PublicCollectionsFeatureImpl : FeatureApi { } private fun handleQuestionsNavigation( - pathManager: NavigationPathManager, navController: NavHostController, collectionId: String, title: String, diff --git a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/PublicQuestionsFeatureImpl.kt b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/PublicQuestionsFeatureImpl.kt index bbf7780b..c0920870 100644 --- a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/PublicQuestionsFeatureImpl.kt +++ b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/PublicQuestionsFeatureImpl.kt @@ -76,12 +76,13 @@ class PublicQuestionsFeatureImpl : FeatureApi { ) is PublicQuestionsResult.NavigateToDetail -> { - val detailRout = + val questionIdsParam = result.questionIds.joinToString(",") + val detailRoute = "$currentTabPrefix/" + FeatureRoute.DetailQuestionFeature - .FEATURE_NAME + "/" + result.id + .FEATURE_NAME + "/" + questionIdsParam + "/" + result.currentIndex Timber.tag("Test") - .d("PublicQuestionsFeatureImpl registerGraph: $detailRout") - navController.navigate(detailRout) + .d("PublicQuestionsFeatureImpl registerGraph: $detailRoute") + navController.navigate(detailRoute) } } }, @@ -90,7 +91,7 @@ class PublicQuestionsFeatureImpl : FeatureApi { idSpecialization = idSpecialization, ) Timber.tag("Test12") - .d(" Title - $tittleTopAppBar idColection - $idCollection idSpec - $idSpecialization") + .d(" Title - $tittleTopAppBar idCollection - $idCollection idSpec - $idSpecialization") } } diff --git a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsResult.kt b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsResult.kt index 60f4f4f0..fdfefb1a 100644 --- a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsResult.kt +++ b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsResult.kt @@ -2,5 +2,8 @@ package ru.yeahub.public_questions.impl.presentation.intents sealed class PublicQuestionsResult { data object NavigateBack : PublicQuestionsResult() - data class NavigateToDetail(val id: String) : PublicQuestionsResult() + data class NavigateToDetail( + val questionIds: List, + val currentIndex: Int + ) : PublicQuestionsResult() } \ No newline at end of file diff --git a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsScreenCommand.kt b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsScreenCommand.kt index a94c7774..926680fa 100644 --- a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsScreenCommand.kt +++ b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsScreenCommand.kt @@ -2,5 +2,8 @@ package ru.yeahub.public_questions.impl.presentation.intents sealed class PublicQuestionsScreenCommand { data object OnBackClick : PublicQuestionsScreenCommand() - data class OnMoreClick(val id: String) : PublicQuestionsScreenCommand() + data class OnMoreClick( + val questionIds: List, + val currentIndex: Int + ) : PublicQuestionsScreenCommand() } \ No newline at end of file diff --git a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsScreenEvent.kt b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsScreenEvent.kt index d47b7609..ae735df0 100644 --- a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsScreenEvent.kt +++ b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/intents/PublicQuestionsScreenEvent.kt @@ -16,7 +16,10 @@ sealed class PublicQuestionsScreenEvent { /** Клик по карточке вопроса(подробнее) */ - data class OnMoreClick(val id: String) : PublicQuestionsScreenEvent() + data class OnMoreClick( + val questionIds: List, + val currentIndex: Int + ) : PublicQuestionsScreenEvent() /** Клик назад */ diff --git a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/screen/PublicQuestionsScreen.kt b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/screen/PublicQuestionsScreen.kt index e304679d..d678d981 100644 --- a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/screen/PublicQuestionsScreen.kt +++ b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/screen/PublicQuestionsScreen.kt @@ -119,10 +119,11 @@ fun PublicQuestionsScreen( listState = lazyListState, onRetryLoadInitial = { viewModel.onEvent(PublicQuestionsScreenEvent.LoadInitial) }, nameQuestions = tittleTopAppBar, - onMoreCLick = { id -> + onMoreCLick = { questionIds, currentIndex -> viewModel.onEvent( PublicQuestionsScreenEvent.OnMoreClick( - id = id + questionIds = questionIds, + currentIndex = currentIndex ) ) } @@ -142,7 +143,12 @@ fun HandlePublicQuestionsCommand( .collect { command -> when (command) { is PublicQuestionsScreenCommand.OnMoreClick -> { - onResult(PublicQuestionsResult.NavigateToDetail(command.id)) + onResult( + PublicQuestionsResult.NavigateToDetail( + questionIds = command.questionIds, + currentIndex = command.currentIndex + ) + ) } PublicQuestionsScreenCommand.OnBackClick -> { @@ -158,7 +164,7 @@ private fun PublicQuestionsContent( modifier: Modifier = Modifier, padding: PaddingValues, nameQuestions: String, - onMoreCLick: (id: String) -> Unit, + onMoreCLick: (questionIds: List, currentIndex: Int) -> Unit, screenState: PublicQuestionsScreenState, listState: LazyListState, onRetryLoadInitial: () -> Unit, @@ -181,6 +187,7 @@ private fun PublicQuestionsContent( onRetry = onRetryLoadInitial ) } else { + val questionIds = screenState.questions.map { it.id } QuestionsListWithFooter( padding = padding, listState = listState, @@ -190,7 +197,7 @@ private fun PublicQuestionsContent( paginationError = screenState.throwable, onRetryPagination = { onRetryLoadInitial() }, nameQuestion = nameQuestions, - onMoreCLick = { id -> onMoreCLick(id) } + onMoreCLick = { currentIndex -> onMoreCLick(questionIds, currentIndex) } ) } } @@ -201,6 +208,7 @@ private fun PublicQuestionsContent( ) { EmptyState() } else { + val questionIds = screenState.questions.map { it.id } QuestionsListWithFooter( padding = padding, listState = listState, @@ -210,7 +218,7 @@ private fun PublicQuestionsContent( paginationError = null, onRetryPagination = { onRetryLoadInitial() }, nameQuestion = nameQuestions, - onMoreCLick = { id -> onMoreCLick(id) }, + onMoreCLick = { currentIndex -> onMoreCLick(questionIds, currentIndex) }, ) } } @@ -270,7 +278,7 @@ private fun QuestionsListWithFooter( isEndReached: Boolean, isLoadingNextPage: Boolean, paginationError: Throwable?, - onMoreCLick: (id: String) -> Unit, + onMoreCLick: (currentIndex: Int) -> Unit, onRetryPagination: () -> Unit, ) { LazyColumn( @@ -293,9 +301,10 @@ private fun QuestionsListWithFooter( items = questions, key = { question -> question.id } ) { question -> + val currentIndex = questions.indexOf(question) PublicQuestionsItem( questions = question, - onClickMore = { id -> onMoreCLick(id) } + onClickMore = { onMoreCLick(currentIndex) } ) } } diff --git a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/viewmodel/PublicQuestionsViewModel.kt b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/viewmodel/PublicQuestionsViewModel.kt index b66b1e5e..7aefa2a9 100644 --- a/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/viewmodel/PublicQuestionsViewModel.kt +++ b/feature/public-questions/impl/src/main/java/ru/yeahub/public_questions/impl/presentation/viewmodel/PublicQuestionsViewModel.kt @@ -109,7 +109,10 @@ class PublicQuestionsViewModel( is PublicQuestionsScreenEvent.LoadInitial -> loadInitial() is PublicQuestionsScreenEvent.LoadNextPage -> loadNextPage() is PublicQuestionsScreenEvent.Refresh -> refresh() - is PublicQuestionsScreenEvent.OnMoreClick -> onMoreClick(event.id) + is PublicQuestionsScreenEvent.OnMoreClick -> onMoreClick( + event.questionIds, + event.currentIndex + ) is PublicQuestionsScreenEvent.OnBackClick -> onBackClick() } } @@ -137,9 +140,9 @@ class PublicQuestionsViewModel( } } - private fun onMoreClick(id: String) { + private fun onMoreClick(questionIds: List, currentIndex: Int) { viewModelScopeSafe.launch(Dispatchers.IO) { - _commandState.emit(PublicQuestionsScreenCommand.OnMoreClick(id)) + _commandState.emit(PublicQuestionsScreenCommand.OnMoreClick(questionIds, currentIndex)) } }