Wire AppleAddonStoreDataSource to a real Swift-driven state source

Adds AppleAddonStoreSnapshot/AppleInstalledAddonSnapshot and update()
so Swift can push real addon list/error/added-name state back into
the shared Addon Store screen, plus
FluxaApple.setAddonStoreActionHandler/updateAddonStore following the
existing handler-setter pattern.
This commit is contained in:
KhooLy 2026-07-20 15:05:28 +03:00
parent 6b218ba97f
commit d88e4226da
2 changed files with 61 additions and 0 deletions

View file

@ -15,7 +15,9 @@ import com.fluxa.app.shared.platform.AppleDetailRequestSnapshot
import com.fluxa.app.shared.platform.AppleDetailSnapshot
import com.fluxa.app.shared.platform.AppleDetailStreamSnapshot
import com.fluxa.app.shared.platform.ApplePlaybackRequestSnapshot
import com.fluxa.app.shared.platform.AppleAddonStoreActionSnapshot
import com.fluxa.app.shared.platform.AppleAddonStoreDataSource
import com.fluxa.app.shared.platform.AppleAddonStoreSnapshot
import com.fluxa.app.shared.platform.ApplePluginsActionSnapshot
import com.fluxa.app.shared.platform.ApplePluginsDataSource
import com.fluxa.app.shared.platform.ApplePluginsSnapshot
@ -117,6 +119,14 @@ object FluxaApple {
libraryDataSource.update(snapshot)
}
fun setAddonStoreActionHandler(handler: (AppleAddonStoreActionSnapshot) -> Unit) {
addonStoreDataSource.setOnActionRequested(handler)
}
fun updateAddonStore(snapshot: AppleAddonStoreSnapshot) {
addonStoreDataSource.update(snapshot)
}
fun setPluginsActionHandler(handler: (ApplePluginsActionSnapshot) -> Unit) {
pluginsDataSource.setOnActionRequested(handler)
}

View file

@ -1,8 +1,10 @@
package com.fluxa.app.shared.platform
import com.fluxa.app.common.AppStrings
import com.fluxa.app.shared.feature.addonstore.AddonStoreDataSource
import com.fluxa.app.shared.feature.addonstore.AddonStoreInputType
import com.fluxa.app.shared.feature.addonstore.AddonStoreUiState
import com.fluxa.app.shared.feature.addonstore.InstalledAddonUiModel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
@ -15,6 +17,43 @@ data class AppleAddonStoreActionSnapshot(
val direction: Int? = null
)
data class AppleInstalledAddonSnapshot(
val name: String,
val description: String,
val url: String,
val logoUrl: String?,
val version: String?,
val configurable: Boolean,
val isEnabled: Boolean,
val canMoveUp: Boolean,
val canMoveDown: Boolean,
val isRefreshing: Boolean
)
data class AppleAddonStoreSnapshot(
val installedAddons: List<AppleInstalledAddonSnapshot> = emptyList(),
val isLoading: Boolean = false,
val isSubmittingInput: Boolean = false,
val inputFailed: Boolean = false,
val addedAddonName: String? = null,
val clearInputOnSuccess: Boolean = false
)
private fun AppleInstalledAddonSnapshot.toUiModel(): InstalledAddonUiModel = InstalledAddonUiModel(
name = name,
description = description,
url = url,
logoUrl = logoUrl,
version = version,
configUrl = null,
configurable = configurable,
isEnabled = isEnabled,
canRemove = true,
canMoveUp = canMoveUp,
canMoveDown = canMoveDown,
isRefreshing = isRefreshing
)
class AppleAddonStoreDataSource : AddonStoreDataSource {
private val state = MutableStateFlow(AddonStoreUiState())
private var onActionRequested: (AppleAddonStoreActionSnapshot) -> Unit = {}
@ -69,6 +108,18 @@ class AppleAddonStoreDataSource : AddonStoreDataSource {
onActionRequested = handler
}
fun update(snapshot: AppleAddonStoreSnapshot) {
state.value = state.value.copy(
installedAddons = snapshot.installedAddons.map { it.toUiModel() },
isLoading = snapshot.isLoading,
isSubmittingInput = snapshot.isSubmittingInput,
inputError = if (snapshot.inputFailed) AppStrings.t("en", "addons.manifest_unreachable") else null,
addedAddonName = snapshot.addedAddonName,
inputText = if (snapshot.clearInputOnSuccess) "" else state.value.inputText,
inputDetectedType = if (snapshot.clearInputOnSuccess) AddonStoreInputType.UNKNOWN else state.value.inputDetectedType
)
}
private fun postAction(action: AppleAddonStoreActionSnapshot) {
onActionRequested(action)
}