update app navigation

This commit is contained in:
Shcherbatykh Oleg
2026-02-27 11:00:07 +03:00
parent 8a5e98dc2e
commit 1f6e7b8ac0
9 changed files with 97 additions and 75 deletions

View File

@@ -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
)
}
}

View File

@@ -1,37 +1,32 @@
package ru.fincode.tsudesk.app.presentation.main package ru.fincode.tsudesk.presentation.main
import androidx.navigation.NavBackStackEntry 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.AppRoute
import ru.fincode.tsudesk.core.navigation.TopLevelDestination import ru.fincode.tsudesk.core.navigation.TopLevelDestination
import ru.fincode.tsudesk.core.navigation.route
fun selectedTopLevel(entry: NavBackStackEntry?): TopLevelDestination { fun selectedTopLevel(entry: NavBackStackEntry?): TopLevelDestination {
if (entry == null) return TopLevelDestination.SCHEDULE val dest: NavDestination = entry?.destination ?: return TopLevelDestination.SCHEDULE
return runCatching { return when {
when (entry.route<AppRoute>()) { dest.hasRoute<AppRoute.Schedule>() || dest.hasRoute<AppRoute.ScheduleDetails>() ->
AppRoute.Schedule, TopLevelDestination.SCHEDULE
is AppRoute.ScheduleDetails -> TopLevelDestination.SCHEDULE
AppRoute.News, dest.hasRoute<AppRoute.News>() || dest.hasRoute<AppRoute.NewsDetails>() ->
is AppRoute.NewsDetails -> TopLevelDestination.NEWS TopLevelDestination.NEWS
AppRoute.Progress -> TopLevelDestination.PROGRESS dest.hasRoute<AppRoute.Progress>() ->
TopLevelDestination.PROGRESS
AppRoute.Settings -> TopLevelDestination.SETTINGS dest.hasRoute<AppRoute.Settings>() ->
TopLevelDestination.SETTINGS
else -> TopLevelDestination.SCHEDULE else -> TopLevelDestination.SCHEDULE
} }
}.getOrDefault(TopLevelDestination.SCHEDULE)
} }
fun shouldShowBottomBar(entry: NavBackStackEntry?): Boolean { fun shouldShowBottomBar(entry: NavBackStackEntry?): Boolean {
if (entry == null) return false val dest: NavDestination = entry?.destination ?: return false
return !dest.hasRoute<AppRoute.Splash>()
return runCatching {
when (entry.route<AppRoute>()) {
AppRoute.Splash -> false
else -> true
}
}.getOrDefault(true)
} }

View File

@@ -12,8 +12,6 @@ import androidx.navigation.compose.currentBackStackEntryAsState
import ru.fincode.core.ui.components.BottomBarItem import ru.fincode.core.ui.components.BottomBarItem
import ru.fincode.core.ui.components.TsudeskBottomBar import ru.fincode.core.ui.components.TsudeskBottomBar
import ru.fincode.tsudesk.R 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.TopLevelDestination
import ru.fincode.tsudesk.core.navigation.navigateToTopLevel import ru.fincode.tsudesk.core.navigation.navigateToTopLevel

View File

