NTP-66546 | State persistence in chunked widgets (#16257)

This commit is contained in:
Naman Khurmi
2025-05-22 01:31:58 +05:30
committed by GitHub
parent f6f898a7ac
commit b129735575
2 changed files with 27 additions and 10 deletions

View File

@@ -36,10 +36,8 @@ import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
@@ -250,7 +248,10 @@ private fun ChunkedWidgetRenderer(
onEvent: (event: HpEvents) -> Unit,
firstChunkSize: Int = 2,
) {
var displayedCount by remember { mutableIntStateOf(0) }
if (elementList.isEmpty()) return
val displayedCount = homeVM().widgetsDisplayed.coerceAtMost(elementList.size)
val delayBetweenChunks = remember {
FirebaseRemoteConfigHelper.getLong(
FirebaseRemoteConfigHelper.HOMEPAGE_WIDGET_RENDER_DELAY_MS,
@@ -259,14 +260,20 @@ private fun ChunkedWidgetRenderer(
}
LaunchedEffect(elementList) {
withContext(Dispatchers.Default) {
displayedCount = displayedCount.coerceAtMost(elementList.size)
var nextChunk = if (displayedCount == 0) firstChunkSize else 1
while (displayedCount < elementList.size) {
displayedCount = (displayedCount + nextChunk).coerceAtMost(elementList.size)
nextChunk += 1
delay(delayBetweenChunks)
if (displayedCount < elementList.size) {
withContext(Dispatchers.Default) {
var nextChunk = if (displayedCount == 0) firstChunkSize else 1
while (displayedCount < elementList.size) {
homeVM()
.updateDisplayedWidgetCount(
(displayedCount + nextChunk).coerceAtMost(elementList.size)
)
nextChunk += 1
delay(delayBetweenChunks)
}
}
} else {
homeVM().updateDisplayedWidgetCount(elementList.size)
}
}

View File

@@ -8,6 +8,9 @@
package com.naviapp.home.viewmodel
import android.content.Context
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.viewModelScope
import com.navi.analytics.utils.NaviTrackEvent
import com.navi.base.cache.model.NaviCacheAltSourceEntity
@@ -107,6 +110,13 @@ constructor(
private val _internetConnectivity = MutableSharedFlow<ConnectivityObserver.Status>()
val internetConnectivity: SharedFlow<ConnectivityObserver.Status> = _internetConnectivity
var widgetsDisplayed by mutableIntStateOf(0)
private set
fun updateDisplayedWidgetCount(count: Int) {
widgetsDisplayed = count
}
private val _delayedRenderingConfig: MutableStateFlow<RenderingConfig?> = MutableStateFlow(null)
val delayedRenderingConfig = _delayedRenderingConfig.asStateFlow()