66 lines
No EOL
2.5 KiB
Kotlin
66 lines
No EOL
2.5 KiB
Kotlin
package com.pixelized.desktop.lwa
|
|
|
|
import androidx.lifecycle.ViewModel
|
|
import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository
|
|
import com.pixelized.desktop.lwa.repository.campaign.CampaignRepository
|
|
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository
|
|
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
|
|
import com.pixelized.desktop.lwa.repository.settings.SettingsRepository
|
|
import com.pixelized.desktop.lwa.repository.tag.TagRepository
|
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|
import kotlinx.coroutines.coroutineScope
|
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
|
import kotlinx.coroutines.flow.filter
|
|
import kotlinx.coroutines.flow.flatMapLatest
|
|
import kotlinx.coroutines.flow.launchIn
|
|
import kotlinx.coroutines.flow.map
|
|
import kotlinx.coroutines.flow.onEach
|
|
|
|
class DataSyncViewModel(
|
|
private val characterRepository: CharacterSheetRepository,
|
|
private val alterationRepository: AlterationRepository,
|
|
private val campaignRepository: CampaignRepository,
|
|
private val tagRepository: TagRepository,
|
|
private val settingsRepository: SettingsRepository,
|
|
private val networkRepository: NetworkRepository,
|
|
) : ViewModel() {
|
|
|
|
fun autoConnect() {
|
|
val settings = settingsRepository.settings()
|
|
|
|
if (settings.playerName.isEmpty()) return
|
|
|
|
networkRepository.connect(
|
|
host = settings.network.host,
|
|
port = settings.network.port,
|
|
)
|
|
}
|
|
|
|
@OptIn(ExperimentalCoroutinesApi::class)
|
|
suspend fun synchronise() = coroutineScope {
|
|
|
|
networkRepository.status
|
|
.filter { status -> status == NetworkRepository.Status.CONNECTED }
|
|
.onEach {
|
|
tagRepository.updateAlterationTags()
|
|
alterationRepository.updateAlterations()
|
|
tagRepository.updateCharacterTags()
|
|
characterRepository.updateCharacterPreviews()
|
|
campaignRepository.updateCampaign()
|
|
}
|
|
.launchIn(this)
|
|
|
|
networkRepository.status
|
|
.filter { status -> status == NetworkRepository.Status.CONNECTED }
|
|
.flatMapLatest { campaignRepository.campaignFlow.map { it.instances } }
|
|
.distinctUntilChanged()
|
|
.onEach { instances ->
|
|
instances.forEach { characterSheetId ->
|
|
characterRepository.updateCharacterSheet(
|
|
characterSheetId = characterSheetId,
|
|
)
|
|
}
|
|
}
|
|
.launchIn(this)
|
|
}
|
|
} |