diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ed030979..28f84b21 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,5 +1,5 @@ name: test -on: [pull_request] +on: [push, pull_request] jobs: run: diff --git a/packages/arcodesign/components/swipe-load/demo/carousel-label.md b/packages/arcodesign/components/swipe-load/demo/carousel-label.md index 940730dd..9c8933d5 100644 --- a/packages/arcodesign/components/swipe-load/demo/carousel-label.md +++ b/packages/arcodesign/components/swipe-load/demo/carousel-label.md @@ -33,15 +33,7 @@ export default function SwipeLoadDemo() { height: 120, }} > -
+
@@ -50,6 +42,13 @@ export default function SwipeLoadDemo() { ``` ```less +.swipe-item { + position: absolute; + .set-prop-with-rtl(left, 0); + height: 120px; + width: 150%; + background-color: #FFCF8B; +} .mylabel-start { width: 100px; height: 96px; diff --git a/packages/arcodesign/components/swipe-load/demo/custom-label.md b/packages/arcodesign/components/swipe-load/demo/custom-label.md index 92609de2..86ab7a42 100644 --- a/packages/arcodesign/components/swipe-load/demo/custom-label.md +++ b/packages/arcodesign/components/swipe-load/demo/custom-label.md @@ -58,7 +58,7 @@ export default function SwipeLoadDemo() { } .list-item { height: 72px; - margin-right: 10px; + .set-prop-with-rtl(margin-right, 10px); .use-var(background, background-color); } ``` diff --git a/packages/arcodesign/components/swipe-load/demo/default-label.md b/packages/arcodesign/components/swipe-load/demo/default-label.md index 1ccb38dc..fb150585 100644 --- a/packages/arcodesign/components/swipe-load/demo/default-label.md +++ b/packages/arcodesign/components/swipe-load/demo/default-label.md @@ -51,7 +51,7 @@ export default function SwipeLoadDemo() { } .list-item { height: 72px; - margin-right: 10px; + .set-prop-with-rtl(margin-right, 10px); .use-var(background, background-color); } ``` diff --git a/packages/arcodesign/components/swipe-load/demo/list-elements.md b/packages/arcodesign/components/swipe-load/demo/list-elements.md index 8f86d079..fff5d106 100644 --- a/packages/arcodesign/components/swipe-load/demo/list-elements.md +++ b/packages/arcodesign/components/swipe-load/demo/list-elements.md @@ -32,7 +32,7 @@ export default function SwipeLoadDemo() { ```less .list-item-color { height: 72px; - margin-right: 10px; + .set-prop-with-rtl(margin-right, 10px); .use-var(background, primary-disabled-color); } ``` diff --git a/packages/arcodesign/components/swipe-load/index.tsx b/packages/arcodesign/components/swipe-load/index.tsx index c07d87a1..28ce3008 100644 --- a/packages/arcodesign/components/swipe-load/index.tsx +++ b/packages/arcodesign/components/swipe-load/index.tsx @@ -51,7 +51,7 @@ const SwipeLoad = forwardRef((props: SwipeLoadProps, ref: Ref) => onTouchMove, renderLabel, } = props; - const { locale = defaultLocale } = useContext(GlobalContext); + const { locale = defaultLocale, useRtl } = useContext(GlobalContext); const [disableState, setDisableState] = useState(disabled); const [labelOffsetState, setLabelOffsetState] = useState(0); const containerRef = useRef(null); @@ -119,15 +119,24 @@ const SwipeLoad = forwardRef((props: SwipeLoadProps, ref: Ref) => // 判断元素是否属于滚动元素 先置为1 之后变成0表示非滚动容器 // @en Determine whether the element belongs to a scrolling element. Set it to 1 and then change to 0 to indicate a non-scrolling container if (!scrollContainer.scrollLeft) { - scrollContainer.scrollLeft = 1; + scrollContainer.scrollLeft = useRtl ? -1 : 1; } endX = e.touches[0].clientX || 0; const diff = endX - startX; offsetRef.current = diff; const labelDiff = fingerDisToLabelDis(Math.abs(diff), damping); + + // 判断是否是滚动到列表开始方向,ltr模式下是向左滚动,rtl模式下是向右滚动 + const isScrollToLeft = useRtl ? diff < 0 : diff > 0; + // 判断是否是滚动到列表结束方向,ltr模式下是向右滚动,rtl模式下是向左滚动 + const isScrollToRight = useRtl ? diff > 0 : diff < 0; // 滑动到最左侧,处理回弹效果 // @en Swipe to the far left to handle the rebound effect - if (diff > 0 && scrollContainer.scrollLeft <= 1 && bounceWhenBumpBoundary) { + if ( + isScrollToLeft && + Math.abs(scrollContainer.scrollLeft) <= 1 && + bounceWhenBumpBoundary + ) { e.stopPropagation(); e.cancelBubble && e.preventDefault(); bouncingRef.current = true; @@ -143,8 +152,8 @@ const SwipeLoad = forwardRef((props: SwipeLoadProps, ref: Ref) => // 向左滑动到尽头 '更多'标签加载 根据scrollLeft判断 滚动容器到达边缘触发 非滚动容器不判断 // @en Swipe left to the end and the 'more' label is loaded. Judging by scrollLeft, the scroll container reaches the edge and the non-scroll container does not judge if ( - diff < 0 && - (scrollContainer.scrollLeft + scrollContainer.clientWidth >= + isScrollToRight && + (Math.abs(scrollContainer.scrollLeft) + scrollContainer.clientWidth >= scrollContainer.scrollWidth - 1 || !scrollContainer.scrollLeft) && !ifToRightRef.current @@ -154,7 +163,7 @@ const SwipeLoad = forwardRef((props: SwipeLoadProps, ref: Ref) => } // 继续滑动露出标签 // @en Continue swiping to reveal labels - if (showLoadMoreRef.current && diff < 0) { + if (showLoadMoreRef.current && isScrollToRight) { // 此时禁止list原生滚动 // @en Disable list native scrolling at this time e.stopPropagation(); @@ -176,16 +185,20 @@ const SwipeLoad = forwardRef((props: SwipeLoadProps, ref: Ref) => } setStyleWithVendor(loadingCurrent, { transition: 'none', - transform: `translateX(-${labelRightMargin}px) translateZ(0)`, + transform: useRtl + ? `translateX(${labelRightMargin}px) translateZ(0)` + : `translateX(-${labelRightMargin}px) translateZ(0)`, }); setStyleWithVendor(scrollContainer, { transition: 'none', - transform: `translateX(-${listRightMargin}px) translateZ(0)`, + transform: useRtl + ? `translateX(${listRightMargin}px) translateZ(0)` + : `translateX(-${listRightMargin}px) translateZ(0)`, }); } if ( - diff > 0 && - scrollContainer.scrollLeft + scrollContainer.clientWidth <= + isScrollToLeft && + Math.abs(scrollContainer.scrollLeft) + scrollContainer.clientWidth <= scrollContainer.scrollWidth - 1 ) { showLoadMoreRef.current = false; @@ -194,8 +207,8 @@ const SwipeLoad = forwardRef((props: SwipeLoadProps, ref: Ref) => // 针对ios惯性滚动处理 // @en Handling inertial scrolling for ios if ( - diff < 0 && - scrollContainer.scrollLeft + scrollContainer.clientWidth <= + isScrollToRight && + Math.abs(scrollContainer.scrollLeft) + scrollContainer.clientWidth <= scrollContainer.scrollWidth - 1 ) { ifToRightRef.current = false; @@ -240,7 +253,7 @@ const SwipeLoad = forwardRef((props: SwipeLoadProps, ref: Ref) => // @em Swipe left, labels are all displayed if ( labelDiff >= minConfirmOffset && - (scrollContainer.scrollLeft + scrollContainer.clientWidth >= + (Math.abs(scrollContainer.scrollLeft) + scrollContainer.clientWidth >= scrollContainer.scrollWidth - 1 || !scrollContainer.scrollLeft) && showLoadMoreRef.current @@ -291,7 +304,7 @@ const SwipeLoad = forwardRef((props: SwipeLoadProps, ref: Ref) => ref={loadingRef} style={{ position: 'absolute', - right: `${initPos}px`, + [useRtl ? 'left' : 'right']: `${initPos}px`, }} > {/* @@ -308,7 +321,7 @@ const SwipeLoad = forwardRef((props: SwipeLoadProps, ref: Ref) => width: `${circleSize}px`, height: `${circleSize}px`, position: 'absolute', - right: `-${circleSize}px`, + [useRtl ? 'left' : 'right']: `-${circleSize}px`, }} >
- ${demoSource.map(demo => demo.source)} + ${demoSource.map(demo => demo.source).join('')} ); }`);