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(private val create: () -> T) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): 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) }