瀏覽代碼

added multipaging

sirekanian 3 年之前
父節點
當前提交
8a74525ba5

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

@@ -57,7 +57,7 @@ class MainPresenterImpl(
 
     override fun loadGallery() {
         scope.launch {
-            state.thumbnails = api.getThumbnails()
+            state.thumbnails = state.thumbnails + api.getThumbnails(state.nextDate)
         }
     }
 

+ 14 - 0
app/src/main/java/com/sirekanian/spacetime/MainState.kt

@@ -1,14 +1,28 @@
 package com.sirekanian.spacetime
 
+import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
+import com.sirekanian.spacetime.ext.currentDate
+import com.sirekanian.spacetime.ext.minusMonths
+import com.sirekanian.spacetime.ext.withDayOfMonth
 import com.sirekanian.spacetime.model.Draft
 import com.sirekanian.spacetime.model.Thumbnail
+import kotlinx.datetime.LocalDate
 
 class MainState {
 
     var draft by mutableStateOf<Draft?>(null)
     var thumbnails by mutableStateOf(listOf<Thumbnail>())
+    val nextDate: LocalDate by derivedStateOf {
+        thumbnails.let {
+            if (it.isEmpty()) {
+                currentDate().withDayOfMonth(1)
+            } else {
+                it.minOf(Thumbnail::date).withDayOfMonth(1).minusMonths(1)
+            }
+        }
+    }
 
 }

+ 4 - 3
app/src/main/java/com/sirekanian/spacetime/data/api/ThumbnailApi.kt

@@ -7,6 +7,7 @@ import io.ktor.client.call.*
 import io.ktor.client.plugins.contentnegotiation.*
 import io.ktor.client.request.*
 import io.ktor.serialization.kotlinx.json.*
+import kotlinx.datetime.LocalDate
 import kotlinx.serialization.json.Json
 
 private const val baseImageUrl = "https://apod.nasa.gov/"
@@ -20,11 +21,11 @@ class ThumbnailApi {
         }
     }
 
-    suspend fun getThumbnails(): List<Thumbnail> =
-        httpClient.get("https://sirekanian.com/apod/json/2022-10-01.json")
+    suspend fun getThumbnails(date: LocalDate): List<Thumbnail> =
+        httpClient.get("https://sirekanian.com/apod/json/$date.json")
             .body<List<NasaMedia>>()
             .filter { it.media_type == "image" && it.url.startsWith(baseImageUrl) }
-            .map { Thumbnail(baseThumbnailUrl + it.url.removePrefix(baseImageUrl)) }
+            .map { Thumbnail(baseThumbnailUrl + it.url.removePrefix(baseImageUrl), date) }
             .reversed()
 
 }

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

@@ -1,11 +0,0 @@
-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
-}

+ 12 - 0
app/src/main/java/com/sirekanian/spacetime/ext/LocalDate.kt

@@ -0,0 +1,12 @@
+package com.sirekanian.spacetime.ext
+
+import kotlinx.datetime.*
+
+fun currentDate(): LocalDate =
+    Clock.System.todayIn(TimeZone.currentSystemDefault())
+
+fun LocalDate.minusMonths(n: Int): LocalDate =
+    minus(n, DateTimeUnit.MONTH)
+
+fun LocalDate.withDayOfMonth(n: Int): LocalDate =
+    if (dayOfMonth == n) this else LocalDate(year, monthNumber, n)

+ 3 - 1
app/src/main/java/com/sirekanian/spacetime/model/Thumbnail.kt

@@ -1,3 +1,5 @@
 package com.sirekanian.spacetime.model
 
-class Thumbnail(val url: String)
+import kotlinx.datetime.LocalDate
+
+class Thumbnail(val url: String, val date: LocalDate)