From 0cd542e75a350f916ca13fb2a09bc3c8aef49626 Mon Sep 17 00:00:00 2001
From: michaelbel <michael-bel@outlook.com>
Date: Sun, 5 May 2024 13:23:00 +0300
Subject: [PATCH] Navigation multiplatform

---
 core/common/build.gradle.kts                  |  3 +-
 core/interactor/build.gradle.kts              |  2 +-
 core/navigation/build.gradle.kts              |  2 +-
 core/persistence/build.gradle.kts             |  1 -
 core/repository/build.gradle.kts              |  2 +-
 core/ui/build.gradle.kts                      |  4 +-
 core/work/build.gradle.kts                    |  1 -
 .../michaelbel/movies/MainWindowContent.kt    | 47 ++---------
 .../org/michaelbel/movies/MoviesDesktop.kt    | 79 +++++++++++++------
 .../movies/account/AccountNavigation.kt       | 18 -----
 .../michaelbel/movies/auth/AuthNavigation.kt  | 18 -----
 .../movies/details/DetailsNavigation.kt       | 24 ++----
 feature/feed-impl/build.gradle.kts            |  8 +-
 .../michaelbel/movies/feed/FeedNavigation.kt  | 24 ------
 feature/gallery-impl/build.gradle.kts         |  4 +-
 .../movies/gallery/GalleryNavigation.kt       | 23 ++----
 feature/search-impl/build.gradle.kts          |  4 +-
 .../movies/search/SearchNavigation.kt         | 24 ++----
 .../movies/settings/SettingsNavigation.kt     | 18 -----
 gradle/libs.versions.toml                     | 10 +--
 readme.md                                     |  1 -
 readme.ru.md                                  |  1 -
 settings.gradle.kts                           |  4 +-
 23 files changed, 102 insertions(+), 220 deletions(-)

diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts
index 49c22f42f..4f8566663 100644
--- a/core/common/build.gradle.kts
+++ b/core/common/build.gradle.kts
@@ -19,8 +19,6 @@ kotlin {
             api(libs.bundles.koin.common)
             implementation(compose.material3)
             implementation(libs.bundles.kotlinx.coroutines.common)
-            /*implementation(libs.bundles.compose.viewmodel.common)*/
-            implementation(libs.bundles.paging.common)
         }
         androidMain.dependencies {
             api(libs.bundles.kotlinx.coroutines.android)
@@ -34,6 +32,7 @@ kotlin {
             api(libs.bundles.koin.compose.work.android)
             implementation(libs.bundles.appcompat.android)
             implementation(libs.bundles.browser.android)
+            implementation(libs.bundles.paging.common) // fixme ломает navigation
         }
         val desktopMain by getting
         desktopMain.dependencies {
diff --git a/core/interactor/build.gradle.kts b/core/interactor/build.gradle.kts
index 04f2fbc36..1c268e8b5 100644
--- a/core/interactor/build.gradle.kts
+++ b/core/interactor/build.gradle.kts
@@ -21,7 +21,7 @@ kotlin {
             implementation(compose.runtime)
             implementation(compose.runtimeSaveable)
             implementation(libs.bundles.kotlinx.coroutines.common)
-            implementation(libs.bundles.paging.common)
+            implementation(libs.bundles.room.paging.common)
         }
     }
 }
diff --git a/core/navigation/build.gradle.kts b/core/navigation/build.gradle.kts
index f81d6a09a..10ffc1b1c 100644
--- a/core/navigation/build.gradle.kts
+++ b/core/navigation/build.gradle.kts
@@ -20,7 +20,7 @@ kotlin {
         val desktopMain by getting
         desktopMain.dependencies {
             api(libs.bundles.compose.navigation.common)
-            api(libs.bundles.precompose.desktop)
+            api(libs.bundles.compose.viewmodel.common)
         }
     }
 }
