diff --git a/opal-web/src/lib/components/SwipeAction.svelte b/opal-web/src/lib/components/SwipeAction.svelte index 858d28b..cfec4ea 100644 --- a/opal-web/src/lib/components/SwipeAction.svelte +++ b/opal-web/src/lib/components/SwipeAction.svelte @@ -2,12 +2,23 @@ /** * @type {() => void} */ - export let onSwipe; + export let onSwipeRight; + + /** + * @type {() => void} + */ + export let onSwipeLeft; + + /** + * @type {'start' | 'stop'} + */ + export let leftIcon; let offsetX = 0; let swiping = false; let locked = false; let completed = false; + let triggered = false; /** @type {number|null} */ let startX = null; @@ -52,8 +63,7 @@ if (swiping) { if (e.cancelable) e.preventDefault(); - // Only allow right swipe - offsetX = Math.max(0, deltaX); + offsetX = deltaX; } } @@ -64,11 +74,20 @@ } if (offsetX >= THRESHOLD) { + // Right swipe — complete (row collapses) completed = true; - // Animate to full width before firing callback offsetX = window.innerWidth; setTimeout(() => { - onSwipe(); + onSwipeRight(); + }, 200); + } else if (offsetX <= -THRESHOLD) { + // Left swipe — start/stop (row stays) + triggered = true; + offsetX = -window.innerWidth; + setTimeout(() => { + onSwipeLeft(); + offsetX = 0; + triggered = false; }, 200); } else { offsetX = 0; @@ -86,7 +105,8 @@ startY = null; } - $: progress = Math.min(offsetX / THRESHOLD, 1); + $: rightProgress = offsetX > 0 ? Math.min(offsetX / THRESHOLD, 1) : 0; + $: leftProgress = offsetX < 0 ? Math.min(Math.abs(offsetX) / THRESHOLD, 1) : 0; $: transitioning = !swiping && offsetX !== 0; @@ -97,15 +117,28 @@ on:touchend={handleTouchEnd} on:touchcancel={resetState} > -