- Root navigation (server setup -> login+2FA -> calendar) with settings-driven theme - CalendarViewModel mirroring iOS CalendarStore: range-based caching, background prefetch, hidden/banished calendar filters, event CRUD - Five calendar views: Month, Week, Day, Quarter, Agenda (shared time grid) - Event detail + editor sheets (platform date/time pickers, color override, writable-calendar picker) across local/caldav/google/homeassistant - Calendar filter sheet (per-calendar show/hide) - Accounts screen: add/delete CalDAV, local, iCal, Home Assistant; list Google - Settings: view/week-start/language/colors/contrast/hour-height/cache range, synced to server - Profile: email, password change, 2FA enable/disable - gradlew build (lint + tests + assemble) passes Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
46 lines
1.8 KiB
Kotlin
46 lines
1.8 KiB
Kotlin
package com.scarriffle.calendarr.ui
|
|
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
|
import androidx.compose.material3.MaterialTheme
|
|
import androidx.compose.material3.Surface
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.CompositionLocalProvider
|
|
import androidx.compose.runtime.collectAsState
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.hilt.navigation.compose.hiltViewModel
|
|
import com.scarriffle.calendarr.ui.auth.LoginScreen
|
|
import com.scarriffle.calendarr.ui.auth.ServerSetupScreen
|
|
import com.scarriffle.calendarr.ui.calendar.CalendarScreen
|
|
import com.scarriffle.calendarr.ui.theme.CalendarrTheme
|
|
|
|
@Composable
|
|
fun CalendarrRoot(vm: MainViewModel = hiltViewModel()) {
|
|
val route by vm.route.collectAsState()
|
|
val settings by vm.settings.collectAsState()
|
|
|
|
CalendarrTheme(settings) {
|
|
CompositionLocalProvider(
|
|
LocalLang provides L10n.resolved(settings.language),
|
|
LocalAppSettings provides settings,
|
|
) {
|
|
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
|
|
when (route) {
|
|
AppRoute.SETUP -> ServerSetupScreen(onConfigured = vm::onServerConfigured)
|
|
AppRoute.LOGIN -> LoginScreen(
|
|
serverUrl = vm.serverUrl,
|
|
onLoggedIn = vm::onLoggedIn,
|
|
onBack = vm::switchServer,
|
|
)
|
|
AppRoute.MAIN -> CalendarScreen(
|
|
onLogout = vm::logout,
|
|
onSwitchServer = vm::switchServer,
|
|
onSettingsChanged = vm::applyLocalSettings,
|
|
onSettingsSynced = vm::refreshSettings,
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|