diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioBottomSheet.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioBottomSheet.kt index af5f9c265..22ce83b9d 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioBottomSheet.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioBottomSheet.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -15,8 +16,6 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.SheetState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -27,12 +26,25 @@ import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import com.nuvio.app.isIos +import com.mohamedrejeb.calf.ui.sheet.AdaptiveBottomSheet +import com.mohamedrejeb.calf.ui.sheet.AdaptiveSheetState +import com.mohamedrejeb.calf.ui.sheet.rememberAdaptiveSheetState + +typealias NuvioBottomSheetState = AdaptiveSheetState + +@Composable +@OptIn(ExperimentalMaterial3Api::class) +fun rememberNuvioBottomSheetState( + skipPartiallyExpanded: Boolean = !isIos, +): NuvioBottomSheetState = + rememberAdaptiveSheetState(skipPartiallyExpanded = skipPartiallyExpanded) @OptIn(ExperimentalMaterial3Api::class) @Composable fun NuvioModalBottomSheet( onDismissRequest: () -> Unit, - sheetState: SheetState, + sheetState: NuvioBottomSheetState, modifier: Modifier = Modifier, containerColor: Color = MaterialTheme.colorScheme.surface, contentColor: Color = MaterialTheme.colorScheme.onSurface, @@ -40,10 +52,16 @@ fun NuvioModalBottomSheet( showDragHandle: Boolean = true, content: @Composable ColumnScope.() -> Unit, ) { - ModalBottomSheet( + val sheetModifier = if (isIos) { + modifier.fillMaxSize() + } else { + modifier + } + + AdaptiveBottomSheet( onDismissRequest = onDismissRequest, - sheetState = sheetState, - modifier = modifier, + adaptiveSheetState = sheetState, + modifier = sheetModifier, containerColor = containerColor, contentColor = contentColor, shape = shape, @@ -104,7 +122,7 @@ fun NuvioBottomSheetActionRow( @OptIn(ExperimentalMaterial3Api::class) suspend fun dismissNuvioBottomSheet( - sheetState: SheetState, + sheetState: NuvioBottomSheetState, onDismiss: () -> Unit, ) { if (sheetState.isVisible) { @@ -122,4 +140,4 @@ private fun NuvioBottomSheetDragHandle() { .clip(RoundedCornerShape(999.dp)) .background(MaterialTheme.colorScheme.outlineVariant.copy(alpha = 0.65f)), ) -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioContinueWatchingActionSheet.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioContinueWatchingActionSheet.kt index 693017d33..7d6fafeae 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioContinueWatchingActionSheet.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioContinueWatchingActionSheet.kt @@ -17,7 +17,6 @@ import androidx.compose.material.icons.filled.Replay import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text -import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment @@ -52,7 +51,7 @@ fun NuvioContinueWatchingActionSheet( onRemove: () -> Unit, ) { if (item == null) return - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val sheetState = rememberNuvioBottomSheetState() val coroutineScope = rememberCoroutineScope() fun dismissAfter(action: () -> Unit) { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioDropdownChip.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioDropdownChip.kt index 85ea9052a..f771f9865 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioDropdownChip.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioDropdownChip.kt @@ -18,9 +18,7 @@ import androidx.compose.material.icons.rounded.KeyboardArrowDown import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.SheetState import androidx.compose.material3.Text -import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -51,7 +49,7 @@ fun NuvioDropdownChip( modifier: Modifier = Modifier, ) { var isSheetVisible by remember { mutableStateOf(false) } - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val sheetState = rememberNuvioBottomSheetState() val coroutineScope = rememberCoroutineScope() Row( @@ -117,7 +115,7 @@ private fun NuvioDropdownOptionsSheet( title: String, options: List, selectedKey: String?, - sheetState: SheetState, + sheetState: NuvioBottomSheetState, onDismiss: () -> Unit, onSelected: (NuvioDropdownOption) -> Unit, ) { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioPosterActionSheet.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioPosterActionSheet.kt index 86520e0aa..b458befe2 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioPosterActionSheet.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioPosterActionSheet.kt @@ -24,7 +24,6 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text -import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment @@ -58,7 +57,7 @@ fun NuvioPosterActionSheet( onToggleWatched: () -> Unit, ) { if (item == null) return - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val sheetState = rememberNuvioBottomSheetState() val coroutineScope = rememberCoroutineScope() NuvioModalBottomSheet( diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt index 01c9ec619..243a2525c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt @@ -44,7 +44,7 @@ import androidx.compose.material3.Switch import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Text import androidx.compose.material3.TextButton -import androidx.compose.material3.rememberModalBottomSheetState +import com.nuvio.app.core.ui.rememberNuvioBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -1918,7 +1918,7 @@ private fun GenrePickerSheet( onSelect: (String?) -> Unit, onDismiss: () -> Unit, ) { - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val sheetState = rememberNuvioBottomSheetState() NuvioModalBottomSheet( onDismissRequest = onDismiss, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/CommentDetailSheet.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/CommentDetailSheet.kt index c13ae1249..3b3dcf118 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/CommentDetailSheet.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/CommentDetailSheet.kt @@ -24,7 +24,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text -import androidx.compose.material3.rememberModalBottomSheetState +import com.nuvio.app.core.ui.rememberNuvioBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment @@ -51,7 +51,7 @@ fun CommentDetailSheet( onNext: () -> Unit, onDismiss: () -> Unit, ) { - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val sheetState = rememberNuvioBottomSheetState() val scrollState = rememberScrollState() LaunchedEffect(comment.id) { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/EpisodeWatchedActionSheet.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/EpisodeWatchedActionSheet.kt index 00dd40f26..49f938861 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/EpisodeWatchedActionSheet.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/EpisodeWatchedActionSheet.kt @@ -12,7 +12,7 @@ import androidx.compose.material.icons.filled.PlaylistAddCheckCircle import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text -import androidx.compose.material3.rememberModalBottomSheetState +import com.nuvio.app.core.ui.rememberNuvioBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier @@ -46,7 +46,7 @@ fun EpisodeWatchedActionSheet( showPlayManually: Boolean = false, onPlayManually: (() -> Unit)? = null, ) { - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val sheetState = rememberNuvioBottomSheetState() val coroutineScope = rememberCoroutineScope() NuvioModalBottomSheet( @@ -140,7 +140,7 @@ fun SeasonWatchedActionSheet( onToggleSeasonWatched: () -> Unit, onMarkPreviousSeasonsWatched: () -> Unit, ) { - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val sheetState = rememberNuvioBottomSheetState() val coroutineScope = rememberCoroutineScope() NuvioModalBottomSheet( diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/TrailerPlayerPopup.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/TrailerPlayerPopup.kt index c12ead6b9..58776ef8a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/TrailerPlayerPopup.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/TrailerPlayerPopup.kt @@ -18,7 +18,7 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton -import androidx.compose.material3.rememberModalBottomSheetState +import com.nuvio.app.core.ui.rememberNuvioBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -67,7 +67,7 @@ fun TrailerPlayerPopup( } }.joinToString(separator = " • ") - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val sheetState = rememberNuvioBottomSheetState() val coroutineScope = rememberCoroutineScope() var playerError by remember(playbackSource?.videoUrl, playbackSource?.audioUrl) { mutableStateOf(null) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppearanceSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppearanceSettingsPage.kt index abbf58e7f..6ca91578a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppearanceSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppearanceSettingsPage.kt @@ -65,7 +65,7 @@ import nuvio.composeapp.generated.resources.settings_appearance_section_theme import org.jetbrains.compose.resources.StringResource import org.jetbrains.compose.resources.stringResource import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.rememberModalBottomSheetState +import com.nuvio.app.core.ui.rememberNuvioBottomSheetState @OptIn(ExperimentalLayoutApi::class) internal fun LazyListScope.appearanceSettingsContent( @@ -196,7 +196,7 @@ private fun AppearanceLanguageBottomSheet( onLanguageSelected: (AppLanguage) -> Unit, onDismiss: () -> Unit, ) { - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val sheetState = rememberNuvioBottomSheetState() val coroutineScope = rememberCoroutineScope() val options = remember { AppLanguage.entries.map { language -> diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt index 5cdb03ec6..97a1c28d5 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt @@ -86,7 +86,7 @@ import com.nuvio.app.core.ui.dismissNuvioBottomSheet import com.nuvio.app.features.downloads.DownloadsRepository import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.rememberModalBottomSheetState +import com.nuvio.app.core.ui.rememberNuvioBottomSheetState import coil3.compose.AsyncImage import com.nuvio.app.core.ui.nuvioSafeBottomPadding import com.nuvio.app.features.debrid.DebridProviders @@ -1126,7 +1126,7 @@ private fun StreamActionsSheet( ) { if (stream == null) return - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val sheetState = rememberNuvioBottomSheetState() val coroutineScope = rememberCoroutineScope() NuvioModalBottomSheet(