diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml
index 0df87e7..3003768 100644
--- a/composeApp/src/commonMain/composeResources/values/strings.xml
+++ b/composeApp/src/commonMain/composeResources/values/strings.xml
@@ -232,6 +232,7 @@
Admin
GameMaster
+ Sauvegarder
Filtrer par nom :
niv: %1$d
Joueur
@@ -253,7 +254,15 @@
Tags
Identifiant du champ
Expression
- Sauvegarder
- Annuler
+ Créer un objet
+ Supprimer un objet
+ Identifiant de l'altération
+ Nom
+ Description
+ Image url
+ Vignette url
+ Empilable
+ Équipable
+ Consommable
\ No newline at end of file
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 4cc3f87..ffd84cd 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt
@@ -4,6 +4,7 @@ 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.item.ItemRepository
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
import com.pixelized.desktop.lwa.repository.settings.SettingsRepository
import com.pixelized.desktop.lwa.repository.tag.TagRepository
@@ -19,6 +20,7 @@ import kotlinx.coroutines.flow.onEach
class DataSyncViewModel(
private val characterRepository: CharacterSheetRepository,
private val alterationRepository: AlterationRepository,
+ private val itemRepository: ItemRepository,
private val campaignRepository: CampaignRepository,
private val tagRepository: TagRepository,
private val settingsRepository: SettingsRepository,
@@ -39,14 +41,18 @@ class DataSyncViewModel(
@OptIn(ExperimentalCoroutinesApi::class)
suspend fun synchronise() = coroutineScope {
+ networkRepository.data.onEach { println(it) }.launchIn(this)
+
networkRepository.status
.filter { status -> status == NetworkRepository.Status.CONNECTED }
.onEach {
tagRepository.updateAlterationTags()
- alterationRepository.updateAlterations()
+ alterationRepository.updateAlterationFlow()
tagRepository.updateCharacterTags()
characterRepository.updateCharacterPreviews()
campaignRepository.updateCampaign()
+ tagRepository.updateItemTags()
+ itemRepository.updateItemFlow()
}
.launchIn(this)
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt
index 46b820b..57bff04 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt
@@ -8,6 +8,8 @@ import com.pixelized.desktop.lwa.repository.campaign.CampaignRepository
import com.pixelized.desktop.lwa.repository.campaign.CampaignStore
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetStore
+import com.pixelized.desktop.lwa.repository.item.ItemRepository
+import com.pixelized.desktop.lwa.repository.item.ItemStore
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
import com.pixelized.desktop.lwa.repository.roll_history.RollHistoryRepository
import com.pixelized.desktop.lwa.repository.settings.SettingsFactory
@@ -17,8 +19,8 @@ import com.pixelized.desktop.lwa.repository.tag.TagRepository
import com.pixelized.desktop.lwa.repository.tag.TagStore
import com.pixelized.desktop.lwa.ui.composable.character.alterteration.CharacterSheetAlterationDialogFactory
import com.pixelized.desktop.lwa.ui.composable.character.alterteration.CharacterSheetAlterationDialogViewModel
-import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogViewModel
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogFactory
+import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogViewModel
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogFactory
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogViewModel
import com.pixelized.desktop.lwa.ui.overlay.portrait.PortraitOverlayViewModel
@@ -47,6 +49,10 @@ import com.pixelized.desktop.lwa.ui.screen.gamemaster.alteration.list.GMAlterati
import com.pixelized.desktop.lwa.ui.screen.gamemaster.character.list.GMCharacterFactory
import com.pixelized.desktop.lwa.ui.screen.gamemaster.character.list.GMCharacterViewModel
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagFactory
+import com.pixelized.desktop.lwa.ui.screen.gamemaster.item.edit.GMItemEditFactory
+import com.pixelized.desktop.lwa.ui.screen.gamemaster.item.edit.GMItemEditViewModel
+import com.pixelized.desktop.lwa.ui.screen.gamemaster.item.list.GMItemFactory
+import com.pixelized.desktop.lwa.ui.screen.gamemaster.item.list.GMItemViewModel
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
@@ -105,6 +111,7 @@ val storeDependencies
singleOf(::AlterationStore)
singleOf(::CampaignStore)
singleOf(::TagStore)
+ singleOf(::ItemStore)
}
val repositoryDependencies
@@ -116,6 +123,7 @@ val repositoryDependencies
singleOf(::AlterationRepository)
singleOf(::CampaignRepository)
singleOf(::TagRepository)
+ singleOf(::ItemRepository)
}
val factoryDependencies
@@ -137,6 +145,8 @@ val factoryDependencies
factoryOf(::GMCharacterFactory)
factoryOf(::GMAlterationFactory)
factoryOf(::GMAlterationEditFactory)
+ factoryOf(::GMItemFactory)
+ factoryOf(::GMItemEditFactory)
}
val viewModelDependencies
@@ -163,6 +173,8 @@ val viewModelDependencies
viewModelOf(::GMActionViewModel)
viewModelOf(::GMAlterationViewModel)
viewModelOf(::GMAlterationEditViewModel)
+ viewModelOf(::GMItemViewModel)
+ viewModelOf(::GMItemEditViewModel)
}
val useCaseDependencies
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt
index 80a3ad1..2e75a8a 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt
@@ -3,9 +3,10 @@ package com.pixelized.desktop.lwa.network
import com.pixelized.shared.lwa.model.alteration.AlterationJson
import com.pixelized.shared.lwa.model.campaign.CampaignJson
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetJson
+import com.pixelized.shared.lwa.model.item.ItemJson
import com.pixelized.shared.lwa.model.tag.TagJson
-import com.pixelized.shared.lwa.protocol.rest.CharacterPreviewJson
import com.pixelized.shared.lwa.protocol.rest.APIResponse
+import com.pixelized.shared.lwa.protocol.rest.CharacterPreviewJson
interface LwaClient {
@@ -56,6 +57,7 @@ interface LwaClient {
suspend fun putCharacter(
sheet: CharacterSheetJson,
+ create: Boolean,
): APIResponse
suspend fun putCharacterDamage(
@@ -83,12 +85,31 @@ interface LwaClient {
characterSheetId: String,
): APIResponse
+ // Items
+
+ suspend fun getItems(): APIResponse>
+
+ suspend fun getItem(
+ itemId: String,
+ ): APIResponse
+
+ suspend fun putItem(
+ itemJson: ItemJson,
+ create: Boolean,
+ ): APIResponse
+
+ suspend fun deleteItem(
+ itemId: String,
+ ): APIResponse
+
// Tags
suspend fun getAlterationTags(): APIResponse>
suspend fun getCharacterTags(): APIResponse>
+ suspend fun getItemTags(): APIResponse>
+
companion object {
fun error(error: APIResponse<*>): Nothing = throw LwaNetworkException(error)
}
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt
index a24f2da..26769f8 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt
@@ -4,6 +4,7 @@ import com.pixelized.desktop.lwa.repository.settings.SettingsRepository
import com.pixelized.shared.lwa.model.alteration.AlterationJson
import com.pixelized.shared.lwa.model.campaign.CampaignJson
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetJson
+import com.pixelized.shared.lwa.model.item.ItemJson
import com.pixelized.shared.lwa.model.tag.TagJson
import com.pixelized.shared.lwa.protocol.rest.APIResponse
import com.pixelized.shared.lwa.protocol.rest.CharacterPreviewJson
@@ -98,8 +99,9 @@ class LwaClientImpl(
@Throws
override suspend fun putCharacter(
sheet: CharacterSheetJson,
+ create: Boolean,
) = client
- .put("$root/character/update/sheet") {
+ .put("$root/character/update/sheet?create=$create") {
contentType(ContentType.Application.Json)
setBody(sheet)
}
@@ -143,6 +145,36 @@ class LwaClientImpl(
.delete("$root/character/delete?characterSheetId=$characterSheetId")
.body>()
+ @Throws
+ override suspend fun getItems(): APIResponse> = client
+ .get("$root/item/all")
+ .body()
+
+ @Throws
+ override suspend fun getItem(
+ itemId: String,
+ ): APIResponse = client
+ .get("$root/item/detail?itemId=$itemId")
+ .body()
+
+ @Throws
+ override suspend fun putItem(
+ item: ItemJson,
+ create: Boolean,
+ ): APIResponse = client
+ .put("$root/item/update?create=$create") {
+ contentType(ContentType.Application.Json)
+ setBody(item)
+ }
+ .body>()
+
+ @Throws
+ override suspend fun deleteItem(
+ itemId: String,
+ ): APIResponse = client
+ .delete("$root/item/delete?itemId=$itemId")
+ .body()
+
@Throws
override suspend fun getAlterationTags(): APIResponse> = client
.get("$root/tag/alteration")
@@ -152,4 +184,9 @@ class LwaClientImpl(
override suspend fun getCharacterTags(): APIResponse> = client
.get("$root/tag/character")
.body()
+
+ @Throws
+ override suspend fun getItemTags(): APIResponse> = client
+ .get("$root/tag/item")
+ .body()
}
\ No newline at end of file
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 18be883..78a1ae0 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
@@ -19,7 +19,6 @@ import kotlinx.coroutines.flow.stateIn
class AlterationRepository(
private val alterationStore: AlterationStore,
-
campaignRepository: CampaignRepository,
characterRepository: CharacterSheetRepository,
) {
@@ -64,7 +63,7 @@ class AlterationRepository(
initialValue = emptyMap(),
)
- suspend fun updateAlterations() {
+ suspend fun updateAlterationFlow() {
alterationStore.updateAlterationsFlow()
}
@@ -97,6 +96,7 @@ class AlterationRepository(
)
}
+ @kotlin.jvm.Throws
suspend fun deleteAlteration(
alterationId: String,
) {
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 a10d1f2..8ecb5ab 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
@@ -52,8 +52,9 @@ class CharacterSheetRepository(
@Throws
suspend fun updateCharacter(
sheet: CharacterSheet,
+ create: Boolean,
) {
- store.updateCharacterSheet(sheet = sheet)
+ store.updateCharacterSheet(sheet = sheet, create = create)
}
@Throws
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetStore.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetStore.kt
index 86024b8..f842148 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetStore.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetStore.kt
@@ -1,5 +1,6 @@
package com.pixelized.desktop.lwa.repository.characterSheet
+import androidx.compose.runtime.clearCompositionErrors
import com.pixelized.desktop.lwa.network.LwaClient
import com.pixelized.desktop.lwa.repository.alteration.AlterationStore
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
@@ -91,9 +92,10 @@ class CharacterSheetStore(
@Throws
suspend fun updateCharacterSheet(
sheet: CharacterSheet,
+ create: Boolean,
) {
val json = factory.convertToJson(sheet = sheet)
- val request = client.putCharacter(sheet = json)
+ val request = client.putCharacter(sheet = json, create = create)
if (request.success.not()) {
LwaClient.error(error = request)
}
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/item/ItemRepository.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/item/ItemRepository.kt
new file mode 100644
index 0000000..cf6f214
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/item/ItemRepository.kt
@@ -0,0 +1,39 @@
+package com.pixelized.desktop.lwa.repository.item
+
+import com.pixelized.shared.lwa.model.item.Item
+
+class ItemRepository(
+ private val itemStore: ItemStore,
+) {
+ val itemFlow get() = itemStore.items
+
+ suspend fun updateItemFlow() {
+ itemStore.updateItemFlow()
+ }
+
+ fun item(
+ itemId: String?,
+ ): Item? {
+ return itemFlow.value[itemId]
+ }
+
+ @Throws
+ suspend fun updateItem(
+ item: Item,
+ create: Boolean,
+ ) {
+ itemStore.putItem(
+ item = item,
+ create = create,
+ )
+ }
+
+ @Throws
+ suspend fun deleteItem(
+ itemId: String,
+ ) {
+ itemStore.deleteItem(
+ itemId = itemId
+ )
+ }
+}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/item/ItemStore.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/item/ItemStore.kt
new file mode 100644
index 0000000..234acee
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/item/ItemStore.kt
@@ -0,0 +1,138 @@
+package com.pixelized.desktop.lwa.repository.item
+
+import com.pixelized.desktop.lwa.network.LwaClient
+import com.pixelized.desktop.lwa.repository.network.NetworkRepository
+import com.pixelized.shared.lwa.model.item.Item
+import com.pixelized.shared.lwa.model.item.factory.ItemJsonFactory
+import com.pixelized.shared.lwa.protocol.websocket.ApiSynchronisation
+import com.pixelized.shared.lwa.protocol.websocket.SocketMessage
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.update
+import kotlinx.coroutines.launch
+
+class ItemStore(
+ private val network: NetworkRepository,
+ private val factory: ItemJsonFactory,
+ private val client: LwaClient,
+) {
+ private val _items = MutableStateFlow