Files
TaskTTL/composeApp/src/commonMain/kotlin/com/taskttl/ui/components/CompactDatePickerDialog.kt
2025-10-08 21:53:18 +08:00

66 lines
2.2 KiB
Kotlin

package com.taskttl.ui.components
import androidx.compose.material3.DatePicker
import androidx.compose.material3.DatePickerDialog
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.rememberDatePickerState
import androidx.compose.runtime.Composable
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toInstant
import kotlinx.datetime.toLocalDateTime
import org.jetbrains.compose.resources.stringResource
import taskttl.composeapp.generated.resources.Res
import taskttl.composeapp.generated.resources.cancel
import taskttl.composeapp.generated.resources.confirm
import kotlin.time.Clock
import kotlin.time.ExperimentalTime
import kotlin.time.Instant
@OptIn(ExperimentalMaterial3Api::class, ExperimentalTime::class)
@Composable
fun CompactDatePickerDialog(
show: Boolean,
initialSelected: LocalDateTime?,
onConfirm: (LocalDateTime) -> Unit,
onDismiss: () -> Unit
) {
if (!show) return
val initialMillis = (
initialSelected?.toInstant(TimeZone.currentSystemDefault())
?: Clock.System.now()
).toEpochMilliseconds()
val state = rememberDatePickerState(initialSelectedDateMillis = initialMillis)
DatePickerDialog(
onDismissRequest = onDismiss,
confirmButton = {
TextButton(
onClick = {
val millis = state.selectedDateMillis
if (millis != null) {
val instant = Instant.fromEpochMilliseconds(millis)
val selected = instant.toLocalDateTime(TimeZone.currentSystemDefault())
onConfirm(selected)
}
onDismiss()
}
) { Text(stringResource(Res.string.confirm)) }
},
dismissButton = {
TextButton(onClick = onDismiss) { Text(stringResource(Res.string.cancel)) }
}
) {
DatePicker(
state = state,
headline = null,
title = null,
showModeToggle = false
)
}
}