From fa55879b4c9afc1f9cead5d3d26f99a0e1459723 Mon Sep 17 00:00:00 2001 From: Sladan Nimcevic Date: Fri, 15 May 2026 15:28:09 +0200 Subject: [PATCH 1/3] Added offset tracking --- .../center/puppyguide/PuppyArticleDestination.kt | 16 +++++++++++++++- .../center/puppyguide/PuppyGuideDestination.kt | 16 ++++++++++++++++ .../help/center/ui/PuppyGuideViewControllers.kt | 4 ++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/feature/feature-help-center/src/commonMain/kotlin/com/hedvig/android/feature/help/center/puppyguide/PuppyArticleDestination.kt b/app/feature/feature-help-center/src/commonMain/kotlin/com/hedvig/android/feature/help/center/puppyguide/PuppyArticleDestination.kt index c070a8213a..d34d29638b 100644 --- a/app/feature/feature-help-center/src/commonMain/kotlin/com/hedvig/android/feature/help/center/puppyguide/PuppyArticleDestination.kt +++ b/app/feature/feature-help-center/src/commonMain/kotlin/com/hedvig/android/feature/help/center/puppyguide/PuppyArticleDestination.kt @@ -23,8 +23,10 @@ import androidx.compose.foundation.layout.windowInsetsTopHeight import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -33,6 +35,7 @@ import androidx.compose.ui.graphics.painter.ColorPainter import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider @@ -65,6 +68,7 @@ internal fun PuppyArticleDestination( viewModel: PuppyArticleViewModel, navigateUp: () -> Unit, imageLoader: ImageLoader, + onScrollOffsetChanged: (Float) -> Unit = {}, ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() PuppyArticleScreen( @@ -77,6 +81,7 @@ internal fun PuppyArticleDestination( onRatingClick = { viewModel.emit(PuppyArticleEvent.RatingClick(it)) }, + onScrollOffsetChanged = onScrollOffsetChanged, ) } @@ -87,6 +92,7 @@ private fun PuppyArticleScreen( onReload: () -> Unit, onRatingClick: (Int) -> Unit, imageLoader: ImageLoader, + onScrollOffsetChanged: (Float) -> Unit, ) { when (uiState) { PuppyArticleUiState.Failure -> HedvigScaffold( @@ -105,6 +111,7 @@ private fun PuppyArticleScreen( navigateUp = navigateUp, imageLoader = imageLoader, onRatingClick = onRatingClick, + onScrollOffsetChanged = onScrollOffsetChanged, ) } } @@ -116,6 +123,7 @@ private fun PuppyArticleSuccessScreen( navigateUp: () -> Unit, onRatingClick: (Int) -> Unit, imageLoader: ImageLoader, + onScrollOffsetChanged: (Float) -> Unit, ) { Surface(color = HedvigTheme.colorScheme.backgroundPrimary) { Column(Modifier.fillMaxSize()) { @@ -130,10 +138,15 @@ private fun PuppyArticleSuccessScreen( val horizontalInsetsPadding = WindowInsets.safeDrawing .only(WindowInsetsSides.Horizontal) .asPaddingValues() + val scrollState = rememberScrollState() + val density = LocalDensity.current + LaunchedEffect(scrollState, density, onScrollOffsetChanged) { + snapshotFlow { with(density) { scrollState.value.toDp().value } }.collect(onScrollOffsetChanged) + } Column( modifier = Modifier .fillMaxWidth() - .verticalScroll(rememberScrollState()) + .verticalScroll(scrollState) .padding(horizontalInsetsPadding) .padding(horizontal = 16.dp), ) { @@ -270,6 +283,7 @@ private fun PuppyArticleScreenPreview( onReload = {}, onRatingClick = {}, imageLoader = rememberPreviewImageLoader(), + onScrollOffsetChanged = {}, ) } } diff --git a/app/feature/feature-help-center/src/commonMain/kotlin/com/hedvig/android/feature/help/center/puppyguide/PuppyGuideDestination.kt b/app/feature/feature-help-center/src/commonMain/kotlin/com/hedvig/android/feature/help/center/puppyguide/PuppyGuideDestination.kt index 168d8bbf37..43df8c32a2 100644 --- a/app/feature/feature-help-center/src/commonMain/kotlin/com/hedvig/android/feature/help/center/puppyguide/PuppyGuideDestination.kt +++ b/app/feature/feature-help-center/src/commonMain/kotlin/com/hedvig/android/feature/help/center/puppyguide/PuppyGuideDestination.kt @@ -26,9 +26,11 @@ import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -38,6 +40,7 @@ import androidx.compose.ui.graphics.painter.ColorPainter import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider @@ -78,6 +81,7 @@ internal fun PuppyGuideDestination( onNavigateUp: () -> Unit, imageLoader: ImageLoader, onNavigateToArticle: (PuppyGuideStory) -> Unit, + onScrollOffsetChanged: (Float) -> Unit = {}, ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -89,6 +93,7 @@ internal fun PuppyGuideDestination( viewModel.emit(PuppyGuideEvent.Reload) }, imageLoader = imageLoader, + onScrollOffsetChanged = onScrollOffsetChanged, ) } @@ -99,6 +104,7 @@ private fun PuppyGuideScreen( onNavigateUp: () -> Unit, reload: () -> Unit, imageLoader: ImageLoader, + onScrollOffsetChanged: (Float) -> Unit, ) { when (uiState) { PuppyGuideUiState.Failure -> HedvigScaffold( @@ -117,6 +123,7 @@ private fun PuppyGuideScreen( onNavigateUp = onNavigateUp, onNavigateToArticle = onNavigateToArticle, imageLoader = imageLoader, + onScrollOffsetChanged = onScrollOffsetChanged, ) } } @@ -128,10 +135,18 @@ private fun PuppyGuideSuccessScreen( onNavigateToArticle: (PuppyGuideStory) -> Unit, onNavigateUp: () -> Unit, imageLoader: ImageLoader, + onScrollOffsetChanged: (Float) -> Unit, ) { val categories = remember(uiState.stories) { uiState.stories.flatMap { it.categories }.toSet().toList() } val listState = rememberLazyListState() val scope = rememberCoroutineScope() + val density = LocalDensity.current + LaunchedEffect(listState, density, onScrollOffsetChanged) { + snapshotFlow { + if (listState.firstVisibleItemIndex > 0) 200f + else with(density) { listState.firstVisibleItemScrollOffset.toDp().value } + }.collect(onScrollOffsetChanged) + } Surface( color = HedvigTheme.colorScheme.backgroundPrimary, @@ -379,6 +394,7 @@ private fun PuppyArticleScreenAnimations( {}, reload = {}, imageLoader = rememberPreviewImageLoader(), + onScrollOffsetChanged = {}, ) } } diff --git a/app/feature/feature-help-center/src/nativeMain/kotlin/com/hedvig/android/feature/help/center/ui/PuppyGuideViewControllers.kt b/app/feature/feature-help-center/src/nativeMain/kotlin/com/hedvig/android/feature/help/center/ui/PuppyGuideViewControllers.kt index 579525c936..3e95454588 100644 --- a/app/feature/feature-help-center/src/nativeMain/kotlin/com/hedvig/android/feature/help/center/ui/PuppyGuideViewControllers.kt +++ b/app/feature/feature-help-center/src/nativeMain/kotlin/com/hedvig/android/feature/help/center/ui/PuppyGuideViewControllers.kt @@ -17,6 +17,7 @@ fun PuppyGuideViewController( onNavigateUp: () -> Unit, onNavigateToArticle: (storyName: String) -> Unit, swipeBackController: IosSwipeBackController, + onScrollOffsetChanged: (Float) -> Unit, ): UIViewController { return HedvigComposeUIViewController(swipeBackController) { val imageLoader = koinInject() @@ -26,6 +27,7 @@ fun PuppyGuideViewController( onNavigateUp = onNavigateUp, imageLoader = imageLoader, onNavigateToArticle = { story -> onNavigateToArticle(story.name) }, + onScrollOffsetChanged = onScrollOffsetChanged, ) } } @@ -35,6 +37,7 @@ fun PuppyArticleViewController( storyName: String, navigateUp: () -> Unit, swipeBackController: IosSwipeBackController, + onScrollOffsetChanged: (Float) -> Unit, ): UIViewController { return HedvigComposeUIViewController(swipeBackController) { val imageLoader = koinInject() @@ -43,6 +46,7 @@ fun PuppyArticleViewController( viewModel = viewModel, navigateUp = navigateUp, imageLoader = imageLoader, + onScrollOffsetChanged = onScrollOffsetChanged, ) } } From 1b01175ef2c51ece05908aec07e88ca68891fa4e Mon Sep 17 00:00:00 2001 From: Sladan Nimcevic Date: Fri, 15 May 2026 15:38:03 +0200 Subject: [PATCH 2/3] Updated umrella --- .github/workflows/umbrella.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/umbrella.yml b/.github/workflows/umbrella.yml index add3e8746d..074268bb78 100644 --- a/.github/workflows/umbrella.yml +++ b/.github/workflows/umbrella.yml @@ -6,6 +6,7 @@ on: - develop - feat/help-center-kmp - feat/puppy-guide-kmp + - feat/puppy-guide-kmp-track-scroll-offset workflow_dispatch: concurrency: From d30c9d59d9c1d6b07927f7fbb027ba0ef1ffe6f6 Mon Sep 17 00:00:00 2001 From: Sladan Nimcevic Date: Tue, 19 May 2026 10:19:11 +0200 Subject: [PATCH 3/3] Removed branch workflow trigger --- .github/workflows/umbrella.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/umbrella.yml b/.github/workflows/umbrella.yml index 074268bb78..add3e8746d 100644 --- a/.github/workflows/umbrella.yml +++ b/.github/workflows/umbrella.yml @@ -6,7 +6,6 @@ on: - develop - feat/help-center-kmp - feat/puppy-guide-kmp - - feat/puppy-guide-kmp-track-scroll-offset workflow_dispatch: concurrency: