This commit is contained in:
2026-05-31 06:48:21 +03:00
parent 96ee5ea45e
commit 66deae6fc3
20 changed files with 210 additions and 150 deletions
@@ -9,12 +9,14 @@ import androidx.lifecycle.viewModelScope
import coil.ImageLoader
import coil.request.ImageRequest
import com.conena.nanokt.collections.indexOfFirstOrNull
import dev.meloda.fast.common.NetworkStateListener
import dev.meloda.fast.common.VkConstants
import dev.meloda.fast.common.extensions.createTimerFlow
import dev.meloda.fast.common.extensions.findWithIndex
import dev.meloda.fast.common.extensions.listenValue
import dev.meloda.fast.common.extensions.setValue
import dev.meloda.fast.common.extensions.updateValue
import dev.meloda.fast.common.model.NetworkState
import dev.meloda.fast.convos.model.ConvoDialog
import dev.meloda.fast.convos.model.ConvoIntent
import dev.meloda.fast.convos.model.ConvoNavigationIntent
@@ -31,6 +33,7 @@ import dev.meloda.fast.domain.LongPollEventsHandler
import dev.meloda.fast.domain.MessagesUseCase
import dev.meloda.fast.domain.util.asPresentation
import dev.meloda.fast.domain.util.extractAvatar
import dev.meloda.fast.logger.FastLogger
import dev.meloda.fast.model.ConvosFilter
import dev.meloda.fast.model.InteractionType
import dev.meloda.fast.model.LongPollParsedEvent
@@ -54,7 +57,9 @@ class ConvosViewModel(
private val userSettings: UserSettings,
private val imageLoader: ImageLoader,
private val applicationContext: Context,
private val loadConvosByIdUseCase: LoadConvosByIdUseCase
private val loadConvosByIdUseCase: LoadConvosByIdUseCase,
private val networkStateListener: NetworkStateListener,
private val logger: FastLogger
) : ViewModel() {
private val screenState = MutableStateFlow(ConvosScreenState.EMPTY)
@@ -87,6 +92,16 @@ class ConvosViewModel(
userSettings.useContactNames.listenValue(viewModelScope) {
syncUiConvos()
}
networkStateListener.networkStateFlow.listenValue { state ->
logger.debug(this@ConvosViewModel::class, "network state changed: $state")
if (state == NetworkState.CONNECTED) {
if (screenState.value.error != null) {
onRefresh()
}
}
}
}
fun handleIntent(intent: ConvoIntent) {
@@ -193,12 +208,12 @@ class ConvosViewModel(
loadConvos()
}
private fun onErrorConsumed() {
private fun clearError() {
screenState.updateValue { copy(error = null) }
}
private fun onRefresh() {
onErrorConsumed()
clearError()
loadConvos(offset = 0)
}
@@ -32,6 +32,8 @@ private fun Scope.createConvosViewModel(filter: ConvosFilter): ConvosViewModel {
userSettings = get(),
imageLoader = get(),
applicationContext = get(),
loadConvosByIdUseCase = get()
loadConvosByIdUseCase = get(),
networkStateListener = get(),
logger = get()
)
}
@@ -56,11 +56,13 @@ import dev.chrisbanes.haze.hazeEffect
import dev.chrisbanes.haze.hazeSource
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.materials.HazeMaterials
import dev.meloda.fast.common.model.NetworkState
import dev.meloda.fast.convos.model.ConvoIntent
import dev.meloda.fast.convos.model.ConvosScreenState
import dev.meloda.fast.convos.navigation.ConvoGraph
import dev.meloda.fast.datastore.AppSettings
import dev.meloda.fast.ui.R
import dev.meloda.fast.ui.common.LocalNetworkState
import dev.meloda.fast.ui.components.FullScreenContainedLoader
import dev.meloda.fast.ui.components.NoItemsView
import dev.meloda.fast.ui.components.SegmentedButtonItem
@@ -156,6 +158,8 @@ fun ConvosScreen(
animationSpec = tween(durationMillis = 50)
)
val networkState = LocalNetworkState.current
Scaffold(
modifier = Modifier.fillMaxSize(),
contentWindowInsets = WindowInsets.statusBars,
@@ -166,6 +170,7 @@ fun ConvosScreen(
Text(
text = stringResource(
id = when {
networkState == NetworkState.DISCONNECTED -> R.string.title_no_network
screenState.isLoading -> R.string.title_loading
isArchive -> R.string.title_archive
else -> R.string.title_convos