d6220b7bd7
- Add Edit icon to PairDetailScreen top bar - Wire onEdit callback through NavGraph to AddPairScreen with pairId - Manual "Sync now" (home card + detail screen) now ignores wifiOnly and chargingOnly constraints so it runs immediately on tap Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
48 lines
1.6 KiB
Kotlin
48 lines
1.6 KiB
Kotlin
package com.syncflow.ui.pairdetail
|
|
|
|
import androidx.lifecycle.SavedStateHandle
|
|
import androidx.lifecycle.ViewModel
|
|
import androidx.lifecycle.viewModelScope
|
|
import androidx.work.WorkManager
|
|
import com.syncflow.data.db.SyncConflictDao
|
|
import com.syncflow.data.db.SyncEventDao
|
|
import com.syncflow.data.db.SyncPairDao
|
|
import com.syncflow.worker.SyncWorker
|
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
|
import kotlinx.coroutines.flow.SharingStarted
|
|
import kotlinx.coroutines.flow.stateIn
|
|
import kotlinx.coroutines.launch
|
|
import javax.inject.Inject
|
|
|
|
@HiltViewModel
|
|
class PairDetailViewModel @Inject constructor(
|
|
private val syncPairDao: SyncPairDao,
|
|
private val eventDao: SyncEventDao,
|
|
private val conflictDao: SyncConflictDao,
|
|
private val workManager: WorkManager,
|
|
savedState: SavedStateHandle,
|
|
) : ViewModel() {
|
|
|
|
private val pairId = savedState.get<Long>("pairId")!!
|
|
|
|
val pair = syncPairDao.observeById(pairId)
|
|
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), null)
|
|
|
|
val events = eventDao.observeRecent(pairId)
|
|
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList())
|
|
|
|
val unresolvedConflicts = conflictDao.observeUnresolvedCount(pairId)
|
|
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), 0)
|
|
|
|
fun syncNow() {
|
|
val p = pair.value ?: return
|
|
workManager.enqueue(SyncWorker.buildOneTimeRequest(p.id, wifiOnly = false, chargingOnly = false))
|
|
}
|
|
|
|
fun delete() {
|
|
viewModelScope.launch {
|
|
pair.value?.let { syncPairDao.delete(it) }
|
|
}
|
|
}
|
|
}
|