diff --git a/app/src/main/java/com/into/websoso/ui/detailExplore/component/RatingRangeSlider.kt b/app/src/main/java/com/into/websoso/ui/detailExplore/component/RatingRangeSlider.kt index 240115325..be62d653a 100644 --- a/app/src/main/java/com/into/websoso/ui/detailExplore/component/RatingRangeSlider.kt +++ b/app/src/main/java/com/into/websoso/ui/detailExplore/component/RatingRangeSlider.kt @@ -1,11 +1,11 @@ package com.into.websoso.ui.detailExplore.component +import android.view.HapticFeedbackConstants import androidx.compose.foundation.background import androidx.compose.foundation.gestures.detectDragGestures import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset @@ -28,6 +28,7 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.unit.dp import com.into.websoso.core.designsystem.theme.Primary100 import com.into.websoso.core.designsystem.theme.Primary50 @@ -64,6 +65,10 @@ fun RatingRangeSlider( val latestStartCenter by rememberUpdatedState(startCenterPx) val latestEndCenter by rememberUpdatedState(endCenterPx) + val view = LocalView.current + var lastMinSnapped by remember { mutableFloatStateOf(min) } + var lastMaxSnapped by remember { mutableFloatStateOf(max) } + fun snap(rawValue: Float): Float { val stepped = round(rawValue / stepSize) * stepSize return stepped.coerceIn(valueRange.start, valueRange.endInclusive) @@ -94,17 +99,31 @@ fun RatingRangeSlider( } val newValue = valueAtX(touchX) if (activeThumb == 1) { - onValueChange(newValue.coerceAtMost(latestMax), latestMax) + val snapped = newValue.coerceAtMost(latestMax) + lastMinSnapped = snapped + onValueChange(snapped, latestMax) } else { - onValueChange(latestMin, newValue.coerceAtLeast(latestMin)) + val snapped = newValue.coerceAtLeast(latestMin) + lastMaxSnapped = snapped + onValueChange(lastMinSnapped, snapped) } }, onDrag = { change, _ -> change.consume() val newValue = valueAtX(change.position.x) if (activeThumb == 1) { + val snapped = newValue.coerceAtMost(latestMax) + if (snapped != lastMinSnapped) { + view.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK) + lastMinSnapped = snapped + } onValueChange(newValue.coerceAtMost(latestMax), latestMax) } else { + val snapped = newValue.coerceAtLeast(latestMin) + if (snapped != lastMaxSnapped) { + view.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK) + lastMaxSnapped = snapped + } onValueChange(latestMin, newValue.coerceAtLeast(latestMin)) } },