Эх сурвалжийг харах

added relative days count

sirekanian 3 жил өмнө
parent
commit
4ec8899d0b

+ 3 - 0
app/build.gradle

@@ -72,4 +72,7 @@ dependencies {
     // coil
     implementation "io.coil-kt:coil-compose:2.2.1"
 
+    // datetime
+    implementation 'org.jetbrains.kotlinx:kotlinx-datetime:0.4.0'
+
 }

+ 2 - 1
app/src/main/java/com/sirekanian/spacetime/data/local/PageEntity.kt

@@ -3,6 +3,7 @@ package com.sirekanian.spacetime.data.local
 import androidx.room.Entity
 import androidx.room.PrimaryKey
 import com.sirekanian.spacetime.model.ImagePage
+import com.sirekanian.spacetime.ui.DateField
 
 @Entity
 class PageEntity(
@@ -12,5 +13,5 @@ class PageEntity(
     val url: String,
     val date: String,
 ) {
-    fun toModel() = ImagePage(id, name, url, date)
+    fun toModel() = ImagePage(id, name, url, DateField(date))
 }

+ 11 - 0
app/src/main/java/com/sirekanian/spacetime/ext/Clock.kt

@@ -0,0 +1,11 @@
+package com.sirekanian.spacetime.ext
+
+import kotlinx.datetime.Clock
+import kotlinx.datetime.LocalDate
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.toLocalDateTime
+
+fun currentDate(): LocalDate {
+    val timeZone = TimeZone.currentSystemDefault()
+    return Clock.System.now().toLocalDateTime(timeZone).date
+}

+ 3 - 2
app/src/main/java/com/sirekanian/spacetime/model/Page.kt

@@ -1,11 +1,12 @@
 package com.sirekanian.spacetime.model
 
 import com.sirekanian.spacetime.data.local.PageEntity
+import com.sirekanian.spacetime.ui.DateField
 
 sealed class Page(val id: Int)
 
-class ImagePage(id: Int, val name: String, val url: String, val date: String) : Page(id) {
-    fun toEntity() = PageEntity(id, name, url, date)
+class ImagePage(id: Int, val name: String, val url: String, val date: DateField) : Page(id) {
+    fun toEntity() = PageEntity(id, name, url, date.value)
 }
 
 object GalleryPage : Page(-1)

+ 19 - 2
app/src/main/java/com/sirekanian/spacetime/ui/DateField.kt

@@ -1,8 +1,11 @@
 package com.sirekanian.spacetime.ui
 
+import android.util.Log
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.input.OffsetMapping
 import androidx.compose.ui.text.input.TransformedText
+import com.sirekanian.spacetime.ext.currentDate
+import kotlinx.datetime.LocalDate
 
 private val offsetMapping = object : OffsetMapping {
     override fun originalToTransformed(offset: Int): Int =
@@ -28,12 +31,26 @@ class DateField(value: String) {
     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)
+        getLocalDate() != null
+
+    fun getRelativeDays(): Int? =
+        getLocalDate()?.toEpochDays()?.minus(currentDate().toEpochDays())
+
+    private fun getLocalDate(): LocalDate? {
+        if (value.length == 8) {
+            try {
+                return LocalDate(year.toInt(), month.toInt(), day.toInt())
+            } catch (exception: IllegalArgumentException) {
+                Log.d("SPACETIME", "Cannot parse date", exception)
+            }
+        }
+        return null
+    }
 
     fun getVisualTransformation(): TransformedText =
         TransformedText(AnnotatedString(getFormattedValue()), offsetMapping)
 
-    fun getFormattedValue(): String =
+    private fun getFormattedValue(): String =
         when (value.length) {
             in (0..3) -> year
             in (4..5) -> "$year-$month"

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

@@ -63,7 +63,7 @@ fun DraftAlertDialog(state: MainState, onConfirm: (ImagePage) -> Unit) {
                         isNameValid = name.isNotEmpty()
                         isDateValid = date.isValid()
                         if (isNameValid && isDateValid) {
-                            onConfirm(ImagePage(0, name, draft.url, date.getFormattedValue()))
+                            onConfirm(ImagePage(0, name, draft.url, date))
                             state.draft = null
                         }
                     },

+ 11 - 1
app/src/main/java/com/sirekanian/spacetime/ui/ImagePageContent.kt

@@ -48,6 +48,16 @@ fun ImagePageContent(insets: PaddingValues, page: ImagePage, onDelete: () -> Uni
         verticalArrangement = Arrangement.Center,
     ) {
         Text(page.name)
-        Text(page.date)
+        page.date.getRelativeDays()?.let { days ->
+            Text(
+                when {
+                    days == 0 -> "today"
+                    days == 1 -> "tomorrow"
+                    days == -1 -> "yesterday"
+                    days > 0 -> "in $days days"
+                    else -> "${-days} days ago"
+                }
+            )
+        }
     }
 }