feat(ui): integrate teacher mode into AppRoot and Home

This commit is contained in:
2026-09-19 20:28:13 +03:00
parent f5696fbbd6
commit e1b2f05548
2 changed files with 24 additions and 5 deletions
+9 -3
View File
@@ -6,6 +6,7 @@ import agzam.vyatsu.ui.picker.PickerScreen
import agzam.vyatsu.ui.picker.PickerViewModel import agzam.vyatsu.ui.picker.PickerViewModel
import agzam.vyatsu.ui.schedule.ScheduleViewModel import agzam.vyatsu.ui.schedule.ScheduleViewModel
import agzam.vyatsu.ui.settings.UpdateViewModel import agzam.vyatsu.ui.settings.UpdateViewModel
import agzam.vyatsu.ui.teacher.TeacherScheduleViewModel
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
@@ -23,9 +24,11 @@ fun AppRoot() {
val container = app.container val container = app.container
val scheduleViewModel: ScheduleViewModel = viewModel(factory = scheduleFactory(container)) val scheduleViewModel: ScheduleViewModel = viewModel(factory = scheduleFactory(container))
val teacherScheduleViewModel: TeacherScheduleViewModel = viewModel(factory = teacherScheduleFactory(container))
val updateViewModel: UpdateViewModel = viewModel(factory = updateFactory(container)) val updateViewModel: UpdateViewModel = viewModel(factory = updateFactory(container))
val state by scheduleViewModel.uiState.collectAsState() val state by scheduleViewModel.uiState.collectAsState()
val teacherState by teacherScheduleViewModel.uiState.collectAsState()
val showFirstRunDialog by updateViewModel.showFirstRunDialog.collectAsState() val showFirstRunDialog by updateViewModel.showFirstRunDialog.collectAsState()
if (showFirstRunDialog) { if (showFirstRunDialog) {
@@ -51,19 +54,21 @@ fun AppRoot() {
) )
} }
if (state.noGroup) { if (state.noGroup && teacherState.noTeacher) {
val pickerViewModel: PickerViewModel = viewModel(factory = pickerFactory(container)) val pickerViewModel: PickerViewModel = viewModel(factory = pickerFactory(container))
PickerScreen( PickerScreen(
viewModel = pickerViewModel, viewModel = pickerViewModel,
onGroupPicked = { group -> scheduleViewModel.selectGroup(group.id) }, onGroupPicked = { group -> scheduleViewModel.selectGroup(group.id) },
onTeacherPicked = { } onTeacherPicked = { teacher -> teacherScheduleViewModel.selectTeacher(teacher.name) }
) )
return return
} }
HomeScreen( HomeScreen(
scheduleViewModel = scheduleViewModel, scheduleViewModel = scheduleViewModel,
teacherScheduleViewModel = teacherScheduleViewModel,
updateViewModel = updateViewModel, updateViewModel = updateViewModel,
onSwitchGroup = { scheduleViewModel.switchGroup() } onSwitchGroup = { scheduleViewModel.switchGroup() },
onSwitchTeacher = { teacherScheduleViewModel.switchTeacher() }
) )
} }
@@ -73,6 +78,7 @@ private class SimpleFactory<T : ViewModel>(private val create: () -> T) : ViewMo
} }
private fun scheduleFactory(c: AppContainer): ViewModelProvider.Factory = SimpleFactory { ScheduleViewModel(c.scheduleRepository, c.preferencesRepository, c.groupRepository) } private fun scheduleFactory(c: AppContainer): ViewModelProvider.Factory = SimpleFactory { ScheduleViewModel(c.scheduleRepository, c.preferencesRepository, c.groupRepository) }
private fun teacherScheduleFactory(c: AppContainer): ViewModelProvider.Factory = SimpleFactory { TeacherScheduleViewModel(c.teacherScheduleRepository, c.preferencesRepository) }
private fun pickerFactory(c: AppContainer): ViewModelProvider.Factory = SimpleFactory { private fun pickerFactory(c: AppContainer): ViewModelProvider.Factory = SimpleFactory {
PickerViewModel( PickerViewModel(
c.groupRepository, c.groupRepository,
@@ -6,6 +6,8 @@ import agzam.vyatsu.ui.schedule.ScheduleScreen
import agzam.vyatsu.ui.schedule.ScheduleViewModel import agzam.vyatsu.ui.schedule.ScheduleViewModel
import agzam.vyatsu.ui.settings.SettingsScreen import agzam.vyatsu.ui.settings.SettingsScreen
import agzam.vyatsu.ui.settings.UpdateViewModel import agzam.vyatsu.ui.settings.UpdateViewModel
import agzam.vyatsu.ui.teacher.TeacherScheduleScreen
import agzam.vyatsu.ui.teacher.TeacherScheduleViewModel
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -19,6 +21,7 @@ import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
@@ -35,10 +38,13 @@ private enum class HomeTab(val label: String) {
@Composable @Composable
fun HomeScreen( fun HomeScreen(
scheduleViewModel: ScheduleViewModel, scheduleViewModel: ScheduleViewModel,
teacherScheduleViewModel: TeacherScheduleViewModel,
updateViewModel: UpdateViewModel, updateViewModel: UpdateViewModel,
onSwitchGroup: () -> Unit onSwitchGroup: () -> Unit,
onSwitchTeacher: () -> Unit
) { ) {
var tab by rememberSaveable { mutableStateOf(HomeTab.SCHEDULE) } var tab by rememberSaveable { mutableStateOf(HomeTab.SCHEDULE) }
val teacherState by teacherScheduleViewModel.uiState.collectAsState()
Scaffold( Scaffold(
bottomBar = { bottomBar = {
@@ -70,7 +76,14 @@ fun HomeScreen(
.padding(innerPadding) .padding(innerPadding)
) { ) {
when (tab) { when (tab) {
HomeTab.SCHEDULE -> ScheduleScreen(viewModel = scheduleViewModel, onSwitchGroup = onSwitchGroup) HomeTab.SCHEDULE -> if (teacherState.teacherName != null) {
TeacherScheduleScreen(
viewModel = teacherScheduleViewModel,
onSwitchTeacher = onSwitchTeacher
)
} else {
ScheduleScreen(viewModel = scheduleViewModel, onSwitchGroup = onSwitchGroup)
}
HomeTab.CALLS -> CallsScreen() HomeTab.CALLS -> CallsScreen()
HomeTab.BUILDINGS -> BuildingsScreen() HomeTab.BUILDINGS -> BuildingsScreen()
HomeTab.SETTINGS -> SettingsScreen(viewModel = updateViewModel) HomeTab.SETTINGS -> SettingsScreen(viewModel = updateViewModel)