diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 509dce90..b3dbc7da 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -74,6 +74,8 @@ kotlin { implementation(libs.sqlite.bundled) implementation(libs.bundles.paging) + + implementation(libs.bundles.kmpPalette) } commonTest.dependencies { diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 6062df03..5f89b3f4 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -50,6 +50,8 @@ Search Movie + See More + Light theme Dark theme diff --git a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardDescription.kt b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardDescription.kt index aa9c01c8..ab353ace 100644 --- a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardDescription.kt +++ b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardDescription.kt @@ -12,10 +12,7 @@ import androidx.compose.material3.Card import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush @@ -26,19 +23,38 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage +import com.kmpalette.loader.NetworkLoader +import com.kmpalette.rememberDominantColorState import com.vickbt.composeApp.domain.models.MovieDetails import com.vickbt.composeApp.utils.loadImage +import com.vickbt.shared.resources.Res +import com.vickbt.shared.resources.see_more +import io.ktor.http.Url +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO +import org.jetbrains.compose.resources.stringResource @Composable fun MovieCardDescription( modifier: Modifier = Modifier, movie: MovieDetails, + networkLoader: NetworkLoader, maxLine: Int = 3, - overFlowText: String = "See more", + overFlowText: String = stringResource(Res.string.see_more), onItemClick: (MovieDetails) -> Unit ) { - var dominantColor by remember { mutableStateOf(Color.DarkGray) } - var dominantTextColor by remember { mutableStateOf(Color.LightGray) } + val dominantColorState = rememberDominantColorState( + loader = networkLoader, + defaultColor = Color.DarkGray, + defaultOnColor = Color.LightGray, + coroutineContext = Dispatchers.IO + ) + + movie.backdropPath?.loadImage()?.let { + LaunchedEffect(it) { + dominantColorState.updateFrom(Url(it)) + } + } Card(modifier = modifier.clickable { onItemClick(movie) }) { Box { @@ -62,7 +78,7 @@ fun MovieCardDescription( .align(Alignment.BottomCenter) .background( Brush.verticalGradient( - listOf(Color.Transparent, dominantColor) + listOf(Color.Transparent, dominantColorState.color) ) ) ) @@ -82,18 +98,16 @@ fun MovieCardDescription( style = MaterialTheme.typography.titleMedium, overflow = TextOverflow.Ellipsis, textAlign = TextAlign.Start, - color = dominantTextColor, + color = dominantColorState.onColor, lineHeight = 30.sp ) - movie.overview?.let { - ExpandableText( - modifier = Modifier.padding(bottom = 4.dp), - text = it, - overFlowText = overFlowText, - minimizedMaxLines = maxLine - ) - } + ExpandableText( + modifier = Modifier.padding(bottom = 4.dp), + text = movie.overview, + overFlowText = overFlowText, + minimizedMaxLines = maxLine + ) } } } diff --git a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardLandscape.kt b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardLandscape.kt index b9aaa0a7..fd51abfc 100644 --- a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardLandscape.kt +++ b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardLandscape.kt @@ -19,10 +19,7 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush @@ -33,6 +30,9 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage +import com.kmpalette.loader.NetworkLoader +import com.kmpalette.loader.rememberNetworkLoader +import com.kmpalette.rememberDominantColorState import com.vickbt.composeApp.domain.models.Movie import com.vickbt.composeApp.ui.components.ratingbar.RatingBar import com.vickbt.composeApp.ui.components.ratingbar.RatingBarStyle @@ -43,16 +43,30 @@ import com.vickbt.composeApp.utils.getReleaseDate import com.vickbt.composeApp.utils.loadImage import com.vickbt.shared.resources.Res import com.vickbt.shared.resources.unknown_movie +import io.ktor.http.Url +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO import org.jetbrains.compose.resources.stringResource @Composable fun MovieCardLandscape( modifier: Modifier = Modifier, movie: Movie, + networkLoader: NetworkLoader = rememberNetworkLoader(), onClickItem: (Movie) -> Unit ) { - var dominantTextColor by remember { mutableStateOf(Color.LightGray) } - var dominantSubTextColor by remember { mutableStateOf(dominantTextColor) } + val dominantColorState = rememberDominantColorState( + loader = networkLoader, + defaultColor = Color.DarkGray, + defaultOnColor = Color.LightGray, + coroutineContext = Dispatchers.IO + ) + + movie.backdropPath?.loadImage()?.let { + LaunchedEffect(it) { + dominantColorState.updateFrom(Url(it)) + } + } Card( modifier = modifier.clickable { onClickItem(movie) }, @@ -80,7 +94,7 @@ fun MovieCardLandscape( Brush.verticalGradient( listOf( Color.Transparent, - Color.DarkGray + dominantColorState.color ) ) ) @@ -103,7 +117,7 @@ fun MovieCardLandscape( style = MaterialTheme.typography.titleMedium, overflow = TextOverflow.Ellipsis, textAlign = TextAlign.Start, - color = dominantTextColor + color = dominantColorState.onColor ) //endregion @@ -131,7 +145,7 @@ fun MovieCardLandscape( .padding(horizontal = 4.dp) .width(1.dp) .height(13.dp), - color = dominantSubTextColor + color = dominantColorState.onColor ) Text( @@ -142,7 +156,7 @@ fun MovieCardLandscape( style = MaterialTheme.typography.labelSmall, overflow = TextOverflow.Ellipsis, textAlign = TextAlign.Start, - color = dominantSubTextColor + color = dominantColorState.onColor ) } } diff --git a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardPager.kt b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardPager.kt index 8b3509b6..619077b2 100644 --- a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardPager.kt +++ b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/MovieCardPager.kt @@ -18,10 +18,7 @@ import androidx.compose.material3.Card import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush @@ -33,6 +30,9 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage +import com.kmpalette.loader.NetworkLoader +import com.kmpalette.loader.rememberNetworkLoader +import com.kmpalette.rememberDominantColorState import com.vickbt.composeApp.domain.models.Movie import com.vickbt.composeApp.ui.components.ratingbar.RatingBar import com.vickbt.composeApp.ui.components.ratingbar.RatingBarStyle @@ -41,16 +41,30 @@ import com.vickbt.composeApp.utils.getRating import com.vickbt.composeApp.utils.loadImage import com.vickbt.shared.resources.Res import com.vickbt.shared.resources.unknown_movie +import io.ktor.http.Url +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO import org.jetbrains.compose.resources.stringResource @Composable fun MovieCardPager( modifier: Modifier = Modifier, movie: Movie, + networkLoader: NetworkLoader = rememberNetworkLoader(), onItemClick: (Movie) -> Unit ) { - var dominantColor by remember { mutableStateOf(Color.DarkGray) } - var dominantTextColor by remember { mutableStateOf(Color.LightGray) } + val dominantColorState = rememberDominantColorState( + loader = networkLoader, + defaultColor = Color.DarkGray, + defaultOnColor = Color.LightGray, + coroutineContext = Dispatchers.IO + ) + + movie.backdropPath?.loadImage()?.let { + LaunchedEffect(it) { + dominantColorState.updateFrom(Url(it)) + } + } Card(modifier = modifier.clickable { onItemClick(movie) }) { Box { @@ -74,7 +88,7 @@ fun MovieCardPager( .align(Alignment.BottomCenter) .background( Brush.verticalGradient( - listOf(Color.Transparent, dominantColor) + listOf(Color.Transparent, dominantColorState.color) ) ) ) @@ -95,7 +109,7 @@ fun MovieCardPager( style = MaterialTheme.typography.titleMedium, overflow = TextOverflow.Ellipsis, textAlign = TextAlign.Start, - color = dominantTextColor, + color = dominantColorState.onColor, lineHeight = 30.sp ) diff --git a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/appbars/DetailsAppBar.kt b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/appbars/DetailsAppBar.kt index b2668a00..8747211f 100644 --- a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/appbars/DetailsAppBar.kt +++ b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/components/appbars/DetailsAppBar.kt @@ -24,10 +24,8 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush @@ -39,6 +37,8 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage +import com.kmpalette.loader.NetworkLoader +import com.kmpalette.rememberDominantColorState import com.vickbt.composeApp.domain.models.MovieDetails import com.vickbt.composeApp.ui.components.collapsingToolbar.CollapsingToolbarScaffoldState import com.vickbt.composeApp.utils.DetailsUiState @@ -46,6 +46,9 @@ import com.vickbt.composeApp.utils.getMovieDuration import com.vickbt.composeApp.utils.loadImage import com.vickbt.shared.resources.Res import com.vickbt.shared.resources.unknown_movie +import io.ktor.http.Url +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalMaterial3Api::class) @@ -54,6 +57,7 @@ fun DetailsAppBar( modifier: Modifier = Modifier, collapsingScrollState: CollapsingToolbarScaffoldState, movieDetailsState: DetailsUiState, + networkLoader: NetworkLoader, onNavigationIconClick: () -> Unit, onShareIconClick: () -> Unit, onFavoriteIconClick: (MovieDetails, Boolean?) -> Unit @@ -61,13 +65,21 @@ fun DetailsAppBar( // Return progress on collapsing toolbar - 1.0f=Expanded, 0.0f=Collapsed val scrollProgress = collapsingScrollState.toolbarState.progress - val defaultDominantColor = MaterialTheme.colorScheme.surface - val defaultDominantTextColor = MaterialTheme.colorScheme.onSurface - var dominantColor by remember { mutableStateOf(defaultDominantColor) } - var dominantTextColor by remember { mutableStateOf(defaultDominantTextColor) } + val dominantColorState = rememberDominantColorState( + loader = networkLoader, + defaultColor = Color.DarkGray, + defaultOnColor = Color.LightGray, + coroutineContext = Dispatchers.IO + ) - val movieDetails by remember { mutableStateOf(movieDetailsState.movieDetails) } - var isFavourite by remember { mutableStateOf(movieDetailsState.isFavorite) } + movieDetailsState.movieDetails?.backdropPath?.loadImage()?.let { + LaunchedEffect(it) { + dominantColorState.updateFrom(Url(it)) + } + } + + val movieDetails = movieDetailsState.movieDetails + var isFavourite = movieDetailsState.isFavorite val backgroundColor by animateColorAsState( targetValue = MaterialTheme.colorScheme.surface.copy(1 - scrollProgress) @@ -95,7 +107,11 @@ fun DetailsAppBar( .fillMaxWidth() .height(210.dp) .align(Alignment.BottomCenter) - .background(Brush.verticalGradient(listOf(Color.Transparent, dominantColor))) + .background( + Brush.verticalGradient( + listOf(Color.Transparent, dominantColorState.color) + ) + ) ) Column( @@ -117,7 +133,7 @@ fun DetailsAppBar( style = MaterialTheme.typography.titleMedium, maxLines = 2, overflow = TextOverflow.Ellipsis, - color = dominantTextColor, + color = dominantColorState.onColor, fontSize = 32.sp, textAlign = TextAlign.Start, lineHeight = 30.sp @@ -126,7 +142,7 @@ fun DetailsAppBar( Text( modifier = Modifier, text = movieDetails?.runtime?.getMovieDuration() ?: "", - color = dominantTextColor, + color = dominantColorState.onColor, style = MaterialTheme.typography.bodyMedium, fontSize = 14.sp ) diff --git a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/details/DetailsScreen.kt b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/details/DetailsScreen.kt index 72bd0ecf..847e9679 100644 --- a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/details/DetailsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/details/DetailsScreen.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavHostController import app.cash.paging.compose.collectAsLazyPagingItems +import com.kmpalette.loader.rememberNetworkLoader import com.vickbt.composeApp.ui.components.ItemMovieCast import com.vickbt.composeApp.ui.components.MovieCardPortrait import com.vickbt.composeApp.ui.components.MovieRatingSection @@ -42,6 +43,7 @@ import com.vickbt.shared.resources.cast import com.vickbt.shared.resources.overview import com.vickbt.shared.resources.similar_movies import org.jetbrains.compose.resources.stringResource +import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel import org.koin.core.annotation.KoinExperimentalAPI @@ -59,6 +61,8 @@ fun DetailsScreen( viewModel.isMovieFavorite(movieId = movieId) } + val networkLoader = rememberNetworkLoader(httpClient = koinInject()) + val movieDetailsState = viewModel.movieDetailsState.collectAsState().value val scrollState = rememberScrollState() @@ -83,6 +87,7 @@ fun DetailsScreen( modifier = Modifier.fillMaxWidth(), collapsingScrollState = collapsingScrollState, movieDetailsState = movieDetailsState, + networkLoader = networkLoader, onNavigationIconClick = { navigator.navigateUp() }, onShareIconClick = {}, onFavoriteIconClick = { movieDetails, isFavorite -> diff --git a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/favorites/FavoritesScreen.kt b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/favorites/FavoritesScreen.kt index fc0a5d53..c6bb031c 100644 --- a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/favorites/FavoritesScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/favorites/FavoritesScreen.kt @@ -16,11 +16,13 @@ import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController +import com.kmpalette.loader.rememberNetworkLoader import com.vickbt.composeApp.ui.components.MovieCardDescription import com.vickbt.composeApp.ui.components.appbars.AppBar import com.vickbt.shared.resources.Res import com.vickbt.shared.resources.title_favorites import org.jetbrains.compose.resources.stringResource +import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel import org.koin.core.annotation.KoinExperimentalAPI @@ -32,6 +34,8 @@ fun FavoritesScreen( ) { val favoriteMovies = viewModel.favoriteMoviesState.collectAsState().value + val networkLoader = rememberNetworkLoader(httpClient = koinInject()) + Scaffold( modifier = Modifier.padding(mainPaddingValues), topBar = { AppBar(stringResource(Res.string.title_favorites)) } @@ -44,7 +48,8 @@ fun FavoritesScreen( items(items = favoriteMovies.favoriteMovies ?: emptyList()) { favoriteMovie -> MovieCardDescription( modifier = Modifier.fillMaxWidth().height(260.dp).padding(vertical = 4.dp), - movie = favoriteMovie + movie = favoriteMovie, + networkLoader = networkLoader ) { movieDetails -> navigator.navigate("/details/${movieDetails.id}") } diff --git a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/home/HomeScreen.kt b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/home/HomeScreen.kt index 191dcb90..2eaaeab7 100644 --- a/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/home/HomeScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/vickbt/composeApp/ui/screens/home/HomeScreen.kt @@ -28,6 +28,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import app.cash.paging.compose.collectAsLazyPagingItems +import com.kmpalette.loader.rememberNetworkLoader import com.vickbt.composeApp.ui.components.MovieCardLandscape import com.vickbt.composeApp.ui.components.MovieCardPager import com.vickbt.composeApp.ui.components.MovieCardPagerIndicator @@ -41,6 +42,7 @@ import com.vickbt.shared.resources.popular_movies import com.vickbt.shared.resources.trending_movies import com.vickbt.shared.resources.upcoming_movies import org.jetbrains.compose.resources.stringResource +import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel @OptIn(ExperimentalFoundationApi::class) @@ -55,7 +57,7 @@ fun HomeScreen( val homeUiState = viewModel.homeUiState.collectAsState().value - val movies = homeUiState.trendingMovies?.collectAsLazyPagingItems() + val networkLoader = rememberNetworkLoader(httpClient = koinInject()) Scaffold( modifier = Modifier @@ -99,6 +101,7 @@ fun HomeScreen( ) { currentPage -> MovieCardPager( modifier = Modifier.fillMaxWidth().height(280.dp), + networkLoader = networkLoader, movie = nowPlayingMovies[currentPage] ) { movie -> navigator.navigate("/details/${movie.id}") @@ -170,6 +173,7 @@ fun HomeScreen( .width(300.dp) .height(245.dp), movie = it, + networkLoader = networkLoader, onClickItem = { movie -> navigator.navigate("/details/${movie.id}") } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index da510e1e..c014e28d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,14 +25,15 @@ materialWindowSizeClass = "0.3.0" navigation = "2.7.0-alpha07" coil = "3.0.0-alpha06" datastore = "1.1.1" +kmpPalette = "3.1.0" ksp = "2.0.20-1.0.24" sqlite = "2.5.0-SNAPSHOT" room = "2.7.0-alpha08" paging = "3.3.0-alpha02-0.5.1" +kmppalette = "3.1.0" #Android Versions androidxActivity = "1.8.2" - androidxCore = "1.12.0" material = "1.12.0" firebaseBOM = "33.1.2" @@ -85,6 +86,8 @@ coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" coil-compose-core = { module = "io.coil-kt.coil3:coil-compose-core", version.ref = "coil" } coil-ktor = { module = "io.coil-kt.coil3:coil-network-ktor", version.ref = "coil" } coil-multiplatform = { module = "io.coil-kt.coil3:coil", version.ref = "coil" } +kmpPalette-core = { module = "com.kmpalette:kmpalette-core", version.ref = "kmpPalette" } +kmpPalette-network = { module = "com.kmpalette:extensions-network", version.ref = "kmpPalette" } room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" } @@ -114,5 +117,5 @@ turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" } [bundles] ktor = ["ktor-core", "ktor-contentNegotiation", "ktor-json", "ktor-logging"] coil = ["coil-compose-core", "coil-compose", "coil-ktor", "coil-multiplatform"] -paging = ["paging-common", "paging-compose"] -#paging = ["paging-compose"] \ No newline at end of file +kmpPalette = ["kmpPalette-core", "kmpPalette-network"] +paging = ["paging-common", "paging-compose"] \ No newline at end of file diff --git a/shared/schemas/com.vickbt.shared.data.cache.room.AppDatabase/1.json b/shared/schemas/com.vickbt.shared.data.cache.room.AppDatabase/1.json deleted file mode 100644 index cbfc3d4d..00000000 --- a/shared/schemas/com.vickbt.shared.data.cache.room.AppDatabase/1.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 1, - "identityHash": "f42990db2e9e1c5e1da7e5ccde59dfdf", - "entities": [ - { - "tableName": "Favorite Movie Table", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `imdbId` TEXT, `backdropPath` TEXT, `posterPath` TEXT, `originalLanguage` TEXT, `originalTitle` TEXT, `overview` TEXT, `popularity` REAL, `releaseDate` TEXT, `runTime` INTEGER, `status` TEXT, `tagLine` TEXT, `title` TEXT, `voteAverage` REAL, `voteCount` INTEGER, `createdAt` TEXT, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "imdbId", - "columnName": "imdbId", - "affinity": "TEXT" - }, - { - "fieldPath": "backdropPath", - "columnName": "backdropPath", - "affinity": "TEXT" - }, - { - "fieldPath": "posterPath", - "columnName": "posterPath", - "affinity": "TEXT" - }, - { - "fieldPath": "originalLanguage", - "columnName": "originalLanguage", - "affinity": "TEXT" - }, - { - "fieldPath": "originalTitle", - "columnName": "originalTitle", - "affinity": "TEXT" - }, - { - "fieldPath": "overview", - "columnName": "overview", - "affinity": "TEXT" - }, - { - "fieldPath": "popularity", - "columnName": "popularity", - "affinity": "REAL" - }, - { - "fieldPath": "releaseDate", - "columnName": "releaseDate", - "affinity": "TEXT" - }, - { - "fieldPath": "runTime", - "columnName": "runTime", - "affinity": "INTEGER" - }, - { - "fieldPath": "status", - "columnName": "status", - "affinity": "TEXT" - }, - { - "fieldPath": "tagLine", - "columnName": "tagLine", - "affinity": "TEXT" - }, - { - "fieldPath": "title", - "columnName": "title", - "affinity": "TEXT" - }, - { - "fieldPath": "voteAverage", - "columnName": "voteAverage", - "affinity": "REAL" - }, - { - "fieldPath": "voteCount", - "columnName": "voteCount", - "affinity": "INTEGER" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "TEXT" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f42990db2e9e1c5e1da7e5ccde59dfdf')" - ] - } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/data/cache/room/RoomAppDatabase.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/data/cache/room/RoomAppDatabase.kt deleted file mode 100644 index 15a6d08d..00000000 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/data/cache/room/RoomAppDatabase.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.vickbt.shared.data.cache.room - -import androidx.room.Database -import androidx.room.RoomDatabase -import androidx.sqlite.driver.bundled.BundledSQLiteDriver -import com.vickbt.shared.data.cache.room.daos.FavoriteMovieDao -import com.vickbt.shared.data.cache.room.entities.FavoriteMovieEntity -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.IO - -@Database(entities = [FavoriteMovieEntity::class], version = 1) -abstract class RoomAppDatabase : RoomDatabase() { - abstract fun favoriteMovieDao(): FavoriteMovieDao -} diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/data/cache/room/daos/FavoriteMovieDao.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/data/cache/room/daos/FavoriteMovieDao.kt deleted file mode 100644 index dafb2c75..00000000 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/data/cache/room/daos/FavoriteMovieDao.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.vickbt.shared.data.cache.room.daos - -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import com.vickbt.shared.data.cache.room.entities.FavoriteMovieEntity -import kotlinx.coroutines.flow.Flow - -@Dao -interface FavoriteMovieDao { - - @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertFavoriteMovie(favoriteMovie: FavoriteMovieEntity) - - @Query("SELECT * FROM `Favorite Movie Table` ORDER BY createdAt DESC") - fun getAllFavoriteMovies(): Flow> - - @Query("SELECT * FROM `Favorite Movie Table` WHERE id = :id") - suspend fun getFavoriteMovie(id: Int): FavoriteMovieEntity? - - @Query("DELETE FROM `Favorite Movie Table` WHERE id = :id") - suspend fun deleteFavoriteMovie(id: Int): Int - - @Query("DELETE FROM `Favorite Movie Table`") - suspend fun deleteAllFavoriteMovies() - - @Query("SELECT count(1) FROM `Favorite Movie Table` WHERE id = :id") - suspend fun isMovieFavorite(id: Int): Int -} - diff --git a/shared/src/commonMain/kotlin/com/vickbt/shared/data/cache/room/entities/FavoriteMovieEntity.kt b/shared/src/commonMain/kotlin/com/vickbt/shared/data/cache/room/entities/FavoriteMovieEntity.kt deleted file mode 100644 index 4e821843..00000000 --- a/shared/src/commonMain/kotlin/com/vickbt/shared/data/cache/room/entities/FavoriteMovieEntity.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.vickbt.shared.data.cache.room.entities - -import androidx.room.Entity -import androidx.room.PrimaryKey - -@Entity(tableName = "Favorite Movie Table") -data class FavoriteMovieEntity( - @PrimaryKey(autoGenerate = false) - val id: Int, - - val imdbId: String?, - val backdropPath: String?, - val posterPath: String?, - val originalLanguage: String?, - val originalTitle: String?, - val overview: String?, - val popularity: Double?, - val releaseDate: String?, - val runTime: Int?, - val status: String?, - val tagLine: String?, - val title: String?, - val voteAverage: Double?, - val voteCount: Int?, - val createdAt: String? -)