From 1f6e7b8ac0d2763edc432f2039b2821be29dbbb6 Mon Sep 17 00:00:00 2001 From: Shcherbatykh Oleg Date: Fri, 27 Feb 2026 11:00:07 +0300 Subject: [PATCH 1/2] update app navigation --- .../ru/fincode/tsudesk/di/AppConfigModule.kt | 30 +++++++ .../tsudesk/presentation/main/MainNavUi.kt | 39 ++++----- .../tsudesk/presentation/main/MainScaffold.kt | 2 - .../tsudesk/presentation/main/TopLevelItem.kt | 1 - .../presentation/navigation/AppNavHost.kt | 82 +++++++++---------- .../fincode/core/database/impl/AppDatabase.kt | 1 - .../presentation/navigation/ScheduleGraph.kt | 15 +++- .../{ => screen}/ScheduleAction.kt | 2 +- ...eduleContract.kt => ScheduleUiContract.kt} | 0 9 files changed, 97 insertions(+), 75 deletions(-) create mode 100644 app/src/main/java/ru/fincode/tsudesk/di/AppConfigModule.kt rename feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/{ => screen}/ScheduleAction.kt (85%) rename feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/screen/{ScheduleContract.kt => ScheduleUiContract.kt} (100%) diff --git a/app/src/main/java/ru/fincode/tsudesk/di/AppConfigModule.kt b/app/src/main/java/ru/fincode/tsudesk/di/AppConfigModule.kt new file mode 100644 index 0000000..7173199 --- /dev/null +++ b/app/src/main/java/ru/fincode/tsudesk/di/AppConfigModule.kt @@ -0,0 +1,30 @@ +package ru.fincode.tsudesk.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import ru.fincode.tsudesk.BuildConfig +import ru.fincode.tsudesk.core.common.app.AppConfig +import javax.inject.Singleton + +private const val BASE_TIMEOUT = 30L + +@Module +@InstallIn(SingletonComponent::class) +object AppConfigModule { + + private const val BASE_URL_PROD = "https://tulsu.ru/schedule/queries/" + private const val BASE_URL_DEVELOP = "https://scherbatykh.ru/app/tsudesk/" + + @Provides + @Singleton + fun provideAppConfig(): AppConfig { + val baseUrl = if (BuildConfig.DEBUG) BASE_URL_PROD else BASE_URL_PROD + return AppConfig( + isDebug = BuildConfig.DEBUG, + baseUrl = baseUrl, + networkTimeoutSec = BASE_TIMEOUT + ) + } +} diff --git a/app/src/main/java/ru/fincode/tsudesk/presentation/main/MainNavUi.kt b/app/src/main/java/ru/fincode/tsudesk/presentation/main/MainNavUi.kt index befad99..122b6a4 100644 --- a/app/src/main/java/ru/fincode/tsudesk/presentation/main/MainNavUi.kt +++ b/app/src/main/java/ru/fincode/tsudesk/presentation/main/MainNavUi.kt @@ -1,37 +1,32 @@ -package ru.fincode.tsudesk.app.presentation.main +package ru.fincode.tsudesk.presentation.main import androidx.navigation.NavBackStackEntry +import androidx.navigation.NavDestination +import androidx.navigation.NavDestination.Companion.hasRoute import ru.fincode.tsudesk.core.navigation.AppRoute import ru.fincode.tsudesk.core.navigation.TopLevelDestination -import ru.fincode.tsudesk.core.navigation.route fun selectedTopLevel(entry: NavBackStackEntry?): TopLevelDestination { - if (entry == null) return TopLevelDestination.SCHEDULE + val dest: NavDestination = entry?.destination ?: return TopLevelDestination.SCHEDULE - return runCatching { - when (entry.route()) { - AppRoute.Schedule, - is AppRoute.ScheduleDetails -> TopLevelDestination.SCHEDULE + return when { + dest.hasRoute() || dest.hasRoute() -> + TopLevelDestination.SCHEDULE - AppRoute.News, - is AppRoute.NewsDetails -> TopLevelDestination.NEWS + dest.hasRoute() || dest.hasRoute() -> + TopLevelDestination.NEWS - AppRoute.Progress -> TopLevelDestination.PROGRESS + dest.hasRoute() -> + TopLevelDestination.PROGRESS - AppRoute.Settings -> TopLevelDestination.SETTINGS + dest.hasRoute() -> + TopLevelDestination.SETTINGS - else -> TopLevelDestination.SCHEDULE - } - }.getOrDefault(TopLevelDestination.SCHEDULE) + else -> TopLevelDestination.SCHEDULE + } } fun shouldShowBottomBar(entry: NavBackStackEntry?): Boolean { - if (entry == null) return false - - return runCatching { - when (entry.route()) { - AppRoute.Splash -> false - else -> true - } - }.getOrDefault(true) + val dest: NavDestination = entry?.destination ?: return false + return !dest.hasRoute() } \ No newline at end of file diff --git a/app/src/main/java/ru/fincode/tsudesk/presentation/main/MainScaffold.kt b/app/src/main/java/ru/fincode/tsudesk/presentation/main/MainScaffold.kt index 0b3c5b0..a5d7baf 100644 --- a/app/src/main/java/ru/fincode/tsudesk/presentation/main/MainScaffold.kt +++ b/app/src/main/java/ru/fincode/tsudesk/presentation/main/MainScaffold.kt @@ -12,8 +12,6 @@ import androidx.navigation.compose.currentBackStackEntryAsState import ru.fincode.core.ui.components.BottomBarItem import ru.fincode.core.ui.components.TsudeskBottomBar import ru.fincode.tsudesk.R -import ru.fincode.tsudesk.app.presentation.main.selectedTopLevel -import ru.fincode.tsudesk.app.presentation.main.shouldShowBottomBar import ru.fincode.tsudesk.core.navigation.TopLevelDestination import ru.fincode.tsudesk.core.navigation.navigateToTopLevel diff --git a/app/src/main/java/ru/fincode/tsudesk/presentation/main/TopLevelItem.kt b/app/src/main/java/ru/fincode/tsudesk/presentation/main/TopLevelItem.kt index 323d188..408eb0c 100644 --- a/app/src/main/java/ru/fincode/tsudesk/presentation/main/TopLevelItem.kt +++ b/app/src/main/java/ru/fincode/tsudesk/presentation/main/TopLevelItem.kt @@ -2,7 +2,6 @@ package ru.fincode.tsudesk.presentation.main import androidx.annotation.StringRes import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.graphics.vector.ImageVector import ru.fincode.tsudesk.core.navigation.TopLevelDestination data class TopLevelItem( diff --git a/app/src/main/java/ru/fincode/tsudesk/presentation/navigation/AppNavHost.kt b/app/src/main/java/ru/fincode/tsudesk/presentation/navigation/AppNavHost.kt index e2a89e6..96aaefb 100644 --- a/app/src/main/java/ru/fincode/tsudesk/presentation/navigation/AppNavHost.kt +++ b/app/src/main/java/ru/fincode/tsudesk/presentation/navigation/AppNavHost.kt @@ -1,19 +1,19 @@ package ru.fincode.tsudesk.presentation.navigation +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable -import androidx.navigation.compose.navigation -import ru.fincode.tsudesk.presentation.main.MainScaffold +import androidx.navigation.compose.rememberNavController import ru.fincode.tsudesk.core.navigation.AppRoute import ru.fincode.tsudesk.core.navigation.navigateRoute +import ru.fincode.tsudesk.feature.news.presentation.screen.NewsRoute +import ru.fincode.tsudesk.presentation.main.MainScaffold import ru.fincode.tsudesk.feature.schedule.presentation.screen.ScheduleRoute - import ru.fincode.tsudesk.feature.splash.presentation.screen.SplashRoute - @Composable fun AppNavHost( navController: NavHostController, @@ -33,51 +33,45 @@ fun AppNavHost( ) } - navigation(startDestination = AppRoute.Schedule) { + composable { + val tabsNavController = rememberNavController() - composable { - MainScaffold(navController) { innerModifier -> - ScheduleRoute( - modifier = innerModifier, -// onOpenDetails = { lessonId -> -// navController.navigateRoute(AppRoute.ScheduleDetails(lessonId)) -// } - ) - } + MainScaffold( + navController = tabsNavController + ) { innerModifier -> + MainTabsNavHost( + navController = tabsNavController, + modifier = innerModifier + ) } + } + } +} - composable { - MainScaffold(navController) { innerModifier: Modifier -> -// NewsScreen( -// modifier = innerModifier, -// onOpenDetails = { id -> -// navController.navigateRoute(AppRoute.NewsDetails(id)) -// } -// ) - } - } +@Composable +private fun MainTabsNavHost( + navController: NavHostController, + modifier: Modifier = Modifier, +) { + NavHost( + navController = navController, + startDestination = AppRoute.Schedule, + modifier = modifier + ) { + composable { + ScheduleRoute(modifier = Modifier.fillMaxSize()) + } - composable { - MainScaffold(navController) { innerModifier: Modifier -> -// ProgressScreen(modifier = innerModifier) - } - } + composable { + NewsRoute(modifier = Modifier.fillMaxSize()) + } - composable { - MainScaffold(navController) { innerModifier -> - // SettingsRoute(modifier = innerModifier) - } - } -// -// composable { entry -> -// val args = entry.route() -// ScheduleDetailsScreen(lessonId = args.lessonId) -// } -// -// composable { entry -> -// val args = entry.route() -// NewsDetailsScreen(id = args.id) -// } + composable { + // ProgressRoute(modifier = Modifier) + } + + composable { + // SettingsRoute(modifier = Modifier) } } } \ No newline at end of file diff --git a/core/database/impl/src/main/java/ru/fincode/core/database/impl/AppDatabase.kt b/core/database/impl/src/main/java/ru/fincode/core/database/impl/AppDatabase.kt index b2eb0ea..b5368c9 100644 --- a/core/database/impl/src/main/java/ru/fincode/core/database/impl/AppDatabase.kt +++ b/core/database/impl/src/main/java/ru/fincode/core/database/impl/AppDatabase.kt @@ -13,7 +13,6 @@ import ru.fincode.tsudesk.core.database.api.schedule.ScheduleDao LessonCacheEntity::class ], version = 2, - exportSchema = true ) @TypeConverters(StringListConverter::class) abstract class AppDatabase : RoomDatabase() { diff --git a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/navigation/ScheduleGraph.kt b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/navigation/ScheduleGraph.kt index 1f70f05..0843325 100644 --- a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/navigation/ScheduleGraph.kt +++ b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/navigation/ScheduleGraph.kt @@ -1,18 +1,25 @@ package ru.fincode.tsudesk.feature.schedule.presentation.navigation +import androidx.compose.ui.Modifier import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import ru.fincode.tsudesk.core.navigation.AppRoute import ru.fincode.tsudesk.feature.schedule.presentation.screen.ScheduleRoute fun NavGraphBuilder.scheduleGraph( + modifier: Modifier = Modifier, + // на будущее: + // onOpenDetails: (lessonId: Long) -> Unit, ) { composable { - ScheduleRoute() + ScheduleRoute( + modifier = modifier, + // onOpenDetails = onOpenDetails + ) } - // composable { backStackEntry -> - // val args = backStackEntry.toRoute() + // composable { entry -> + // val args = entry.toRoute() // ScheduleDetailsRoute(lessonId = args.lessonId) // } -} +} \ No newline at end of file diff --git a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/ScheduleAction.kt b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/screen/ScheduleAction.kt similarity index 85% rename from feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/ScheduleAction.kt rename to feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/screen/ScheduleAction.kt index 82211e0..f25e89c 100644 --- a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/ScheduleAction.kt +++ b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/screen/ScheduleAction.kt @@ -1,4 +1,4 @@ -package ru.fincode.tsudesk.feature.schedule.presentation +package ru.fincode.tsudesk.feature.schedule.presentation.screen sealed interface ScheduleAction { diff --git a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/screen/ScheduleContract.kt b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/screen/ScheduleUiContract.kt similarity index 100% rename from feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/screen/ScheduleContract.kt rename to feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/presentation/screen/ScheduleUiContract.kt From 993ab0a0b157137951c06a2a5b42c8843516505f Mon Sep 17 00:00:00 2001 From: Shcherbatykh Oleg Date: Fri, 27 Feb 2026 11:01:47 +0300 Subject: [PATCH 2/2] merge fix --- .../fincode/tsudesk/di/NetworkDebugModule.kt | 28 ------------------- .../presentation/navigation/AppNavHost.kt | 6 +++- 2 files changed, 5 insertions(+), 29 deletions(-) delete mode 100644 app/src/main/java/ru/fincode/tsudesk/di/NetworkDebugModule.kt diff --git a/app/src/main/java/ru/fincode/tsudesk/di/NetworkDebugModule.kt b/app/src/main/java/ru/fincode/tsudesk/di/NetworkDebugModule.kt deleted file mode 100644 index d851a4d..0000000 --- a/app/src/main/java/ru/fincode/tsudesk/di/NetworkDebugModule.kt +++ /dev/null @@ -1,28 +0,0 @@ -package ru.fincode.tsudesk.di - -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import ru.fincode.tsudesk.BuildConfig -import ru.fincode.tsudesk.core.common.app.AppConfig -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -object AppConfigModule { - - private const val BASE_URL_PROD = "https://tulsu.ru/schedule/queries/" - private const val BASE_URL_DEVELOP = "https://scherbatykh.ru/app/tsudesk/" - - @Provides - @Singleton - fun provideAppConfig(): AppConfig { - val baseUrl = if (BuildConfig.DEBUG) BASE_URL_PROD else BASE_URL_PROD - return AppConfig( - isDebug = BuildConfig.DEBUG, - baseUrl = baseUrl, - networkTimeoutSec = 30L - ) - } -} diff --git a/app/src/main/java/ru/fincode/tsudesk/presentation/navigation/AppNavHost.kt b/app/src/main/java/ru/fincode/tsudesk/presentation/navigation/AppNavHost.kt index 96aaefb..70b0b66 100644 --- a/app/src/main/java/ru/fincode/tsudesk/presentation/navigation/AppNavHost.kt +++ b/app/src/main/java/ru/fincode/tsudesk/presentation/navigation/AppNavHost.kt @@ -9,7 +9,6 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import ru.fincode.tsudesk.core.navigation.AppRoute import ru.fincode.tsudesk.core.navigation.navigateRoute -import ru.fincode.tsudesk.feature.news.presentation.screen.NewsRoute import ru.fincode.tsudesk.presentation.main.MainScaffold import ru.fincode.tsudesk.feature.schedule.presentation.screen.ScheduleRoute import ru.fincode.tsudesk.feature.splash.presentation.screen.SplashRoute @@ -74,4 +73,9 @@ private fun MainTabsNavHost( // SettingsRoute(modifier = Modifier) } } +} + +@Composable +fun NewsRoute(modifier: Modifier) { + TODO("Not yet implemented") } \ No newline at end of file