feat(shift): wire VM factory, onResume reload, settings menu entry

This commit is contained in:
xfy 2026-07-06 18:41:07 +08:00
parent e08243d0fa
commit d528b98cde

View File

@ -93,7 +93,15 @@ import plus.rua.project.composeTraceBeginSection
import plus.rua.project.composeTraceEndSection
import kotlin.math.abs
import kotlin.time.Clock
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory
import plus.rua.project.ShiftPatternStorage
/**
* 日历主界面包含月/周视图切换折叠动画和年视图转场
@ -107,9 +115,30 @@ import androidx.lifecycle.viewmodel.compose.viewModel
fun CalendarMonthView(
modifier: Modifier = Modifier,
onNavigateToAbout: () -> Unit = {},
onNavigateToTools: () -> Unit = {}
onNavigateToTools: () -> Unit = {},
onNavigateToShiftSettings: () -> Unit = {}
) {
val viewModel = viewModel<CalendarViewModel>()
val context = LocalContext.current.applicationContext
val viewModel: CalendarViewModel = viewModel(
factory = viewModelFactory {
initializer {
CalendarViewModel(
clock = Clock.System,
shiftStorage = ShiftPatternStorage.fromContext(context)
)
}
}
)
// 设置页返回后 onResume 重读 storage,立即刷新班次
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) viewModel.refreshShiftPattern()
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
}
val today = remember { Clock.System.todayIn(TimeZone.currentSystemDefault()) }
val uiState by viewModel.uiState.collectAsState()
@ -427,6 +456,14 @@ fun CalendarMonthView(
viewModel.toggleShowLegalHoliday()
}
)
MenuItem(
text = "班次设置",
selected = false,
onClick = {
isMenuExpanded = false
onNavigateToShiftSettings()
}
)
HorizontalDivider(
thickness = 1.dp,
color = MaterialTheme.colorScheme.outlineVariant,