Fix potential crash with getValue

This commit is contained in:
Thomas Andres Gomez 2023-11-12 18:07:10 +01:00
parent e98b2864e2
commit 003390e844
3 changed files with 68 additions and 33 deletions

View file

@ -6,9 +6,11 @@ import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.pixelized.rplexicon.data.model.Alteration
import com.pixelized.rplexicon.data.model.Attack import com.pixelized.rplexicon.data.model.Attack
import com.pixelized.rplexicon.data.model.CharacterSheet import com.pixelized.rplexicon.data.model.CharacterSheet
import com.pixelized.rplexicon.data.model.DiceThrow import com.pixelized.rplexicon.data.model.DiceThrow
import com.pixelized.rplexicon.data.model.Property
import com.pixelized.rplexicon.data.repository.character.ActionRepository import com.pixelized.rplexicon.data.repository.character.ActionRepository
import com.pixelized.rplexicon.data.repository.character.AlterationRepository import com.pixelized.rplexicon.data.repository.character.AlterationRepository
import com.pixelized.rplexicon.data.repository.character.CharacterSheetRepository import com.pixelized.rplexicon.data.repository.character.CharacterSheetRepository
@ -32,27 +34,42 @@ class AttacksViewModel @Inject constructor(
attackFactory: AttackUioFactory, attackFactory: AttackUioFactory,
) : AndroidViewModel(application) { ) : AndroidViewModel(application) {
private val character = savedStateHandle.characterSheetArgument.name private val character = savedStateHandle.characterSheetArgument.name
private val model: CharacterSheet get() = characterRepository.data.value.getValue(character)
private val _attacks = mutableStateOf<List<AttackUio>>(emptyList()) private val _attacks = mutableStateOf<List<AttackUio>>(emptyList())
val attacks: State<List<AttackUio>> get() = _attacks val attacks: State<List<AttackUio>> get() = _attacks
init { init {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
actionRepository.data characterRepository.data
.combine(alterationRepository.assignedAlterations) { actions, _ -> actions } .combine(actionRepository.data) { characters, actions ->
.collect { sheets -> ActionData(
val alterations = alterationRepository.getActiveAlterationsStatus( character = characters[character],
character = character, actions = actions[character] ?: emptyList()
) )
val attacks = sheets[character]?.map { action -> }
attackFactory.convert( .combine(alterationRepository.assignedAlterations) { data, _ ->
characterSheet = model, data.also {
alterations = alterations, it.alterations = alterationRepository.getActiveAlterationsStatus(character)
attack = action, }
) }
} ?: emptyList() .collect { data ->
withContext(Dispatchers.Main) { _attacks.value = attacks } val characterSheet = data.character
if (characterSheet != null) {
val attacks = data.actions.map { action ->
attackFactory.convert(
characterSheet = characterSheet,
alterations = data.alterations,
attack = action,
)
}
withContext(Dispatchers.Main) {
_attacks.value = attacks
}
} else {
launch {
characterRepository.fetchCharacterSheet()
}
}
} }
} }
} }
@ -90,4 +107,11 @@ class AttacksViewModel @Inject constructor(
else -> null else -> null
} }
} }
private data class ActionData(
var character: CharacterSheet?,
var actions: List<Attack>,
) {
lateinit var alterations: Map<Property, List<Alteration.Status>>
}
} }

View file

@ -53,18 +53,22 @@ class HeaderViewModel @Inject constructor(
characterRepository.data characterRepository.data
.combine(alterationRepository.assignedAlterations) { sheets, _ -> sheets } .combine(alterationRepository.assignedAlterations) { sheets, _ -> sheets }
.collect { sheets -> .collect { sheets ->
val character = sheets.getValue(character) val character = sheets[character]
val alterations = alterationRepository.getActiveAlterationsStatus( if (character != null) {
character = character.name, val alterations = alterationRepository.getActiveAlterationsStatus(
) character = character.name,
val data = SheetHeaderData( )
hpMax = character.hitPoint + alterations[Property.HIT_POINT].sum, val data = SheetHeaderData(
speed = character.speed, hpMax = character.hitPoint + alterations[Property.HIT_POINT].sum,
ca = character.armorClass + alterations[Property.ARMOR_CLASS].sum, speed = character.speed,
dc = character.dC, ca = character.armorClass + alterations[Property.ARMOR_CLASS].sum,
) dc = character.dC,
withContext(Dispatchers.Main) { )
sheetData.value = data withContext(Dispatchers.Main) {
sheetData.value = data
}
} else {
launch { characterRepository.fetchCharacterSheet() }
} }
} }
} }

View file

@ -38,13 +38,20 @@ class ProficiencyViewModel @Inject constructor(
characterRepository.data characterRepository.data
.combine(alterationRepository.assignedAlterations) { sheets, _ -> sheets } .combine(alterationRepository.assignedAlterations) { sheets, _ -> sheets }
.collect { .collect {
val alterations = alterationRepository.getActiveAlterationsStatus(character) val characterSheet = it[character]
val sheet = characterSheetFactory.convert( if (characterSheet != null) {
sheet = it.getValue(key = character), val alterations = alterationRepository.getActiveAlterationsStatus(character)
alterations = alterations, val sheet = characterSheetFactory.convert(
) sheet = characterSheet,
withContext(Dispatchers.Main) { alterations = alterations,
_sheet.value = sheet )
withContext(Dispatchers.Main) {
_sheet.value = sheet
}
} else {
launch {
characterRepository.fetchCharacterSheet()
}
} }
} }
} }