Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,21 @@ package dev.dimension.flare.ui.component
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.ModalBottomSheetProperties
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.navigation3.runtime.NavEntry
import androidx.navigation3.scene.OverlayScene
import androidx.navigation3.scene.Scene
import androidx.navigation3.scene.SceneStrategy
import androidx.navigation3.scene.SceneStrategyScope

internal class BottomSheetScene<T : Any>
private class BottomSheetScene<T : Any>
@OptIn(ExperimentalMaterial3Api::class)
constructor(
override val key: Any,
override val previousEntries: List<NavEntry<T>>,
override val overlaidEntries: List<NavEntry<T>>,
private val properties: ModalBottomSheetProperties,
private val properties: BottomSheetProperties,
private val entry: NavEntry<T>,
private val onBack: () -> Unit,
) : OverlayScene<T> {
Expand All @@ -26,7 +27,8 @@ internal class BottomSheetScene<T : Any>
override val content: @Composable (() -> Unit) = {
ModalBottomSheet(
onDismissRequest = { onBack() },
properties = properties,
properties = properties.properties,
sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = properties.expandFully),
) {
entry.Content()
}
Expand All @@ -37,7 +39,7 @@ internal class BottomSheetScene<T : Any>
internal class BottomSheetSceneStrategy<T : Any> : SceneStrategy<T> {
override fun SceneStrategyScope<T>.calculateScene(entries: List<NavEntry<T>>): Scene<T>? {
val lastEntry = entries.lastOrNull()
val properties = lastEntry?.metadata?.get(BOTTOMSHEET_KEY) as? ModalBottomSheetProperties
val properties = lastEntry?.metadata?.get(BOTTOMSHEET_KEY) as? BottomSheetProperties
return properties?.let { properties ->
BottomSheetScene(
key = lastEntry.contentKey,
Expand All @@ -53,7 +55,22 @@ internal class BottomSheetSceneStrategy<T : Any> : SceneStrategy<T> {
companion object {
private const val BOTTOMSHEET_KEY = "bottom_sheet"

fun bottomSheet(properties: ModalBottomSheetProperties = ModalBottomSheetProperties()): Map<String, Any> =
mapOf(BOTTOMSHEET_KEY to properties)
fun bottomSheet(
properties: ModalBottomSheetProperties = ModalBottomSheetProperties(),
expandFully: Boolean = false,
): Map<String, Any> =
mapOf(
BOTTOMSHEET_KEY to
BottomSheetProperties(
properties = properties,
expandFully = expandFully,
),
)
}
}

@OptIn(ExperimentalMaterial3Api::class)
private data class BottomSheetProperties(
val properties: ModalBottomSheetProperties,
val expandFully: Boolean,
)
19 changes: 19 additions & 0 deletions app/src/main/java/dev/dimension/flare/ui/route/Route.kt
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,16 @@ internal sealed interface Route : NavKey {
override val accountType: AccountType,
) : Status,
WithAccountType

@Serializable
data class ShareSheet(
val statusKey: MicroBlogKey,
override val accountType: AccountType,
val shareUrl: String,
val fxShareUrl: String? = null,
val fixvxShareUrl: String? = null,
) : Status,
WithAccountType
}

@Serializable
Expand Down Expand Up @@ -575,6 +585,15 @@ internal sealed interface Route : NavKey {
accountType = deeplinkRoute.accountType,
)

is DeeplinkRoute.Status.ShareSheet ->
Status.ShareSheet(
statusKey = deeplinkRoute.statusKey,
accountType = deeplinkRoute.accountType,
shareUrl = deeplinkRoute.shareUrl,
fxShareUrl = deeplinkRoute.fxShareUrl,
fixvxShareUrl = deeplinkRoute.fixvxShareUrl,
)

is DeeplinkRoute.Status.VVOComment ->
Status.VVOComment(
commentKey = deeplinkRoute.commentKey,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import dev.dimension.flare.ui.screen.status.action.BlueskyReportStatusDialog
import dev.dimension.flare.ui.screen.status.action.DeleteStatusConfirmDialog
import dev.dimension.flare.ui.screen.status.action.MastodonReportDialog
import dev.dimension.flare.ui.screen.status.action.MisskeyReportDialog
import dev.dimension.flare.ui.screen.status.action.StatusShareSheet

@OptIn(ExperimentalMaterial3Api::class)
internal fun EntryProviderScope<NavKey>.statusEntryBuilder(
Expand Down Expand Up @@ -102,4 +103,19 @@ internal fun EntryProviderScope<NavKey>.statusEntryBuilder(
onBack = onBack
)
}
}

entry<Route.Status.ShareSheet>(
metadata = BottomSheetSceneStrategy.bottomSheet(
expandFully = true,
)
) { args ->
StatusShareSheet(
statusKey = args.statusKey,
accountType = args.accountType,
shareUrl = args.shareUrl,
fxShareUrl = args.fxShareUrl,
fixvxShareUrl = args.fixvxShareUrl,
onBack = onBack
)
}
}
Loading
Loading