@hh.ru/magritte-ui-swipe 5.0.6 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Swipe.js +131 -119
- package/Swipe.js.map +1 -1
- package/SwipeGroup.d.ts +2 -0
- package/SwipeGroup.js +22 -0
- package/SwipeGroup.js.map +1 -0
- package/context.d.ts +6 -0
- package/context.js +7 -0
- package/context.js.map +1 -0
- package/index.css +136 -126
- package/index.d.ts +4 -2
- package/index.js +4 -0
- package/index.js.map +1 -1
- package/package.json +4 -2
- package/types.d.ts +11 -6
package/Swipe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Swipe.js","sources":["../src/Swipe.tsx"],"sourcesContent":["import { FC, MutableRefObject, useCallback, useEffect, useRef, useState } from 'react';\nimport { animated, config, useSpring } from '@react-spring/web';\nimport classNames from 'classnames';\n\nimport { useDebounce } from '@hh.ru/magritte-common-func-utils';\nimport { SwipeEvent, SwipeEventHandler, SwipeThreshold } from '@hh.ru/magritte-common-use-swipe';\nimport { MAIN_AXIS_THRESHOLD_PX, useSwipe } from '@hh.ru/magritte-common-use-swipe/useSwipe';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { Layer, LayerName } from '@hh.ru/magritte-ui-layer';\nimport { SwipeButtonsArray, SwipeProps } from '@hh.ru/magritte-ui-swipe/types';\n\nimport styles from './swipe.less';\n\nconst MIN_BUTTON_WIDTH = 76;\nconst OPEN_THRESHOLD = 1 / 3;\nconst MIN_SWIPE_DISTANCE = MIN_BUTTON_WIDTH * OPEN_THRESHOLD;\n\nenum ButtonsState {\n Close = 'close',\n LeftOpen = 'leftOpen',\n RightOpen = 'rightOpen',\n}\n\nenum LongState {\n Off = 'off',\n Left = 'left',\n Right = 'right',\n}\n\nexport const Swipe: FC<SwipeProps> = ({\n children,\n leftButtons,\n rightButtons,\n onStart,\n onFinish,\n useLongSwipe = true,\n 'data-qa': dataQa,\n demo = false,\n twoSidedDemoMode = 'right-to-left',\n demoAppearTime = 200,\n demoIdleTime = 300,\n demoDisappearTime = 200,\n onFinishDemo,\n onStartDemo,\n onResetDemo,\n}) => {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const swipeableRef = useRef<HTMLDivElement | null>(null);\n const childrenWrapperRef = useRef<HTMLDivElement | null>(null);\n const [swipeableWidth, setSwipeableWidth] = useState(0);\n const leftButtonsRef = useRef<HTMLDivElement | null>(null);\n const rightButtonsRef = useRef<HTMLDivElement | null>(null);\n\n const sumRefs = useRef<HTMLDivElement[]>([]); // ссылки на кнопки, по которым считается реальный размер\n const leftButtonsSumSizeRef = useRef(0); // реальный размер, требуемый левым кнопкам\n const rightButtonsSumSizeRef = useRef(0); // реальный размер, требуемый правым кнопкам\n\n const leftButtonsSizeRef = useRef(0); // установленный размер левых кнопок\n const rigthButtonsSizeRef = useRef(0); // установленный размер правых кнопок\n const prevDistance = useRef(0);\n const swipeThresholdRef = useRef<SwipeThreshold>({ max: MIN_SWIPE_DISTANCE });\n const swipeLockRef = useRef(false);\n const { isMobile } = useBreakpoint();\n\n const [leftBlockStyles, leftBlockApi] = useSpring(() => ({\n width: 0,\n }));\n\n const [rightBlockStyles, rightBlockApi] = useSpring(() => ({\n width: 0,\n }));\n\n const [longState, setLongState] = useState(LongState.Off);\n const stateRef = useRef({\n candidate: ButtonsState.Close, // предполагаемое состояние, нужно чтобы нельзя было двигать влево-вправо за один раз\n now: ButtonsState.Close, // текущее состояние\n next: ButtonsState.Close, // следующее состояние, после завершения свайпа\n });\n\n const [demoInProgress, setDemoInProgress] = useState<boolean>(false);\n\n const setAnimateButtonsWidth = useCallback((flag: boolean) => {\n if (leftButtonsRef.current) {\n leftButtonsRef.current.style.transitionProperty = flag ? 'width' : 'none';\n }\n if (rightButtonsRef.current) {\n rightButtonsRef.current.style.transitionProperty = flag ? 'width' : 'none';\n }\n }, []);\n\n const setWidth = useDebounce(\n useCallback(() => {\n if (swipeableRef.current && childrenWrapperRef.current && rootRef.current) {\n const value: number = rootRef.current.getBoundingClientRect().width;\n // устанавливаем размер области равной размеру контента,\n // чтобы она не растягивалась, когда растягиваются кнопки\n setSwipeableWidth(value);\n swipeableRef.current.style.width = `${value}px`;\n childrenWrapperRef.current.style.width = `${value}px`;\n childrenWrapperRef.current.style.minWidth = `${value}px`;\n }\n }, [setSwipeableWidth]),\n 64\n );\n\n useEffect(() => {\n setWidth();\n }, [setWidth]);\n\n useEffect(() => {\n if (window && isMobile) {\n window.addEventListener('resize', setWidth);\n }\n\n return () => {\n if (window && isMobile) {\n window.removeEventListener('resize', setWidth);\n }\n };\n }, [setWidth, isMobile]);\n\n // обновляет порог срабатывания для useSwipe в зависимости от состояния\n const updateSwipeThreshold = useCallback(() => {\n const { now, candidate } = stateRef.current;\n\n // если открыта одна из сторон, то мы можем свайпнуть к закрытию, или к активации длинного свайпа\n if ([ButtonsState.LeftOpen, ButtonsState.RightOpen].includes(now)) {\n swipeThresholdRef.current =\n now === ButtonsState.LeftOpen\n ? {\n // свайп к закрытию\n minDelta: -MIN_SWIPE_DISTANCE,\n // свайп к активации длинного свайпа\n maxDelta: useLongSwipe ? MIN_SWIPE_DISTANCE : Number.MAX_SAFE_INTEGER,\n }\n : {\n // свайп к закрытию\n maxDelta: MIN_SWIPE_DISTANCE,\n // свайп к активации длинного свайпа\n minDelta: useLongSwipe ? -MIN_SWIPE_DISTANCE : -Number.MAX_SAFE_INTEGER,\n };\n } else if (candidate === ButtonsState.LeftOpen) {\n // если кандидат на открытие слева, то мы можем свайпнуть к открытию слева\n swipeThresholdRef.current = { maxDelta: MIN_SWIPE_DISTANCE };\n } else if (candidate === ButtonsState.RightOpen) {\n // если кандидат на открытие справа, то мы можем свайпнуть к открытию справа, дельта с отрицательным знаком\n // потому что свайпаем вправо\n swipeThresholdRef.current = { minDelta: -MIN_SWIPE_DISTANCE };\n }\n }, [useLongSwipe]);\n\n // анимирует размер кнопок для перехода в переданное состояние\n const animateToState = useCallback(\n (toState: ButtonsState, velocity: number) => {\n leftBlockApi.stop();\n rightBlockApi.stop();\n stateRef.current.now = toState;\n\n const animationConfig = {\n width: 0,\n config: {\n ...config.gentle,\n clamp: true,\n velocity: 0,\n },\n };\n let api: typeof leftBlockApi | typeof rightBlockApi;\n\n // если нужно закрыть кнопки, то сначала определяем с какой стороны кнопки открыты\n // получаем апи для акнимации кнопок с нужной стороны\n // вычисляем начальную скорость, т.к. анимация закрытия кнопок с разных сторон направлена в разные стороны\n // то для правой стороны нужно поменять знак начальной скорости\n if (toState === ButtonsState.Close) {\n const fromLeft = leftBlockApi.current[0].get().width > 0;\n api = fromLeft ? leftBlockApi : rightBlockApi;\n const v = fromLeft ? velocity : -velocity;\n\n // скорость делим на 1000 т.к. в событии приходит скорость в пикселях в секунду\n // а нужна в пикселях в миллисекунду\n animationConfig.config.velocity = v / 1000;\n } else {\n // если нужно открыть кнопки, то получаем апи для анимации блока кнопок с нужной стороны\n // вычисляем начальную скорость, т.к. анимация открытия кнопок с разных сторон направлена в разные стороны\n // то для правой стороны нужно поменять знак начальной скорости\n api = toState === ButtonsState.LeftOpen ? leftBlockApi : rightBlockApi;\n const v = toState === ButtonsState.LeftOpen ? velocity : -velocity;\n animationConfig.width = Math.min(\n swipeableWidth,\n (toState === ButtonsState.LeftOpen ? leftButtonsSumSizeRef : rightButtonsSumSizeRef).current\n );\n animationConfig.config.velocity = v / 1000;\n }\n\n void api.start(animationConfig)[0].then(({ finished }) => {\n if (finished) {\n stateRef.current.candidate = ButtonsState.Close;\n }\n });\n },\n [leftBlockApi, rightBlockApi, swipeableWidth]\n );\n\n const handleSwipeStart: SwipeEventHandler = useCallback(() => {\n if (demoInProgress || swipeLockRef.current) {\n return;\n }\n\n rightBlockApi.stop();\n leftBlockApi.stop();\n onStart?.();\n onResetDemo?.();\n updateSwipeThreshold();\n if (longState !== LongState.Off) {\n setLongState(LongState.Off);\n }\n prevDistance.current = 0;\n setAnimateButtonsWidth(false);\n }, [\n demoInProgress,\n rightBlockApi,\n leftBlockApi,\n onStart,\n onResetDemo,\n updateSwipeThreshold,\n longState,\n setAnimateButtonsWidth,\n ]);\n\n const handleChangeButtonsSizeByDistance = useCallback(\n (distance: number) => {\n // работаем с изменением дистанции, чтобы добавлять ее к существующей ширине\n const distanceDelta = distance - prevDistance.current;\n\n if (distanceDelta === 0) {\n return;\n }\n\n prevDistance.current = distance;\n\n // определяем сторону свайпа, проверяем есть ли с этой стороны кнопки, если есть меняем ширину блока кнопок\n const isLeft =\n stateRef.current.now === ButtonsState.LeftOpen ||\n stateRef.current.candidate === ButtonsState.LeftOpen ||\n (stateRef.current.now !== ButtonsState.RightOpen &&\n stateRef.current.candidate === ButtonsState.Close &&\n distanceDelta > 0);\n const hasButtons = isLeft ? !!leftButtonsRef.current : !!rightButtonsRef.current;\n const api = isLeft ? leftBlockApi : rightBlockApi;\n const currentWidth = api.current[0].get().width;\n\n if (!hasButtons) {\n return;\n }\n\n const width = Math.max(currentWidth + (isLeft ? distanceDelta : -distanceDelta), 0);\n api.set({ width });\n\n // если ширина блока кнопок > 0 фиксируем сторону-кандидат\n // чтобы не было возможности двигать влево-вправо за один свайп\n if (width > 0) {\n stateRef.current.candidate = isLeft ? ButtonsState.LeftOpen : ButtonsState.RightOpen;\n updateSwipeThreshold();\n }\n\n // определяем значение justifyContent у контейнера в зависимости от того, с какой стороны сейчас раскрыты кнопки\n // если раскрыты слева, то контент должен уходить за пределы области в право, ставим flex-start\n // если раскрыты справа, то контент должен уходить за пределы области в лево, ставим flex-end\n // визуально ничего не меняется, потому что контент в контейнере растянут на всю ширину\n if (swipeableRef.current) {\n swipeableRef.current.style.justifyContent =\n stateRef.current.candidate === ButtonsState.RightOpen ? 'flex-end' : 'flex-start';\n }\n\n // определяем выполнены ли условия для перевода компонента в состояние длинного свайпа\n // длинный свайп может быть отключен вообще или может быть недоступен если это сдвиг на проекцию\n const sumSize = isLeft ? leftButtonsSumSizeRef.current : rightButtonsSumSizeRef.current;\n if (useLongSwipe && width > sumSize + MIN_SWIPE_DISTANCE) {\n setLongState(isLeft ? LongState.Left : LongState.Right);\n stateRef.current.next = ButtonsState.Close;\n } else {\n setLongState(LongState.Off);\n }\n },\n [leftBlockApi, rightBlockApi, useLongSwipe, updateSwipeThreshold]\n );\n\n const handleSwipeMove: SwipeEventHandler = useCallback(\n (event: SwipeEvent) => {\n if (demoInProgress || swipeLockRef.current) {\n return;\n }\n // сдвиг в след за пальцем, можем делать длинный свайп\n handleChangeButtonsSizeByDistance(event.distanceX);\n },\n [demoInProgress, handleChangeButtonsSizeByDistance]\n );\n\n const runSwipeAnimation = useCallback(() => {\n if (!swipeableRef.current) {\n return;\n }\n\n if (stateRef.current.next === ButtonsState.Close) {\n // свайп завершен, кнопки должны закрыться, потому что не выполнен минимальный размер раскрытия\n // сбрасываем ширину в 0\n if (leftButtonsRef.current) {\n leftButtonsRef.current.style.width = '0';\n }\n leftButtonsSizeRef.current = 0;\n if (rightButtonsRef.current) {\n rightButtonsRef.current.style.width = '0';\n }\n rigthButtonsSizeRef.current = 0;\n } else if (stateRef.current.next === ButtonsState.LeftOpen) {\n // выполнено условие раскрытия слева\n // раскрываем кнопки на ширину их контента, но не больше ширины контейнера\n const maxLeftSize = Math.min(swipeableWidth, leftButtonsSumSizeRef.current);\n if (leftButtonsRef.current) {\n leftButtonsRef.current.style.width = `${maxLeftSize}px`;\n }\n leftButtonsSizeRef.current = maxLeftSize;\n rigthButtonsSizeRef.current = 0;\n } else if (stateRef.current.next === ButtonsState.RightOpen) {\n // выполнено условие раскрытия справа\n // раскрываем кнопки на ширину их контента, но не больше ширины контейнера\n const maxRightSize = Math.min(swipeableWidth, rightButtonsSumSizeRef.current);\n if (rightButtonsRef.current) {\n rightButtonsRef.current.style.width = `${maxRightSize}px`;\n }\n rigthButtonsSizeRef.current = maxRightSize;\n leftButtonsSizeRef.current = 0;\n }\n stateRef.current.now = stateRef.current.next;\n }, [swipeableWidth]);\n\n const handleSwipeFinish: SwipeEventHandler = useCallback(\n (event: SwipeEvent) => {\n if (demoInProgress) {\n return;\n }\n\n onFinish?.();\n\n // если это длинный свайп, то трггерим клик на соответствующую кнопку, и закрываем блок кнопок\n // если не установлен флаг keepStateAfterLong\n if (longState !== LongState.Off) {\n const buttons = longState === LongState.Left ? leftButtons : rightButtons;\n const button = longState === LongState.Left ? buttons?.[0] : buttons?.[buttons.length - 1];\n button?.onClick();\n onResetDemo?.();\n swipeLockRef.current = !!button?.keepStateAfterLong;\n if (!button?.keepStateAfterLong) {\n animateToState(ButtonsState.Close, event.velocityX);\n }\n return;\n }\n\n // если это не длинный свайп, то анимируем к соответствующему состоянию\n // если открыт левый или правый блок, то анимируем в закрытое состояние\n // если закрыты оба блока, то анимируем к открытию стороны-кадидата\n const { now, candidate } = stateRef.current;\n animateToState(\n [ButtonsState.LeftOpen, ButtonsState.RightOpen].includes(now) ? ButtonsState.Close : candidate,\n event.velocityX\n );\n },\n [demoInProgress, longState, leftButtons, rightButtons, onFinish, onResetDemo, animateToState]\n );\n\n const handleSwipeCancel: SwipeEventHandler = useCallback(\n (event) => {\n animateToState(stateRef.current.now, event.velocityX);\n },\n [animateToState]\n );\n\n const swipeHandlers = useSwipe({\n thresholdXRef: swipeThresholdRef,\n onSwipeStart: handleSwipeStart,\n onSwipeMove: handleSwipeMove,\n onSwipeEnd: handleSwipeFinish,\n onSwipeCancel: handleSwipeCancel,\n });\n\n const preventHorizontalScroll: EventListener = useCallback((e) => {\n if (Math.abs(prevDistance.current) > MAIN_AXIS_THRESHOLD_PX) {\n e.preventDefault();\n }\n }, []);\n\n const swipebleRefCurrent = swipeableRef.current;\n\n // выключаем вертикальный скролл, если у нас был минимальный горизонтальный скролл, чтобы не дергалось\n useEffect(() => {\n if (swipebleRefCurrent) {\n swipebleRefCurrent.addEventListener('touchmove', preventHorizontalScroll, { passive: false });\n }\n return () => {\n if (swipebleRefCurrent) {\n swipebleRefCurrent.removeEventListener('touchmove', preventHorizontalScroll);\n }\n };\n }, [preventHorizontalScroll, swipebleRefCurrent]);\n\n const getButtonsFromSide = useCallback((side = stateRef.current.now) => {\n const buttons = side === ButtonsState.RightOpen ? rightButtonsRef.current : leftButtonsRef.current;\n const oppositeButtons = buttons === rightButtonsRef.current ? leftButtonsRef.current : rightButtonsRef.current;\n\n return { buttons, oppositeButtons };\n }, []);\n\n const unmountDemoEndHandler = useCallback(\n (event: TransitionEvent) => {\n if (event.propertyName !== 'width') {\n return;\n }\n\n setDemoInProgress(false);\n\n const isTwoSidedSwipe = !!rightButtonsRef.current && !!leftButtonsRef.current;\n const isLeft = isTwoSidedSwipe\n ? twoSidedDemoMode === 'right-to-left' || twoSidedDemoMode === 'left'\n : !!leftButtonsRef.current;\n const buttons = isLeft ? leftButtonsRef.current : rightButtonsRef.current;\n\n buttons?.removeEventListener('transitionend', unmountDemoEndHandler);\n\n rootRef.current?.style.removeProperty('--transition-duration');\n rootRef.current?.style.removeProperty('--transition-delay');\n\n onResetDemo?.();\n onFinishDemo?.();\n },\n [onFinishDemo, onResetDemo, twoSidedDemoMode]\n );\n\n const demoSideAppearHandler = useCallback(\n (event: TransitionEvent) => {\n if (event.propertyName !== 'width') {\n return;\n }\n\n const currentSide = stateRef.current.now;\n const { buttons, oppositeButtons } = getButtonsFromSide(currentSide);\n\n const appearedIsFirstOfSides =\n !!rightButtonsRef.current &&\n !!leftButtonsRef.current &&\n ((currentSide === ButtonsState.LeftOpen && twoSidedDemoMode === 'left-to-right') ||\n (currentSide === ButtonsState.RightOpen && twoSidedDemoMode === 'right-to-left'));\n\n buttons?.removeEventListener('transitionend', demoSideAppearHandler);\n\n if (rootRef.current) {\n rootRef.current.style.setProperty(\n '--transition-duration',\n `${appearedIsFirstOfSides ? demoAppearTime : demoDisappearTime}ms`\n );\n rootRef.current.style.setProperty('--transition-delay', `${demoIdleTime}ms`);\n }\n\n stateRef.current.next = ButtonsState.Close;\n stateRef.current.candidate = stateRef.current.next;\n runSwipeAnimation();\n\n if (appearedIsFirstOfSides) {\n stateRef.current.next =\n currentSide === ButtonsState.LeftOpen ? ButtonsState.RightOpen : ButtonsState.LeftOpen;\n stateRef.current.candidate = stateRef.current.next;\n\n runSwipeAnimation();\n\n const twiceSideTransitionHandler = () => {\n oppositeButtons?.removeEventListener('transitionstart', twiceSideTransitionHandler);\n\n if (oppositeButtons && childrenWrapperRef.current) {\n const isRight = currentSide === ButtonsState.RightOpen;\n\n childrenWrapperRef.current.style.transform = `translateX(${\n isRight ? leftButtonsSumSizeRef.current : -rightButtonsSumSizeRef.current\n }px)`;\n }\n };\n\n oppositeButtons?.addEventListener('transitionstart', twiceSideTransitionHandler);\n oppositeButtons?.addEventListener('transitionend', demoSideAppearHandler);\n } else {\n const startDestroyDemoHandler = () => {\n buttons?.removeEventListener('transitionstart', startDestroyDemoHandler);\n childrenWrapperRef.current?.style.removeProperty('transform');\n };\n\n buttons?.addEventListener('transitionstart', startDestroyDemoHandler);\n buttons?.addEventListener('transitionend', unmountDemoEndHandler);\n }\n },\n [\n getButtonsFromSide,\n twoSidedDemoMode,\n runSwipeAnimation,\n demoAppearTime,\n demoDisappearTime,\n demoIdleTime,\n unmountDemoEndHandler,\n ]\n );\n\n const startDemo = useCallback(\n (side: ButtonsState.RightOpen | ButtonsState.LeftOpen) => {\n onResetDemo?.();\n onStartDemo?.();\n setDemoInProgress(true);\n\n stateRef.current.now = ButtonsState.Close;\n stateRef.current.next = side;\n stateRef.current.candidate = side;\n\n if (swipeableRef.current) {\n swipeableRef.current.style.justifyContent = side === ButtonsState.RightOpen ? 'flex-end' : 'flex-start';\n }\n\n if (rootRef.current) {\n rootRef.current.style.setProperty('--transition-duration', `${demoAppearTime}ms`);\n }\n\n setLongState(LongState.Off);\n setAnimateButtonsWidth(true);\n runSwipeAnimation();\n\n const { buttons } = getButtonsFromSide(side);\n buttons?.addEventListener('transitionend', demoSideAppearHandler);\n },\n [\n demoAppearTime,\n demoSideAppearHandler,\n getButtonsFromSide,\n runSwipeAnimation,\n onResetDemo,\n onStartDemo,\n setAnimateButtonsWidth,\n ]\n );\n\n useEffect(() => {\n if (\n demo &&\n !demoInProgress &&\n stateRef.current.now === ButtonsState.Close &&\n swipeableRef.current?.style.width\n ) {\n const isTwoSidedSwipe = Boolean(rightButtonsRef.current && leftButtonsRef.current);\n\n if (isTwoSidedSwipe) {\n startDemo(\n twoSidedDemoMode === 'right' || twoSidedDemoMode === 'right-to-left'\n ? ButtonsState.RightOpen\n : ButtonsState.LeftOpen\n );\n } else {\n startDemo(rightButtonsRef.current ? ButtonsState.RightOpen : ButtonsState.LeftOpen);\n }\n }\n\n if (!isMobile && demoInProgress) {\n setDemoInProgress(false);\n stateRef.current = {\n candidate: ButtonsState.Close,\n now: ButtonsState.Close,\n next: ButtonsState.Close,\n };\n }\n }, [demo, twoSidedDemoMode, startDemo, demoInProgress, isMobile, onResetDemo]);\n\n // подсчитываем реальный необходимый размер для кнопок\n // и назначаем проперти исходя из положения кнопки (последняя/не последняя)\n const handleButtonContentRef = useCallback(\n (left: boolean, isGrow: boolean) => (ref: HTMLDivElement) => {\n // нужно чтобы посчитать размеры для каждой кнопки один раз (не придумал, как сделать лучше)\n if (sumRefs.current.includes(ref) || !ref) {\n return;\n }\n\n const width = ref?.offsetWidth ?? 0;\n if (!isGrow) {\n ref.style.maxWidth = `${width}px`;\n }\n sumRefs.current.push(ref);\n if (left) {\n leftButtonsSumSizeRef.current += width;\n } else {\n rightButtonsSumSizeRef.current += width;\n }\n },\n []\n );\n\n const renderButtons = (buttons: SwipeButtonsArray, ref: MutableRefObject<HTMLDivElement | null>, left: boolean) => {\n const isTwoSidedDemoInProgress = leftButtons && rightButtons && demoInProgress;\n return (\n <Layer layer={LayerName.Content}>\n <animated.div\n className={classNames(styles.buttons, {\n [styles.buttonsLeft]: left && twoSidedDemoMode === 'right-to-left' && isTwoSidedDemoInProgress,\n [styles.buttonsRight]:\n !left && twoSidedDemoMode === 'left-to-right' && isTwoSidedDemoInProgress,\n })}\n // \"длинная\" кнопка растягивается максимум на ширину контейнера (buttons)\n // чтобы не было видно пустоты между ней и контейнером\n // нужно устанавливать выравнивание в зависимости от стороны\n style={{\n justifyContent: left ? 'flex-start' : 'flex-end',\n ...(left ? leftBlockStyles : rightBlockStyles),\n }}\n ref={ref}\n data-qa={`swipe-buttons-${left ? 'left' : 'right'}`}\n >\n {buttons.map((item, index) => {\n if (!item) {\n return null;\n }\n const isGrow = left ? index === 0 : index === buttons.length - 1;\n const isHide =\n (left && index !== 0 && longState === LongState.Left) ||\n (!left && index !== buttons.length - 1 && longState === LongState.Right);\n const Icon = item.icon;\n const iconProps = item.showLabel\n ? { 'aria-hidden': true, focusable: false }\n : { 'aria-label': item.label };\n return (\n <button\n className={classNames(styles.button, {\n [styles.buttonGrow]: isGrow,\n [styles.buttonHide]: isHide,\n [styles[`button_style-${item.style}`]]: item.style,\n })}\n // это нужно чтобы анимировался длинный свайп.\n // Здесь должно быть значение максимально близкое к тому,\n // какой максимум может занимать одна кнопка, если кнопок больше 1\n style={isGrow ? { maxWidth: `${swipeableWidth}px` } : {}}\n key={index}\n onClick={() => {\n if (demoInProgress) {\n return;\n }\n if (item.closeOnAction) {\n animateToState(ButtonsState.Close, 0);\n }\n item.onClick();\n }}\n data-qa={`swipe-button-${left ? 'left' : 'right'}-${index}`}\n >\n <div\n className={styles.buttonContent}\n ref={handleButtonContentRef(left, isGrow)}\n data-qa={`swipe-button-content-${left ? 'left' : 'right'}-${index}`}\n >\n <div className={styles.buttonContentColumn}>\n {Icon && (\n <div className={styles.iconWrapper}>\n <Icon {...iconProps} />\n </div>\n )}\n {item.showLabel && <span className={styles.buttonLabel}>{item.label}</span>}\n </div>\n </div>\n </button>\n );\n })}\n </animated.div>\n </Layer>\n );\n };\n\n if (!isMobile) {\n return null;\n }\n\n return (\n <div className={styles.root} ref={rootRef} data-qa={dataQa ?? 'swipe-root'}>\n <div\n className={classNames(styles.swipeble)}\n ref={swipeableRef}\n {...swipeHandlers}\n data-qa=\"swipe-swipeable\"\n >\n {!!leftButtons?.length && renderButtons(leftButtons, leftButtonsRef, true)}\n <div ref={childrenWrapperRef} className={styles.childrenWrapper}>\n {children}\n </div>\n {!!rightButtons?.length && renderButtons(rightButtons, rightButtonsRef, false)}\n </div>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Swipe.js","sources":["../src/Swipe.tsx"],"sourcesContent":["import { FC, Fragment, MutableRefObject, useCallback, useContext, useEffect, useId, useRef, useState } from 'react';\nimport { animated, config, useSpring } from '@react-spring/web';\nimport classNames from 'classnames';\n\nimport { useDebounce } from '@hh.ru/magritte-common-func-utils';\nimport { useResize } from '@hh.ru/magritte-common-resize';\nimport { SwipeEvent, SwipeEventHandler, SwipeThreshold } from '@hh.ru/magritte-common-use-swipe';\nimport { MAIN_AXIS_THRESHOLD_PX, useSwipe } from '@hh.ru/magritte-common-use-swipe/useSwipe';\nimport { useWhenFontLoaded } from '@hh.ru/magritte-common-use-when-font-loaded';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { Layer, LayerName } from '@hh.ru/magritte-ui-layer';\nimport { SwipeContext } from '@hh.ru/magritte-ui-swipe/context';\nimport { SwipeButtonsArray, SwipeProps } from '@hh.ru/magritte-ui-swipe/types';\n\nimport styles from './swipe.less';\n\nconst MIN_BUTTON_WIDTH = 76;\nconst OPEN_THRESHOLD = 1 / 3;\nconst MIN_SWIPE_DISTANCE = MIN_BUTTON_WIDTH * OPEN_THRESHOLD;\nconst GAP_WIDTH = 12;\n\nenum ButtonsState {\n Close = 'close',\n LeftOpen = 'leftOpen',\n RightOpen = 'rightOpen',\n}\n\nenum LongState {\n Off = 'off',\n Left = 'left',\n Right = 'right',\n}\n\nexport const Swipe: FC<SwipeProps> = ({\n children,\n leftButtons,\n rightButtons,\n onStart,\n onFinish,\n useLongSwipe = true,\n 'data-qa': dataQa,\n demo = false,\n twoSidedDemoMode = 'right-to-left',\n demoAppearTime = 200,\n demoIdleTime = 300,\n demoDisappearTime = 200,\n onFinishDemo,\n onStartDemo,\n onResetDemo,\n gap = false,\n borderRadius,\n}) => {\n const fixedContainerRef = useRef<HTMLDivElement | null>(null);\n const swipeContainerRef = useRef<HTMLDivElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [swipeContainerWidth, setSwipeContainerWidth] = useState(0);\n const leftButtonsRef = useRef<HTMLDivElement | null>(null);\n const rightButtonsRef = useRef<HTMLDivElement | null>(null);\n\n const sumRefs = useRef<HTMLDivElement[]>([]); // ссылки на кнопки, по которым считается реальный размер\n const leftButtonsSumSizeRef = useRef(0); // реальный размер, требуемый левым кнопкам\n const rightButtonsSumSizeRef = useRef(0); // реальный размер, требуемый правым кнопкам\n\n const leftButtonsSizeRef = useRef(0); // установленный размер левых кнопок\n const rigthButtonsSizeRef = useRef(0); // установленный размер правых кнопок\n const prevDistance = useRef(0);\n const swipeThresholdRef = useRef<SwipeThreshold>({ max: MIN_SWIPE_DISTANCE });\n const swipeLockRef = useRef(false);\n const { isMobile } = useBreakpoint();\n const [isFontLoaded, setFontLoaded] = useState(false);\n const visible = isMobile && isFontLoaded;\n\n useWhenFontLoaded(() => setFontLoaded(true));\n\n const [leftBlockStyles, leftBlockApi] = useSpring(() => ({ width: 0 }));\n const [rightBlockStyles, rightBlockApi] = useSpring(() => ({ width: 0 }));\n\n const [longState, setLongState] = useState(LongState.Off);\n const stateRef = useRef({\n candidate: ButtonsState.Close, // предполагаемое состояние, нужно чтобы нельзя было двигать влево-вправо за один раз\n now: ButtonsState.Close, // текущее состояние\n next: ButtonsState.Close, // следующее состояние, после завершения свайпа\n });\n\n const [demoInProgress, setDemoInProgress] = useState<boolean>(false);\n\n const setAnimateButtonsWidth = useCallback((flag: boolean) => {\n if (leftButtonsRef.current) {\n leftButtonsRef.current.style.transitionProperty = flag ? 'width' : 'none';\n }\n if (rightButtonsRef.current) {\n rightButtonsRef.current.style.transitionProperty = flag ? 'width' : 'none';\n }\n }, []);\n\n const recalcSwipeContainerWidth = useCallback(() => {\n if (swipeContainerRef.current && contentRef.current && fixedContainerRef.current) {\n const width = Math.round(fixedContainerRef.current.getBoundingClientRect().width);\n // устанавливаем размер области равной размеру контента,\n // чтобы она не растягивалась, когда растягиваются кнопки\n setSwipeContainerWidth(width);\n swipeContainerRef.current.style.width = `${width}px`;\n contentRef.current.style.width = `${width}px`;\n contentRef.current.style.minWidth = `${width}px`;\n }\n }, [setSwipeContainerWidth]);\n\n useEffect(() => {\n if (visible) {\n recalcSwipeContainerWidth();\n }\n }, [visible, recalcSwipeContainerWidth]);\n\n useResize(useDebounce(recalcSwipeContainerWidth, 50));\n\n // обновляет порог срабатывания для useSwipe в зависимости от состояния\n const updateSwipeThreshold = useCallback(() => {\n const { now, candidate } = stateRef.current;\n\n // если открыта одна из сторон, то мы можем свайпнуть к закрытию, или к активации длинного свайпа\n if ([ButtonsState.LeftOpen, ButtonsState.RightOpen].includes(now)) {\n swipeThresholdRef.current =\n now === ButtonsState.LeftOpen\n ? {\n // свайп к закрытию\n minDelta: -MIN_SWIPE_DISTANCE,\n // свайп к активации длинного свайпа\n maxDelta: useLongSwipe ? MIN_SWIPE_DISTANCE : Number.MAX_SAFE_INTEGER,\n }\n : {\n // свайп к закрытию\n maxDelta: MIN_SWIPE_DISTANCE,\n // свайп к активации длинного свайпа\n minDelta: useLongSwipe ? -MIN_SWIPE_DISTANCE : -Number.MAX_SAFE_INTEGER,\n };\n } else if (candidate === ButtonsState.LeftOpen) {\n // если кандидат на открытие слева, то мы можем свайпнуть к открытию слева\n swipeThresholdRef.current = { maxDelta: MIN_SWIPE_DISTANCE };\n } else if (candidate === ButtonsState.RightOpen) {\n // если кандидат на открытие справа, то мы можем свайпнуть к открытию справа, дельта с отрицательным знаком\n // потому что свайпаем вправо\n swipeThresholdRef.current = { minDelta: -MIN_SWIPE_DISTANCE };\n }\n }, [useLongSwipe]);\n\n // анимирует размер кнопок для перехода в переданное состояние\n const animateToState = useCallback(\n (toState: ButtonsState, velocity: number) => {\n leftBlockApi.stop();\n rightBlockApi.stop();\n stateRef.current.now = toState;\n\n const animationConfig = {\n width: 0,\n config: {\n ...config.gentle,\n clamp: true,\n velocity: 0,\n },\n };\n let api: typeof leftBlockApi | typeof rightBlockApi;\n\n // если нужно закрыть кнопки, то сначала определяем с какой стороны кнопки открыты\n // получаем апи для акнимации кнопок с нужной стороны\n // вычисляем начальную скорость, т.к. анимация закрытия кнопок с разных сторон направлена в разные стороны\n // то для правой стороны нужно поменять знак начальной скорости\n if (toState === ButtonsState.Close) {\n const fromLeft = leftBlockApi.current[0].get().width > 0;\n api = fromLeft ? leftBlockApi : rightBlockApi;\n const v = fromLeft ? velocity : -velocity;\n\n // скорость делим на 1000 т.к. в событии приходит скорость в пикселях в секунду\n // а нужна в пикселях в миллисекунду\n animationConfig.config.velocity = v / 1000;\n } else {\n // если нужно открыть кнопки, то получаем апи для анимации блока кнопок с нужной стороны\n // вычисляем начальную скорость, т.к. анимация открытия кнопок с разных сторон направлена в разные стороны\n // то для правой стороны нужно поменять знак начальной скорости\n api = toState === ButtonsState.LeftOpen ? leftBlockApi : rightBlockApi;\n const v = toState === ButtonsState.LeftOpen ? velocity : -velocity;\n animationConfig.width = Math.min(\n swipeContainerWidth,\n (toState === ButtonsState.LeftOpen ? leftButtonsSumSizeRef : rightButtonsSumSizeRef).current\n );\n animationConfig.config.velocity = v / 1000;\n }\n\n void api.start(animationConfig)[0].then(({ finished }) => {\n if (finished) {\n stateRef.current.candidate = ButtonsState.Close;\n if (swipeContainerRef.current !== null) {\n swipeContainerRef.current.classList.remove(styles.swipeContainerInProgress);\n }\n }\n });\n },\n [leftBlockApi, rightBlockApi, swipeContainerWidth]\n );\n\n const id = useId();\n const swipeContext = useContext(SwipeContext);\n\n useEffect(() => {\n if (visible && swipeContext !== null) {\n swipeContext.register(id, () => {\n animateToState(ButtonsState.Close, 0);\n });\n }\n }, [visible, swipeContext, id, animateToState]);\n\n const handleSwipeStart: SwipeEventHandler = useCallback(() => {\n if (demoInProgress || swipeLockRef.current) {\n return;\n }\n\n rightBlockApi.stop();\n leftBlockApi.stop();\n onStart?.();\n onResetDemo?.();\n updateSwipeThreshold();\n if (longState !== LongState.Off) {\n setLongState(LongState.Off);\n }\n prevDistance.current = 0;\n setAnimateButtonsWidth(false);\n }, [\n demoInProgress,\n rightBlockApi,\n leftBlockApi,\n onStart,\n onResetDemo,\n updateSwipeThreshold,\n longState,\n setAnimateButtonsWidth,\n ]);\n\n const recalcButtonsSizes = useCallback(\n (distance: number) => {\n // работаем с изменением дистанции, чтобы добавлять ее к существующей ширине\n const distanceDelta = distance - prevDistance.current;\n\n if (distanceDelta === 0) {\n return;\n }\n\n prevDistance.current = distance;\n\n // определяем сторону свайпа, проверяем есть ли с этой стороны кнопки, если есть меняем ширину блока кнопок\n const isLeft =\n stateRef.current.now === ButtonsState.LeftOpen ||\n stateRef.current.candidate === ButtonsState.LeftOpen ||\n (stateRef.current.now !== ButtonsState.RightOpen &&\n stateRef.current.candidate === ButtonsState.Close &&\n distanceDelta > 0);\n const hasButtons = isLeft ? !!leftButtonsRef.current : !!rightButtonsRef.current;\n const api = isLeft ? leftBlockApi : rightBlockApi;\n const currentWidth = api.current[0].get().width;\n\n if (!hasButtons) {\n return;\n }\n\n const width = Math.max(currentWidth + (isLeft ? distanceDelta : -distanceDelta), 0);\n api.set({ width });\n\n // если ширина блока кнопок > 0 фиксируем сторону-кандидат\n // чтобы не было возможности двигать влево-вправо за один свайп\n if (width > 0) {\n stateRef.current.candidate = isLeft ? ButtonsState.LeftOpen : ButtonsState.RightOpen;\n updateSwipeThreshold();\n }\n\n // определяем значение justifyContent у контейнера в зависимости от того, с какой стороны сейчас раскрыты кнопки\n // если раскрыты слева, то контент должен уходить за пределы области в право, ставим flex-start\n // если раскрыты справа, то контент должен уходить за пределы области в лево, ставим flex-end\n // визуально ничего не меняется, потому что контент в контейнере растянут на всю ширину\n if (swipeContainerRef.current) {\n swipeContainerRef.current.classList.toggle(styles.swipeContainerInProgress, width > 0);\n swipeContainerRef.current.style.justifyContent =\n stateRef.current.candidate === ButtonsState.RightOpen ? 'flex-end' : 'flex-start';\n }\n\n // определяем выполнены ли условия для перевода компонента в состояние длинного свайпа\n // длинный свайп может быть отключен вообще или может быть недоступен если это сдвиг на проекцию\n const sumSize = isLeft ? leftButtonsSumSizeRef.current : rightButtonsSumSizeRef.current;\n if (useLongSwipe && width > sumSize + MIN_SWIPE_DISTANCE) {\n setLongState(isLeft ? LongState.Left : LongState.Right);\n stateRef.current.next = ButtonsState.Close;\n } else {\n setLongState(LongState.Off);\n }\n\n if (Math.abs(distance) > MAIN_AXIS_THRESHOLD_PX) {\n swipeContext?.onShown(id);\n }\n },\n [leftBlockApi, rightBlockApi, useLongSwipe, updateSwipeThreshold, id, swipeContext]\n );\n\n const handleSwipeMove: SwipeEventHandler = useCallback(\n (event: SwipeEvent) => {\n if (demoInProgress || swipeLockRef.current) {\n return;\n }\n // сдвиг вслед за пальцем, можем делать длинный свайп\n recalcButtonsSizes(event.distanceX);\n },\n [demoInProgress, recalcButtonsSizes]\n );\n\n const runSwipeAnimation = useCallback(() => {\n if (!swipeContainerRef.current) {\n return;\n }\n\n if (stateRef.current.next === ButtonsState.Close) {\n // свайп завершен, кнопки должны закрыться, потому что не выполнен минимальный размер раскрытия\n // сбрасываем ширину в 0\n if (leftButtonsRef.current) {\n leftButtonsRef.current.style.width = '0';\n }\n leftButtonsSizeRef.current = 0;\n if (rightButtonsRef.current) {\n rightButtonsRef.current.style.width = '0';\n }\n rigthButtonsSizeRef.current = 0;\n } else if (stateRef.current.next === ButtonsState.LeftOpen) {\n // выполнено условие раскрытия слева\n // раскрываем кнопки на ширину их контента, но не больше ширины контейнера\n const maxLeftSize = Math.min(swipeContainerWidth, leftButtonsSumSizeRef.current);\n if (leftButtonsRef.current) {\n leftButtonsRef.current.style.width = `${maxLeftSize}px`;\n }\n leftButtonsSizeRef.current = maxLeftSize;\n rigthButtonsSizeRef.current = 0;\n } else if (stateRef.current.next === ButtonsState.RightOpen) {\n // выполнено условие раскрытия справа\n // раскрываем кнопки на ширину их контента, но не больше ширины контейнера\n const maxRightSize = Math.min(swipeContainerWidth, rightButtonsSumSizeRef.current);\n if (rightButtonsRef.current) {\n rightButtonsRef.current.style.width = `${maxRightSize}px`;\n }\n rigthButtonsSizeRef.current = maxRightSize;\n leftButtonsSizeRef.current = 0;\n }\n stateRef.current.now = stateRef.current.next;\n }, [swipeContainerWidth]);\n\n const handleSwipeEnd: SwipeEventHandler = useCallback(\n (event: SwipeEvent) => {\n if (demoInProgress) {\n return;\n }\n\n onFinish?.();\n\n // если это длинный свайп, то триггерим клик на соответствующую кнопку, и закрываем блок кнопок\n // если не установлен флаг keepStateAfterLong\n if (longState !== LongState.Off) {\n const buttons = longState === LongState.Left ? leftButtons : rightButtons;\n const button = longState === LongState.Left ? buttons?.[0] : buttons?.[buttons.length - 1];\n button?.onClick();\n onResetDemo?.();\n swipeLockRef.current = !!button?.keepStateAfterLong;\n if (!button?.keepStateAfterLong) {\n animateToState(ButtonsState.Close, event.velocityX);\n }\n return;\n }\n\n // если это не длинный свайп, то анимируем к соответствующему состоянию\n // если открыт левый или правый блок, то анимируем в закрытое состояние\n // если закрыты оба блока, то анимируем к открытию стороны-кадидата\n const { now, candidate } = stateRef.current;\n animateToState(\n [ButtonsState.LeftOpen, ButtonsState.RightOpen].includes(now) ? ButtonsState.Close : candidate,\n event.velocityX\n );\n },\n [demoInProgress, longState, leftButtons, rightButtons, onFinish, onResetDemo, animateToState]\n );\n\n const handleSwipeCancel: SwipeEventHandler = useCallback(\n (event) => {\n animateToState(stateRef.current.now, event.velocityX);\n },\n [animateToState]\n );\n\n const swipeHandlers = useSwipe({\n thresholdXRef: swipeThresholdRef,\n onSwipeStart: handleSwipeStart,\n onSwipeMove: handleSwipeMove,\n onSwipeEnd: handleSwipeEnd,\n onSwipeCancel: handleSwipeCancel,\n });\n\n useEffect(() => {\n const swipeContainer = swipeContainerRef.current;\n if (!visible || !swipeContainer) {\n return void 0;\n }\n\n const preventScroll = (event: TouchEvent) => {\n if (Math.abs(prevDistance.current) > MAIN_AXIS_THRESHOLD_PX) {\n event.preventDefault();\n }\n };\n\n swipeContainer.addEventListener('touchmove', preventScroll, { passive: false });\n return () => swipeContainer.removeEventListener('touchmove', preventScroll);\n }, [visible]);\n\n const getButtonsFromSide = useCallback((side = stateRef.current.now) => {\n const buttons = side === ButtonsState.RightOpen ? rightButtonsRef.current : leftButtonsRef.current;\n const oppositeButtons = buttons === rightButtonsRef.current ? leftButtonsRef.current : rightButtonsRef.current;\n\n return { buttons, oppositeButtons };\n }, []);\n\n const unmountDemoEndHandler = useCallback(\n (event: TransitionEvent) => {\n if (event.propertyName !== 'width') {\n return;\n }\n\n setDemoInProgress(false);\n\n const isTwoSidedSwipe = !!rightButtonsRef.current && !!leftButtonsRef.current;\n const isLeft = isTwoSidedSwipe\n ? twoSidedDemoMode === 'right-to-left' || twoSidedDemoMode === 'left'\n : !!leftButtonsRef.current;\n const buttons = isLeft ? leftButtonsRef.current : rightButtonsRef.current;\n\n buttons?.removeEventListener('transitionend', unmountDemoEndHandler);\n\n fixedContainerRef.current?.style.removeProperty('--transition-duration');\n fixedContainerRef.current?.style.removeProperty('--transition-delay');\n\n onResetDemo?.();\n onFinishDemo?.();\n },\n [onFinishDemo, onResetDemo, twoSidedDemoMode]\n );\n\n const demoSideAppearHandler = useCallback(\n (event: TransitionEvent) => {\n if (event.propertyName !== 'width') {\n return;\n }\n\n const currentSide = stateRef.current.now;\n const { buttons, oppositeButtons } = getButtonsFromSide(currentSide);\n\n const appearedIsFirstOfSides =\n !!rightButtonsRef.current &&\n !!leftButtonsRef.current &&\n ((currentSide === ButtonsState.LeftOpen && twoSidedDemoMode === 'left-to-right') ||\n (currentSide === ButtonsState.RightOpen && twoSidedDemoMode === 'right-to-left'));\n\n buttons?.removeEventListener('transitionend', demoSideAppearHandler);\n\n if (fixedContainerRef.current) {\n fixedContainerRef.current.style.setProperty(\n '--transition-duration',\n `${appearedIsFirstOfSides ? demoAppearTime : demoDisappearTime}ms`\n );\n fixedContainerRef.current.style.setProperty('--transition-delay', `${demoIdleTime}ms`);\n }\n\n stateRef.current.next = ButtonsState.Close;\n stateRef.current.candidate = stateRef.current.next;\n runSwipeAnimation();\n\n if (appearedIsFirstOfSides) {\n stateRef.current.next =\n currentSide === ButtonsState.LeftOpen ? ButtonsState.RightOpen : ButtonsState.LeftOpen;\n stateRef.current.candidate = stateRef.current.next;\n\n runSwipeAnimation();\n\n const twiceSideTransitionHandler = () => {\n oppositeButtons?.removeEventListener('transitionstart', twiceSideTransitionHandler);\n\n if (oppositeButtons && contentRef.current) {\n const isRight = currentSide === ButtonsState.RightOpen;\n\n contentRef.current.style.transform = `translateX(${\n isRight ? leftButtonsSumSizeRef.current : -rightButtonsSumSizeRef.current\n }px)`;\n }\n };\n\n oppositeButtons?.addEventListener('transitionstart', twiceSideTransitionHandler);\n oppositeButtons?.addEventListener('transitionend', demoSideAppearHandler);\n } else {\n const startDestroyDemoHandler = () => {\n buttons?.removeEventListener('transitionstart', startDestroyDemoHandler);\n contentRef.current?.style.removeProperty('transform');\n };\n\n buttons?.addEventListener('transitionstart', startDestroyDemoHandler);\n buttons?.addEventListener('transitionend', unmountDemoEndHandler);\n }\n },\n [\n getButtonsFromSide,\n twoSidedDemoMode,\n runSwipeAnimation,\n demoAppearTime,\n demoDisappearTime,\n demoIdleTime,\n unmountDemoEndHandler,\n ]\n );\n\n const startDemo = useCallback(\n (side: ButtonsState.RightOpen | ButtonsState.LeftOpen) => {\n onResetDemo?.();\n onStartDemo?.();\n setDemoInProgress(true);\n\n stateRef.current.now = ButtonsState.Close;\n stateRef.current.next = side;\n stateRef.current.candidate = side;\n\n if (swipeContainerRef.current) {\n swipeContainerRef.current.style.justifyContent =\n side === ButtonsState.RightOpen ? 'flex-end' : 'flex-start';\n }\n\n if (fixedContainerRef.current) {\n fixedContainerRef.current.style.setProperty('--transition-duration', `${demoAppearTime}ms`);\n }\n\n setLongState(LongState.Off);\n setAnimateButtonsWidth(true);\n runSwipeAnimation();\n\n const { buttons } = getButtonsFromSide(side);\n buttons?.addEventListener('transitionend', demoSideAppearHandler);\n },\n [\n demoAppearTime,\n demoSideAppearHandler,\n getButtonsFromSide,\n runSwipeAnimation,\n onResetDemo,\n onStartDemo,\n setAnimateButtonsWidth,\n ]\n );\n\n useEffect(() => {\n if (\n demo &&\n !demoInProgress &&\n stateRef.current.now === ButtonsState.Close &&\n swipeContainerRef.current?.style.width\n ) {\n const isTwoSidedSwipe = Boolean(rightButtonsRef.current && leftButtonsRef.current);\n\n if (isTwoSidedSwipe) {\n startDemo(\n twoSidedDemoMode === 'right' || twoSidedDemoMode === 'right-to-left'\n ? ButtonsState.RightOpen\n : ButtonsState.LeftOpen\n );\n } else {\n startDemo(rightButtonsRef.current ? ButtonsState.RightOpen : ButtonsState.LeftOpen);\n }\n }\n\n if (!isMobile && demoInProgress) {\n setDemoInProgress(false);\n stateRef.current = {\n candidate: ButtonsState.Close,\n now: ButtonsState.Close,\n next: ButtonsState.Close,\n };\n }\n }, [demo, twoSidedDemoMode, startDemo, demoInProgress, isMobile, onResetDemo]);\n\n // подсчитываем реальный необходимый размер для кнопок\n // и назначаем проперти исходя из положения кнопки (последняя/не последняя)\n const handleButtonContentRef = useCallback(\n (side: 'left' | 'right', grow: boolean) => (ref: HTMLDivElement) => {\n // нужно чтобы посчитать размеры для каждой кнопки один раз\n if (sumRefs.current.includes(ref) || !ref) {\n return;\n }\n\n const width = ref?.offsetWidth ?? 0;\n if (!grow) {\n ref.style.maxWidth = `${width}px`;\n }\n sumRefs.current.push(ref);\n const widthWithGap = gap && width > 0 ? width + GAP_WIDTH : width;\n if (side === 'left') {\n leftButtonsSumSizeRef.current += widthWithGap;\n } else {\n rightButtonsSumSizeRef.current += widthWithGap;\n }\n },\n [gap]\n );\n\n const renderButtons = (\n buttons: SwipeButtonsArray,\n ref: MutableRefObject<HTMLDivElement | null>,\n side: 'left' | 'right'\n ) => {\n const isTwoSidedDemoInProgress = leftButtons && rightButtons && demoInProgress;\n return (\n <Layer layer={LayerName.Content}>\n <animated.div\n className={classNames(styles.buttons, {\n [styles.leftButtonsAnimation]:\n side === 'left' && twoSidedDemoMode === 'right-to-left' && isTwoSidedDemoInProgress,\n [styles.rightButtonsAnimation]:\n side === 'right' && twoSidedDemoMode === 'left-to-right' && isTwoSidedDemoInProgress,\n })}\n // \"длинная\" кнопка растягивается максимум на ширину контейнера (buttons)\n // чтобы не было видно пустоты между ней и контейнером\n // нужно устанавливать выравнивание в зависимости от стороны\n style={{\n ...(side === 'left' ? { justifyContent: 'flex-start', ...leftBlockStyles } : {}),\n ...(side === 'right' ? { justifyContent: 'flex-end', ...rightBlockStyles } : {}),\n }}\n ref={ref}\n data-qa={`swipe-buttons-${side}`}\n >\n {gap && side === 'right' && longState === LongState.Right && <div className={styles.gap} />}\n {buttons.map((item, index) => {\n if (!item) {\n return null;\n }\n const grow = side === 'left' ? index === 0 : index === buttons.length - 1;\n const hide =\n (side === 'left' && index !== 0 && longState === LongState.Left) ||\n (side === 'right' && index !== buttons.length - 1 && longState === LongState.Right);\n const Icon = item.icon;\n const iconProps = item.showLabel\n ? { 'aria-hidden': true, focusable: false }\n : { 'aria-label': item.label };\n return (\n <Fragment key={index}>\n {gap && side === 'right' && longState !== LongState.Right && (\n <div className={styles.gap} />\n )}\n <div\n className={classNames(styles.buttonWrapper, {\n [styles.buttonWrapperGrow]: grow,\n [styles.buttonWrapperHide]: hide,\n })}\n // это нужно чтобы анимировался длинный свайп.\n // Здесь должно быть значение максимально близкое к тому,\n // какой максимум может занимать одна кнопка, если кнопок больше 1\n style={grow ? { maxWidth: `${swipeContainerWidth}px` } : {}}\n >\n <button\n className={classNames(styles.button, {\n [styles.buttonGrow]: grow,\n [styles[`button_style-${item.style}`]]: item.style,\n })}\n onClick={() => {\n if (demoInProgress) {\n return;\n }\n if (item.closeOnAction) {\n animateToState(ButtonsState.Close, 0);\n }\n item.onClick();\n }}\n style={gap ? { borderRadius } : {}}\n data-qa={`swipe-button-${side}-${index}`}\n >\n <div\n className={styles.buttonContent}\n ref={handleButtonContentRef(side, grow)}\n data-qa={`swipe-button-content-${side}-${index}`}\n >\n <div className={styles.buttonContentColumn}>\n {Icon && (\n <div className={styles.iconWrapper}>\n <Icon {...iconProps} />\n </div>\n )}\n {item.showLabel && (\n <span className={styles.buttonLabel}>{item.label}</span>\n )}\n </div>\n </div>\n </button>\n </div>\n {gap && side === 'left' && <div className={styles.gap} />}\n </Fragment>\n );\n })}\n </animated.div>\n </Layer>\n );\n };\n\n if (!visible) {\n return null;\n }\n\n return (\n <div className={styles.fixedContainer} ref={fixedContainerRef} data-qa={dataQa ?? 'swipe-root'}>\n <div\n className={classNames(styles.swipeContainer)}\n ref={swipeContainerRef}\n {...swipeHandlers}\n data-qa=\"swipe-swipeable\"\n >\n {!!leftButtons?.length && renderButtons(leftButtons, leftButtonsRef, 'left')}\n <div ref={contentRef} className={styles.content}>\n {children}\n </div>\n {!!rightButtons?.length && renderButtons(rightButtons, rightButtonsRef, 'right')}\n </div>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
package/SwipeGroup.d.ts
ADDED
package/SwipeGroup.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useRef } from 'react';
|
|
4
|
+
import { SwipeContext } from './context.js';
|
|
5
|
+
|
|
6
|
+
const SwipeGroup = ({ children }) => {
|
|
7
|
+
const closeFuncsRef = useRef({});
|
|
8
|
+
const valueRef = useRef({
|
|
9
|
+
register: (id, closeFunc) => {
|
|
10
|
+
closeFuncsRef.current[id] = closeFunc;
|
|
11
|
+
},
|
|
12
|
+
onShown: (activeId) => {
|
|
13
|
+
Object.entries(closeFuncsRef.current)
|
|
14
|
+
.filter(([id]) => id !== activeId)
|
|
15
|
+
.forEach(([, closeFunc]) => closeFunc());
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
return jsx(SwipeContext.Provider, { value: valueRef.current, children: children });
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export { SwipeGroup };
|
|
22
|
+
//# sourceMappingURL=SwipeGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwipeGroup.js","sources":["../src/SwipeGroup.tsx"],"sourcesContent":["import { FC, PropsWithChildren, useRef } from 'react';\n\nimport { SwipeContext, SwipeContextProps } from '@hh.ru/magritte-ui-swipe/context';\n\nexport const SwipeGroup: FC<PropsWithChildren> = ({ children }) => {\n const closeFuncsRef = useRef<Record<string, VoidFunction>>({});\n\n const valueRef = useRef<SwipeContextProps>({\n register: (id, closeFunc) => {\n closeFuncsRef.current[id] = closeFunc;\n },\n onShown: (activeId) => {\n Object.entries(closeFuncsRef.current)\n .filter(([id]) => id !== activeId)\n .forEach(([, closeFunc]) => closeFunc());\n },\n });\n\n return <SwipeContext.Provider value={valueRef.current}>{children}</SwipeContext.Provider>;\n};\n"],"names":["_jsx"],"mappings":";;;;MAIa,UAAU,GAA0B,CAAC,EAAE,QAAQ,EAAE,KAAI;AAC9D,IAAA,MAAM,aAAa,GAAG,MAAM,CAA+B,EAAE,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,MAAM,CAAoB;AACvC,QAAA,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,KAAI;AACxB,YAAA,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;SACzC;AACD,QAAA,OAAO,EAAE,CAAC,QAAQ,KAAI;AAClB,YAAA,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC;iBAChC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,QAAQ,CAAC;AACjC,iBAAA,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;SAChD;AACJ,KAAA,CAAC,CAAC;AAEH,IAAA,OAAOA,GAAC,CAAA,YAAY,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAG,QAAA,EAAA,QAAQ,GAAyB,CAAC;AAC9F;;;;"}
|
package/context.d.ts
ADDED
package/context.js
ADDED
package/context.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sources":["../src/context.ts"],"sourcesContent":["import { createContext } from 'react';\n\nexport interface SwipeContextProps {\n register: (id: string, closeFunc: VoidFunction) => void;\n onShown: (activeId: string) => void;\n}\n\nexport const SwipeContext = createContext<SwipeContextProps | null>(null);\n"],"names":[],"mappings":";;MAOa,YAAY,GAAG,aAAa,CAA2B,IAAI;;;;"}
|