diff --git a/appleApp/AppleCore/FluxaAppleAddonResourceLoader.swift b/appleApp/AppleCore/FluxaAppleAddonResourceLoader.swift index 20614ea..af4a1f2 100644 --- a/appleApp/AppleCore/FluxaAppleAddonResourceLoader.swift +++ b/appleApp/AppleCore/FluxaAppleAddonResourceLoader.swift @@ -1,4 +1,5 @@ import Foundation +import FluxaCore final class FluxaAppleAddonResourceLoader { private let resolver: FluxaAppleAddonCatalogResolver diff --git a/appleApp/AppleCore/FluxaAppleCatalogLoader.swift b/appleApp/AppleCore/FluxaAppleCatalogLoader.swift index 50e745a..5cec4ed 100644 --- a/appleApp/AppleCore/FluxaAppleCatalogLoader.swift +++ b/appleApp/AppleCore/FluxaAppleCatalogLoader.swift @@ -1,4 +1,5 @@ import Foundation +import FluxaCore struct FluxaAppleCatalogRequest: Sendable { let id: String diff --git a/appleApp/project.yml b/appleApp/project.yml index 100ef74..ae49abb 100644 --- a/appleApp/project.yml +++ b/appleApp/project.yml @@ -32,8 +32,11 @@ targets: - name: Build Fluxa Rust Core script: scripts/build-rust-core-xcframework.sh basedOnDependencyAnalysis: false + - name: Build FluxaCore + script: ../gradlew -p .. :core:embedAndSignAppleFrameworkForXcode + basedOnDependencyAnalysis: false - name: Build FluxaShared - script: ../gradlew -p .. :shared:embedAndSignAppleFrameworkForXcode --info + script: ../gradlew -p .. :shared:embedAndSignAppleFrameworkForXcode basedOnDependencyAnalysis: false FluxaTvos: type: application diff --git a/core/build.gradle.kts b/core/build.gradle.kts index c610ae6..1c5ac7b 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -15,7 +15,7 @@ kotlin { targets .withType() - .matching { it.name.startsWith("tvos") } + .matching { it.name.startsWith("tvos") || it.name.startsWith("ios") } .configureEach { binaries.framework { baseName = "FluxaCore" diff --git a/core/src/iosMain/kotlin/com/fluxa/app/core/apple/AppleSnapshots.kt b/core/src/iosMain/kotlin/com/fluxa/app/core/apple/AppleSnapshots.kt new file mode 100644 index 0000000..231f3cf --- /dev/null +++ b/core/src/iosMain/kotlin/com/fluxa/app/core/apple/AppleSnapshots.kt @@ -0,0 +1,90 @@ +package com.fluxa.app.core.apple + +data class AppleCatalogHomeSnapshot( + val rows: List = emptyList(), + val isLoading: Boolean = false +) + +data class AppleCatalogRowSnapshot( + val id: String, + val title: String, + val items: List, + val canLoadMore: Boolean = false +) + +data class AppleCatalogItemSnapshot( + val id: String, + val type: String, + val title: String, + val subtitle: String = "", + val artworkUrl: String? = null, + val logoUrl: String? = null, + val addonTransportUrl: String? = null, + val catalogType: String? = null, + val progress: Float? = null, + val topTenRank: Int? = null +) + +data class AppleDetailRequestSnapshot( + val id: String, + val type: String, + val addonTransportUrl: String? = null, + val catalogType: String? = null, + val title: String? = null +) + +data class AppleDetailStreamSnapshot( + val addonName: String, + val title: String, + val playableUrl: String, + val requestHeadersJson: String = "{}" +) + +data class AppleDetailSnapshot( + val id: String, + val type: String, + val title: String, + val description: String = "", + val posterUrl: String? = null, + val backgroundUrl: String? = null, + val logoUrl: String? = null, + val releaseLabel: String = "", + val ratingLabel: String = "", + val isInWatchlist: Boolean = false, + val isLoading: Boolean = false, + val errorKey: String? = null, + val streams: List = emptyList(), + val hasStreamProviders: Boolean = true +) + +data class ApplePlaybackRequestSnapshot( + val playableUrl: String, + val title: String, + val resumePositionMs: Long = 0L, + val requestHeadersJson: String = "{}" +) + +data class AppleDiscoverRequestSnapshot( + val contentType: String, + val catalogKey: String? = null, + val genre: String? = null +) + +data class AppleDiscoverFilterOptionSnapshot( + val id: String? = null, + val label: String +) + +data class AppleDiscoverSnapshot( + val request: AppleDiscoverRequestSnapshot, + val catalogOptions: List = emptyList(), + val genreOptions: List = emptyList(), + val results: List = emptyList(), + val isLoading: Boolean = false +) + +data class AppleSearchSnapshot( + val query: String, + val results: List = emptyList(), + val isLoading: Boolean = false +) diff --git a/shared/src/iosMain/kotlin/com/fluxa/app/shared/FluxaApple.kt b/shared/src/iosMain/kotlin/com/fluxa/app/shared/FluxaApple.kt index 4486e20..1e501fb 100644 --- a/shared/src/iosMain/kotlin/com/fluxa/app/shared/FluxaApple.kt +++ b/shared/src/iosMain/kotlin/com/fluxa/app/shared/FluxaApple.kt @@ -2,17 +2,17 @@ package com.fluxa.app.shared import androidx.compose.runtime.Composable import androidx.compose.ui.window.ComposeUIViewController -import com.fluxa.app.shared.platform.AppleCatalogHomeSnapshot -import com.fluxa.app.shared.platform.AppleSearchSnapshot -import com.fluxa.app.shared.platform.AppleDiscoverRequestSnapshot -import com.fluxa.app.shared.platform.AppleDiscoverSnapshot +import com.fluxa.app.core.apple.AppleCatalogHomeSnapshot +import com.fluxa.app.core.apple.AppleSearchSnapshot +import com.fluxa.app.core.apple.AppleDiscoverRequestSnapshot +import com.fluxa.app.core.apple.AppleDiscoverSnapshot import com.fluxa.app.shared.platform.AppleCalendarSnapshot import com.fluxa.app.shared.platform.AppleAuthSubmitSnapshot import com.fluxa.app.shared.platform.AppleAuthSnapshot import com.fluxa.app.shared.platform.AppleLibrarySnapshot -import com.fluxa.app.shared.platform.AppleDetailRequestSnapshot -import com.fluxa.app.shared.platform.AppleDetailSnapshot -import com.fluxa.app.shared.platform.ApplePlaybackRequestSnapshot +import com.fluxa.app.core.apple.AppleDetailRequestSnapshot +import com.fluxa.app.core.apple.AppleDetailSnapshot +import com.fluxa.app.core.apple.ApplePlaybackRequestSnapshot import com.fluxa.app.shared.platform.AppleAddonStoreActionSnapshot import com.fluxa.app.shared.platform.AppleAddonStoreDataSource import com.fluxa.app.shared.platform.AppleAddonStoreSnapshot diff --git a/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleCatalogHomeDataSource.kt b/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleCatalogHomeDataSource.kt index b1c09b4..3188150 100644 --- a/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleCatalogHomeDataSource.kt +++ b/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleCatalogHomeDataSource.kt @@ -1,5 +1,8 @@ package com.fluxa.app.shared.platform +import com.fluxa.app.core.apple.AppleCatalogHomeSnapshot +import com.fluxa.app.core.apple.AppleCatalogItemSnapshot +import com.fluxa.app.core.apple.AppleCatalogRowSnapshot import com.fluxa.app.shared.feature.catalog.CatalogHomeDataSource import com.fluxa.app.shared.feature.catalog.CatalogHomeUiState import com.fluxa.app.shared.feature.catalog.CatalogItemUiModel @@ -11,31 +14,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import androidx.compose.ui.unit.dp -data class AppleCatalogHomeSnapshot( - val rows: List = emptyList(), - val isLoading: Boolean = false -) - -data class AppleCatalogRowSnapshot( - val id: String, - val title: String, - val items: List, - val canLoadMore: Boolean = false -) - -data class AppleCatalogItemSnapshot( - val id: String, - val type: String, - val title: String, - val subtitle: String = "", - val artworkUrl: String? = null, - val logoUrl: String? = null, - val addonTransportUrl: String? = null, - val catalogType: String? = null, - val progress: Float? = null, - val topTenRank: Int? = null -) - class AppleCatalogHomeDataSource : CatalogHomeDataSource { private val state = MutableStateFlow(CatalogHomeUiState()) private var onRefreshRequested: () -> Unit = {} diff --git a/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleDetailDataSource.kt b/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleDetailDataSource.kt index 8f2abe3..abf7c1e 100644 --- a/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleDetailDataSource.kt +++ b/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleDetailDataSource.kt @@ -1,5 +1,9 @@ package com.fluxa.app.shared.platform +import com.fluxa.app.core.apple.AppleDetailRequestSnapshot +import com.fluxa.app.core.apple.AppleDetailSnapshot +import com.fluxa.app.core.apple.AppleDetailStreamSnapshot +import com.fluxa.app.core.apple.ApplePlaybackRequestSnapshot import com.fluxa.app.shared.feature.catalog.CatalogItemUiModel import com.fluxa.app.shared.feature.catalog.CatalogSourceUiModel import com.fluxa.app.shared.feature.detail.DetailDataSource @@ -15,45 +19,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -data class AppleDetailRequestSnapshot( - val id: String, - val type: String, - val addonTransportUrl: String? = null, - val catalogType: String? = null, - val title: String? = null -) - -data class AppleDetailSnapshot( - val id: String, - val type: String, - val title: String, - val description: String = "", - val posterUrl: String? = null, - val backgroundUrl: String? = null, - val logoUrl: String? = null, - val releaseLabel: String = "", - val ratingLabel: String = "", - val isInWatchlist: Boolean = false, - val isLoading: Boolean = false, - val errorKey: String? = null, - val streams: List = emptyList(), - val hasStreamProviders: Boolean = true -) - -data class ApplePlaybackRequestSnapshot( - val playableUrl: String, - val title: String, - val resumePositionMs: Long = 0L, - val requestHeadersJson: String = "{}" -) - -data class AppleDetailStreamSnapshot( - val addonName: String, - val title: String, - val playableUrl: String, - val requestHeadersJson: String = "{}" -) - class AppleDetailDataSource( private val watchlistStore: WatchlistStore ) : DetailDataSource { diff --git a/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleDiscoverDataSource.kt b/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleDiscoverDataSource.kt index 53ab9da..7f0e71c 100644 --- a/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleDiscoverDataSource.kt +++ b/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleDiscoverDataSource.kt @@ -1,5 +1,9 @@ package com.fluxa.app.shared.platform +import com.fluxa.app.core.apple.AppleCatalogItemSnapshot +import com.fluxa.app.core.apple.AppleDiscoverFilterOptionSnapshot +import com.fluxa.app.core.apple.AppleDiscoverRequestSnapshot +import com.fluxa.app.core.apple.AppleDiscoverSnapshot import com.fluxa.app.shared.feature.discover.DiscoverDataSource import com.fluxa.app.shared.feature.discover.DiscoverFilterOptionUiModel import com.fluxa.app.shared.feature.discover.DiscoverFiltersUiModel @@ -12,25 +16,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -data class AppleDiscoverRequestSnapshot( - val contentType: String, - val catalogKey: String? = null, - val genre: String? = null -) - -data class AppleDiscoverFilterOptionSnapshot( - val id: String? = null, - val label: String -) - -data class AppleDiscoverSnapshot( - val request: AppleDiscoverRequestSnapshot, - val catalogOptions: List = emptyList(), - val genreOptions: List = emptyList(), - val results: List = emptyList(), - val isLoading: Boolean = false -) - class AppleDiscoverDataSource : DiscoverDataSource { private val state = MutableStateFlow(DiscoverUiState()) private var onDiscoverRequested: (AppleDiscoverRequestSnapshot) -> Unit = {} diff --git a/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleSearchDataSource.kt b/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleSearchDataSource.kt index 993b821..5ab12e7 100644 --- a/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleSearchDataSource.kt +++ b/shared/src/iosMain/kotlin/com/fluxa/app/shared/platform/AppleSearchDataSource.kt @@ -1,6 +1,8 @@ package com.fluxa.app.shared.platform import androidx.compose.ui.unit.dp +import com.fluxa.app.core.apple.AppleCatalogItemSnapshot +import com.fluxa.app.core.apple.AppleSearchSnapshot import com.fluxa.app.shared.feature.catalog.CatalogItemUiModel import com.fluxa.app.shared.feature.catalog.CatalogSourceUiModel import com.fluxa.app.shared.feature.search.SearchDataSource @@ -15,12 +17,6 @@ import kotlinx.serialization.encodeToString import kotlinx.serialization.decodeFromString import platform.Foundation.NSUserDefaults -data class AppleSearchSnapshot( - val query: String, - val results: List = emptyList(), - val isLoading: Boolean = false -) - class AppleSearchDataSource : SearchDataSource { private val defaults = NSUserDefaults.standardUserDefaults private val state = MutableStateFlow(SearchUiState(recentItems = readHistory()))