Coverage Summary for Class: SyncStatusProviderKt (com.georgeci.moneysurfer.navigation)

Class Method, % Branch, % Line, % Instruction, %
SyncStatusProviderKt 0% (0/4) 7.1% (2/28) 0% (0/16) 0% (0/262)
SyncStatusProviderKt$SyncStatusProvider$statusFlow$1$1 0% (0/1) 0% (0/1) 0% (0/3)
Total 0% (0/5) 7.1% (2/28) 0% (0/17) 0% (0/265)


 package com.georgeci.moneysurfer.navigation
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.remember
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.georgeci.moneysurfer.sync.api.LastSyncOutcome
 import com.georgeci.moneysurfer.sync.api.SyncState
 import com.georgeci.moneysurfer.sync.coordinator.SyncCoordinator
 import com.georgeci.moneysurfer.uikit.components.base.LocalSurferSyncStatus
 import com.georgeci.moneysurfer.uikit.components.base.SurferSyncStatus
 import kotlinx.coroutines.flow.combine
 import org.koin.compose.koinInject
 
 /**
  * Single ambient bridge that maps [SyncCoordinator] live state into
  * [LocalSurferSyncStatus]. Wrap once near the root of the UI tree — every
  * `SurferToolbar` underneath then renders the indicator without any per-screen
  * plumbing.
  *
  * Lives next to [AppNavGraph] so `:uikit` stays free of sync-layer types.
  */
 @Composable
 fun SyncStatusProvider(
     coordinator: SyncCoordinator = koinInject(),
     content: @Composable () -> Unit,
 ) {
     val statusFlow = remember(coordinator) {
         combine(coordinator.state, coordinator.lastOutcome) { state, outcome ->
             toSurferStatus(state, outcome)
         }
     }
     val status by statusFlow.collectAsStateWithLifecycle(initialValue = SurferSyncStatus.Hidden)
 
     CompositionLocalProvider(LocalSurferSyncStatus provides status) {
         content()
     }
 }
 
 private fun toSurferStatus(state: SyncState, outcome: LastSyncOutcome): SurferSyncStatus =
     when (state) {
         is SyncState.Running, is SyncState.Queued -> SurferSyncStatus.Syncing
         SyncState.Idle -> when (outcome) {
             is LastSyncOutcome.Success -> SurferSyncStatus.Synced
             is LastSyncOutcome.Failed -> SurferSyncStatus.Failed
             LastSyncOutcome.None, is LastSyncOutcome.Cancelled -> SurferSyncStatus.Hidden
         }
     }