forked from agzam/vyatsu-schedule
77 lines
3.2 KiB
Kotlin
77 lines
3.2 KiB
Kotlin
package agzam.vyatsu
|
|
|
|
import agzam.vyatsu.di.AppContainer
|
|
import agzam.vyatsu.ui.groups.GroupPickerScreen
|
|
import agzam.vyatsu.ui.groups.GroupPickerViewModel
|
|
import agzam.vyatsu.ui.home.HomeScreen
|
|
import agzam.vyatsu.ui.schedule.ScheduleViewModel
|
|
import agzam.vyatsu.ui.settings.UpdateViewModel
|
|
import androidx.compose.material3.AlertDialog
|
|
import androidx.compose.material3.Text
|
|
import androidx.compose.material3.TextButton
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.collectAsState
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.ui.platform.LocalContext
|
|
import androidx.lifecycle.ViewModel
|
|
import androidx.lifecycle.ViewModelProvider
|
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
|
|
|
@Composable
|
|
fun AppRoot() {
|
|
val app = LocalContext.current.applicationContext as VyatsuApplication
|
|
val container = app.container
|
|
|
|
val scheduleViewModel: ScheduleViewModel = viewModel(factory = scheduleFactory(container))
|
|
val groupPickerViewModel: GroupPickerViewModel = viewModel(factory = groupPickerFactory(container))
|
|
val updateViewModel: UpdateViewModel = viewModel(factory = updateFactory(container))
|
|
|
|
val state by scheduleViewModel.uiState.collectAsState()
|
|
val showFirstRunDialog by updateViewModel.showFirstRunDialog.collectAsState()
|
|
|
|
if (showFirstRunDialog) {
|
|
AlertDialog(
|
|
onDismissRequest = { updateViewModel.onFirstRunDecision(false) },
|
|
title = { Text("Автоматические обновления") },
|
|
text = {
|
|
Text(
|
|
"Разрешить автоматически проверять и устанавливать " +
|
|
"новые версии приложения?"
|
|
)
|
|
},
|
|
confirmButton = {
|
|
TextButton(onClick = { updateViewModel.onFirstRunDecision(true) }) {
|
|
Text("Разрешить")
|
|
}
|
|
},
|
|
dismissButton = {
|
|
TextButton(onClick = { updateViewModel.onFirstRunDecision(false) }) {
|
|
Text("Не надо")
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
if (state.noGroup) {
|
|
GroupPickerScreen(
|
|
viewModel = groupPickerViewModel,
|
|
onGroupPicked = { group -> scheduleViewModel.selectGroup(group.id) }
|
|
)
|
|
return
|
|
}
|
|
HomeScreen(
|
|
scheduleViewModel = scheduleViewModel,
|
|
updateViewModel = updateViewModel,
|
|
onSwitchGroup = { scheduleViewModel.switchGroup() }
|
|
)
|
|
}
|
|
|
|
private class SimpleFactory<T : ViewModel>(private val create: () -> T) : ViewModelProvider.Factory {
|
|
@Suppress("UNCHECKED_CAST")
|
|
override fun <T : ViewModel> create(modelClass: Class<T>): T = create() as T
|
|
}
|
|
|
|
private fun scheduleFactory(c: AppContainer): ViewModelProvider.Factory = SimpleFactory { ScheduleViewModel(c.scheduleRepository, c.preferencesRepository, c.groupRepository) }
|
|
private fun groupPickerFactory(c: AppContainer): ViewModelProvider.Factory = SimpleFactory { GroupPickerViewModel(c.groupRepository) }
|
|
private fun updateFactory(c: AppContainer): ViewModelProvider.Factory = SimpleFactory { UpdateViewModel(c.appUpdater, c.preferencesRepository) }
|