package com.syncflow.ui.files import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.syncflow.data.db.SyncFileStateDao import com.syncflow.data.db.SyncPairDao import com.syncflow.data.db.entities.SyncFileStateEntity import com.syncflow.data.db.entities.SyncPairEntity import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.* import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @HiltViewModel class FilesViewModel @Inject constructor( syncPairDao: SyncPairDao, private val fileStateDao: SyncFileStateDao, ) : ViewModel() { val pairs: StateFlow> = syncPairDao.observeAll() .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList()) private val _selectedPairId = MutableStateFlow(null) val selectedPair: StateFlow = combine(_selectedPairId, pairs) { id, list -> list.firstOrNull { it.id == id } ?: list.firstOrNull() }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null) val files: StateFlow> = _selectedPairId .flatMapLatest { id -> if (id == null) pairs.map { it.firstOrNull()?.id }.filterNotNull() .flatMapLatest { fileStateDao.observeForPair(it) } else fileStateDao.observeForPair(id) } .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList()) fun selectPair(id: Long) { _selectedPairId.value = id } }