diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt index ffd84cd..c863b82 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt @@ -58,7 +58,7 @@ class DataSyncViewModel( networkRepository.status .filter { status -> status == NetworkRepository.Status.CONNECTED } - .flatMapLatest { campaignRepository.campaignFlow.map { it.instances } } + .flatMapLatest { campaignRepository.campaignFlow().map { it.instances } } .distinctUntilChanged() .onEach { instances -> instances.forEach { characterSheetId -> diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt index 78a1ae0..c144324 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt @@ -33,7 +33,7 @@ class AlterationRepository( */ @OptIn(ExperimentalCoroutinesApi::class) private val campaignCharactersFlow: Flow>> = - campaignRepository.campaignFlow + campaignRepository.campaignFlow() .flatMapLatest { campaign -> val flows = campaign.instances.map { characterRepository.characterDetailFlow(characterSheetId = it) diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/campaign/CampaignRepository.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/campaign/CampaignRepository.kt index da1b34b..b61a3f2 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/campaign/CampaignRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/campaign/CampaignRepository.kt @@ -1,9 +1,14 @@ package com.pixelized.desktop.lwa.repository.campaign +import com.pixelized.shared.lwa.model.campaign.Campaign +import kotlinx.coroutines.flow.StateFlow + class CampaignRepository( private val store: CampaignStore, ) { - val campaignFlow = store.campaignFlow() + fun campaignFlow(): StateFlow { + return store.campaignFlow() + } suspend fun updateCampaign() { store.updateCampaignFlow() diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetRepository.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetRepository.kt index 8ecb5ab..74b9ec4 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetRepository.kt @@ -15,7 +15,9 @@ class CharacterSheetRepository( ) { private val scope = CoroutineScope(Dispatchers.IO + Job()) - val characterSheetPreviewFlow get() = store.previewFlow + fun characterSheetPreviewFlow(): StateFlow> { + return store.previewFlow + } suspend fun updateCharacterPreviews() { store.updateCharactersPreviewFlow() @@ -26,7 +28,7 @@ class CharacterSheetRepository( } fun characterPreview(characterId: String?): CharacterSheetPreview? { - return characterSheetPreviewFlow.value.firstOrNull { it.characterSheetId == characterId } + return store.previewFlow.value.firstOrNull { it.characterSheetId == characterId } } fun characterDetail( diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/roll_history/RollHistoryRepository.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/roll_history/RollHistoryRepository.kt index a3ca82f..033f556 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/roll_history/RollHistoryRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/roll_history/RollHistoryRepository.kt @@ -15,10 +15,12 @@ class RollHistoryRepository( ) { private val scope = CoroutineScope(Dispatchers.IO + Job()) - val rolls: SharedFlow = network.data + private val rolls: SharedFlow = network.data .filterIsInstance(RollEvent::class) .shareIn( scope = scope, started = SharingStarted.Eagerly, ) + + fun rolls(): SharedFlow = rolls } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonViewModel.kt index 4c8d5f0..eb1ca0d 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonViewModel.kt @@ -64,7 +64,7 @@ abstract class CharacterRibbonViewModel( @OptIn(ExperimentalCoroutinesApi::class) val characters: StateFlow> = combine( settingsRepository.settingsFlow(), - campaignRepository.campaignFlow, + campaignRepository.campaignFlow(), ) { settings, campaign -> campaign to settings } .distinctUntilChanged() .flatMapLatest { (campaign, settings) -> @@ -111,7 +111,7 @@ abstract class CharacterRibbonViewModel( LaunchedEffect(characterSheetId) { combine( settingsRepository.settingsFlow(), - rollHistoryRepository.rolls, + rollHistoryRepository.rolls(), ) { settings, roll -> if (settings.portrait.dynamicDice && characterSheetId == roll.characterSheetId) { state.value = CharacterPortraitRollUio( diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChatViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChatViewModel.kt index 8283293..21baec1 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChatViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChatViewModel.kt @@ -4,6 +4,7 @@ import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.tween import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.pixelized.desktop.lwa.repository.campaign.CampaignRepository import com.pixelized.desktop.lwa.repository.network.NetworkRepository import com.pixelized.desktop.lwa.repository.settings.SettingsRepository import com.pixelized.shared.lwa.protocol.websocket.SocketMessage @@ -16,6 +17,7 @@ import kotlinx.coroutines.flow.stateIn class CampaignChatViewModel( private val settingsRepository: SettingsRepository, + private val campaignRepository: CampaignRepository, networkRepository: NetworkRepository, textMessageFactory: TextMessageFactory, ) : ViewModel() { @@ -36,14 +38,16 @@ class CampaignChatViewModel( val messages = combine( settingsRepository.settingsFlow(), + campaignRepository.campaignFlow(), networkRepository.data.runningFold( initial = mutableListOf(), operation = List::plus ) - ) { settings, messages -> + ) { settings, campaign, messages -> messages.mapNotNull { message -> textMessageFactory.convertToTextMessage( settings = settings, + campaign = campaign, message = message, ) }.takeLast( diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/TextMessageFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/TextMessageFactory.kt index f478bb3..5bf3b03 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/TextMessageFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/TextMessageFactory.kt @@ -6,8 +6,7 @@ import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.Characteristic import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.DiminishedTextMessageUio import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.RollTextMessageUio import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.TextMessage -import com.pixelized.shared.lwa.model.campaign.CampaignJsonV1.CharacterInstanceJsonV1.CharacteristicV1.Damage -import com.pixelized.shared.lwa.model.campaign.CampaignJsonV1.CharacterInstanceJsonV1.CharacteristicV1.Power +import com.pixelized.shared.lwa.model.campaign.Campaign import com.pixelized.shared.lwa.protocol.websocket.ApiSynchronisation import com.pixelized.shared.lwa.protocol.websocket.CampaignEvent import com.pixelized.shared.lwa.protocol.websocket.CharacterSheetEvent @@ -29,6 +28,7 @@ class TextMessageFactory( suspend fun convertToTextMessage( settings: Settings, + campaign: Campaign, message: SocketMessage, ): TextMessage? { return when (message) { @@ -62,6 +62,11 @@ class TextMessageFactory( is CharacterSheetEvent -> when (message) { is CharacterSheetEvent.UpdateDiminished -> { + // only display the message if the character is in the party or npcs. + val isInParty = campaign.characters.contains(message.characterSheetId) + val isInNpcs = campaign.npcs.contains(message.characterSheetId) + if ((isInParty || isInNpcs).not()) return null + // get the character sheet val sheetPreview = characterSheetRepository .characterPreview(characterId = message.characterSheetId) ?: return null @@ -75,10 +80,14 @@ class TextMessageFactory( } is CharacterSheetEvent.UpdateDamage -> { - val sheet = characterSheetRepository.characterDetail( - characterSheetId = message.characterSheetId, - ) ?: return null - + // only display the message if the character is in the party or npcs. + val isInParty = campaign.characters.contains(message.characterSheetId) + val isInNpcs = campaign.npcs.contains(message.characterSheetId) + if ((isInParty || isInNpcs).not()) return null + // get the character sheet + val sheet = characterSheetRepository + .characterDetail(characterSheetId = message.characterSheetId) + ?: return null // We are talking about damage / consumption there so old value have to be put first. val value = message.oldValue - message.damage @@ -95,10 +104,13 @@ class TextMessageFactory( } is CharacterSheetEvent.UpdateFatigue -> { - val sheet = characterSheetRepository.characterDetail( - characterSheetId = message.characterSheetId, - ) ?: return null - + // only display the message if the character is in the party. + val isInParty = campaign.characters.contains(message.characterSheetId) + if (isInParty.not()) return null + // get the character sheet + val sheet = characterSheetRepository + .characterDetail(characterSheetId = message.characterSheetId) + ?: return null // We are talking about damage / consumption there so old value have to be put first. val value = message.oldValue - message.fatigue diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/CampaignToolbarViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/CampaignToolbarViewModel.kt index 6866eeb..df5ac2c 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/CampaignToolbarViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/toolbar/CampaignToolbarViewModel.kt @@ -17,7 +17,7 @@ class CampaignToolbarViewModel( val status = networkRepository.status - val title = campaignRepository.campaignFlow + val title = campaignRepository.campaignFlow() .map { it.scene.name } .stateIn( scope = viewModelScope, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/action/GMActionViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/action/GMActionViewModel.kt index 0490f8a..659c3bc 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/action/GMActionViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/action/GMActionViewModel.kt @@ -24,7 +24,7 @@ class GMActionViewModel( private val _error = MutableSharedFlow() val error: SharedFlow get() = _error - val actions: StateFlow = campaignRepository.campaignFlow + val actions: StateFlow = campaignRepository.campaignFlow() .map { ActionPageUio( party = it.options.showParty, @@ -39,7 +39,7 @@ class GMActionViewModel( ) suspend fun onPartyHeal() { - campaignRepository.campaignFlow.value.characters.forEach { characterSheetId -> + campaignRepository.campaignFlow().value.characters.forEach { characterSheetId -> val sheet = characterRepository.characterDetail( characterSheetId = characterSheetId, ) ?: return@forEach diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/character/list/GMCharacterViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/character/list/GMCharacterViewModel.kt index 979e115..6e1436a 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/character/list/GMCharacterViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/character/list/GMCharacterViewModel.kt @@ -59,8 +59,8 @@ class GMCharacterViewModel( ) val characters = combine( - campaignRepository.campaignFlow, - characterSheetRepository.characterSheetPreviewFlow, + campaignRepository.campaignFlow(), + characterSheetRepository.characterSheetPreviewFlow(), filter.valueFlow.map { it.unAccent() }, tags, selectedTagId, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryViewModel.kt index 51a1d0d..4b31b6a 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/rollhistory/RollHistoryViewModel.kt @@ -15,8 +15,8 @@ class RollHistoryViewModel( private var _rolls: List = emptyList() val rolls = combine( - characterRepository.characterSheetPreviewFlow, - rollRepository.rolls, + characterRepository.characterSheetPreviewFlow(), + rollRepository.rolls(), ) { sheets, message -> val name = sheets.firstOrNull { it.characterSheetId == message.characterSheetId }?.name ?: "" val roll = RollHistoryItemUio(