feat: implement nuvioSecondaryClick modifier for secondary click handling

This commit is contained in:
tapframe 2026-05-12 23:28:18 +05:30
parent 89ca233f71
commit 76cce3180f
9 changed files with 54 additions and 4 deletions

View file

@ -0,0 +1,5 @@
package com.nuvio.app.core.ui
import androidx.compose.ui.Modifier
internal actual fun Modifier.nuvioSecondaryClick(onSecondaryClick: (() -> Unit)?): Modifier = this

View file

@ -0,0 +1,5 @@
package com.nuvio.app.core.ui
import androidx.compose.ui.Modifier
internal expect fun Modifier.nuvioSecondaryClick(onSecondaryClick: (() -> Unit)?): Modifier

View file

@ -343,10 +343,11 @@ internal fun Modifier.posterCardClickable(
onLongClick: (() -> Unit)?,
): Modifier =
if (onClick != null || onLongClick != null) {
combinedClickable(
onClick = { onClick?.invoke() },
onLongClick = onLongClick,
)
nuvioSecondaryClick(onLongClick)
.combinedClickable(
onClick = { onClick?.invoke() },
onLongClick = onLongClick,
)
} else {
this
}

View file

@ -25,6 +25,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.nuvio.app.core.ui.AppIconResource
import com.nuvio.app.core.ui.appIconPainter
import com.nuvio.app.core.ui.nuvioSecondaryClick
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.action_play
import nuvio.composeapp.generated.resources.action_save
@ -70,6 +71,7 @@ fun DetailActionButtons(
Row(
modifier = Modifier
.fillMaxWidth()
.nuvioSecondaryClick(onPlayLongClick)
.combinedClickable(
onClick = onPlayClick,
onLongClick = onPlayLongClick,
@ -104,6 +106,7 @@ fun DetailActionButtons(
Row(
modifier = Modifier
.fillMaxWidth()
.nuvioSecondaryClick(onSaveLongClick)
.combinedClickable(
onClick = onSaveClick,
onLongClick = onSaveLongClick,

View file

@ -64,6 +64,7 @@ import com.nuvio.app.core.format.formatReleaseDateForDisplay
import com.nuvio.app.core.i18n.localizedSeasonEpisodeCode
import com.nuvio.app.core.ui.NuvioAnimatedWatchedBadge
import com.nuvio.app.core.ui.NuvioProgressBar
import com.nuvio.app.core.ui.nuvioSecondaryClick
import com.nuvio.app.features.details.MetaDetails
import com.nuvio.app.features.details.MetaEpisodeCardStyle
import com.nuvio.app.features.details.MetaVideo
@ -656,6 +657,7 @@ private fun EpisodeHorizontalCard(
color = Color.White.copy(alpha = 0.12f),
shape = cardShape,
)
.nuvioSecondaryClick(onLongPress)
.combinedClickable(
enabled = onClick != null || onLongPress != null,
onClick = { onClick?.invoke() },
@ -1011,6 +1013,7 @@ private fun EpisodeListCard(
color = Color.White.copy(alpha = 0.1f),
shape = cardShape,
)
.nuvioSecondaryClick(onLongPress)
.combinedClickable(
enabled = onClick != null || onLongPress != null,
onClick = { onClick?.invoke() },

View file

@ -41,6 +41,7 @@ import coil3.compose.AsyncImage
import com.nuvio.app.core.ui.localizedContinueWatchingSubtitle
import com.nuvio.app.core.ui.NuvioProgressBar
import com.nuvio.app.core.ui.NuvioShelfSection
import com.nuvio.app.core.ui.nuvioSecondaryClick
import com.nuvio.app.core.ui.posterCardClickable
import com.nuvio.app.features.watchprogress.ContinueWatchingItem
import com.nuvio.app.features.watchprogress.ContinueWatchingSectionStyle
@ -334,6 +335,7 @@ private fun ContinueWatchingWideCard(
color = Color.White.copy(alpha = 0.15f),
shape = RoundedCornerShape(layout.cardRadius),
)
.nuvioSecondaryClick(onLongClick)
.combinedClickable(
enabled = onClick != null || onLongClick != null,
onClick = { onClick?.invoke() },

View file

@ -83,6 +83,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.rememberModalBottomSheetState
import coil3.compose.AsyncImage
import com.nuvio.app.core.ui.nuvioSecondaryClick
import com.nuvio.app.core.ui.nuvioSafeBottomPadding
import com.nuvio.app.features.watchprogress.WatchProgressRepository
import kotlinx.coroutines.launch
@ -963,6 +964,7 @@ private fun StreamCard(
)
.clip(cardShape)
.background(Color.White.copy(alpha = 0.05f))
.nuvioSecondaryClick(if (isEnabled) onLongClick else null)
.combinedClickable(
enabled = isEnabled,
onClick = onClick,

View file

@ -0,0 +1,24 @@
package com.nuvio.app.core.ui
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.PointerEventPass
import androidx.compose.ui.input.pointer.PointerEventType
import androidx.compose.ui.input.pointer.isSecondary
import androidx.compose.ui.input.pointer.onPointerEvent
@OptIn(ExperimentalComposeUiApi::class)
internal actual fun Modifier.nuvioSecondaryClick(onSecondaryClick: (() -> Unit)?): Modifier =
if (onSecondaryClick != null) {
onPointerEvent(
eventType = PointerEventType.Press,
pass = PointerEventPass.Initial,
) { event ->
if (event.button?.isSecondary == true) {
event.changes.forEach { it.consume() }
onSecondaryClick()
}
}
} else {
this
}

View file

@ -0,0 +1,5 @@
package com.nuvio.app.core.ui
import androidx.compose.ui.Modifier
internal actual fun Modifier.nuvioSecondaryClick(onSecondaryClick: (() -> Unit)?): Modifier = this