Fix a crash related to default network config.

This commit is contained in:
Thomas Andres Gomez 2025-03-17 13:32:49 +01:00
parent a617d4ba7b
commit e2b3b54f88
18 changed files with 153 additions and 119 deletions

View file

@ -36,7 +36,7 @@ class DataSyncViewModel(
networkRepository.status networkRepository.status
.filter { status -> status == NetworkRepository.Status.CONNECTED } .filter { status -> status == NetworkRepository.Status.CONNECTED }
.onEach { campaignRepository.update() } .onEach { campaignRepository.campaign(update = true) }
.launchIn(this) .launchIn(this)
networkRepository.status networkRepository.status

View file

@ -16,27 +16,27 @@ import com.pixelized.desktop.lwa.repository.settings.SettingsStore
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterDetailCharacteristicDialogViewModel import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterDetailCharacteristicDialogViewModel
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogFactory import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogFactory
import com.pixelized.desktop.lwa.ui.overlay.roll.RollViewModel import com.pixelized.desktop.lwa.ui.overlay.roll.RollViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.CampaignToolbarViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkFactory
import com.pixelized.desktop.lwa.ui.screen.campaign.text.CampaignChatViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.text.TextMessageFactory import com.pixelized.desktop.lwa.ui.screen.campaign.player.CharacterRibbonFactory
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailFactory import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailFactory
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDiminishedViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDiminishedViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.player.CharacterRibbonFactory import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.npc.NpcRibbonViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.player.PlayerRibbonViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.player.PlayerRibbonViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.text.CampaignChatViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.text.TextMessageFactory
import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.CampaignToolbarViewModel
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetFactory import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetFactory
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetViewModel import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetViewModel
import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.CharacterSheetEditFactory import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.CharacterSheetEditFactory
import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.CharacterSheetEditViewModel import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.CharacterSheetEditViewModel
import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.common.SkillFieldFactory import com.pixelized.desktop.lwa.ui.screen.characterSheet.edit.common.SkillFieldFactory
import com.pixelized.desktop.lwa.ui.screen.levelup.LevelUpFactory
import com.pixelized.desktop.lwa.ui.screen.levelup.LevelUpViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkFactory
import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.npc.NpcRibbonViewModel
import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterActionUseCase import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterActionUseCase
import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterFactory import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterFactory
import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterViewModel import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterViewModel
import com.pixelized.desktop.lwa.ui.screen.levelup.LevelUpFactory
import com.pixelized.desktop.lwa.ui.screen.levelup.LevelUpViewModel
import com.pixelized.desktop.lwa.ui.screen.rollhistory.RollHistoryViewModel import com.pixelized.desktop.lwa.ui.screen.rollhistory.RollHistoryViewModel
import com.pixelized.desktop.lwa.ui.screen.settings.SettingsViewModel import com.pixelized.desktop.lwa.ui.screen.settings.SettingsViewModel
import com.pixelized.desktop.lwa.usecase.SettingsUseCase import com.pixelized.desktop.lwa.usecase.SettingsUseCase
@ -77,7 +77,9 @@ val toolsDependencies
} }
} }
single<LwaClient> { single<LwaClient> {
LwaClientImpl(get(), get()) val client: HttpClient = get()
val setting: SettingsRepository = get()
LwaClientImpl(client, setting)
} }
single { single {
PathProvider(appName = "LwaClient") PathProvider(appName = "LwaClient")

View file

@ -17,8 +17,8 @@ class CampaignRepository(
val campaignFlow get() = store.campaignFlow val campaignFlow get() = store.campaignFlow
suspend fun update() { suspend fun campaign(update: Boolean) {
store.update() store.campaign(update = update)
} }
fun instanceFlow( fun instanceFlow(

View file

@ -30,57 +30,78 @@ class CampaignStore(
init { init {
val scope = CoroutineScope(Dispatchers.IO + Job()) val scope = CoroutineScope(Dispatchers.IO + Job())
scope.launch { scope.launch {
update() campaign(update = true)
} }
scope.launch { scope.launch {
network.data.collect(::handleMessage) network.data.collect(::handleMessage)
} }
} }
suspend fun update() { suspend fun campaign(update: Boolean): Campaign {
_campaignFlow.value = load() val campaign = _campaignFlow.value
} if (update || campaign == Campaign.EMPTY) {
val data = try {
private suspend fun load(): Campaign {
val request = client.campaign() val request = client.campaign()
val data = factory.convertFromJson(json = request) factory.convertFromJson(json = request)
return data } catch (exception: Exception) {
println(exception) // TODO
Campaign.EMPTY
}
return _campaignFlow.update(data)
}
return campaign
} }
suspend fun addCharacter( suspend fun addCharacter(
characterSheetId: String, characterSheetId: String,
) { ) {
try {
client.campaignAddCharacter( client.campaignAddCharacter(
characterSheetId = characterSheetId characterSheetId = characterSheetId
) )
} catch (exception: Exception) {
println(exception) // TODO
}
} }
suspend fun removeCharacter( suspend fun removeCharacter(
characterSheetId: String, characterSheetId: String,
instanceId: Int, instanceId: Int,
) { ) {
try {
client.campaignRemoveCharacter( client.campaignRemoveCharacter(
characterSheetId = characterSheetId, characterSheetId = characterSheetId,
instanceId = instanceId, instanceId = instanceId,
) )
} catch (exception: Exception) {
println(exception) // TODO
}
} }
suspend fun addNpc( suspend fun addNpc(
characterSheetId: String, characterSheetId: String,
) { ) {
try {
client.campaignAddNpc( client.campaignAddNpc(
characterSheetId = characterSheetId characterSheetId = characterSheetId
) )
} catch (exception: Exception) {
println(exception) // TODO
}
} }
suspend fun removeNpc( suspend fun removeNpc(
characterSheetId: String, characterSheetId: String,
instanceId: Int, instanceId: Int,
) { ) {
try {
client.campaignRemoveNpc( client.campaignRemoveNpc(
characterSheetId = characterSheetId, characterSheetId = characterSheetId,
instanceId = instanceId, instanceId = instanceId,
) )
} catch (exception: Exception) {
println(exception) // TODO
}
} }
// region : WebSocket message Handling. // region : WebSocket message Handling.
@ -88,7 +109,7 @@ class CampaignStore(
private suspend fun handleMessage(message: Message) { private suspend fun handleMessage(message: Message) {
when (val payload = message.value) { when (val payload = message.value) {
is RestSynchronisation.Campaign -> { is RestSynchronisation.Campaign -> {
update() campaign(update = true)
} }
is CampaignMessage -> { is CampaignMessage -> {
@ -177,4 +198,9 @@ class CampaignStore(
} }
// endregion // endregion
private fun MutableStateFlow<Campaign>.update(campaign: Campaign): Campaign {
value = campaign
return campaign
}
} }

View file

@ -1,6 +1,6 @@
package com.pixelized.desktop.lwa.repository.characterSheet package com.pixelized.desktop.lwa.repository.characterSheet
import com.pixelized.desktop.lwa.repository.campaign.model.CharacterSheetPreview import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetPreview
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -20,7 +20,7 @@ class CharacterSheetRepository(
val characterDetailFlow get() = store.detailFlow val characterDetailFlow get() = store.detailFlow
suspend fun updateCharacterPreviews() { suspend fun updateCharacterPreviews() {
store.updateCharacterPreviews() store.charactersPreview()
} }
fun characterPreview(characterId: String?): CharacterSheetPreview? { fun characterPreview(characterId: String?): CharacterSheetPreview? {
@ -33,8 +33,8 @@ class CharacterSheetRepository(
): CharacterSheet? { ): CharacterSheet? {
return try { return try {
characterSheetId?.let { characterSheetId?.let {
store.characterDetail( store.getCharacterSheet(
characterId = it, characterSheetId = it,
forceUpdate = forceUpdate forceUpdate = forceUpdate
) )
} }
@ -61,12 +61,12 @@ class CharacterSheetRepository(
suspend fun updateCharacter( suspend fun updateCharacter(
characterSheet: CharacterSheet, characterSheet: CharacterSheet,
) { ) {
store.updateCharacter(sheet = characterSheet) store.updateCharacterSheet(sheet = characterSheet)
} }
suspend fun deleteCharacter( suspend fun deleteCharacter(
characterId: String, characterId: String,
) { ) {
store.deleteCharacter(characterId = characterId) store.deleteCharacterSheet(characterId = characterId)
} }
} }

View file

@ -1,10 +1,10 @@
package com.pixelized.desktop.lwa.repository.characterSheet package com.pixelized.desktop.lwa.repository.characterSheet
import com.pixelized.desktop.lwa.network.LwaClient import com.pixelized.desktop.lwa.network.LwaClient
import com.pixelized.desktop.lwa.repository.campaign.model.CharacterSheetPreview
import com.pixelized.desktop.lwa.repository.network.NetworkRepository import com.pixelized.desktop.lwa.repository.network.NetworkRepository
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetJsonFactory import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetJsonFactory
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetPreview
import com.pixelized.shared.lwa.protocol.websocket.Message import com.pixelized.shared.lwa.protocol.websocket.Message
import com.pixelized.shared.lwa.protocol.websocket.payload.RestSynchronisation import com.pixelized.shared.lwa.protocol.websocket.payload.RestSynchronisation
import com.pixelized.shared.lwa.protocol.websocket.payload.UpdateSkillUsageMessage import com.pixelized.shared.lwa.protocol.websocket.payload.UpdateSkillUsageMessage
@ -32,7 +32,7 @@ class CharacterSheetStore(
val scope = CoroutineScope(Dispatchers.IO + Job()) val scope = CoroutineScope(Dispatchers.IO + Job())
// initial data loading. // initial data loading.
scope.launch { scope.launch {
updateCharacterPreviews() charactersPreview()
} }
// data update through WebSocket. // data update through WebSocket.
scope.launch { scope.launch {
@ -42,58 +42,55 @@ class CharacterSheetStore(
// region Rest // region Rest
suspend fun updateCharacterPreviews() {
_previewFlow.value = charactersPreview()
}
suspend fun charactersPreview(): List<CharacterSheetPreview> { suspend fun charactersPreview(): List<CharacterSheetPreview> {
val request = client.characters() val request = try {
val data = request.map { client.characters()
CharacterSheetPreview( } catch (exception: Exception) {
characterSheetId = it.id, println(exception) // TODO
name = it.name, emptyList()
level = it.level,
)
} }
return data val characters = request.map { factory.convertFromJson(it) }
return _previewFlow.update(characters)
} }
suspend fun characterDetail( suspend fun getCharacterSheet(
characterId: String, characterSheetId: String,
forceUpdate: Boolean = false, forceUpdate: Boolean = false,
): CharacterSheet { ): CharacterSheet? {
val character = _detailFlow.value[characterId] val character = _detailFlow.value[characterSheetId]
if (forceUpdate || character == null) { if (forceUpdate || character == null) {
val request = client.character(id = characterId) try {
val request = client.character(id = characterSheetId)
val data = factory.convertFromJson(json = request) val data = factory.convertFromJson(json = request)
// update the local detail flow.
return _detailFlow.update(data) return _detailFlow.update(data)
} else { } catch (exception: Exception) {
println(exception) // TODO
return null
}
}
return character return character
} }
}
suspend fun updateCharacter( suspend fun updateCharacterSheet(
sheet: CharacterSheet, sheet: CharacterSheet,
) { ) {
val json = factory.convertToJson(sheet = sheet) val json = factory.convertToJson(sheet = sheet)
try { try {
client.updateCharacter(sheet = json) client.updateCharacter(sheet = json)
} catch (exception: Exception) { } catch (exception: Exception) {
// TODO println(exception) // TODO
println(exception)
} }
_detailFlow.update(sheet = sheet) _detailFlow.update(sheet = sheet)
} }
suspend fun deleteCharacter( suspend fun deleteCharacterSheet(
characterId: String, characterId: String,
) { ) {
try { try {
client.deleteCharacterSheet(id = characterId) client.deleteCharacterSheet(id = characterId)
_detailFlow.delete(characterId = characterId) _detailFlow.delete(characterId = characterId)
} catch (exception: Exception) { } catch (exception: Exception) {
// TODO println(exception) // TODO
} }
} }
@ -102,8 +99,8 @@ class CharacterSheetStore(
private suspend fun handleMessage(message: Message) { private suspend fun handleMessage(message: Message) {
when (val payload = message.value) { when (val payload = message.value) {
is RestSynchronisation.CharacterUpdate -> characterDetail( is RestSynchronisation.CharacterUpdate -> getCharacterSheet(
characterId = payload.id, characterSheetId = payload.id,
forceUpdate = true forceUpdate = true
) )
@ -130,24 +127,38 @@ class CharacterSheetStore(
skillId: String, skillId: String,
used: Boolean, used: Boolean,
) { ) {
val sheet = getCharacterSheet(characterSheetId = characterId) ?: return
val character = useCase.updateSkillUsage( val character = useCase.updateSkillUsage(
character = characterDetail(characterId = characterId), character = sheet,
skillId = skillId, skillId = skillId,
used = used, used = used,
) )
_detailFlow.update(character) _detailFlow.update(character)
} }
// endregion // endregion
private fun MutableStateFlow<Map<String, CharacterSheet>>.update(sheet: CharacterSheet): CharacterSheet { private fun MutableStateFlow<List<CharacterSheetPreview>>.update(
previews: List<CharacterSheetPreview>,
): List<CharacterSheetPreview> {
value = previews
return previews
}
private fun MutableStateFlow<Map<String, CharacterSheet>>.update(
sheet: CharacterSheet,
): CharacterSheet {
value = value.toMutableMap().also { value = value.toMutableMap().also {
it[sheet.id] = sheet it[sheet.id] = sheet
} }
return sheet return sheet
} }
private fun MutableStateFlow<Map<String, CharacterSheet>>.delete(characterId: String) { private fun MutableStateFlow<Map<String, CharacterSheet>>.delete(
characterId: String,
) {
value = value.toMutableMap().also { value = value.toMutableMap().also {
it.remove(characterId) it.remove(characterId)
} }

View file

@ -22,7 +22,7 @@ class SettingsFactory(
autoShowChat = settings.autoShowChat, autoShowChat = settings.autoShowChat,
autoScrollChat = settings.autoScrollChat, autoScrollChat = settings.autoScrollChat,
isAdmin = settings.isAdmin, isAdmin = settings.isAdmin,
isGM = settings.isGM, isGameMaster = settings.isGameMaster,
) )
} }
@ -48,7 +48,7 @@ class SettingsFactory(
autoShowChat = json.autoShowChat ?: default.autoShowChat, autoShowChat = json.autoShowChat ?: default.autoShowChat,
autoScrollChat = json.autoScrollChat ?: default.autoScrollChat, autoScrollChat = json.autoScrollChat ?: default.autoScrollChat,
isAdmin = json.isAdmin ?: default.isAdmin, isAdmin = json.isAdmin ?: default.isAdmin,
isGM = json.isGM ?: default.isGM, isGameMaster = json.isGameMaster ?: default.isGameMaster,
) )
} }
} }

View file

@ -1,30 +1,16 @@
package com.pixelized.desktop.lwa.repository.settings package com.pixelized.desktop.lwa.repository.settings
import com.pixelized.desktop.lwa.usecase.SettingsUseCase
import com.pixelized.desktop.lwa.repository.settings.model.Settings import com.pixelized.desktop.lwa.repository.settings.model.Settings
import kotlinx.coroutines.CoroutineScope import com.pixelized.desktop.lwa.usecase.SettingsUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.stateIn
class SettingsRepository( class SettingsRepository(
private val store: SettingsStore, private val store: SettingsStore,
private val useCase: SettingsUseCase, private val useCase: SettingsUseCase,
) { ) {
private val scope = CoroutineScope(Dispatchers.IO + Job()) fun settingsFlow(): StateFlow<Settings> = store.settingsFlow
private val settings = store.settingsFlow() fun settings(): Settings = store.settingsFlow.value
.stateIn(
scope = scope,
started = SharingStarted.Eagerly,
initialValue = useCase.defaultSettings()
)
fun settingsFlow(): StateFlow<Settings> = settings
fun settings(): Settings = settings.value
fun update(settings: Settings) { fun update(settings: Settings) {
store.save(settings = settings) store.save(settings = settings)

View file

@ -4,12 +4,9 @@ import com.pixelized.desktop.lwa.repository.settings.model.Settings
import com.pixelized.desktop.lwa.repository.settings.model.SettingsJson import com.pixelized.desktop.lwa.repository.settings.model.SettingsJson
import com.pixelized.desktop.lwa.usecase.SettingsUseCase import com.pixelized.desktop.lwa.usecase.SettingsUseCase
import com.pixelized.shared.lwa.utils.PathProvider import com.pixelized.shared.lwa.utils.PathProvider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import java.io.File import java.io.File
@ -19,17 +16,19 @@ class SettingsStore(
private val useCase: SettingsUseCase, private val useCase: SettingsUseCase,
private val jsonFormatter: Json, private val jsonFormatter: Json,
) { ) {
private val flow = MutableStateFlow(value = useCase.defaultSettings()) private val _settingsFlow = MutableStateFlow(value = useCase.defaultSettings())
val settingsFlow: StateFlow<Settings> = _settingsFlow
fun settingsFlow(): StateFlow<Settings> = flow
init { init {
// create the directory // create the directory
File(pathProvider.storePath()).also { it.mkdirs() } File(pathProvider.storePath()).also { it.mkdirs() }
// load the data. // load the data.
val scope = CoroutineScope(Dispatchers.IO + Job()) runBlocking {
scope.launch { try {
flow.value = load() _settingsFlow.value = load()
} catch (exception: Exception) {
println(exception) // TODO
}
} }
} }
@ -55,7 +54,7 @@ class SettingsStore(
root = exception root = exception
) )
} }
flow.value = settings _settingsFlow.value = settings
} }
private fun load(): Settings { private fun load(): Settings {

View file

@ -9,8 +9,8 @@ data class Settings(
val autoHideDelay: Int, val autoHideDelay: Int,
val autoShowChat: Boolean, val autoShowChat: Boolean,
val autoScrollChat: Boolean, val autoScrollChat: Boolean,
val isAdmin: Boolean, val isAdmin: Boolean? = null,
val isGM: Boolean, val isGameMaster: Boolean? = null,
) { ) {
val root: String get() = "http://${"${host}:${port}".removePrefix("http://")}" val root: String get() = "http://${"${host}:${port}".removePrefix("http://")}"
} }

View file

@ -12,6 +12,6 @@ data class SettingsJsonV1(
val autoHideDelay: Int?, val autoHideDelay: Int?,
val autoShowChat: Boolean?, val autoShowChat: Boolean?,
val autoScrollChat: Boolean?, val autoScrollChat: Boolean?,
val isGM: Boolean?, val isGameMaster: Boolean?,
val isAdmin: Boolean?, val isAdmin: Boolean?,
) : SettingsJson ) : SettingsJson

View file

@ -68,9 +68,9 @@ abstract class CharacterRibbonViewModel(
alterations = alterations, alterations = alterations,
characterInstanceId = entry.key, characterInstanceId = entry.key,
characterInstance = entry.value, characterInstance = entry.value,
enableCharacterId = settings.isGM, enableCharacterId = settings.isGameMaster ?: false,
enableCharacterSheet = enableCharacterSheet || settings.isGM, enableCharacterSheet = enableCharacterSheet || settings.isGameMaster ?: false,
enableCharacterStats = enableCharacterStats || settings.isGM, enableCharacterStats = enableCharacterStats || settings.isGameMaster ?: false,
) )
} }
}, },

View file

@ -26,7 +26,7 @@ class CampaignToolbarViewModel(
) )
val isAdmin = settingsRepository.settingsFlow() val isAdmin = settingsRepository.settingsFlow()
.map { it.isAdmin } .map { it.isAdmin ?: false }
.stateIn( .stateIn(
scope = viewModelScope, scope = viewModelScope,
started = SharingStarted.Lazily, started = SharingStarted.Lazily,

View file

@ -1,6 +1,6 @@
package com.pixelized.desktop.lwa.ui.screen.gamemaster package com.pixelized.desktop.lwa.ui.screen.gamemaster
import com.pixelized.desktop.lwa.repository.campaign.model.CharacterSheetPreview import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetPreview
import com.pixelized.desktop.lwa.ui.screen.gamemaster.items.GMCharacterUio import com.pixelized.desktop.lwa.ui.screen.gamemaster.items.GMCharacterUio
import com.pixelized.desktop.lwa.ui.screen.gamemaster.items.GMCharacterUio.Action import com.pixelized.desktop.lwa.ui.screen.gamemaster.items.GMCharacterUio.Action
import com.pixelized.desktop.lwa.ui.screen.gamemaster.items.GMTagUio import com.pixelized.desktop.lwa.ui.screen.gamemaster.items.GMTagUio

View file

@ -76,7 +76,7 @@ class GameMasterViewModel(
val settings = settingsRepository.settings() val settings = settingsRepository.settings()
settingsRepository.update( settingsRepository.update(
settings = settings.copy( settings = settings.copy(
isGM = settings.isGM.not(), isGameMaster = (settings.isGameMaster ?: false).not(),
) )
) )
} }

View file

@ -13,8 +13,8 @@ class SettingsUseCase {
autoHideDelay = 8, autoHideDelay = 8,
autoShowChat = true, autoShowChat = true,
autoScrollChat = true, autoScrollChat = true,
isAdmin = false, isAdmin = null,
isGM = false, isGameMaster = null,
) )
companion object { companion object {

View file

@ -15,6 +15,16 @@ class CharacterSheetJsonFactory(
} }
} }
suspend fun convertFromJson(
json: CharacterPreviewJson,
): CharacterSheetPreview {
return CharacterSheetPreview(
characterSheetId = json.id,
name = json.name,
level = json.level,
)
}
private suspend fun convertFromV1( private suspend fun convertFromV1(
json: CharacterSheetJsonV1, json: CharacterSheetJsonV1,
): CharacterSheet = characterSheetUseCase.run { ): CharacterSheet = characterSheetUseCase.run {

View file

@ -1,4 +1,4 @@
package com.pixelized.desktop.lwa.repository.campaign.model package com.pixelized.shared.lwa.model.characterSheet
data class CharacterSheetPreview( data class CharacterSheetPreview(
val characterSheetId: String, val characterSheetId: String,