@@ -2,7 +2,6 @@ package ru.fincode.tsudesk.presentation.main
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.ImageVector
import ru.fincode.tsudesk.core.navigation.TopLevelDestination import ru.fincode.tsudesk.core.navigation.TopLevelDestination
data class TopLevelItem( data class TopLevelItem(

View File

@@ -1,19 +1,19 @@
package ru.fincode.tsudesk.presentation.navigation package ru.fincode.tsudesk.presentation.navigation
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation import androidx.navigation.compose.rememberNavController
import ru.fincode.tsudesk.presentation.main.MainScaffold
import ru.fincode.tsudesk.core.navigation.AppRoute import ru.fincode.tsudesk.core.navigation.AppRoute
import ru.fincode.tsudesk.core.navigation.navigateRoute 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.schedule.presentation.screen.ScheduleRoute
import ru.fincode.tsudesk.feature.splash.presentation.screen.SplashRoute import ru.fincode.tsudesk.feature.splash.presentation.screen.SplashRoute
@Composable @Composable
fun AppNavHost( fun AppNavHost(
navController: NavHostController, navController: NavHostController,
@@ -33,51 +33,45 @@ fun AppNavHost(
) )
} }
navigation<AppRoute.Main>(startDestination = AppRoute.Schedule) { composable<AppRoute.Main> {
val tabsNavController = rememberNavController()
composable<AppRoute.Schedule> { MainScaffold(
MainScaffold(navController) { innerModifier -> navController = tabsNavController
ScheduleRoute( ) { innerModifier ->
modifier = innerModifier, MainTabsNavHost(
// onOpenDetails = { lessonId -> navController = tabsNavController,
// navController.navigateRoute(AppRoute.ScheduleDetails(lessonId)) modifier = innerModifier
// } )
)
}
} }
}
composable<AppRoute.News> { }
MainScaffold(navController) { innerModifier: Modifier -> }
// NewsScreen(
// modifier = innerModifier, @Composable
// onOpenDetails = { id -> private fun MainTabsNavHost(
// navController.navigateRoute(AppRoute.NewsDetails(id)) navController: NavHostController,
// } modifier: Modifier = Modifier,
// ) ) {
} NavHost(
} navController = navController,
startDestination = AppRoute.Schedule,
composable<AppRoute.Progress> { modifier = modifier
MainScaffold(navController) { innerModifier: Modifier -> ) {
// ProgressScreen(modifier = innerModifier) composable<AppRoute.Schedule> {
} ScheduleRoute(modifier = Modifier.fillMaxSize())
} }
composable<AppRoute.Settings> { composable<AppRoute.News> {
MainScaffold(navController) { innerModifier -> NewsRoute(modifier = Modifier.fillMaxSize())
// SettingsRoute(modifier = innerModifier) }
}
} composable<AppRoute.Progress> {
// // ProgressRoute(modifier = Modifier)
// composable<AppRoute.ScheduleDetails> { entry -> }
// val args = entry.route<AppRoute.ScheduleDetails>()
// ScheduleDetailsScreen(lessonId = args.lessonId) composable<AppRoute.Settings> {
// } // SettingsRoute(modifier = Modifier)
//
// composable<AppRoute.NewsDetails> { entry ->
// val args = entry.route<AppRoute.NewsDetails>()
// NewsDetailsScreen(id = args.id)
// }
} }
} }
} }

View File

@@ -13,7 +13,6 @@ import ru.fincode.tsudesk.core.database.api.schedule.ScheduleDao
LessonCacheEntity::class LessonCacheEntity::class
], ],
version = 2, version = 2,
exportSchema = true
) )
@TypeConverters(StringListConverter::class) @TypeConverters(StringListConverter::class)
abstract class AppDatabase : RoomDatabase() { abstract class AppDatabase : RoomDatabase() {

View File

@@ -1,18 +1,25 @@
package ru.fincode.tsudesk.feature.schedule.presentation.navigation package ru.fincode.tsudesk.feature.schedule.presentation.navigation
import androidx.compose.ui.Modifier
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import ru.fincode.tsudesk.core.navigation.AppRoute import ru.fincode.tsudesk.core.navigation.AppRoute
import ru.fincode.tsudesk.feature.schedule.presentation.screen.ScheduleRoute import ru.fincode.tsudesk.feature.schedule.presentation.screen.ScheduleRoute
fun NavGraphBuilder.scheduleGraph( fun NavGraphBuilder.scheduleGraph(
modifier: Modifier = Modifier,
// на будущее:
// onOpenDetails: (lessonId: Long) -> Unit,
) { ) {
composable<AppRoute.Schedule> { composable<AppRoute.Schedule> {
ScheduleRoute() ScheduleRoute(
modifier = modifier,
// onOpenDetails = onOpenDetails
)
} }
// composable<AppRoute.ScheduleDetails> { backStackEntry -> // composable<AppRoute.ScheduleDetails> { entry ->
// val args = backStackEntry.toRoute<AppRoute.ScheduleDetails>() // val args = entry.toRoute<AppRoute.ScheduleDetails>()
// ScheduleDetailsRoute(lessonId = args.lessonId) // ScheduleDetailsRoute(lessonId = args.lessonId)
// } // }
} }

View File

@@ -1,4 +1,4 @@
package ru.fincode.tsudesk.feature.schedule.presentation package ru.fincode.tsudesk.feature.schedule.presentation.screen
sealed interface ScheduleAction { sealed interface ScheduleAction {