Browse Source

added visual transformation for date

sirekanian 3 năm trước cách đây
mục cha
commit
897ca5cab8

+ 43 - 0
app/src/main/java/com/sirekanian/spacetime/ui/DateField.kt

@@ -0,0 +1,43 @@
+package com.sirekanian.spacetime.ui
+
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.input.OffsetMapping
+import androidx.compose.ui.text.input.TransformedText
+
+private val offsetMapping = object : OffsetMapping {
+    override fun originalToTransformed(offset: Int): Int =
+        when (offset) {
+            in (0..3) -> offset
+            in (4..5) -> offset + 1
+            else -> offset + 2
+        }
+
+    override fun transformedToOriginal(offset: Int): Int =
+        when (offset) {
+            in (0..4) -> offset
+            in (5..7) -> offset - 1
+            else -> offset - 2
+        }
+}
+
+class DateField(value: String) {
+
+    val value = value.filter(Char::isDigit).take(8)
+    private val year: String get() = value.take(4)
+    private val month: String get() = value.drop(4).take(2)
+    private val day: String get() = value.drop(6).take(2)
+
+    fun isValid(): Boolean =
+        value.length == 8 && month.toInt() in (1..12) && day.toInt() in (1..31)
+
+    fun getVisualTransformation(): TransformedText =
+        TransformedText(AnnotatedString(getFormattedValue()), offsetMapping)
+
+    fun getFormattedValue(): String =
+        when (value.length) {
+            in (0..3) -> year
+            in (4..5) -> "$year-$month"
+            else -> "$year-$month-$day"
+        }
+
+}

+ 6 - 5
app/src/main/java/com/sirekanian/spacetime/ui/DraftAlertDialog.kt

@@ -18,7 +18,7 @@ import com.sirekanian.spacetime.model.ImagePage
 fun DraftAlertDialog(state: MainState, onConfirm: (ImagePage) -> Unit) {
     val draft = state.draft
     var name by remember(draft) { mutableStateOf("") }
-    var date by remember(draft) { mutableStateOf("") }
+    var date by remember(draft) { mutableStateOf(DateField("")) }
     var isNameValid by remember(draft, name) { mutableStateOf(true) }
     var isDateValid by remember(draft, date) { mutableStateOf(true) }
     if (draft != null) {
@@ -39,11 +39,12 @@ fun DraftAlertDialog(state: MainState, onConfirm: (ImagePage) -> Unit) {
                     isError = !isNameValid
                 )
                 OutlinedTextField(
-                    value = date,
-                    onValueChange = { date = it },
+                    value = date.value,
+                    onValueChange = { date = DateField(it) },
                     label = { Text("Date") },
                     placeholder = { Text("YYYY-MM-DD") },
                     isError = !isDateValid,
+                    visualTransformation = { DateField(it.text).getVisualTransformation() },
                     keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
                 )
                 LaunchedEffect(Unit) {
@@ -60,9 +61,9 @@ fun DraftAlertDialog(state: MainState, onConfirm: (ImagePage) -> Unit) {
                 TextButton(
                     onClick = {
                         isNameValid = name.isNotEmpty()
-                        isDateValid = date.length == 8
+                        isDateValid = date.isValid()
                         if (isNameValid && isDateValid) {
-                            onConfirm(ImagePage(0, name, draft.url, date))
+                            onConfirm(ImagePage(0, name, draft.url, date.getFormattedValue()))
                             state.draft = null
                         }
                     },