Browse Source

Added gallery error state

Vadik Sirekanyan 2 năm trước cách đây
mục cha
commit
b4dce25677

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

@@ -1,5 +1,6 @@
 package com.sirekanian.spacetime
 
+import android.util.Log
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
@@ -62,7 +63,16 @@ class MainPresenterImpl(
 
     override fun loadGallery() {
         scope.launch {
-            state.thumbnails = state.thumbnails + api.getThumbnails(state.nextDate)
+            try {
+                state.thumbnails = state.thumbnails.orEmpty() + api.getThumbnails(state.nextDate)
+            } catch (exception: Exception) {
+                Log.d("Spacetime", "Cannot load thumbnails", exception)
+                state.thumbnails?.let { thumbnails ->
+                    if (thumbnails.isEmpty()) {
+                        state.thumbnails = null
+                    }
+                }
+            }
         }
     }
 

+ 14 - 9
app/src/main/java/com/sirekanian/spacetime/MainScreen.kt

@@ -14,6 +14,7 @@ import com.sirekanian.spacetime.model.GalleryPage
 import com.sirekanian.spacetime.model.ImagePage
 import com.sirekanian.spacetime.model.createImagePage
 import com.sirekanian.spacetime.ui.DraftPage
+import com.sirekanian.spacetime.ui.GalleryErrorContent
 import com.sirekanian.spacetime.ui.GalleryPageContent
 import com.sirekanian.spacetime.ui.ImagePageContent
 
@@ -45,15 +46,19 @@ fun MainScreen(presenter: MainPresenter) {
                 )
             }
             GalleryPage -> {
-                GalleryPageContent(
-                    insets,
-                    state.thumbnails,
-                    onSelect = { url ->
-                        val draft = createImagePage("", url, "", 0.5f)
-                        state.editablePage = EditablePage(draft, Autofocus.NAME)
-                    },
-                    onEnd = { presenter.loadGallery() }
-                )
+                state.thumbnails?.let { thumbnails ->
+                    GalleryPageContent(
+                        insets = insets,
+                        thumbnails = thumbnails,
+                        onSelect = { url ->
+                            val draft = createImagePage("", url, "", 0.5f)
+                            state.editablePage = EditablePage(draft, Autofocus.NAME)
+                        },
+                        onEnd = { presenter.loadGallery() },
+                    )
+                } ?: run {
+                    GalleryErrorContent(onRetry = presenter::loadGallery)
+                }
             }
         }
     }

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

@@ -22,10 +22,10 @@ class MainState {
     var editablePage by mutableStateOf<EditablePage?>(null)
     var pages by mutableStateOf(listOf<Page>())
     val draft by derivedStateOf { editablePage?.takeIf { it.page.id == 0 } }
-    var thumbnails by mutableStateOf(listOf<Thumbnail>())
+    var thumbnails by mutableStateOf<List<Thumbnail>?>(listOf())
     val nextDate: LocalDate by derivedStateOf {
         thumbnails.let {
-            if (it.isEmpty()) {
+            if (it.isNullOrEmpty()) {
                 currentDate().minusDays(2).withDayOfMonth(1)
             } else {
                 it.minOf(Thumbnail::date).withDayOfMonth(1).minusMonths(1)

+ 33 - 0
app/src/main/java/com/sirekanian/spacetime/ui/GalleryErrorContent.kt

@@ -0,0 +1,33 @@
+package com.sirekanian.spacetime.ui
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.systemBarsPadding
+import androidx.compose.material.Button
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+
+@Composable
+fun GalleryErrorContent(onRetry: () -> Unit) {
+    Column(
+        modifier = Modifier.fillMaxSize().systemBarsPadding().padding(16.dp),
+        verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.CenterVertically),
+        horizontalAlignment = Alignment.CenterHorizontally,
+    ) {
+        Text(
+            text = "Check your network connection",
+            modifier = Modifier.fillMaxWidth(),
+            textAlign = TextAlign.Center,
+        )
+        Button(onClick = onRetry) {
+            Text(text = "Try again")
+        }
+    }
+}