fix: IllegalStateException when opening SortBottomSheet (#931)

This commit is contained in:
Diego Beraldin 2024-06-05 13:49:59 +02:00 committed by GitHub
parent 541cf7255d
commit fd13d1c7b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,5 +1,6 @@
package com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals package com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals
import androidx.compose.animation.Crossfade
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@ -20,14 +21,14 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorFilter
import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.currentOrThrow
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.BottomSheetHeader import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.BottomSheetHeader
import com.github.diegoberaldin.raccoonforlemmy.core.l10n.LocalXmlStrings import com.github.diegoberaldin.raccoonforlemmy.core.l10n.LocalXmlStrings
@ -41,6 +42,12 @@ import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.toInt
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.toReadableName import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.toReadableName
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.toSortType import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.toSortType
private sealed interface SortBottomSheetLevel {
data object Main : SortBottomSheetLevel
data object Top : SortBottomSheetLevel
}
class SortBottomSheet( class SortBottomSheet(
private val values: List<Int>, private val values: List<Int>,
private val comments: Boolean = false, private val comments: Boolean = false,
@ -62,29 +69,49 @@ class SortBottomSheet(
), ),
verticalArrangement = Arrangement.spacedBy(Spacing.s), verticalArrangement = Arrangement.spacedBy(Spacing.s),
) { ) {
Navigator( var level by remember { mutableStateOf<SortBottomSheetLevel>(SortBottomSheetLevel.Main) }
Crossfade(
targetState = level,
) { currentLevel ->
when (currentLevel) {
SortBottomSheetLevel.Main -> {
SortBottomSheetMain( SortBottomSheetMain(
values = values, values = values,
expandTop = expandTop, expandTop = expandTop,
comments = comments, comments = comments,
defaultForCommunity = defaultForCommunity, defaultForCommunity = defaultForCommunity,
screenKey = screenKey, screenKey = screenKey,
), onNavigateUp = {
level = SortBottomSheetLevel.Top
},
)
}
SortBottomSheetLevel.Top -> {
SortBottomSheetTop(
comments = comments,
defaultForCommunity = defaultForCommunity,
screenKey = screenKey,
onNavigateDown = {
level = SortBottomSheetLevel.Main
},
) )
} }
} }
} }
}
}
}
internal class SortBottomSheetMain(
private val comments: Boolean,
private val values: List<Int>,
private val expandTop: Boolean = false,
private val defaultForCommunity: Boolean = false,
private val screenKey: String?,
) : Screen {
@Composable @Composable
override fun Content() { private fun SortBottomSheetMain(
val navigator = LocalNavigator.currentOrThrow comments: Boolean,
values: List<Int>,
expandTop: Boolean = false,
defaultForCommunity: Boolean = false,
screenKey: String?,
onNavigateUp: () -> Unit,
) {
val navigationCoordinator = remember { getNavigationCoordinator() } val navigationCoordinator = remember { getNavigationCoordinator() }
val notificationCenter = remember { getNotificationCenter() } val notificationCenter = remember { getNotificationCenter() }
Column { Column {
@ -106,13 +133,7 @@ internal class SortBottomSheetMain(
.onClick( .onClick(
onClick = { onClick = {
if (sortValue == SortType.Top.Generic && expandTop) { if (sortValue == SortType.Top.Generic && expandTop) {
navigator.push( onNavigateUp()
SortBottomSheetTop(
comments = comments,
defaultForCommunity = defaultForCommunity,
screenKey = screenKey,
),
)
} else { } else {
val event = val event =
if (comments) { if (comments) {
@ -162,11 +183,11 @@ internal class SortBottomSheetMain(
} }
} }
} }
}
internal class SortBottomSheetTop( @Composable
private val comments: Boolean, private fun SortBottomSheetTop(
private val values: List<Int> = comments: Boolean,
values: List<Int> =
listOf( listOf(
SortType.Top.PastHour, SortType.Top.PastHour,
SortType.Top.Past6Hours, SortType.Top.Past6Hours,
@ -176,12 +197,10 @@ internal class SortBottomSheetTop(
SortType.Top.Month, SortType.Top.Month,
SortType.Top.Year, SortType.Top.Year,
).map { it.toInt() }, ).map { it.toInt() },
private val defaultForCommunity: Boolean = false, defaultForCommunity: Boolean = false,
private val screenKey: String?, screenKey: String?,
) : Screen { onNavigateDown: () -> Unit,
@Composable ) {
override fun Content() {
val navigator = LocalNavigator.currentOrThrow
val navigationCoordinator = remember { getNavigationCoordinator() } val navigationCoordinator = remember { getNavigationCoordinator() }
val notificationCenter = remember { getNotificationCenter() } val notificationCenter = remember { getNotificationCenter() }
@ -198,7 +217,7 @@ internal class SortBottomSheetTop(
Modifier Modifier
.onClick( .onClick(
onClick = { onClick = {
navigator.pop() onNavigateDown()
}, },
), ),
imageVector = Icons.AutoMirrored.Default.ArrowBack, imageVector = Icons.AutoMirrored.Default.ArrowBack,
@ -259,4 +278,3 @@ internal class SortBottomSheetTop(
} }
} }
} }
}