mirror of
https://github.com/FluxaMedia/fluxa.git
synced 2026-07-26 20:02:14 +00:00
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:
parent
6b218ba97f
commit
d88e4226da
2 changed files with 61 additions and 0 deletions
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue