From b79e73f2420c035f38c64bafa07044b76e1f707d Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 11:14:17 +0000 Subject: [PATCH] Fix critical issues: mobile scrolling, auto mode crash, and enhanced robustness - Fix #525: Set passive: isTouch for touch events to allow native vertical scrolling - Fix #524: Add safety guards and iteration limits to prevent infinite loops in auto mode - Enhance calculateAverage with isFinite validation for better robustness All tests pass, no regressions introduced. Co-Authored-By: Abdelrahman Ismail --- src/components/Carousel/Carousel.ts | 21 +++++++++++++++------ src/composables/useDrag.ts | 2 +- src/utils/calculateAverage.ts | 6 ++++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/components/Carousel/Carousel.ts b/src/components/Carousel/Carousel.ts index c896e667..a1d4bb74 100644 --- a/src/components/Carousel/Carousel.ts +++ b/src/components/Carousel/Carousel.ts @@ -702,13 +702,17 @@ export const Carousel = defineComponent({ let accumulatedSize = 0 let index = 0 - clonedSlidesCount.value.before const offset = Math.abs(scrolledOffset.value + clonedSlidesOffset.value) + let iterations = 0 + const maxIterations = slides.length * 2 - while (accumulatedSize <= offset) { + while (accumulatedSize <= offset && iterations < maxIterations) { const normalizedIndex = ((index % slides.length) + slides.length) % slides.length - accumulatedSize += - slidesRect.value[normalizedIndex]?.[dimension.value] + config.gap + const slideSize = slidesRect.value[normalizedIndex]?.[dimension.value] || 0 + if (slideSize <= 0) break + accumulatedSize += slideSize + config.gap index++ + iterations++ } minIndex = index - 1 } @@ -717,6 +721,9 @@ export const Carousel = defineComponent({ { let index = minIndex let accumulatedSize = 0 + let iterations = 0 + const maxIterations = slides.length * 2 + if (index < 0) { accumulatedSize = slidesRect.value @@ -731,12 +738,14 @@ export const Carousel = defineComponent({ Math.abs(scrolledOffset.value) } - while (accumulatedSize < viewportRect.value[dimension.value]) { + while (accumulatedSize < viewportRect.value[dimension.value] && iterations < maxIterations) { const normalizedIndex = ((index % slides.length) + slides.length) % slides.length - accumulatedSize += - slidesRect.value[normalizedIndex]?.[dimension.value] + config.gap + const slideSize = slidesRect.value[normalizedIndex]?.[dimension.value] || 0 + if (slideSize <= 0) break + accumulatedSize += slideSize + config.gap index++ + iterations++ } maxIndex = index - 1 } diff --git a/src/composables/useDrag.ts b/src/composables/useDrag.ts index 23ebcb7d..cdc85805 100644 --- a/src/composables/useDrag.ts +++ b/src/composables/useDrag.ts @@ -54,7 +54,7 @@ export function useDrag(options: UseDragOptions) { const moveEvent = isTouch ? 'touchmove' : 'mousemove' const endEvent = isTouch ? 'touchend' : 'mouseup' - document.addEventListener(moveEvent, handleDrag, { passive: false }) + document.addEventListener(moveEvent, handleDrag, { passive: isTouch }) document.addEventListener(endEvent, handleDragEnd, { passive: true }) options.onDragStart?.() diff --git a/src/utils/calculateAverage.ts b/src/utils/calculateAverage.ts index 066cbfb5..045e71f7 100644 --- a/src/utils/calculateAverage.ts +++ b/src/utils/calculateAverage.ts @@ -1,5 +1,7 @@ export function calculateAverage(numbers: number[]) { if (numbers.length === 0) return 0 - const sum = numbers.reduce((acc, num) => acc + num, 0) - return sum / numbers.length + const validNumbers = numbers.filter(num => typeof num === 'number' && !isNaN(num) && isFinite(num)) + if (validNumbers.length === 0) return 0 + const sum = validNumbers.reduce((acc, num) => acc + num, 0) + return sum / validNumbers.length }