diff --git a/core/persistence/build.gradle.kts b/core/persistence/build.gradle.kts
index 972d6cc22..66113ee43 100644
--- a/core/persistence/build.gradle.kts
+++ b/core/persistence/build.gradle.kts
@@ -20,7 +20,6 @@ kotlin {
             api(project(":core:common"))
             api(project(":core:network"))
             implementation(libs.bundles.datastore.common)
-            implementation(libs.bundles.paging.common)
             implementation(libs.bundles.room.common)
             implementation(libs.bundles.sqlite.common)
             implementation(libs.bundles.okio.common)
diff --git a/core/repository/build.gradle.kts b/core/repository/build.gradle.kts
index 332e966ca..1728e29f3 100644
--- a/core/repository/build.gradle.kts
+++ b/core/repository/build.gradle.kts
@@ -17,7 +17,7 @@ kotlin {
         commonMain.dependencies {
             api(project(":core:persistence"))
             implementation(libs.bundles.kotlinx.coroutines.common)
-            implementation(libs.bundles.paging.common)
+            implementation(libs.bundles.room.paging.common)
         }
     }
 }
diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts
index 0c4973a4e..b7190af51 100644
--- a/core/ui/build.gradle.kts
+++ b/core/ui/build.gradle.kts
@@ -23,9 +23,8 @@ kotlin {
     sourceSets {
         commonMain.dependencies {
             implementation(project(":core:persistence"))
-            implementation(libs.bundles.paging.common)
-            implementation(libs.bundles.constraintlayout.common)
             implementation(libs.bundles.coil.common)
+            implementation(libs.bundles.constraintlayout.common)
             implementation(compose.components.resources)
             implementation(compose.foundation)
             implementation(compose.material)
@@ -43,6 +42,7 @@ kotlin {
             api(libs.bundles.coil.android)
             api(libs.bundles.compose.android)
             api(libs.bundles.google.material.android)
+            implementation(libs.bundles.paging.common) // fixme ломает navigation
         }
     }
 }
diff --git a/core/work/build.gradle.kts b/core/work/build.gradle.kts
index 418ee0af4..6b2cf6fc6 100644
--- a/core/work/build.gradle.kts
+++ b/core/work/build.gradle.kts
@@ -18,7 +18,6 @@ kotlin {
             implementation(project(":core:interactor"))
             implementation(project(":core:notifications"))
             implementation(libs.bundles.kotlinx.serialization.common)
-            implementation(libs.bundles.paging.common)
         }
         androidMain.dependencies {
             implementation(libs.bundles.work.android)
diff --git a/desktopApp/src/jvmMain/kotlin/org/michaelbel/movies/MainWindowContent.kt b/desktopApp/src/jvmMain/kotlin/org/michaelbel/movies/MainWindowContent.kt
index 13b204a7f..62e62a0e3 100644
--- a/desktopApp/src/jvmMain/kotlin/org/michaelbel/movies/MainWindowContent.kt
+++ b/desktopApp/src/jvmMain/kotlin/org/michaelbel/movies/MainWindowContent.kt
@@ -1,8 +1,9 @@
 package org.michaelbel.movies
 
 import androidx.compose.runtime.Composable
-import moe.tlaster.precompose.navigation.NavHost
-import moe.tlaster.precompose.navigation.rememberNavigator
+import androidx.navigation.NavHostController
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.rememberNavController
 import org.michaelbel.movies.account.accountGraph
 import org.michaelbel.movies.account.navigateToAccount
 import org.michaelbel.movies.auth.authGraph
@@ -18,44 +19,10 @@ import org.michaelbel.movies.settings.navigateToSettings
 import org.michaelbel.movies.settings.settingsGraph
 
 @Composable
-internal fun MainWindowContent() {
-    val navHostController = rememberNavigator()
-
+internal fun MainWindowContent(
+    navHostController: NavHostController = rememberNavController()
+) {
     NavHost(
-        navigator = navHostController,
-        initialRoute = "feed"
-    ) {
-        authGraph(
-            navigateBack = navHostController::popBackStack
-        )
-        accountGraph(
-            navigateBack = navHostController::popBackStack
-        )
-        feedGraph(
-            navigateToSearch = navHostController::navigateToSearch,
-            navigateToAuth = navHostController::navigateToAuth,
-            navigateToAccount = navHostController::navigateToAccount,
-            navigateToSettings = navHostController::navigateToSettings,
-            navigateToDetails = navHostController::navigateToDetails
-        )
-        detailsGraph(
-            navigateBack = navHostController::popBackStack,
-            navigateToGallery = navHostController::navigateToGallery
-        )
-        galleryGraph(
-            navigateBack = navHostController::popBackStack
-        )
-        searchGraph(
-            navigateBack = navHostController::popBackStack,
-            navigateToDetails = navHostController::navigateToDetails,
-        )
-        settingsGraph(
-            navigateBack = navHostController::popBackStack
-        )
-    }
-
-    /*val navHostController: NavHostController = rememberNavController()
-    androidx.navigation.compose.NavHost(
         navController = navHostController,
         startDestination = "feed"
     ) {
@@ -86,5 +53,5 @@ internal fun MainWindowContent() {
         settingsGraph(
             navigateBack = navHostController::popBackStack
         )
-    }*/
+    }
 }
\ No newline at end of file
diff --git a/desktopApp/src/jvmMain/kotlin/org/michaelbel/movies/MoviesDesktop.kt b/desktopApp/src/jvmMain/kotlin/org/michaelbel/movies/MoviesDesktop.kt
index 97f26c2c8..76f1a22cf 100644
--- a/desktopApp/src/jvmMain/kotlin/org/michaelbel/movies/MoviesDesktop.kt
+++ b/desktopApp/src/jvmMain/kotlin/org/michaelbel/movies/MoviesDesktop.kt
@@ -1,35 +1,66 @@
 package org.michaelbel.movies
 
-import androidx.compose.ui.window.singleWindowApplication
-import moe.tlaster.precompose.PreComposeApp
-import org.koin.core.context.startKoin
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.remember
+import androidx.compose.ui.window.Window
+import androidx.compose.ui.window.application
+import androidx.lifecycle.ViewModelStore
+import androidx.lifecycle.ViewModelStoreOwner
+import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
 import org.michaelbel.movies.common.ThemeData
 import org.michaelbel.movies.common.theme.AppTheme
-import org.michaelbel.movies.di.appKoinModule
 import org.michaelbel.movies.ui.theme.MoviesTheme
 
-fun main() {
-    startKoin {
-        modules(appKoinModule)
+fun main() = application {
+    Window(onCloseRequest = ::exitApplication, title = "Movies") {
+        App()
     }
+}
 
-    singleWindowApplication(
-        title = "Movies",
-        icon = null
+@Composable
+private fun App() = withViewModelStoreOwner {
+    MoviesTheme(
+        themeData = ThemeData(
+            appTheme = AppTheme.FollowSystem,
+            dynamicColors = false,
+            paletteKey = 0,
+            seedColor = 0
+        ),
+        theme = AppTheme.FollowSystem,
+        enableEdgeToEdge = { _,_ -> }
     ) {
-        PreComposeApp {
-            MoviesTheme(
-                themeData = ThemeData(
-                    appTheme = AppTheme.FollowSystem,
-                    dynamicColors = false,
-                    paletteKey = 0,
-                    seedColor = 0
-                ),
-                theme = AppTheme.FollowSystem,
-                enableEdgeToEdge = { _,_ -> }
-            ) {
-                MainWindowContent()
-            }
-        }
+        MainWindowContent()
+    }
+}
+
+private class ComposeViewModelStoreOwner: ViewModelStoreOwner {
+    override val viewModelStore = ViewModelStore()
+    fun dispose() { viewModelStore.clear() }
+}
+
+@Composable
+private fun rememberComposeViewModelStoreOwner(): ViewModelStoreOwner {
+    val viewModelStoreOwner = remember { ComposeViewModelStoreOwner() }
+    DisposableEffect(viewModelStoreOwner) {
+        onDispose { viewModelStoreOwner.dispose() }
+    }
+    return viewModelStoreOwner
+}
+
+@Composable
+internal fun withViewModelStoreOwner(content: @Composable () -> Unit) {
+    if (LocalViewModelStoreOwner.current != null) {
+        // Normal case: use system-provided owner
+        content()
+    } else {
+        // Fallback case: use ViewModelStoreOwner with scope of this composable.
+        // It's required for Compose Multiplatform for now because it's not providing default value yet.
+        // Expected to be fixed in Compose Multiplatform 1.7.0
+        CompositionLocalProvider(
+            LocalViewModelStoreOwner provides rememberComposeViewModelStoreOwner(),
+            content = content
+        )
     }
 }
\ No newline at end of file
diff --git a/feature/account/src/desktopMain/kotlin/org/michaelbel/movies/account/AccountNavigation.kt b/feature/account/src/desktopMain/kotlin/org/michaelbel/movies/account/AccountNavigation.kt
index 269f0df70..ba9ff4945 100644
--- a/feature/account/src/desktopMain/kotlin/org/michaelbel/movies/account/AccountNavigation.kt
+++ b/feature/account/src/desktopMain/kotlin/org/michaelbel/movies/account/AccountNavigation.kt
@@ -3,26 +3,8 @@ package org.michaelbel.movies.account
 import androidx.navigation.NavController
 import androidx.navigation.NavGraphBuilder
 import androidx.navigation.compose.dialog
-import moe.tlaster.precompose.navigation.Navigator
-import moe.tlaster.precompose.navigation.RouteBuilder
 import org.michaelbel.movies.account.ui.AccountRoute
 
-fun Navigator.navigateToAccount() {
-    navigate(AccountDestination.route)
-}
-
-fun RouteBuilder.accountGraph(
-    navigateBack: () -> Unit
-) {
-    dialog(
-        route = AccountDestination.route
-    ) {
-        AccountRoute(
-            onBackClick = navigateBack
-        )
-    }
-}
-
 fun NavController.navigateToAccount() {
     navigate(AccountDestination.route)
 }
diff --git a/feature/auth/src/desktopMain/kotlin/org/michaelbel/movies/auth/AuthNavigation.kt b/feature/auth/src/desktopMain/kotlin/org/michaelbel/movies/auth/AuthNavigation.kt
index be566cca6..ff8186f6a 100644
--- a/feature/auth/src/desktopMain/kotlin/org/michaelbel/movies/auth/AuthNavigation.kt
+++ b/feature/auth/src/desktopMain/kotlin/org/michaelbel/movies/auth/AuthNavigation.kt
@@ -3,26 +3,8 @@ package org.michaelbel.movies.auth
 import androidx.navigation.NavController
 import androidx.navigation.NavGraphBuilder
 import androidx.navigation.compose.dialog
-import moe.tlaster.precompose.navigation.Navigator
-import moe.tlaster.precompose.navigation.RouteBuilder
 import org.michaelbel.movies.auth.ui.AuthRoute
 
-fun Navigator.navigateToAuth() {
-    navigate(AuthDestination.route)
-}
-
-fun RouteBuilder.authGraph(
-    navigateBack: () -> Unit
-) {
-    dialog(
-        route = AuthDestination.route,
-    ) {
-        AuthRoute(
-            onBackClick = navigateBack
-        )
-    }
-}
-
 fun NavController.navigateToAuth() {
     navigate(AuthDestination.route)
 }
diff --git a/feature/details/src/desktopMain/kotlin/org/michaelbel/movies/details/DetailsNavigation.kt b/feature/details/src/desktopMain/kotlin/org/michaelbel/movies/details/DetailsNavigation.kt
index bf42a5085..e3e7810e2 100644
--- a/feature/details/src/desktopMain/kotlin/org/michaelbel/movies/details/DetailsNavigation.kt
+++ b/feature/details/src/desktopMain/kotlin/org/michaelbel/movies/details/DetailsNavigation.kt
@@ -1,29 +1,14 @@
 package org.michaelbel.movies.details
 
+import androidx.compose.foundation.clickable
 import androidx.compose.material.Text
+import androidx.compose.ui.Modifier
 import androidx.navigation.NavController
 import androidx.navigation.NavGraphBuilder
 import androidx.navigation.compose.composable
-import moe.tlaster.precompose.navigation.Navigator
-import moe.tlaster.precompose.navigation.RouteBuilder
 import org.michaelbel.movies.persistence.database.typealiases.MovieId
 import org.michaelbel.movies.persistence.database.typealiases.PagingKey
 
-fun Navigator.navigateToDetails(pagingKey: PagingKey, movieId: MovieId) {
-    navigate("movie?movieList=$pagingKey&movieId=$movieId")
-}
-
-fun RouteBuilder.detailsGraph(
-    navigateBack: () -> Unit,
-    navigateToGallery: (MovieId) -> Unit
-) {
-    scene(
-        route = DetailsDestination.route
-    ) {
-        Text("details")
-    }
-}
-
 fun NavController.navigateToDetails(pagingKey: PagingKey, movieId: MovieId) {
     navigate("movie?movieList=$pagingKey&movieId=$movieId")
 }
@@ -35,6 +20,9 @@ fun NavGraphBuilder.detailsGraph(
     composable(
         route = DetailsDestination.route
     ) {
-        Text("details")
+        Text(
+            text = "Details",
+            modifier = Modifier.clickable { navigateBack() }
+        )
     }
 }
\ No newline at end of file
diff --git a/feature/feed-impl/build.gradle.kts b/feature/feed-impl/build.gradle.kts
index 46f5c640a..67c493bf3 100644
--- a/feature/feed-impl/build.gradle.kts
+++ b/feature/feed-impl/build.gradle.kts
@@ -22,15 +22,17 @@ kotlin {
 
     sourceSets {
         commonMain.dependencies {
-            api(project(":core:navigation"))
-            api(project(":core:platform-services:interactor"))
             api(project(":core:ui"))
             api(project(":core:common"))
+            api(project(":core:navigation"))
             api(project(":core:interactor"))
             implementation(project(":core:notifications"))
-            implementation(libs.bundles.paging.common)
+            api(project(":core:platform-services:interactor"))
             implementation(libs.bundles.constraintlayout.common)
         }
+        androidMain.dependencies {
+            implementation(libs.bundles.paging.common) // fixme ломает navigation
+        }
         val desktopMain by getting
         desktopMain.dependencies {
             implementation(compose.foundation)
diff --git a/feature/feed/src/desktopMain/kotlin/org/michaelbel/movies/feed/FeedNavigation.kt b/feature/feed/src/desktopMain/kotlin/org/michaelbel/movies/feed/FeedNavigation.kt
index 0b204ff35..11c77aad7 100644
--- a/feature/feed/src/desktopMain/kotlin/org/michaelbel/movies/feed/FeedNavigation.kt
+++ b/feature/feed/src/desktopMain/kotlin/org/michaelbel/movies/feed/FeedNavigation.kt
@@ -2,32 +2,8 @@ package org.michaelbel.movies.feed
 
 import androidx.navigation.NavGraphBuilder
 import androidx.navigation.compose.composable
-import moe.tlaster.precompose.navigation.RouteBuilder
 import org.michaelbel.movies.feed.ui.FeedRoute
 
-fun RouteBuilder.feedGraph(
-    navigateToSearch: () -> Unit,
-    navigateToAuth: () -> Unit,
-    navigateToAccount: () -> Unit,
-    navigateToSettings: () -> Unit,
-    navigateToDetails: (String, Int) -> Unit
-) {
-    scene(
-        route = FeedDestination.route,
-        deepLinks = listOf(
-            "movies://redirect_url?request_token={request_token}&approved={approved}"
-        )
-    ) {
-        FeedRoute(
-            onNavigateToSearch = navigateToSearch,
-            onNavigateToAccount = navigateToAccount,
-            onNavigateToAuth = navigateToAuth,
-            onNavigateToSettings = navigateToSettings,
-            onNavigateToDetails = navigateToDetails
-        )
-    }
-}
-
 fun NavGraphBuilder.feedGraph(
     navigateToSearch: () -> Unit,
     navigateToAuth: () -> Unit,
diff --git a/feature/gallery-impl/build.gradle.kts b/feature/gallery-impl/build.gradle.kts
index ab08a8805..b470a33c3 100644
--- a/feature/gallery-impl/build.gradle.kts
+++ b/feature/gallery-impl/build.gradle.kts
@@ -22,11 +22,11 @@ kotlin {
 
     sourceSets {
         commonMain.dependencies {
-            api(project(":core:navigation"))
             api(project(":core:ui"))
+            api(project(":core:work"))
             api(project(":core:common"))
             api(project(":core:interactor"))
-            api(project(":core:work"))
+            api(project(":core:navigation"))
             implementation(libs.bundles.constraintlayout.common)
         }
     }
diff --git a/feature/gallery/src/desktopMain/kotlin/org/michaelbel/movies/gallery/GalleryNavigation.kt b/feature/gallery/src/desktopMain/kotlin/org/michaelbel/movies/gallery/GalleryNavigation.kt
index 616b0e1c8..078f251c3 100644
--- a/feature/gallery/src/desktopMain/kotlin/org/michaelbel/movies/gallery/GalleryNavigation.kt
+++ b/feature/gallery/src/desktopMain/kotlin/org/michaelbel/movies/gallery/GalleryNavigation.kt
@@ -1,27 +1,13 @@
 package org.michaelbel.movies.gallery
 
+import androidx.compose.foundation.clickable
 import androidx.compose.material.Text
+import androidx.compose.ui.Modifier
 import androidx.navigation.NavController
 import androidx.navigation.NavGraphBuilder
 import androidx.navigation.compose.composable
-import moe.tlaster.precompose.navigation.Navigator
-import moe.tlaster.precompose.navigation.RouteBuilder
 import org.michaelbel.movies.persistence.database.typealiases.MovieId
 
-fun Navigator.navigateToGallery(movieId: MovieId) {
-    navigate("gallery/$movieId")
-}
-
-fun RouteBuilder.galleryGraph(
-    navigateBack: () -> Unit,
-) {
-    scene(
-        route = GalleryDestination.route
-    ) {
-        Text("gallery")
-    }
-}
-
 fun NavController.navigateToGallery(movieId: MovieId) {
     navigate("gallery/$movieId")
 }
@@ -32,6 +18,9 @@ fun NavGraphBuilder.galleryGraph(
     composable(
         route = GalleryDestination.route
     ) {
-        Text("gallery")
+        Text(
+            text = "Gallery",
+            modifier = Modifier.clickable { navigateBack() }
+        )
     }
 }
\ No newline at end of file
diff --git a/feature/search-impl/build.gradle.kts b/feature/search-impl/build.gradle.kts
index 9b63aac0b..d1181a60a 100644
--- a/feature/search-impl/build.gradle.kts
+++ b/feature/search-impl/build.gradle.kts
@@ -27,9 +27,11 @@ kotlin {
             api(project(":core:common"))
             api(project(":core:interactor"))
             implementation(project(":core:notifications"))
-            implementation(libs.bundles.paging.common)
             implementation(libs.bundles.constraintlayout.common)
         }
+        androidMain.dependencies {
+            implementation(libs.bundles.paging.common) // fixme ломает navigation
+        }
     }
 }
 
diff --git a/feature/search/src/desktopMain/kotlin/org/michaelbel/movies/search/SearchNavigation.kt b/feature/search/src/desktopMain/kotlin/org/michaelbel/movies/search/SearchNavigation.kt
index 5ef409b4b..a694adc46 100644
--- a/feature/search/src/desktopMain/kotlin/org/michaelbel/movies/search/SearchNavigation.kt
+++ b/feature/search/src/desktopMain/kotlin/org/michaelbel/movies/search/SearchNavigation.kt
@@ -1,26 +1,11 @@
 package org.michaelbel.movies.search
 
+import androidx.compose.foundation.clickable
 import androidx.compose.material.Text
+import androidx.compose.ui.Modifier
 import androidx.navigation.NavController
 import androidx.navigation.NavGraphBuilder
 import androidx.navigation.compose.composable
-import moe.tlaster.precompose.navigation.Navigator
-import moe.tlaster.precompose.navigation.RouteBuilder
-
-fun Navigator.navigateToSearch() {
-    navigate(SearchDestination.route)
-}
-
-fun RouteBuilder.searchGraph(
-    navigateBack: () -> Unit,
-    navigateToDetails: (String, Int) -> Unit,
-) {
-    scene(
-        route = SearchDestination.route
-    ) {
-        Text("Feed")
-    }
-}
 
 fun NavController.navigateToSearch() {
     navigate(SearchDestination.route)
@@ -33,6 +18,9 @@ fun NavGraphBuilder.searchGraph(
     composable(
         route = SearchDestination.route
     ) {
-        Text("Feed")
+        Text(
+            text = "Feed",
+            modifier = Modifier.clickable { navigateBack() }
+        )
     }
 }
\ No newline at end of file
diff --git a/feature/settings/src/desktopMain/kotlin/org/michaelbel/movies/settings/SettingsNavigation.kt b/feature/settings/src/desktopMain/kotlin/org/michaelbel/movies/settings/SettingsNavigation.kt
index 0c62820e5..2ff6d24b8 100644
--- a/feature/settings/src/desktopMain/kotlin/org/michaelbel/movies/settings/SettingsNavigation.kt
+++ b/feature/settings/src/desktopMain/kotlin/org/michaelbel/movies/settings/SettingsNavigation.kt
@@ -3,26 +3,8 @@ package org.michaelbel.movies.settings
 import androidx.navigation.NavController
 import androidx.navigation.NavGraphBuilder
 import androidx.navigation.compose.composable
-import moe.tlaster.precompose.navigation.Navigator
-import moe.tlaster.precompose.navigation.RouteBuilder
 import org.michaelbel.movies.settings.ui.SettingsRoute
 
-fun Navigator.navigateToSettings() {
-    navigate(SettingsDestination.route)
-}
-
-fun RouteBuilder.settingsGraph(
-    navigateBack: () -> Unit
-) {
-    scene(
-        route = SettingsDestination.route
-    ) {
-        SettingsRoute(
-            onBackClick = navigateBack
-        )
-    }
-}
-
 fun NavController.navigateToSettings() {
     navigate(SettingsDestination.route)
 }
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 81d3d63ad..cdf4ac9bc 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -48,7 +48,7 @@ androidx-glance = "1.0.0"
 androidx-media3 = "1.3.1"
 androidx-navigation = "2.7.7"
 androidx-palette-ktx = "1.0.0"
-androidx-paging = "3.2.1"
+androidx-paging = "3.3.0-rc01"
 androidx-profile-installer = "1.3.1"
 androidx-room = "2.7.0-alpha01"
 androidx-startup = "1.1.1"
@@ -85,7 +85,6 @@ barista = "4.3.0"
 kotest = "5.8.1"
 sqldelight = "2.0.2"
 koin = "3.5.6"
-precompose = "1.6.0"
 constraintlayout-compose-multiplatform = "0.3.1"
 okio = "3.9.0"
 
@@ -229,7 +228,6 @@ koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
 koin-core-jvm = { module = "io.insert-koin:koin-core-jvm", version.ref = "koin" }
 koin-test = { module = "io.insert-koin:koin-test", version.ref = "koin" }
 koin-test-junit4 = { module = "io.insert-koin:koin-test-junit4", version.ref = "koin" }
-precompose = { module = "moe.tlaster:precompose", version.ref = "precompose" }
 constraintlayout-compose-multiplatform = { module = "tech.annexflow.compose:constraintlayout-compose-multiplatform", version.ref = "constraintlayout-compose-multiplatform" }
 okio = { module = "com.squareup.okio:okio", version.ref = "okio" }
 
@@ -265,6 +263,9 @@ room-common = [
     "androidx-room-runtime",
     "androidx-room-paging"
 ]
+room-paging-common = [
+    "androidx-room-paging"
+]
 room-compiler-common = [
     "androidx-room-compiler"
 ]
@@ -469,9 +470,6 @@ kotlinx-coroutines-desktop = [
 datastore-desktop = [
     "androidx-datastore-core-okio-jvm"
 ]
-precompose-desktop = [
-    "precompose"
-]
 
 [plugins]
 android-application = { id = "com.android.application", version.ref = "agp" }
diff --git a/readme.md b/readme.md
index fc255082f..473c31a70 100644
--- a/readme.md
+++ b/readme.md
@@ -164,7 +164,6 @@ The app is still usable without an API key. In this case functionality will be l
 - [x] [Biometric Authentication Dialog](https://d.android.com/training/sign-in/biometric-auth)
 - [x] [LeakCanary](https://github.com/square/leakcanary)
 - [x] [ConstraintLayout Multiplatform](https://github.com/Lavmee/constraintlayout-compose-multiplatform)
-- [x] [PreCompose](https://github.com/Tlaster/PreCompose)
 - [x] [Koin](https://github.com/InsertKoinIO/koin)
 - [x] [Screenshot Detection](https://d.android.com/about/versions/14/features/screenshot-detection)
 - [x] [ConstraintLayout](https://d.android.com/develop/ui/views/layout/constraint-layout) removed in [44723cb](https://github.com/michaelbel/movies/commit/44723cbbafdad89bef6043f99cbd0fbab1ecf19a)
diff --git a/readme.ru.md b/readme.ru.md
index e9bc6c0b3..f64f2810c 100644
--- a/readme.ru.md
+++ b/readme.ru.md
@@ -164,7 +164,6 @@ TMDB_API_KEY=your_own_tmdb_api_key
 - [x] [Biometric Authentication Dialog](https://d.android.com/training/sign-in/biometric-auth)
 - [x] [LeakCanary](https://github.com/square/leakcanary)
 - [x] [ConstraintLayout Multiplatform](https://github.com/Lavmee/constraintlayout-compose-multiplatform)
-- [x] [PreCompose](https://github.com/Tlaster/PreCompose)
 - [x] [Koin](https://github.com/InsertKoinIO/koin)
 - [x] [Screenshot Detection](https://d.android.com/about/versions/14/features/screenshot-detection)
 - [x] [ConstraintLayout](https://d.android.com/develop/ui/views/layout/constraint-layout) removed in [44723cb](https://github.com/michaelbel/movies/commit/44723cbbafdad89bef6043f99cbd0fbab1ecf19a)
diff --git a/settings.gradle.kts b/settings.gradle.kts
index dca6f0461..706aa6fd0 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -3,8 +3,8 @@
 pluginManagement {
     repositories {
         google()
-        mavenCentral()
         gradlePluginPortal()
+        mavenCentral()
         maven(url = "https://developer.huawei.com/repo/")
     }
 }
@@ -12,7 +12,6 @@ pluginManagement {
 dependencyResolutionManagement {
     /*repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)*/
     repositories {
-        mavenCentral()
         google {
             content {
                 includeGroupAndSubgroups("androidx")
@@ -20,6 +19,7 @@ dependencyResolutionManagement {
                 includeGroupAndSubgroups("com.google")
             }
         }
+        mavenCentral()
         maven(url = "https://developer.huawei.com/repo/")
     }
 }