@vkontakte/vkui 5.9.2 → 5.9.4
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/dist/cjs/components/ActionSheet/ActionSheet.js +1 -1
- package/dist/cjs/components/ActionSheet/ActionSheet.js.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cjs/components/Header/Header.d.ts +3 -3
- package/dist/cjs/components/Header/Header.d.ts.map +1 -1
- package/dist/cjs/components/Header/Header.js +4 -5
- package/dist/cjs/components/Header/Header.js.map +1 -1
- package/dist/cjs/components/HorizontalScroll/HorizontalScroll.d.ts.map +1 -1
- package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js +4 -0
- package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/cjs/components/ModalRoot/ModalRoot.d.ts.map +1 -1
- package/dist/cjs/components/ModalRoot/ModalRoot.js +7 -1
- package/dist/cjs/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/cjs/components/PullToRefresh/PullToRefresh.d.ts.map +1 -1
- package/dist/cjs/components/PullToRefresh/PullToRefresh.js +35 -7
- package/dist/cjs/components/PullToRefresh/PullToRefresh.js.map +1 -1
- package/dist/cjs/components/Tappable/Tappable.d.ts.map +1 -1
- package/dist/cjs/components/Tappable/Tappable.js +1 -3
- package/dist/cjs/components/Tappable/Tappable.js.map +1 -1
- package/dist/cjs/components/Typography/Caption/Caption.d.ts +2 -0
- package/dist/cjs/components/Typography/Caption/Caption.d.ts.map +1 -1
- package/dist/cjs/components/Typography/Caption/Caption.js.map +1 -1
- package/dist/cjs/components/Typography/Footnote/Footnote.d.ts +2 -0
- package/dist/cjs/components/Typography/Footnote/Footnote.d.ts.map +1 -1
- package/dist/cjs/components/Typography/Footnote/Footnote.js.map +1 -1
- package/dist/cjs/components/Typography/Headline/Headline.d.ts +2 -0
- package/dist/cjs/components/Typography/Headline/Headline.d.ts.map +1 -1
- package/dist/cjs/components/Typography/Headline/Headline.js.map +1 -1
- package/dist/cjs/components/Typography/Paragraph/Paragraph.d.ts +2 -0
- package/dist/cjs/components/Typography/Paragraph/Paragraph.d.ts.map +1 -1
- package/dist/cjs/components/Typography/Paragraph/Paragraph.js.map +1 -1
- package/dist/cjs/components/Typography/Subhead/Subhead.d.ts +2 -0
- package/dist/cjs/components/Typography/Subhead/Subhead.d.ts.map +1 -1
- package/dist/cjs/components/Typography/Subhead/Subhead.js.map +1 -1
- package/dist/cjs/components/Typography/Text/Text.d.ts +2 -0
- package/dist/cjs/components/Typography/Text/Text.d.ts.map +1 -1
- package/dist/cjs/components/Typography/Text/Text.js.map +1 -1
- package/dist/cjs/components/Typography/Title/Title.d.ts +2 -0
- package/dist/cjs/components/Typography/Title/Title.d.ts.map +1 -1
- package/dist/cjs/components/Typography/Title/Title.js.map +1 -1
- package/dist/components/ActionSheet/ActionSheet.js +1 -1
- package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.d.ts +1 -1
- package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/Header/Header.d.ts +3 -3
- package/dist/components/Header/Header.d.ts.map +1 -1
- package/dist/components/Header/Header.js +4 -5
- package/dist/components/Header/Header.js.map +1 -1
- package/dist/components/HorizontalScroll/HorizontalScroll.d.ts.map +1 -1
- package/dist/components/HorizontalScroll/HorizontalScroll.js +4 -0
- package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/components/ModalRoot/ModalRoot.d.ts.map +1 -1
- package/dist/components/ModalRoot/ModalRoot.js +7 -1
- package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/components/PullToRefresh/PullToRefresh.d.ts.map +1 -1
- package/dist/components/PullToRefresh/PullToRefresh.js +35 -7
- package/dist/components/PullToRefresh/PullToRefresh.js.map +1 -1
- package/dist/components/Tappable/Tappable.d.ts.map +1 -1
- package/dist/components/Tappable/Tappable.js +1 -3
- package/dist/components/Tappable/Tappable.js.map +1 -1
- package/dist/components/Typography/Caption/Caption.d.ts +2 -0
- package/dist/components/Typography/Caption/Caption.d.ts.map +1 -1
- package/dist/components/Typography/Caption/Caption.js +2 -0
- package/dist/components/Typography/Caption/Caption.js.map +1 -1
- package/dist/components/Typography/Footnote/Footnote.d.ts +2 -0
- package/dist/components/Typography/Footnote/Footnote.d.ts.map +1 -1
- package/dist/components/Typography/Footnote/Footnote.js +2 -0
- package/dist/components/Typography/Footnote/Footnote.js.map +1 -1
- package/dist/components/Typography/Headline/Headline.d.ts +2 -0
- package/dist/components/Typography/Headline/Headline.d.ts.map +1 -1
- package/dist/components/Typography/Headline/Headline.js +2 -0
- package/dist/components/Typography/Headline/Headline.js.map +1 -1
- package/dist/components/Typography/Paragraph/Paragraph.d.ts +2 -0
- package/dist/components/Typography/Paragraph/Paragraph.d.ts.map +1 -1
- package/dist/components/Typography/Paragraph/Paragraph.js +2 -0
- package/dist/components/Typography/Paragraph/Paragraph.js.map +1 -1
- package/dist/components/Typography/Subhead/Subhead.d.ts +2 -0
- package/dist/components/Typography/Subhead/Subhead.d.ts.map +1 -1
- package/dist/components/Typography/Subhead/Subhead.js +2 -0
- package/dist/components/Typography/Subhead/Subhead.js.map +1 -1
- package/dist/components/Typography/Text/Text.d.ts +2 -0
- package/dist/components/Typography/Text/Text.d.ts.map +1 -1
- package/dist/components/Typography/Text/Text.js +2 -0
- package/dist/components/Typography/Text/Text.js.map +1 -1
- package/dist/components/Typography/Title/Title.d.ts +2 -0
- package/dist/components/Typography/Title/Title.d.ts.map +1 -1
- package/dist/components/Typography/Title/Title.js +2 -0
- package/dist/components/Typography/Title/Title.js.map +1 -1
- package/dist/components.css +2 -2
- package/dist/components.css.map +1 -1
- package/dist/components.js.tmp +1557 -1538
- package/dist/cssm/components/ActionSheet/ActionSheet.js +1 -1
- package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
- package/dist/cssm/components/Alert/Alert.module.css +5 -0
- package/dist/cssm/components/CustomSelect/CustomSelect.d.ts +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/Header/Header.d.ts +3 -3
- package/dist/cssm/components/Header/Header.d.ts.map +1 -1
- package/dist/cssm/components/Header/Header.js +2 -3
- package/dist/cssm/components/Header/Header.js.map +1 -1
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.d.ts.map +1 -1
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +4 -0
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/cssm/components/ModalRoot/ModalRoot.d.ts.map +1 -1
- package/dist/cssm/components/ModalRoot/ModalRoot.js +7 -1
- package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/cssm/components/PullToRefresh/PullToRefresh.d.ts.map +1 -1
- package/dist/cssm/components/PullToRefresh/PullToRefresh.js +35 -7
- package/dist/cssm/components/PullToRefresh/PullToRefresh.js.map +1 -1
- package/dist/cssm/components/Tappable/Tappable.d.ts.map +1 -1
- package/dist/cssm/components/Tappable/Tappable.js +1 -3
- package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
- package/dist/cssm/components/Typography/Caption/Caption.d.ts +2 -0
- package/dist/cssm/components/Typography/Caption/Caption.d.ts.map +1 -1
- package/dist/cssm/components/Typography/Caption/Caption.js +2 -0
- package/dist/cssm/components/Typography/Caption/Caption.js.map +1 -1
- package/dist/cssm/components/Typography/Footnote/Footnote.d.ts +2 -0
- package/dist/cssm/components/Typography/Footnote/Footnote.d.ts.map +1 -1
- package/dist/cssm/components/Typography/Footnote/Footnote.js +2 -0
- package/dist/cssm/components/Typography/Footnote/Footnote.js.map +1 -1
- package/dist/cssm/components/Typography/Headline/Headline.d.ts +2 -0
- package/dist/cssm/components/Typography/Headline/Headline.d.ts.map +1 -1
- package/dist/cssm/components/Typography/Headline/Headline.js +2 -0
- package/dist/cssm/components/Typography/Headline/Headline.js.map +1 -1
- package/dist/cssm/components/Typography/Paragraph/Paragraph.d.ts +2 -0
- package/dist/cssm/components/Typography/Paragraph/Paragraph.d.ts.map +1 -1
- package/dist/cssm/components/Typography/Paragraph/Paragraph.js +2 -0
- package/dist/cssm/components/Typography/Paragraph/Paragraph.js.map +1 -1
- package/dist/cssm/components/Typography/Subhead/Subhead.d.ts +2 -0
- package/dist/cssm/components/Typography/Subhead/Subhead.d.ts.map +1 -1
- package/dist/cssm/components/Typography/Subhead/Subhead.js +2 -0
- package/dist/cssm/components/Typography/Subhead/Subhead.js.map +1 -1
- package/dist/cssm/components/Typography/Text/Text.d.ts +2 -0
- package/dist/cssm/components/Typography/Text/Text.d.ts.map +1 -1
- package/dist/cssm/components/Typography/Text/Text.js +2 -0
- package/dist/cssm/components/Typography/Text/Text.js.map +1 -1
- package/dist/cssm/components/Typography/Title/Title.d.ts +2 -0
- package/dist/cssm/components/Typography/Title/Title.d.ts.map +1 -1
- package/dist/cssm/components/Typography/Title/Title.js +2 -0
- package/dist/cssm/components/Typography/Title/Title.js.map +1 -1
- package/dist/cssm/styles/common.css +5 -0
- package/dist/vkui.css +2 -2
- package/dist/vkui.css.map +1 -1
- package/dist/vkui.js.tmp +1557 -1538
- package/package.json +1 -1
- package/src/components/ActionSheet/ActionSheet.tsx +2 -2
- package/src/components/Alert/Alert.module.css +5 -0
- package/src/components/CustomSelect/CustomSelect.tsx +1 -1
- package/src/components/Header/Header.tsx +3 -3
- package/src/components/HorizontalScroll/HorizontalScroll.tsx +4 -0
- package/src/components/ModalRoot/ModalRoot.tsx +9 -1
- package/src/components/PullToRefresh/PullToRefresh.tsx +43 -9
- package/src/components/Tappable/Tappable.tsx +1 -3
- package/src/components/Typography/Caption/Caption.tsx +2 -0
- package/src/components/Typography/Footnote/Footnote.tsx +2 -0
- package/src/components/Typography/Headline/Headline.tsx +2 -0
- package/src/components/Typography/Paragraph/Paragraph.tsx +2 -0
- package/src/components/Typography/Subhead/Subhead.tsx +2 -0
- package/src/components/Typography/Text/Text.tsx +2 -0
- package/src/components/Typography/Title/Title.tsx +2 -0
- package/src/styles/common.css +6 -0
- package/dist/cjs/hooks/useAdaptivityHasHover.d.ts +0 -9
- package/dist/cjs/hooks/useAdaptivityHasHover.d.ts.map +0 -1
- package/dist/cjs/hooks/useAdaptivityHasHover.js +0 -28
- package/dist/cjs/hooks/useAdaptivityHasHover.js.map +0 -1
- package/dist/cssm/hooks/useAdaptivityHasHover.d.ts +0 -9
- package/dist/cssm/hooks/useAdaptivityHasHover.d.ts.map +0 -1
- package/dist/cssm/hooks/useAdaptivityHasHover.js +0 -16
- package/dist/cssm/hooks/useAdaptivityHasHover.js.map +0 -1
- package/dist/hooks/useAdaptivityHasHover.d.ts +0 -9
- package/dist/hooks/useAdaptivityHasHover.d.ts.map +0 -1
- package/dist/hooks/useAdaptivityHasHover.js +0 -17
- package/dist/hooks/useAdaptivityHasHover.js.map +0 -1
- package/src/hooks/useAdaptivityHasHover.ts +0 -26
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ModalRoot/ModalRoot.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { withContext } from '../../hoc/withContext';\nimport { withPlatform } from '../../hoc/withPlatform';\nimport { DOMProps, withDOM } from '../../lib/dom';\nimport { getNavId } from '../../lib/getNavId';\nimport { Platform } from '../../lib/platform';\nimport { setTransformStyle } from '../../lib/styles';\nimport { transitionEvent } from '../../lib/supportEvents';\nimport { rubber } from '../../lib/touch';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { ConfigProviderContext } from '../ConfigProvider/ConfigProviderContext';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { ModalRootContext, ModalRootContextInterface } from './ModalRootContext';\nimport { MODAL_PAGE_DEFAULT_PERCENT_HEIGHT } from './constants';\nimport { ModalRootWithDOMProps, ModalsStateEntry, ModalType, TranslateRange } from './types';\nimport { ModalTransitionProps, withModalManager } from './useModalManager';\nimport styles from './ModalRoot.module.css';\n\nconst warn = warnOnce('ModalRoot');\n\nfunction numberInRange(number: number, range: TranslateRange | undefined) {\n if (!range) {\n return false;\n }\n return number >= range[0] && number <= range[1];\n}\n\nfunction rangeTranslate(number: number) {\n return clamp(number, 0, 98);\n}\n\ninterface ModalRootState {\n touchDown?: boolean;\n dragging?: boolean;\n modalOpenedLog: string[];\n}\n\nclass ModalRootTouchComponent extends React.Component<\n ModalRootWithDOMProps & DOMProps & ModalTransitionProps,\n ModalRootState\n> {\n constructor(props: ModalRootWithDOMProps & ModalTransitionProps) {\n super(props);\n this.state = {\n touchDown: false,\n dragging: false,\n modalOpenedLog: [],\n };\n\n this.maskElementRef = React.createRef();\n\n this.modalRootContext = {\n updateModalHeight: this.updateModalHeight,\n registerModal: ({ id, ...data }) => Object.assign(this.props.getModalState(id) ?? {}, data),\n onClose: () => this.props.onExit(),\n isInsideModal: true,\n };\n\n this.frameIds = {};\n }\n\n private documentScrolling = false;\n private readonly maskElementRef: React.RefObject<HTMLDivElement>;\n private readonly viewportRef = React.createRef<HTMLDivElement>();\n private maskAnimationFrame: number | undefined = undefined;\n private readonly modalRootContext: ModalRootContextInterface;\n private readonly frameIds: {\n [index: string]: number;\n };\n private restoreFocusTo: HTMLElement | undefined | null = undefined;\n\n get timeout(): number {\n return this.props.platform === Platform.IOS ? 400 : 320;\n }\n\n get document(): Document {\n return this.props.document as Document;\n }\n\n get window(): Window {\n return this.props.window as Window;\n }\n\n getModals() {\n return React.Children.toArray(this.props.children) as React.ReactElement[];\n }\n\n componentDidMount() {\n // Отслеживаем изменение размеров viewport\n this.window?.addEventListener('resize', this.updateModalHeight, false);\n }\n\n componentWillUnmount() {\n this.toggleDocumentScrolling(true);\n this.window.removeEventListener('resize', this.updateModalHeight, false);\n }\n\n componentDidUpdate(prevProps: ModalRootWithDOMProps & ModalTransitionProps) {\n // transition phase 2: animate exiting modal\n if (this.props.exitingModal && this.props.exitingModal !== prevProps.exitingModal) {\n this.closeModal(this.props.exitingModal);\n }\n\n // transition phase 3: animate entering modal\n if (this.props.enteringModal && this.props.enteringModal !== prevProps.enteringModal) {\n const { enteringModal } = this.props;\n const enteringState = this.props.getModalState(enteringModal);\n this.props.onEnter();\n this.waitTransitionFinish(enteringState, () => {\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = '';\n }\n this.props.onEntered(enteringModal);\n });\n\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = this.props.delayEnter\n ? `${this.timeout}ms`\n : '';\n this.animateTranslate(enteringState, enteringState.translateY);\n this.setMaskOpacity(enteringState, 1);\n }\n }\n\n // focus restoration\n if (this.props.activeModal && !prevProps.activeModal) {\n this.restoreFocusTo = this.document.activeElement as HTMLElement;\n }\n if (!this.props.activeModal && !this.props.exitingModal && this.restoreFocusTo) {\n this.restoreFocusTo.focus();\n this.restoreFocusTo = null;\n }\n\n this.toggleDocumentScrolling(!this.props.activeModal && !this.props.exitingModal);\n }\n\n /* Отключает скролл документа */\n toggleDocumentScrolling(enabled: boolean) {\n if (this.documentScrolling === enabled) {\n return;\n }\n this.documentScrolling = enabled;\n\n if (enabled) {\n // Здесь нужен последний аргумент с такими же параметрами, потому что\n // некоторые браузеры на странных вендорах типа Meizu не удаляют обработчик.\n // https://github.com/VKCOM/VKUI/issues/444\n this.window.removeEventListener('touchmove', this.preventTouch, {\n // @ts-expect-error: TS2769 В интерфейсе EventListenerOptions нет поля passive\n passive: false,\n });\n } else {\n this.window.addEventListener('touchmove', this.preventTouch, {\n passive: false,\n });\n }\n }\n\n preventTouch = (event: any) => {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n return false;\n };\n\n checkPageContentHeight() {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE && modalState?.modalElement) {\n const prevModalState = { ...modalState };\n initPageModal(modalState);\n const currentModalState = { ...modalState };\n\n let needAnimate = false;\n\n if (prevModalState.expandable === currentModalState.expandable) {\n if (prevModalState.translateYFrom !== currentModalState.translateYFrom) {\n needAnimate = true;\n }\n } else {\n needAnimate = true;\n }\n\n if (needAnimate) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n }\n }\n\n updateModalHeight = () => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState && modalState.type === ModalType.PAGE) {\n if (this.props.enteringModal) {\n this.waitTransitionFinish(modalState, () => {\n requestAnimationFrame(() => this.checkPageContentHeight());\n });\n } else {\n requestAnimationFrame(() => this.checkPageContentHeight());\n }\n }\n };\n\n closeModal(id: string) {\n // Сбрасываем состояния, которые могут помешать закрытию модального окна\n this.setState({ touchDown: false });\n\n const prevModalState = this.props.getModalState(id);\n\n if (!prevModalState) {\n id && warn(`closeActiveModal: модальное окно (страница) ${id} не существует`, 'error');\n return;\n }\n if (!this.state.modalOpenedLog.length) {\n this.setState((prevState) => ({\n modalOpenedLog: [...prevState.modalOpenedLog, id],\n }));\n }\n const nextModalState = this.props.getModalState(this.props.activeModal);\n const nextIsPage = !!nextModalState && nextModalState.type === ModalType.PAGE;\n\n const prevIsPage = !!prevModalState && prevModalState.type === ModalType.PAGE;\n this.waitTransitionFinish(prevModalState, () => this.props.onExited(id));\n const exitTranslate =\n prevIsPage &&\n nextIsPage &&\n (prevModalState.translateY ?? 0) <= (nextModalState?.translateYFrom ?? 0) &&\n !this.props.isBack\n ? (nextModalState?.translateYFrom ?? 0) + 10\n : 100;\n this.animateTranslate(prevModalState, exitTranslate);\n\n if (!nextModalState) {\n // NOTE: was only for clean exit\n this.setMaskOpacity(prevModalState, 0);\n this.setState({ modalOpenedLog: [] });\n prevModalState.translateY = undefined;\n } else if (nextModalState.id && !this.state.modalOpenedLog.includes(nextModalState.id)) {\n nextModalState.translateY = undefined;\n this.setState((prevState) => ({\n modalOpenedLog: [...prevState.modalOpenedLog, nextModalState.id!],\n }));\n }\n }\n\n onTouchMove = (e: TouchEvent) => {\n if (this.props.exitingModal) {\n return;\n }\n const modalState = this.props.getModalState(this.props.activeModal);\n if (!modalState) {\n return;\n }\n\n if (modalState.type === ModalType.PAGE) {\n return this.onPageTouchMove(e, modalState);\n }\n\n if (modalState.type === ModalType.CARD) {\n return this.onCardTouchMove(e, modalState);\n }\n };\n\n onPageTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { shiftY, originalEvent } = event;\n const target = originalEvent.target as HTMLElement;\n\n if (!event.isY) {\n if (this.viewportRef.current?.contains(target)) {\n originalEvent.preventDefault();\n }\n return;\n }\n\n if (!modalState.innerElement?.contains(target)) {\n return originalEvent.preventDefault();\n }\n\n originalEvent.stopPropagation();\n\n const { expandable, contentScrolled, collapsed, expanded } = modalState;\n\n if (!this.state.touchDown) {\n modalState.touchStartContentScrollTop = modalState.contentElement?.scrollTop ?? 0;\n this.setState({ touchDown: true });\n }\n\n if (contentScrolled) {\n return;\n }\n\n if (modalState.touchMovePositive === null) {\n modalState.touchMovePositive = shiftY > 0;\n }\n\n if (\n !modalState.expandable ||\n collapsed ||\n (expanded && modalState.touchMovePositive && modalState.touchStartContentScrollTop === 0) ||\n modalState.headerElement?.contains(target)\n ) {\n originalEvent.preventDefault();\n\n if ((!expandable && shiftY < 0) || !this.window) {\n return;\n }\n\n !this.state.dragging && this.setState({ dragging: true });\n\n const shiftYPercent = (shiftY / this.window.innerHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 0.8, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = rangeTranslate((modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onCardTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { originalEvent, shiftY } = event;\n const target = originalEvent.target as HTMLElement;\n if (modalState.innerElement?.contains(target)) {\n if (!this.state.touchDown) {\n this.setState({ touchDown: true, dragging: true });\n }\n\n const shiftYPercent = (shiftY / modalState.innerElement.offsetHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 1.2, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = Math.max(0, (modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onTouchEnd = (e: TouchEvent) => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE) {\n return this.onPageTouchEnd(e, modalState);\n }\n\n if (modalState?.type === ModalType.CARD) {\n return this.onCardTouchEnd(e, modalState);\n }\n };\n\n onPageTouchEnd(event: TouchEvent, modalState: ModalsStateEntry) {\n const { startY, shiftY } = event;\n\n modalState.contentScrolled = false;\n modalState.touchMovePositive = null;\n\n let setStateCallback;\n\n if (this.state.dragging && this.window) {\n const shiftYEndPercent = ((startY + shiftY) / this.window.innerHeight) * 100;\n\n let translateY = modalState.translateYCurrent ?? 0;\n const expectTranslateY =\n (translateY / event.duration) *\n 240 *\n 0.6 *\n ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = rangeTranslate(translateY + expectTranslateY);\n\n if (modalState.settlingHeight !== 100) {\n if (numberInRange(translateY, modalState.expandedRange)) {\n translateY = modalState.expandedRange?.[0] ?? 0;\n } else if (numberInRange(translateY, modalState.collapsedRange)) {\n translateY = modalState.translateYFrom ?? 0;\n } else if (numberInRange(translateY, modalState.hiddenRange)) {\n translateY = 100;\n } else {\n translateY = modalState.translateYFrom ?? 0;\n }\n } else {\n if (numberInRange(translateY, [0, 25])) {\n translateY = 0;\n } else {\n translateY = 100;\n }\n }\n\n if (translateY !== 100 && shiftYEndPercent >= 75) {\n translateY = 100;\n }\n\n modalState.translateY = translateY;\n modalState.translateYCurrent = translateY;\n modalState.collapsed = numberInRange(translateY, modalState.collapsedRange);\n modalState.expanded = translateY === 0;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onCardTouchEnd({ duration }: TouchEvent, modalState: ModalsStateEntry) {\n let setStateCallback;\n\n if (this.state.dragging) {\n let translateY = modalState.translateYCurrent ?? 0;\n\n const expectTranslateY =\n (translateY / duration) * 240 * 0.6 * ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = Math.max(0, translateY + expectTranslateY);\n\n if (translateY >= 30) {\n translateY = 100;\n } else {\n translateY = 0;\n }\n\n modalState.translateY = translateY;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onScroll = (e: React.SyntheticEvent) => {\n const activeModal = this.props.activeModal;\n\n const target = e.target as HTMLElement;\n\n if (!activeModal) {\n return;\n }\n const modalState = this.props.getModalState(activeModal);\n if (modalState?.type === ModalType.PAGE && modalState?.contentElement?.contains(target)) {\n modalState.contentScrolled = true;\n\n if (modalState.contentScrollStopTimeout) {\n clearTimeout(modalState.contentScrollStopTimeout);\n }\n\n modalState.contentScrollStopTimeout = setTimeout(() => {\n if (modalState.contentScrolled) {\n modalState.contentScrolled = false;\n }\n }, 250);\n }\n };\n\n waitTransitionFinish(modalState: ModalsStateEntry | undefined, eventHandler: () => void) {\n if (transitionEvent.supported) {\n const onceHandler = () => {\n modalState?.innerElement?.removeEventListener(transitionEvent.name as string, onceHandler);\n eventHandler();\n };\n\n modalState?.innerElement?.addEventListener(transitionEvent.name as string, onceHandler);\n } else {\n setTimeout(eventHandler, this.timeout);\n }\n }\n\n /**\n * Анимирует сдвиг модалки\n *\n * @param {ModalsStateEntry} modalState\n * @param {number} percent Процент сдвига: 0 – полностью открыта, 100 – полностью закрыта\n */\n animateTranslate(modalState: ModalsStateEntry, percent: number | undefined) {\n const frameId = `animateTranslateFrame${modalState.id}`;\n\n cancelAnimationFrame(this.frameIds[frameId]);\n\n this.frameIds[frameId] = requestAnimationFrame(() => {\n setTransformStyle(modalState.innerElement, `translate3d(0, ${percent}%, 0)`);\n });\n }\n\n /* Устанавливает прозрачность для полупрозрачной подложки */\n setMaskOpacity(modalState: ModalsStateEntry, forceOpacity: number | null = null) {\n if (forceOpacity === null && this.props.history?.[0] !== modalState.id) {\n return;\n }\n if (this.maskAnimationFrame) {\n cancelAnimationFrame(this.maskAnimationFrame);\n }\n this.maskAnimationFrame = requestAnimationFrame(() => {\n if (this.maskElementRef.current) {\n const { translateY = 0, translateYCurrent = 0 } = modalState;\n\n const opacity =\n forceOpacity === null\n ? 1 - (translateYCurrent - translateY) / (100 - translateY) || 0\n : forceOpacity;\n this.maskElementRef.current.style.opacity = clamp(opacity, 0, 100).toString();\n this.maskElementRef.current.style.transitionDelay =\n opacity && this.props.delayEnter ? `${this.timeout}ms` : '';\n }\n });\n }\n\n render() {\n const { activeModal, exitingModal, enteringModal } = this.props;\n const { touchDown, dragging } = this.state;\n\n if (!activeModal && !exitingModal) {\n return null;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <ModalRootContext.Provider value={this.modalRootContext}>\n <Touch\n className={classNames(\n styles['ModalRoot'],\n this.props.configProvider?.hasCustomPanelHeaderAfter &&\n styles['ModalRoot--hasCustomPanelHeaderAfterSlot'],\n touchDown &&\n classNames(styles['ModalRoot--touched'], 'vkuiInternalModalRoot--touched'),\n !!(enteringModal || exitingModal) &&\n classNames(styles['ModalRoot--switching'], 'vkuiInternalModalRoot--switching'),\n )}\n onMove={this.onTouchMove}\n onEnd={this.onTouchEnd}\n onScroll={this.onScroll}\n >\n <div\n className={styles['ModalRoot__mask']}\n onClick={this.props.onExit}\n ref={this.maskElementRef}\n />\n <div className={styles['ModalRoot__viewport']} ref={this.viewportRef}>\n {this.getModals().map((Modal) => {\n const modalId = getNavId(Modal.props, warn);\n const _modalState = this.props.getModalState(modalId);\n if ((modalId !== activeModal && modalId !== exitingModal) || !_modalState) {\n return null;\n }\n const modalState = { ..._modalState };\n\n const isPage = modalState.type === ModalType.PAGE;\n const key = `modal-${modalId}`;\n\n return (\n <FocusTrap\n key={key}\n getRootRef={(e) => {\n const modalState = this.props.getModalState(modalId);\n if (modalState) {\n modalState.modalElement = e;\n }\n }}\n onClose={this.props.onExit}\n timeout={this.timeout}\n className={classNames(\n styles['ModalRoot__modal'],\n\n dragging && 'vkuiInternalModalRoot__modal--dragging',\n\n isPage && modalState.expandable && 'vkuiInternalModalRoot__modal--expandable',\n isPage && modalState.collapsed && 'vkuiInternalModalRoot__modal--collapsed',\n )}\n restoreFocus={false}\n >\n {Modal}\n </FocusTrap>\n );\n })}\n </div>\n </Touch>\n </ModalRootContext.Provider>\n </TouchRootContext.Provider>\n );\n }\n}\n\nexport const ModalRootTouch = withContext(\n withPlatform(\n withDOM<ModalRootWithDOMProps>(withModalManager(initModal)(ModalRootTouchComponent)),\n ),\n ConfigProviderContext,\n 'configProvider',\n);\n\n/**\n * Инициализирует модалку перед анимацией открытия\n */\nfunction initModal(modalState: ModalsStateEntry) {\n switch (modalState.type) {\n case ModalType.PAGE:\n modalState.settlingHeight = modalState.settlingHeight || MODAL_PAGE_DEFAULT_PERCENT_HEIGHT;\n return initPageModal(modalState);\n case ModalType.CARD:\n return initCardModal(modalState);\n default:\n process.env.NODE_ENV === 'development' &&\n warn(`initActiveModal: modalState.type=\"${modalState.type}\" не поддерживается`, 'error');\n }\n}\n\nfunction initPageModal(modalState: ModalsStateEntry) {\n const { contentElement, bottomInset } = modalState;\n const contentElementHeight = (contentElement?.firstElementChild as HTMLElement).scrollHeight;\n const bottomInsetHeight = bottomInset?.offsetHeight || 0;\n const contentHeight = contentElementHeight + bottomInsetHeight;\n let prevTranslateY = modalState.translateY;\n\n modalState.expandable =\n contentHeight > (contentElement?.clientHeight ?? 0) ||\n modalState.settlingHeight === 100 ||\n modalState.expanded;\n\n let collapsed = false;\n let expanded = false;\n let translateYFrom;\n let translateY;\n let expandedRange: TranslateRange;\n let collapsedRange: TranslateRange | undefined;\n let hiddenRange: TranslateRange;\n\n const hasCollapsedState = Boolean(modalState.expandable && modalState.settlingHeight !== 100);\n if (modalState.expandable) {\n translateYFrom = 100 - (modalState.settlingHeight ?? 0);\n\n const shiftHalf = translateYFrom / 2;\n const visiblePart = 100 - translateYFrom;\n\n expandedRange = [0, shiftHalf];\n collapsedRange = hasCollapsedState ? [shiftHalf, translateYFrom + visiblePart / 4] : undefined;\n hiddenRange = [translateYFrom + visiblePart / 4, 100];\n\n collapsed = hasCollapsedState && translateYFrom > 0;\n expanded = translateYFrom <= 0;\n translateY = translateYFrom;\n } else {\n const headerHeight = modalState.headerElement?.offsetHeight ?? 0;\n const height = contentHeight + headerHeight;\n\n translateYFrom =\n 100 - (height / (modalState.innerElement?.parentElement?.offsetHeight ?? 0)) * 100;\n translateY = translateYFrom;\n\n expandedRange = [translateY, translateY + 25];\n collapsedRange = undefined;\n hiddenRange = [translateY + 25, translateY + 100];\n }\n\n // Если модалка может открываться на весь экран, и новый сдвиг больше предыдущего, то откроем её на весь экран\n if (\n (modalState.expandable && translateY > (prevTranslateY ?? 100)) ||\n modalState.settlingHeight === 100\n ) {\n translateY = 0;\n }\n\n // Если модалка уже раскрыта обновляем состояния\n if (translateY === 0) {\n expanded = true;\n collapsed = false;\n }\n\n modalState.expandedRange = expandedRange;\n modalState.collapsedRange = collapsedRange;\n modalState.hiddenRange = hiddenRange;\n modalState.translateY = translateY;\n modalState.translateYFrom = translateYFrom;\n modalState.collapsed = collapsed;\n modalState.expanded = expanded;\n}\n\nfunction initCardModal(modalState: ModalsStateEntry) {\n modalState.translateY = 0;\n}\n"],"names":["React","classNames","clamp","withContext","withPlatform","withDOM","getNavId","Platform","setTransformStyle","transitionEvent","rubber","warnOnce","ConfigProviderContext","FocusTrap","Touch","TouchRootContext","ModalRootContext","MODAL_PAGE_DEFAULT_PERCENT_HEIGHT","ModalType","withModalManager","styles","warn","numberInRange","number","range","rangeTranslate","ModalRootTouchComponent","Component","constructor","props","state","touchDown","dragging","modalOpenedLog","maskElementRef","createRef","modalRootContext","updateModalHeight","registerModal","id","data","Object","assign","getModalState","onClose","onExit","isInsideModal","frameIds","documentScrolling","viewportRef","maskAnimationFrame","undefined","restoreFocusTo","timeout","platform","IOS","document","window","getModals","Children","toArray","children","componentDidMount","addEventListener","componentWillUnmount","toggleDocumentScrolling","removeEventListener","componentDidUpdate","prevProps","exitingModal","closeModal","enteringModal","enteringState","onEnter","waitTransitionFinish","innerElement","style","transitionDelay","onEntered","delayEnter","animateTranslate","translateY","setMaskOpacity","activeModal","activeElement","focus","enabled","preventTouch","passive","event","originalEvent","preventDefault","checkPageContentHeight","modalState","type","PAGE","modalElement","prevModalState","initPageModal","currentModalState","needAnimate","expandable","translateYFrom","requestAnimationFrame","setState","length","prevState","nextModalState","nextIsPage","prevIsPage","onExited","exitTranslate","isBack","includes","onTouchMove","e","onPageTouchMove","CARD","onCardTouchMove","shiftY","target","isY","current","contains","stopPropagation","contentScrolled","collapsed","expanded","touchStartContentScrollTop","contentElement","scrollTop","touchMovePositive","headerElement","shiftYPercent","innerHeight","shiftYCurrent","touchShiftYPercent","translateYCurrent","offsetHeight","Math","max","onTouchEnd","onPageTouchEnd","onCardTouchEnd","startY","setStateCallback","shiftYEndPercent","expectTranslateY","duration","settlingHeight","expandedRange","collapsedRange","hiddenRange","hidden","onScroll","contentScrollStopTimeout","clearTimeout","setTimeout","eventHandler","supported","onceHandler","name","percent","frameId","cancelAnimationFrame","forceOpacity","history","opacity","toString","render","Provider","value","className","configProvider","hasCustomPanelHeaderAfter","onMove","onEnd","div","onClick","ref","map","Modal","modalId","_modalState","isPage","key","getRootRef","restoreFocus","ModalRootTouch","initModal","initCardModal","process","env","NODE_ENV","bottomInset","contentElementHeight","firstElementChild","scrollHeight","bottomInsetHeight","contentHeight","prevTranslateY","clientHeight","hasCollapsedState","Boolean","shiftHalf","visiblePart","headerHeight","height","parentElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ModalRoot/ModalRoot.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { withContext } from '../../hoc/withContext';\nimport { withPlatform } from '../../hoc/withPlatform';\nimport { DOMProps, withDOM } from '../../lib/dom';\nimport { getNavId } from '../../lib/getNavId';\nimport { Platform } from '../../lib/platform';\nimport { setTransformStyle } from '../../lib/styles';\nimport { transitionEvent } from '../../lib/supportEvents';\nimport { rubber } from '../../lib/touch';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { ConfigProviderContext } from '../ConfigProvider/ConfigProviderContext';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { ModalRootContext, ModalRootContextInterface } from './ModalRootContext';\nimport { MODAL_PAGE_DEFAULT_PERCENT_HEIGHT } from './constants';\nimport { ModalRootWithDOMProps, ModalsStateEntry, ModalType, TranslateRange } from './types';\nimport { ModalTransitionProps, withModalManager } from './useModalManager';\nimport styles from './ModalRoot.module.css';\n\nconst warn = warnOnce('ModalRoot');\n\nfunction numberInRange(number: number, range: TranslateRange | undefined) {\n if (!range) {\n return false;\n }\n return number >= range[0] && number <= range[1];\n}\n\nfunction rangeTranslate(number: number) {\n return clamp(number, 0, 98);\n}\n\ninterface ModalRootState {\n touchDown?: boolean;\n dragging?: boolean;\n modalOpenedLog: string[];\n}\n\nclass ModalRootTouchComponent extends React.Component<\n ModalRootWithDOMProps & DOMProps & ModalTransitionProps,\n ModalRootState\n> {\n constructor(props: ModalRootWithDOMProps & ModalTransitionProps) {\n super(props);\n this.state = {\n touchDown: false,\n dragging: false,\n modalOpenedLog: [],\n };\n\n this.maskElementRef = React.createRef();\n\n this.modalRootContext = {\n updateModalHeight: this.updateModalHeight,\n registerModal: ({ id, ...data }) => Object.assign(this.props.getModalState(id) ?? {}, data),\n onClose: () => this.props.onExit(),\n isInsideModal: true,\n };\n\n this.frameIds = {};\n }\n\n private documentScrolling = false;\n private readonly maskElementRef: React.RefObject<HTMLDivElement>;\n private readonly viewportRef = React.createRef<HTMLDivElement>();\n private maskAnimationFrame: number | undefined = undefined;\n private readonly modalRootContext: ModalRootContextInterface;\n private readonly frameIds: {\n [index: string]: number;\n };\n private restoreFocusTo: HTMLElement | undefined | null = undefined;\n\n get timeout(): number {\n return this.props.platform === Platform.IOS ? 400 : 320;\n }\n\n get document(): Document {\n return this.props.document as Document;\n }\n\n get window(): Window {\n return this.props.window as Window;\n }\n\n getModals() {\n return React.Children.toArray(this.props.children) as React.ReactElement[];\n }\n\n componentDidMount() {\n // Отслеживаем изменение размеров viewport\n this.window?.addEventListener('resize', this.updateModalHeight, false);\n }\n\n componentWillUnmount() {\n this.toggleDocumentScrolling(true);\n this.window.removeEventListener('resize', this.updateModalHeight, false);\n }\n\n componentDidUpdate(prevProps: ModalRootWithDOMProps & ModalTransitionProps) {\n // transition phase 2: animate exiting modal\n if (this.props.exitingModal && this.props.exitingModal !== prevProps.exitingModal) {\n this.closeModal(this.props.exitingModal);\n }\n\n // transition phase 3: animate entering modal\n if (this.props.enteringModal && this.props.enteringModal !== prevProps.enteringModal) {\n const { enteringModal } = this.props;\n const enteringState = this.props.getModalState(enteringModal);\n this.props.onEnter();\n this.waitTransitionFinish(enteringState, () => {\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = '';\n }\n this.props.onEntered(enteringModal);\n });\n\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = this.props.delayEnter\n ? `${this.timeout}ms`\n : '';\n this.animateTranslate(enteringState, enteringState.translateY);\n this.setMaskOpacity(enteringState, 1);\n }\n }\n\n // focus restoration\n if (this.props.activeModal && !prevProps.activeModal) {\n this.restoreFocusTo = this.document.activeElement as HTMLElement;\n }\n if (!this.props.activeModal && !this.props.exitingModal && this.restoreFocusTo) {\n this.restoreFocusTo.focus();\n this.restoreFocusTo = null;\n }\n\n this.toggleDocumentScrolling(!this.props.activeModal && !this.props.exitingModal);\n }\n\n /* Отключает скролл документа */\n toggleDocumentScrolling(enabled: boolean) {\n if (this.documentScrolling === enabled) {\n return;\n }\n this.documentScrolling = enabled;\n\n if (enabled) {\n // восстанавливаем значение overscroll behavior\n // eslint-disable-next-line no-restricted-properties\n this.document.documentElement.classList.remove('vkui--disable-overscroll-behavior');\n\n // некоторые браузеры на странных вендорах типа Meizu не удаляют обработчик.\n // https://github.com/VKCOM/VKUI/issues/444\n this.window.removeEventListener('touchmove', this.preventTouch, {\n // @ts-expect-error: TS2769 В интерфейсе EventListenerOptions нет поля passive\n passive: false,\n });\n } else {\n // отключаем нативный pull-to-refresh при открытом модальном окне\n // чтобы он не срабатывал при закрытии модалки смахиванием вниз\n // eslint-disable-next-line no-restricted-properties\n this.document.documentElement.classList.add('vkui--disable-overscroll-behavior');\n\n this.window.addEventListener('touchmove', this.preventTouch, {\n passive: false,\n });\n }\n }\n\n preventTouch = (event: any) => {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n return false;\n };\n\n checkPageContentHeight() {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE && modalState?.modalElement) {\n const prevModalState = { ...modalState };\n initPageModal(modalState);\n const currentModalState = { ...modalState };\n\n let needAnimate = false;\n\n if (prevModalState.expandable === currentModalState.expandable) {\n if (prevModalState.translateYFrom !== currentModalState.translateYFrom) {\n needAnimate = true;\n }\n } else {\n needAnimate = true;\n }\n\n if (needAnimate) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n }\n }\n\n updateModalHeight = () => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState && modalState.type === ModalType.PAGE) {\n if (this.props.enteringModal) {\n this.waitTransitionFinish(modalState, () => {\n requestAnimationFrame(() => this.checkPageContentHeight());\n });\n } else {\n requestAnimationFrame(() => this.checkPageContentHeight());\n }\n }\n };\n\n closeModal(id: string) {\n // Сбрасываем состояния, которые могут помешать закрытию модального окна\n this.setState({ touchDown: false });\n\n const prevModalState = this.props.getModalState(id);\n\n if (!prevModalState) {\n id && warn(`closeActiveModal: модальное окно (страница) ${id} не существует`, 'error');\n return;\n }\n if (!this.state.modalOpenedLog.length) {\n this.setState((prevState) => ({\n modalOpenedLog: [...prevState.modalOpenedLog, id],\n }));\n }\n const nextModalState = this.props.getModalState(this.props.activeModal);\n const nextIsPage = !!nextModalState && nextModalState.type === ModalType.PAGE;\n\n const prevIsPage = !!prevModalState && prevModalState.type === ModalType.PAGE;\n this.waitTransitionFinish(prevModalState, () => this.props.onExited(id));\n const exitTranslate =\n prevIsPage &&\n nextIsPage &&\n (prevModalState.translateY ?? 0) <= (nextModalState?.translateYFrom ?? 0) &&\n !this.props.isBack\n ? (nextModalState?.translateYFrom ?? 0) + 10\n : 100;\n this.animateTranslate(prevModalState, exitTranslate);\n\n if (!nextModalState) {\n // NOTE: was only for clean exit\n this.setMaskOpacity(prevModalState, 0);\n this.setState({ modalOpenedLog: [] });\n prevModalState.translateY = undefined;\n } else if (nextModalState.id && !this.state.modalOpenedLog.includes(nextModalState.id)) {\n nextModalState.translateY = undefined;\n this.setState((prevState) => ({\n modalOpenedLog: [...prevState.modalOpenedLog, nextModalState.id!],\n }));\n }\n }\n\n onTouchMove = (e: TouchEvent) => {\n if (this.props.exitingModal) {\n return;\n }\n const modalState = this.props.getModalState(this.props.activeModal);\n if (!modalState) {\n return;\n }\n\n if (modalState.type === ModalType.PAGE) {\n return this.onPageTouchMove(e, modalState);\n }\n\n if (modalState.type === ModalType.CARD) {\n return this.onCardTouchMove(e, modalState);\n }\n };\n\n onPageTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { shiftY, originalEvent } = event;\n const target = originalEvent.target as HTMLElement;\n\n if (!event.isY) {\n if (this.viewportRef.current?.contains(target)) {\n originalEvent.preventDefault();\n }\n return;\n }\n\n if (!modalState.innerElement?.contains(target)) {\n return originalEvent.preventDefault();\n }\n\n originalEvent.stopPropagation();\n\n const { expandable, contentScrolled, collapsed, expanded } = modalState;\n\n if (!this.state.touchDown) {\n modalState.touchStartContentScrollTop = modalState.contentElement?.scrollTop ?? 0;\n this.setState({ touchDown: true });\n }\n\n if (contentScrolled) {\n return;\n }\n\n if (modalState.touchMovePositive === null) {\n modalState.touchMovePositive = shiftY > 0;\n }\n\n if (\n !modalState.expandable ||\n collapsed ||\n (expanded && modalState.touchMovePositive && modalState.touchStartContentScrollTop === 0) ||\n modalState.headerElement?.contains(target)\n ) {\n originalEvent.preventDefault();\n\n if ((!expandable && shiftY < 0) || !this.window) {\n return;\n }\n\n !this.state.dragging && this.setState({ dragging: true });\n\n const shiftYPercent = (shiftY / this.window.innerHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 0.8, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = rangeTranslate((modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onCardTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { originalEvent, shiftY } = event;\n const target = originalEvent.target as HTMLElement;\n if (modalState.innerElement?.contains(target)) {\n if (!this.state.touchDown) {\n this.setState({ touchDown: true, dragging: true });\n }\n\n const shiftYPercent = (shiftY / modalState.innerElement.offsetHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 1.2, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = Math.max(0, (modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onTouchEnd = (e: TouchEvent) => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE) {\n return this.onPageTouchEnd(e, modalState);\n }\n\n if (modalState?.type === ModalType.CARD) {\n return this.onCardTouchEnd(e, modalState);\n }\n };\n\n onPageTouchEnd(event: TouchEvent, modalState: ModalsStateEntry) {\n const { startY, shiftY } = event;\n\n modalState.contentScrolled = false;\n modalState.touchMovePositive = null;\n\n let setStateCallback;\n\n if (this.state.dragging && this.window) {\n const shiftYEndPercent = ((startY + shiftY) / this.window.innerHeight) * 100;\n\n let translateY = modalState.translateYCurrent ?? 0;\n const expectTranslateY =\n (translateY / event.duration) *\n 240 *\n 0.6 *\n ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = rangeTranslate(translateY + expectTranslateY);\n\n if (modalState.settlingHeight !== 100) {\n if (numberInRange(translateY, modalState.expandedRange)) {\n translateY = modalState.expandedRange?.[0] ?? 0;\n } else if (numberInRange(translateY, modalState.collapsedRange)) {\n translateY = modalState.translateYFrom ?? 0;\n } else if (numberInRange(translateY, modalState.hiddenRange)) {\n translateY = 100;\n } else {\n translateY = modalState.translateYFrom ?? 0;\n }\n } else {\n if (numberInRange(translateY, [0, 25])) {\n translateY = 0;\n } else {\n translateY = 100;\n }\n }\n\n if (translateY !== 100 && shiftYEndPercent >= 75) {\n translateY = 100;\n }\n\n modalState.translateY = translateY;\n modalState.translateYCurrent = translateY;\n modalState.collapsed = numberInRange(translateY, modalState.collapsedRange);\n modalState.expanded = translateY === 0;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onCardTouchEnd({ duration }: TouchEvent, modalState: ModalsStateEntry) {\n let setStateCallback;\n\n if (this.state.dragging) {\n let translateY = modalState.translateYCurrent ?? 0;\n\n const expectTranslateY =\n (translateY / duration) * 240 * 0.6 * ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = Math.max(0, translateY + expectTranslateY);\n\n if (translateY >= 30) {\n translateY = 100;\n } else {\n translateY = 0;\n }\n\n modalState.translateY = translateY;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onScroll = (e: React.SyntheticEvent) => {\n const activeModal = this.props.activeModal;\n\n const target = e.target as HTMLElement;\n\n if (!activeModal) {\n return;\n }\n const modalState = this.props.getModalState(activeModal);\n if (modalState?.type === ModalType.PAGE && modalState?.contentElement?.contains(target)) {\n modalState.contentScrolled = true;\n\n if (modalState.contentScrollStopTimeout) {\n clearTimeout(modalState.contentScrollStopTimeout);\n }\n\n modalState.contentScrollStopTimeout = setTimeout(() => {\n if (modalState.contentScrolled) {\n modalState.contentScrolled = false;\n }\n }, 250);\n }\n };\n\n waitTransitionFinish(modalState: ModalsStateEntry | undefined, eventHandler: () => void) {\n if (transitionEvent.supported) {\n const onceHandler = () => {\n modalState?.innerElement?.removeEventListener(transitionEvent.name as string, onceHandler);\n eventHandler();\n };\n\n modalState?.innerElement?.addEventListener(transitionEvent.name as string, onceHandler);\n } else {\n setTimeout(eventHandler, this.timeout);\n }\n }\n\n /**\n * Анимирует сдвиг модалки\n *\n * @param {ModalsStateEntry} modalState\n * @param {number} percent Процент сдвига: 0 – полностью открыта, 100 – полностью закрыта\n */\n animateTranslate(modalState: ModalsStateEntry, percent: number | undefined) {\n const frameId = `animateTranslateFrame${modalState.id}`;\n\n cancelAnimationFrame(this.frameIds[frameId]);\n\n this.frameIds[frameId] = requestAnimationFrame(() => {\n setTransformStyle(modalState.innerElement, `translate3d(0, ${percent}%, 0)`);\n });\n }\n\n /* Устанавливает прозрачность для полупрозрачной подложки */\n setMaskOpacity(modalState: ModalsStateEntry, forceOpacity: number | null = null) {\n if (forceOpacity === null && this.props.history?.[0] !== modalState.id) {\n return;\n }\n if (this.maskAnimationFrame) {\n cancelAnimationFrame(this.maskAnimationFrame);\n }\n this.maskAnimationFrame = requestAnimationFrame(() => {\n if (this.maskElementRef.current) {\n const { translateY = 0, translateYCurrent = 0 } = modalState;\n\n const opacity =\n forceOpacity === null\n ? 1 - (translateYCurrent - translateY) / (100 - translateY) || 0\n : forceOpacity;\n this.maskElementRef.current.style.opacity = clamp(opacity, 0, 100).toString();\n this.maskElementRef.current.style.transitionDelay =\n opacity && this.props.delayEnter ? `${this.timeout}ms` : '';\n }\n });\n }\n\n render() {\n const { activeModal, exitingModal, enteringModal } = this.props;\n const { touchDown, dragging } = this.state;\n\n if (!activeModal && !exitingModal) {\n return null;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <ModalRootContext.Provider value={this.modalRootContext}>\n <Touch\n className={classNames(\n styles['ModalRoot'],\n this.props.configProvider?.hasCustomPanelHeaderAfter &&\n styles['ModalRoot--hasCustomPanelHeaderAfterSlot'],\n touchDown &&\n classNames(styles['ModalRoot--touched'], 'vkuiInternalModalRoot--touched'),\n !!(enteringModal || exitingModal) &&\n classNames(styles['ModalRoot--switching'], 'vkuiInternalModalRoot--switching'),\n )}\n onMove={this.onTouchMove}\n onEnd={this.onTouchEnd}\n onScroll={this.onScroll}\n >\n <div\n className={styles['ModalRoot__mask']}\n onClick={this.props.onExit}\n ref={this.maskElementRef}\n />\n <div className={styles['ModalRoot__viewport']} ref={this.viewportRef}>\n {this.getModals().map((Modal) => {\n const modalId = getNavId(Modal.props, warn);\n const _modalState = this.props.getModalState(modalId);\n if ((modalId !== activeModal && modalId !== exitingModal) || !_modalState) {\n return null;\n }\n const modalState = { ..._modalState };\n\n const isPage = modalState.type === ModalType.PAGE;\n const key = `modal-${modalId}`;\n\n return (\n <FocusTrap\n key={key}\n getRootRef={(e) => {\n const modalState = this.props.getModalState(modalId);\n if (modalState) {\n modalState.modalElement = e;\n }\n }}\n onClose={this.props.onExit}\n timeout={this.timeout}\n className={classNames(\n styles['ModalRoot__modal'],\n\n dragging && 'vkuiInternalModalRoot__modal--dragging',\n\n isPage && modalState.expandable && 'vkuiInternalModalRoot__modal--expandable',\n isPage && modalState.collapsed && 'vkuiInternalModalRoot__modal--collapsed',\n )}\n restoreFocus={false}\n >\n {Modal}\n </FocusTrap>\n );\n })}\n </div>\n </Touch>\n </ModalRootContext.Provider>\n </TouchRootContext.Provider>\n );\n }\n}\n\nexport const ModalRootTouch = withContext(\n withPlatform(\n withDOM<ModalRootWithDOMProps>(withModalManager(initModal)(ModalRootTouchComponent)),\n ),\n ConfigProviderContext,\n 'configProvider',\n);\n\n/**\n * Инициализирует модалку перед анимацией открытия\n */\nfunction initModal(modalState: ModalsStateEntry) {\n switch (modalState.type) {\n case ModalType.PAGE:\n modalState.settlingHeight = modalState.settlingHeight || MODAL_PAGE_DEFAULT_PERCENT_HEIGHT;\n return initPageModal(modalState);\n case ModalType.CARD:\n return initCardModal(modalState);\n default:\n process.env.NODE_ENV === 'development' &&\n warn(`initActiveModal: modalState.type=\"${modalState.type}\" не поддерживается`, 'error');\n }\n}\n\nfunction initPageModal(modalState: ModalsStateEntry) {\n const { contentElement, bottomInset } = modalState;\n const contentElementHeight = (contentElement?.firstElementChild as HTMLElement).scrollHeight;\n const bottomInsetHeight = bottomInset?.offsetHeight || 0;\n const contentHeight = contentElementHeight + bottomInsetHeight;\n let prevTranslateY = modalState.translateY;\n\n modalState.expandable =\n contentHeight > (contentElement?.clientHeight ?? 0) ||\n modalState.settlingHeight === 100 ||\n modalState.expanded;\n\n let collapsed = false;\n let expanded = false;\n let translateYFrom;\n let translateY;\n let expandedRange: TranslateRange;\n let collapsedRange: TranslateRange | undefined;\n let hiddenRange: TranslateRange;\n\n const hasCollapsedState = Boolean(modalState.expandable && modalState.settlingHeight !== 100);\n if (modalState.expandable) {\n translateYFrom = 100 - (modalState.settlingHeight ?? 0);\n\n const shiftHalf = translateYFrom / 2;\n const visiblePart = 100 - translateYFrom;\n\n expandedRange = [0, shiftHalf];\n collapsedRange = hasCollapsedState ? [shiftHalf, translateYFrom + visiblePart / 4] : undefined;\n hiddenRange = [translateYFrom + visiblePart / 4, 100];\n\n collapsed = hasCollapsedState && translateYFrom > 0;\n expanded = translateYFrom <= 0;\n translateY = translateYFrom;\n } else {\n const headerHeight = modalState.headerElement?.offsetHeight ?? 0;\n const height = contentHeight + headerHeight;\n\n translateYFrom =\n 100 - (height / (modalState.innerElement?.parentElement?.offsetHeight ?? 0)) * 100;\n translateY = translateYFrom;\n\n expandedRange = [translateY, translateY + 25];\n collapsedRange = undefined;\n hiddenRange = [translateY + 25, translateY + 100];\n }\n\n // Если модалка может открываться на весь экран, и новый сдвиг больше предыдущего, то откроем её на весь экран\n if (\n (modalState.expandable && translateY > (prevTranslateY ?? 100)) ||\n modalState.settlingHeight === 100\n ) {\n translateY = 0;\n }\n\n // Если модалка уже раскрыта обновляем состояния\n if (translateY === 0) {\n expanded = true;\n collapsed = false;\n }\n\n modalState.expandedRange = expandedRange;\n modalState.collapsedRange = collapsedRange;\n modalState.hiddenRange = hiddenRange;\n modalState.translateY = translateY;\n modalState.translateYFrom = translateYFrom;\n modalState.collapsed = collapsed;\n modalState.expanded = expanded;\n}\n\nfunction initCardModal(modalState: ModalsStateEntry) {\n modalState.translateY = 0;\n}\n"],"names":["React","classNames","clamp","withContext","withPlatform","withDOM","getNavId","Platform","setTransformStyle","transitionEvent","rubber","warnOnce","ConfigProviderContext","FocusTrap","Touch","TouchRootContext","ModalRootContext","MODAL_PAGE_DEFAULT_PERCENT_HEIGHT","ModalType","withModalManager","styles","warn","numberInRange","number","range","rangeTranslate","ModalRootTouchComponent","Component","constructor","props","state","touchDown","dragging","modalOpenedLog","maskElementRef","createRef","modalRootContext","updateModalHeight","registerModal","id","data","Object","assign","getModalState","onClose","onExit","isInsideModal","frameIds","documentScrolling","viewportRef","maskAnimationFrame","undefined","restoreFocusTo","timeout","platform","IOS","document","window","getModals","Children","toArray","children","componentDidMount","addEventListener","componentWillUnmount","toggleDocumentScrolling","removeEventListener","componentDidUpdate","prevProps","exitingModal","closeModal","enteringModal","enteringState","onEnter","waitTransitionFinish","innerElement","style","transitionDelay","onEntered","delayEnter","animateTranslate","translateY","setMaskOpacity","activeModal","activeElement","focus","enabled","documentElement","classList","remove","preventTouch","passive","add","event","originalEvent","preventDefault","checkPageContentHeight","modalState","type","PAGE","modalElement","prevModalState","initPageModal","currentModalState","needAnimate","expandable","translateYFrom","requestAnimationFrame","setState","length","prevState","nextModalState","nextIsPage","prevIsPage","onExited","exitTranslate","isBack","includes","onTouchMove","e","onPageTouchMove","CARD","onCardTouchMove","shiftY","target","isY","current","contains","stopPropagation","contentScrolled","collapsed","expanded","touchStartContentScrollTop","contentElement","scrollTop","touchMovePositive","headerElement","shiftYPercent","innerHeight","shiftYCurrent","touchShiftYPercent","translateYCurrent","offsetHeight","Math","max","onTouchEnd","onPageTouchEnd","onCardTouchEnd","startY","setStateCallback","shiftYEndPercent","expectTranslateY","duration","settlingHeight","expandedRange","collapsedRange","hiddenRange","hidden","onScroll","contentScrollStopTimeout","clearTimeout","setTimeout","eventHandler","supported","onceHandler","name","percent","frameId","cancelAnimationFrame","forceOpacity","history","opacity","toString","render","Provider","value","className","configProvider","hasCustomPanelHeaderAfter","onMove","onEnd","div","onClick","ref","map","Modal","modalId","_modalState","isPage","key","getRootRef","restoreFocus","ModalRootTouch","initModal","initCardModal","process","env","NODE_ENV","bottomInset","contentElementHeight","firstElementChild","scrollHeight","bottomInsetHeight","contentHeight","prevTranslateY","clientHeight","hasCollapsedState","Boolean","shiftHalf","visiblePart","headerHeight","height","parentElement"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PullToRefresh.d.ts","sourceRoot":"","sources":["../../../../src/components/PullToRefresh/PullToRefresh.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,QAAQ,EAAU,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"PullToRefresh.d.ts","sourceRoot":"","sources":["../../../../src/components/PullToRefresh/PullToRefresh.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,QAAQ,EAAU,MAAM,eAAe,CAAC;AAKjD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAa,MAAM,0BAA0B,CAAC;AAE7E,OAAO,EAAqB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAqB/D,MAAM,WAAW,kBAAmB,SAAQ,QAAQ,EAAE,UAAU,EAAE,WAAW;IAC3E;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,SAAS,EAAE,WAAW,CAAC;IACvB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc;IACd,MAAM,CAAC,EAAE,sBAAsB,CAAC;CACjC;AAOD;;GAEG;AACH,eAAO,MAAM,aAAa,iEAMvB,kBAAkB,sBAgPpB,CAAC"}
|
|
@@ -8,6 +8,7 @@ import { useTimeout } from '../../hooks/useTimeout';
|
|
|
8
8
|
import { useDOM } from '../../lib/dom';
|
|
9
9
|
import { Platform } from '../../lib/platform';
|
|
10
10
|
import { runTapticImpactOccurred } from '../../lib/taptic';
|
|
11
|
+
import { coordY } from '../../lib/touch';
|
|
11
12
|
import { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';
|
|
12
13
|
import { useScroll } from '../AppRoot/ScrollContext';
|
|
13
14
|
import { FixedLayout } from '../FixedLayout/FixedLayout';
|
|
@@ -59,13 +60,6 @@ const TOUCH_MOVE_EVENT_PARAMS = {
|
|
|
59
60
|
const touchY = React.useRef(0);
|
|
60
61
|
const [contentShift, setContentShift] = React.useState(0);
|
|
61
62
|
const [spinnerProgress, setSpinnerProgress] = React.useState(0);
|
|
62
|
-
const onWindowTouchMove = (event)=>{
|
|
63
|
-
if (refreshing) {
|
|
64
|
-
event.preventDefault();
|
|
65
|
-
event.stopPropagation();
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
useGlobalEventListener(document, 'touchmove', onWindowTouchMove, TOUCH_MOVE_EVENT_PARAMS);
|
|
69
63
|
const resetRefreshingState = React.useCallback(()=>{
|
|
70
64
|
setWatching(false);
|
|
71
65
|
setCanRefresh(false);
|
|
@@ -148,12 +142,41 @@ const TOUCH_MOVE_EVENT_PARAMS = {
|
|
|
148
142
|
canRefresh,
|
|
149
143
|
runRefreshing
|
|
150
144
|
]);
|
|
145
|
+
const startYRef = React.useRef(0);
|
|
151
146
|
const onTouchStart = (e)=>{
|
|
152
147
|
if (refreshing) {
|
|
153
148
|
cancelEvent(e);
|
|
154
149
|
}
|
|
155
150
|
setTouchDown(true);
|
|
151
|
+
startYRef.current = e.startY;
|
|
152
|
+
if (document) {
|
|
153
|
+
// eslint-disable-next-line no-restricted-properties
|
|
154
|
+
document.documentElement.classList.add('vkui--disable-overscroll-behavior');
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
const shouldPreventTouchMove = (event)=>{
|
|
158
|
+
if (watching || refreshing) {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
/* Нам нужно запретить touchmove у документа как только стало понятно, что
|
|
162
|
+
* начинается pull.
|
|
163
|
+
* состояния watching и refreshing устанавливаются слишком поздно и браузер
|
|
164
|
+
* может успеть начать нативный pull to refresh.
|
|
165
|
+
*
|
|
166
|
+
* Этот код является запасным вариантом, на случай, если css свойство
|
|
167
|
+
* overscroll-behavior не поддерживается
|
|
168
|
+
* */ const shiftY = coordY(event) - startYRef.current;
|
|
169
|
+
const pageYOffset = scroll?.getScroll().y;
|
|
170
|
+
const isRefreshGestureStarted = pageYOffset === 0 && shiftY > 0 && touchDown;
|
|
171
|
+
return isRefreshGestureStarted;
|
|
156
172
|
};
|
|
173
|
+
const onWindowTouchMove = (event)=>{
|
|
174
|
+
if (shouldPreventTouchMove(event)) {
|
|
175
|
+
event.preventDefault();
|
|
176
|
+
event.stopPropagation();
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
useGlobalEventListener(document, 'touchmove', onWindowTouchMove, TOUCH_MOVE_EVENT_PARAMS);
|
|
157
180
|
const onTouchMove = (e)=>{
|
|
158
181
|
const { isY, shiftY } = e;
|
|
159
182
|
const { start, max } = initParams;
|
|
@@ -182,6 +205,11 @@ const TOUCH_MOVE_EVENT_PARAMS = {
|
|
|
182
205
|
const onTouchEnd = ()=>{
|
|
183
206
|
setWatching(false);
|
|
184
207
|
setTouchDown(false);
|
|
208
|
+
// восстанавливаем overscroll behavior
|
|
209
|
+
if (document) {
|
|
210
|
+
// eslint-disable-next-line no-restricted-properties
|
|
211
|
+
document.documentElement.classList.remove('vkui--disable-overscroll-behavior');
|
|
212
|
+
}
|
|
185
213
|
};
|
|
186
214
|
const spinnerTransform = `translate3d(0, ${spinnerY}px, 0)`;
|
|
187
215
|
let contentTransform = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/PullToRefresh/PullToRefresh.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { usePrevious } from '../../hooks/usePrevious';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { DOMProps, useDOM } from '../../lib/dom';\nimport { Platform } from '../../lib/platform';\nimport { runTapticImpactOccurred } from '../../lib/taptic';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { AnyFunction, HasChildren } from '../../types';\nimport { ScrollContextInterface, useScroll } from '../AppRoot/ScrollContext';\nimport { FixedLayout } from '../FixedLayout/FixedLayout';\nimport { Touch, TouchEvent, TouchProps } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { PullToRefreshSpinner } from './PullToRefreshSpinner';\nimport styles from './PullToRefresh.module.css';\n\nfunction cancelEvent(event: any) {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault && event.cancelable) {\n event.preventDefault();\n }\n if (event.stopPropagation) {\n event.stopPropagation();\n }\n return false;\n}\n\nexport interface PullToRefreshProps extends DOMProps, TouchProps, HasChildren {\n /**\n * Будет вызвана для обновления контента (прим.: функция должна быть мемоизированным коллбэком)\n *\n * > ⚠️ **Для разработчиков VK Mini Apps**\n * >\n * > Сейчас метод под конец выполнения вызывает `runTapticImpactOccurred()`.\n * >\n * > В **v6** нужно будет самостоятельно вызывать эту функцию в вашем обработчике `onRefresh()`.\n * > (см. https://github.com/VKCOM/VKUI/issues/5049). Функцию можете импортировать её из\n * > бибилиотеки `@vkontakte/vk-bridge-react`.\n * >\n * > Чтобы подготовить ваше мини-приложение к обновлению до **v6**, в рамках **v5** вы уже можете\n * > вызывать `runTapticImpactOccurred()`, но с одним условием: вы должны вернуть результат\n * > выполнения функции, чтобы исключить двойной вызов. Результат функции — `boolean`. Если\n * > вернётся `true`, значит, вызывать `runTapticImpactOccurred()` снова со стороны **VKUI** —\n * > не нужно.\n * >\n * > ```jsx\n * > const onRefresh = React.useCallback(() => {\n * > // ...\n * > return runTapticImpactOccurred();\n * > }, []);\n * >\n * > // <PullToRefresh onRefresh={onRefresh} />\n * > ```\n * >\n * > Соответственно, в **v6** ничего возвращать уже не потребуется.\n */\n onRefresh: AnyFunction;\n /**\n * Определяет, выполняется ли обновление. Для скрытия спиннера после получения контента необходимо передать `false`\n */\n isFetching?: boolean;\n /** @ignore */\n scroll?: ScrollContextInterface;\n}\n\nconst TOUCH_MOVE_EVENT_PARAMS = {\n cancelable: true,\n passive: false,\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/PullToRefresh\n */\nexport const PullToRefresh = ({\n children,\n isFetching,\n onRefresh,\n className,\n ...restProps\n}: PullToRefreshProps) => {\n const platform = usePlatform();\n const scroll = useScroll();\n const { document } = useDOM();\n const prevIsFetching = usePrevious(isFetching);\n\n const initParams = React.useMemo(\n () => ({\n start: platform === Platform.IOS ? -10 : -45,\n max: platform === Platform.IOS ? 50 : 80,\n maxY: platform === Platform.IOS ? 400 : 80,\n refreshing: platform === Platform.IOS ? 36 : 50,\n positionMultiplier: platform === Platform.IOS ? 0.21 : 1,\n }),\n [platform],\n );\n\n const [spinnerY, setSpinnerY] = React.useState(initParams.start);\n const [watching, setWatching] = React.useState(false);\n const [refreshing, setRefreshing] = React.useState(false);\n const [canRefresh, setCanRefresh] = React.useState(false);\n const [touchDown, setTouchDown] = React.useState(false);\n const prevTouchDown = usePrevious(touchDown);\n\n const touchY = React.useRef(0);\n const [contentShift, setContentShift] = React.useState(0);\n const [spinnerProgress, setSpinnerProgress] = React.useState(0);\n\n const onWindowTouchMove = (event: Event) => {\n if (refreshing) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n useGlobalEventListener(document, 'touchmove', onWindowTouchMove, TOUCH_MOVE_EVENT_PARAMS);\n\n const resetRefreshingState = React.useCallback(() => {\n setWatching(false);\n setCanRefresh(false);\n setRefreshing(false);\n setSpinnerY(initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }, [initParams]);\n\n const onRefreshingFinish = React.useCallback(() => {\n if (!touchDown) {\n resetRefreshingState();\n }\n }, [touchDown, resetRefreshingState]);\n\n const { set: setWaitFetchingTimeout, clear: clearWaitFetchingTimeout } = useTimeout(\n onRefreshingFinish,\n 1000,\n );\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && prevIsFetching && !isFetching) {\n onRefreshingFinish();\n }\n }, [prevIsFetching, isFetching, onRefreshingFinish]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && !prevIsFetching && isFetching) {\n clearWaitFetchingTimeout();\n }\n }, [isFetching, prevIsFetching, clearWaitFetchingTimeout]);\n\n const runRefreshing = React.useCallback(() => {\n if (!refreshing && onRefresh) {\n // cleanup if the consumer does not start fetching in 1s\n setWaitFetchingTimeout();\n\n setRefreshing(true);\n setSpinnerY((prevSpinnerY) =>\n platform === Platform.IOS ? prevSpinnerY : initParams.refreshing,\n );\n\n const runTapticImpactOccurredCalled = onRefresh();\n // TODO [>=6]: удалить блок кода (#5049)\n if (!runTapticImpactOccurredCalled) {\n runTapticImpactOccurred('light');\n }\n }\n }, [refreshing, onRefresh, setWaitFetchingTimeout, platform, initParams.refreshing]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevTouchDown !== undefined && prevTouchDown && !touchDown) {\n if (!refreshing && canRefresh) {\n runRefreshing();\n } else if (refreshing && !isFetching) {\n // only iOS can start refresh before gesture end\n resetRefreshingState();\n } else {\n // refreshing && isFetching: refresh in progress\n // OR !refreshing && !canRefresh: pull was not strong enough\n setSpinnerY(refreshing ? initParams.refreshing : initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }\n }\n }, [\n initParams,\n prevIsFetching,\n isFetching,\n onRefreshingFinish,\n prevTouchDown,\n touchDown,\n refreshing,\n canRefresh,\n runRefreshing,\n ]);\n\n const onTouchStart = (e: TouchEvent) => {\n if (refreshing) {\n cancelEvent(e);\n }\n setTouchDown(true);\n };\n\n const onTouchMove = (e: TouchEvent) => {\n const { isY, shiftY } = e;\n const { start, max } = initParams;\n const pageYOffset = scroll?.getScroll().y;\n\n if (watching && touchDown) {\n cancelEvent(e);\n\n const { positionMultiplier, maxY } = initParams;\n\n const shift = Math.max(0, shiftY - touchY.current);\n\n const currentY = clamp(start + shift * positionMultiplier, start, maxY);\n const progress = currentY > -10 ? Math.abs((currentY + 10) / max) * 80 : 0;\n\n setSpinnerY(currentY);\n setSpinnerProgress(clamp(progress, 0, 80));\n setCanRefresh(progress > 80);\n setContentShift((currentY + 10) * 2.3);\n\n if (progress > 85 && !refreshing && platform === Platform.IOS) {\n runRefreshing();\n }\n } else if (isY && pageYOffset === 0 && shiftY > 0 && !refreshing && touchDown) {\n cancelEvent(e);\n\n touchY.current = shiftY;\n setWatching(true);\n setSpinnerY(start);\n setSpinnerProgress(0);\n }\n };\n\n const onTouchEnd = () => {\n setWatching(false);\n setTouchDown(false);\n };\n\n const spinnerTransform = `translate3d(0, ${spinnerY}px, 0)`;\n let contentTransform = '';\n\n if (platform === Platform.IOS && refreshing && !touchDown) {\n contentTransform = 'translate3d(0, 100px, 0)';\n } else if (platform === Platform.IOS && (contentShift || refreshing)) {\n contentTransform = `translate3d(0, ${contentShift}px, 0)`;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <Touch\n {...restProps}\n onStart={onTouchStart}\n onMove={onTouchMove}\n onEnd={onTouchEnd}\n className={classNames(\n styles['PullToRefresh'],\n platform === Platform.IOS && styles['PullToRefresh--ios'],\n watching && styles['PullToRefresh--watching'],\n refreshing && styles['PullToRefresh--refreshing'],\n className,\n )}\n >\n <FixedLayout className={styles['PullToRefresh__controls']} useParentWidth>\n <PullToRefreshSpinner\n style={{\n transform: spinnerTransform,\n WebkitTransform: spinnerTransform,\n opacity: watching || refreshing || canRefresh ? 1 : 0,\n }}\n on={refreshing}\n progress={refreshing ? undefined : spinnerProgress}\n />\n </FixedLayout>\n\n <div\n className={styles['PullToRefresh__content']}\n style={{\n transform: contentTransform,\n WebkitTransform: contentTransform,\n }}\n >\n {children}\n </div>\n </Touch>\n </TouchRootContext.Provider>\n );\n};\n"],"names":["React","classNames","clamp","useGlobalEventListener","usePlatform","usePrevious","useTimeout","useDOM","Platform","runTapticImpactOccurred","useIsomorphicLayoutEffect","useScroll","FixedLayout","Touch","TouchRootContext","PullToRefreshSpinner","styles","cancelEvent","event","originalEvent","preventDefault","cancelable","stopPropagation","TOUCH_MOVE_EVENT_PARAMS","passive","PullToRefresh","children","isFetching","onRefresh","className","restProps","platform","scroll","document","prevIsFetching","initParams","useMemo","start","IOS","max","maxY","refreshing","positionMultiplier","spinnerY","setSpinnerY","useState","watching","setWatching","setRefreshing","canRefresh","setCanRefresh","touchDown","setTouchDown","prevTouchDown","touchY","useRef","contentShift","setContentShift","spinnerProgress","setSpinnerProgress","onWindowTouchMove","resetRefreshingState","useCallback","onRefreshingFinish","set","setWaitFetchingTimeout","clear","clearWaitFetchingTimeout","undefined","runRefreshing","prevSpinnerY","runTapticImpactOccurredCalled","onTouchStart","e","onTouchMove","isY","shiftY","pageYOffset","getScroll","y","shift","Math","current","currentY","progress","abs","onTouchEnd","spinnerTransform","contentTransform","Provider","value","onStart","onMove","onEnd","useParentWidth","style","transform","WebkitTransform","opacity","on","div"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/PullToRefresh/PullToRefresh.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { usePrevious } from '../../hooks/usePrevious';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { DOMProps, useDOM } from '../../lib/dom';\nimport { Platform } from '../../lib/platform';\nimport { runTapticImpactOccurred } from '../../lib/taptic';\nimport { coordY, VKUITouchEvent } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { AnyFunction, HasChildren } from '../../types';\nimport { ScrollContextInterface, useScroll } from '../AppRoot/ScrollContext';\nimport { FixedLayout } from '../FixedLayout/FixedLayout';\nimport { Touch, TouchEvent, TouchProps } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { PullToRefreshSpinner } from './PullToRefreshSpinner';\nimport styles from './PullToRefresh.module.css';\n\nfunction cancelEvent(event: any) {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault && event.cancelable) {\n event.preventDefault();\n }\n if (event.stopPropagation) {\n event.stopPropagation();\n }\n return false;\n}\n\nexport interface PullToRefreshProps extends DOMProps, TouchProps, HasChildren {\n /**\n * Будет вызвана для обновления контента (прим.: функция должна быть мемоизированным коллбэком)\n *\n * > ⚠️ **Для разработчиков VK Mini Apps**\n * >\n * > Сейчас метод под конец выполнения вызывает `runTapticImpactOccurred()`.\n * >\n * > В **v6** нужно будет самостоятельно вызывать эту функцию в вашем обработчике `onRefresh()`.\n * > (см. https://github.com/VKCOM/VKUI/issues/5049). Функцию можете импортировать её из\n * > бибилиотеки `@vkontakte/vk-bridge-react`.\n * >\n * > Чтобы подготовить ваше мини-приложение к обновлению до **v6**, в рамках **v5** вы уже можете\n * > вызывать `runTapticImpactOccurred()`, но с одним условием: вы должны вернуть результат\n * > выполнения функции, чтобы исключить двойной вызов. Результат функции — `boolean`. Если\n * > вернётся `true`, значит, вызывать `runTapticImpactOccurred()` снова со стороны **VKUI** —\n * > не нужно.\n * >\n * > ```jsx\n * > const onRefresh = React.useCallback(() => {\n * > // ...\n * > return runTapticImpactOccurred();\n * > }, []);\n * >\n * > // <PullToRefresh onRefresh={onRefresh} />\n * > ```\n * >\n * > Соответственно, в **v6** ничего возвращать уже не потребуется.\n */\n onRefresh: AnyFunction;\n /**\n * Определяет, выполняется ли обновление. Для скрытия спиннера после получения контента необходимо передать `false`\n */\n isFetching?: boolean;\n /** @ignore */\n scroll?: ScrollContextInterface;\n}\n\nconst TOUCH_MOVE_EVENT_PARAMS = {\n cancelable: true,\n passive: false,\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/PullToRefresh\n */\nexport const PullToRefresh = ({\n children,\n isFetching,\n onRefresh,\n className,\n ...restProps\n}: PullToRefreshProps) => {\n const platform = usePlatform();\n const scroll = useScroll();\n const { document } = useDOM();\n const prevIsFetching = usePrevious(isFetching);\n\n const initParams = React.useMemo(\n () => ({\n start: platform === Platform.IOS ? -10 : -45,\n max: platform === Platform.IOS ? 50 : 80,\n maxY: platform === Platform.IOS ? 400 : 80,\n refreshing: platform === Platform.IOS ? 36 : 50,\n positionMultiplier: platform === Platform.IOS ? 0.21 : 1,\n }),\n [platform],\n );\n\n const [spinnerY, setSpinnerY] = React.useState(initParams.start);\n const [watching, setWatching] = React.useState(false);\n const [refreshing, setRefreshing] = React.useState(false);\n const [canRefresh, setCanRefresh] = React.useState(false);\n const [touchDown, setTouchDown] = React.useState(false);\n const prevTouchDown = usePrevious(touchDown);\n\n const touchY = React.useRef(0);\n const [contentShift, setContentShift] = React.useState(0);\n const [spinnerProgress, setSpinnerProgress] = React.useState(0);\n\n const resetRefreshingState = React.useCallback(() => {\n setWatching(false);\n setCanRefresh(false);\n setRefreshing(false);\n setSpinnerY(initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }, [initParams]);\n\n const onRefreshingFinish = React.useCallback(() => {\n if (!touchDown) {\n resetRefreshingState();\n }\n }, [touchDown, resetRefreshingState]);\n\n const { set: setWaitFetchingTimeout, clear: clearWaitFetchingTimeout } = useTimeout(\n onRefreshingFinish,\n 1000,\n );\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && prevIsFetching && !isFetching) {\n onRefreshingFinish();\n }\n }, [prevIsFetching, isFetching, onRefreshingFinish]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && !prevIsFetching && isFetching) {\n clearWaitFetchingTimeout();\n }\n }, [isFetching, prevIsFetching, clearWaitFetchingTimeout]);\n\n const runRefreshing = React.useCallback(() => {\n if (!refreshing && onRefresh) {\n // cleanup if the consumer does not start fetching in 1s\n setWaitFetchingTimeout();\n\n setRefreshing(true);\n setSpinnerY((prevSpinnerY) =>\n platform === Platform.IOS ? prevSpinnerY : initParams.refreshing,\n );\n\n const runTapticImpactOccurredCalled = onRefresh();\n // TODO [>=6]: удалить блок кода (#5049)\n if (!runTapticImpactOccurredCalled) {\n runTapticImpactOccurred('light');\n }\n }\n }, [refreshing, onRefresh, setWaitFetchingTimeout, platform, initParams.refreshing]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevTouchDown !== undefined && prevTouchDown && !touchDown) {\n if (!refreshing && canRefresh) {\n runRefreshing();\n } else if (refreshing && !isFetching) {\n // only iOS can start refresh before gesture end\n resetRefreshingState();\n } else {\n // refreshing && isFetching: refresh in progress\n // OR !refreshing && !canRefresh: pull was not strong enough\n setSpinnerY(refreshing ? initParams.refreshing : initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }\n }\n }, [\n initParams,\n prevIsFetching,\n isFetching,\n onRefreshingFinish,\n prevTouchDown,\n touchDown,\n refreshing,\n canRefresh,\n runRefreshing,\n ]);\n\n const startYRef = React.useRef(0);\n\n const onTouchStart = (e: TouchEvent) => {\n if (refreshing) {\n cancelEvent(e);\n }\n setTouchDown(true);\n startYRef.current = e.startY;\n\n if (document) {\n // eslint-disable-next-line no-restricted-properties\n document.documentElement.classList.add('vkui--disable-overscroll-behavior');\n }\n };\n\n const shouldPreventTouchMove = (event: VKUITouchEvent) => {\n if (watching || refreshing) {\n return true;\n }\n\n /* Нам нужно запретить touchmove у документа как только стало понятно, что\n * начинается pull.\n * состояния watching и refreshing устанавливаются слишком поздно и браузер\n * может успеть начать нативный pull to refresh.\n *\n * Этот код является запасным вариантом, на случай, если css свойство\n * overscroll-behavior не поддерживается\n * */\n const shiftY = coordY(event) - startYRef.current;\n const pageYOffset = scroll?.getScroll().y;\n const isRefreshGestureStarted = pageYOffset === 0 && shiftY > 0 && touchDown;\n return isRefreshGestureStarted;\n };\n\n const onWindowTouchMove = (event: VKUITouchEvent) => {\n if (shouldPreventTouchMove(event)) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n useGlobalEventListener(document, 'touchmove', onWindowTouchMove, TOUCH_MOVE_EVENT_PARAMS);\n\n const onTouchMove = (e: TouchEvent) => {\n const { isY, shiftY } = e;\n const { start, max } = initParams;\n const pageYOffset = scroll?.getScroll().y;\n\n if (watching && touchDown) {\n cancelEvent(e);\n\n const { positionMultiplier, maxY } = initParams;\n\n const shift = Math.max(0, shiftY - touchY.current);\n\n const currentY = clamp(start + shift * positionMultiplier, start, maxY);\n const progress = currentY > -10 ? Math.abs((currentY + 10) / max) * 80 : 0;\n\n setSpinnerY(currentY);\n setSpinnerProgress(clamp(progress, 0, 80));\n setCanRefresh(progress > 80);\n setContentShift((currentY + 10) * 2.3);\n\n if (progress > 85 && !refreshing && platform === Platform.IOS) {\n runRefreshing();\n }\n } else if (isY && pageYOffset === 0 && shiftY > 0 && !refreshing && touchDown) {\n cancelEvent(e);\n\n touchY.current = shiftY;\n setWatching(true);\n setSpinnerY(start);\n setSpinnerProgress(0);\n }\n };\n\n const onTouchEnd = () => {\n setWatching(false);\n setTouchDown(false);\n\n // восстанавливаем overscroll behavior\n if (document) {\n // eslint-disable-next-line no-restricted-properties\n document.documentElement.classList.remove('vkui--disable-overscroll-behavior');\n }\n };\n\n const spinnerTransform = `translate3d(0, ${spinnerY}px, 0)`;\n let contentTransform = '';\n\n if (platform === Platform.IOS && refreshing && !touchDown) {\n contentTransform = 'translate3d(0, 100px, 0)';\n } else if (platform === Platform.IOS && (contentShift || refreshing)) {\n contentTransform = `translate3d(0, ${contentShift}px, 0)`;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <Touch\n {...restProps}\n onStart={onTouchStart}\n onMove={onTouchMove}\n onEnd={onTouchEnd}\n className={classNames(\n styles['PullToRefresh'],\n platform === Platform.IOS && styles['PullToRefresh--ios'],\n watching && styles['PullToRefresh--watching'],\n refreshing && styles['PullToRefresh--refreshing'],\n className,\n )}\n >\n <FixedLayout className={styles['PullToRefresh__controls']} useParentWidth>\n <PullToRefreshSpinner\n style={{\n transform: spinnerTransform,\n WebkitTransform: spinnerTransform,\n opacity: watching || refreshing || canRefresh ? 1 : 0,\n }}\n on={refreshing}\n progress={refreshing ? undefined : spinnerProgress}\n />\n </FixedLayout>\n\n <div\n className={styles['PullToRefresh__content']}\n style={{\n transform: contentTransform,\n WebkitTransform: contentTransform,\n }}\n >\n {children}\n </div>\n </Touch>\n </TouchRootContext.Provider>\n );\n};\n"],"names":["React","classNames","clamp","useGlobalEventListener","usePlatform","usePrevious","useTimeout","useDOM","Platform","runTapticImpactOccurred","coordY","useIsomorphicLayoutEffect","useScroll","FixedLayout","Touch","TouchRootContext","PullToRefreshSpinner","styles","cancelEvent","event","originalEvent","preventDefault","cancelable","stopPropagation","TOUCH_MOVE_EVENT_PARAMS","passive","PullToRefresh","children","isFetching","onRefresh","className","restProps","platform","scroll","document","prevIsFetching","initParams","useMemo","start","IOS","max","maxY","refreshing","positionMultiplier","spinnerY","setSpinnerY","useState","watching","setWatching","setRefreshing","canRefresh","setCanRefresh","touchDown","setTouchDown","prevTouchDown","touchY","useRef","contentShift","setContentShift","spinnerProgress","setSpinnerProgress","resetRefreshingState","useCallback","onRefreshingFinish","set","setWaitFetchingTimeout","clear","clearWaitFetchingTimeout","undefined","runRefreshing","prevSpinnerY","runTapticImpactOccurredCalled","startYRef","onTouchStart","e","current","startY","documentElement","classList","add","shouldPreventTouchMove","shiftY","pageYOffset","getScroll","y","isRefreshGestureStarted","onWindowTouchMove","onTouchMove","isY","shift","Math","currentY","progress","abs","onTouchEnd","remove","spinnerTransform","contentTransform","Provider","value","onStart","onMove","onEnd","useParentWidth","style","transform","WebkitTransform","opacity","on","div"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tappable.d.ts","sourceRoot":"","sources":["../../../../src/components/Tappable/Tappable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Tappable.d.ts","sourceRoot":"","sources":["../../../../src/components/Tappable/Tappable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAiB/B,OAAO,EACL,wBAAwB,EACxB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAqB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAmB/D,KAAK,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAI1C,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAClC,cAAc,GACd,aAAa,GACb,YAAY,GACZ,eAAe,GACf,aAAa,GACb,aAAa,GACb,WAAW,GACX,cAAc,CACjB,GACC,wBAAwB,CAAC;AAE3B,MAAM,WAAW,aACf,SAAQ,oBAAoB,EAC1B,UAAU,CAAC,WAAW,CAAC,EACvB,YAAY,EACZ,WAAW,EACX,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAClD;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,UAAU,CAAC,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C;;OAEG;IACH,SAAS,CAAC,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5C;;OAEG;IACH,gBAAgB,CAAC,EAAE,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,CAAC,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,OAAO,CAAC,CAAC,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAQD,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,mBAAmB,MAAM,CAAC;AA2EvC;;GAEG;AACH,eAAO,MAAM,QAAQ,0SAoBlB,aAAa,sBA6Kf,CAAC"}
|
|
@@ -2,7 +2,6 @@ import * as React from 'react';
|
|
|
2
2
|
import { classNames, noop } from '@vkontakte/vkjs';
|
|
3
3
|
import mitt from 'mitt';
|
|
4
4
|
import { useAdaptivity } from '../../hooks/useAdaptivity';
|
|
5
|
-
import { useAdaptivityHasHover } from '../../hooks/useAdaptivityHasHover';
|
|
6
5
|
import { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';
|
|
7
6
|
import { useBooleanState } from '../../hooks/useBooleanState';
|
|
8
7
|
import { useExternRef } from '../../hooks/useExternRef';
|
|
@@ -120,9 +119,8 @@ function useActivity(hasActive, stopDelay) {
|
|
|
120
119
|
const insideTouchRoot = React.useContext(TouchRootContext);
|
|
121
120
|
const platform = usePlatform();
|
|
122
121
|
const { focusVisible, onBlur, onFocus } = useFocusVisible();
|
|
123
|
-
const { sizeX = 'none' } = useAdaptivity();
|
|
122
|
+
const { sizeX = 'none', hasHover: hasHoverContext = true } = useAdaptivity();
|
|
124
123
|
const hasPointerContext = useAdaptivityHasPointer();
|
|
125
|
-
const hasHoverContext = useAdaptivityHasHover();
|
|
126
124
|
const [clicks, setClicks] = React.useState([]);
|
|
127
125
|
const [childHover, setChildHover] = React.useState(false);
|
|
128
126
|
const { value: _hovered, setTrue: setHoveredTrue, setFalse: setHoveredFalse } = useBooleanState(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Tappable/Tappable.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport mitt from 'mitt';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityHasHover } from '../../hooks/useAdaptivityHasHover';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useFocusVisible } from '../../hooks/useFocusVisible';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { shouldTriggerClickOnEnterOrSpace } from '../../lib/accessibility';\nimport { SizeType } from '../../lib/adaptivity';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { getOffsetRect } from '../../lib/offset';\nimport { Platform } from '../../lib/platform';\nimport { coordX, coordY } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport {\n AnchorHTMLAttributesOnly,\n HasChildren,\n HasComponent,\n HasRootRef,\n LiteralUnion,\n} from '../../types';\nimport { FocusVisible, FocusVisibleMode } from '../FocusVisible/FocusVisible';\nimport { Touch, TouchEvent, TouchProps } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport styles from './Tappable.module.css';\n\nconst sizeXClassNames = {\n none: styles['Tappable--sizeX-none'],\n compact: styles['Tappable--sizeX-compact'],\n};\n\nconst stylesHoverMode = {\n background: styles['Tappable--hover-background'],\n opacity: styles['Tappable--hover-opacity'],\n};\n\nconst stylesActiveMode = {\n background: styles['Tappable--active-background'],\n opacity: styles['Tappable--active-opacity'],\n};\n\ntype StateMode = 'opacity' | 'background';\n\nconst WAVE_LIVE = 225;\n\nexport type TappableElementProps = Omit<\n React.AllHTMLAttributes<HTMLElement>,\n | 'onTouchStart'\n | 'onTouchMove'\n | 'onTouchEnd'\n | 'onTouchCancel'\n | 'onMouseDown'\n | 'onMouseMove'\n | 'onMouseUp'\n | 'onMouseLeave'\n> &\n AnchorHTMLAttributesOnly; // В AllHTMLAttributes не хватает типов для ссылок\n\nexport interface TappableProps\n extends TappableElementProps,\n HasRootRef<HTMLElement>,\n HasComponent,\n HasChildren,\n Pick<TouchProps, 'onStart' | 'onEnd' | 'onMove'> {\n /**\n * Длительность показа active-состояния\n */\n activeEffectDelay?: number;\n stopPropagation?: boolean;\n /**\n * Указывает, должен ли компонент реагировать на hover-состояние\n */\n hasHover?: boolean;\n /**\n * Позволяет управлять hovered-состоянием извне\n */\n hovered?: boolean;\n /**\n * Позволяет управлять activated-состоянием извне\n */\n activated?: boolean;\n /**\n * Указывает, должен ли компонент реагировать на active-состояние\n */\n hasActive?: boolean;\n /**\n * Стиль подсветки active-состояния. Если передать произвольную строку, она добавится как css-класс во время active\n */\n activeMode?: LiteralUnion<StateMode, string>;\n /**\n * Стиль подсветки hover-состояния. Если передать произвольную строку, она добавится как css-класс во время hover\n */\n hoverMode?: LiteralUnion<StateMode, string>;\n /**\n * Стиль аутлайна focus visible. Если передать произвольную строку, она добавится как css-класс во время focus-visible\n */\n focusVisibleMode?: LiteralUnion<FocusVisibleMode, string>;\n onEnter?(outputEvent: MouseEvent): void;\n onLeave?(outputEvent: MouseEvent): void;\n /**\n * Задает border-radius элементу\n * В режиме `auto` на маленьких экранах `border-radius: 0`, иначе определяется токеном `--vkui--size_border_radius--regular`\n */\n borderRadiusMode?: 'auto' | 'inherit';\n}\n\ninterface Wave {\n x: number;\n y: number;\n id: number;\n}\n\nexport interface RootComponentProps extends TouchProps {\n ref?: React.Ref<HTMLElement>;\n}\n\nexport const ACTIVE_DELAY = 70;\nexport const ACTIVE_EFFECT_DELAY = 600;\n\nconst activeBus = mitt<{ active: string }>();\nconst TapState = { none: 0, pending: 1, active: 2, exiting: 3 } as const;\n\ntype TappableContextInterface = { onHoverChange: (s: boolean) => void };\nconst TappableContext = React.createContext<TappableContextInterface>({\n onHoverChange: noop,\n});\n\nfunction isPresetStateMode(stateMode: LiteralUnion<StateMode, string>): stateMode is StateMode {\n switch (stateMode) {\n case 'opacity':\n case 'background':\n return true;\n default:\n return false;\n }\n}\n\nfunction useActivity(hasActive: boolean, stopDelay: number) {\n const id = React.useMemo(() => Math.round(Math.random() * 1e8).toString(16), []);\n\n const [activity, setActivity] = React.useState<(typeof TapState)[keyof typeof TapState]>(\n TapState.none,\n );\n const _stop = () => setActivity(TapState.none);\n const start = () => hasActive && setActivity(TapState.active);\n const delayStart = () => {\n hasActive && setActivity(TapState.pending);\n };\n\n const activeTimeout = useTimeout(start, ACTIVE_DELAY);\n const stopTimeout = useTimeout(_stop, stopDelay);\n\n useIsomorphicLayoutEffect(() => {\n if (activity === TapState.pending) {\n activeTimeout.set();\n return activeTimeout.clear;\n }\n if (activity === TapState.exiting) {\n return stopTimeout.clear;\n }\n if (activity === TapState.active) {\n activeBus.emit('active', id);\n }\n return noop;\n }, [activity]);\n\n useIsomorphicLayoutEffect(() => {\n if (activity === TapState.none) {\n return noop;\n }\n const onActiveChange = (activeId: string) => {\n activeId !== id && _stop();\n };\n activeBus.on('active', onActiveChange);\n return () => activeBus.off('active', onActiveChange);\n }, [activity === TapState.none]);\n\n useIsomorphicLayoutEffect(() => {\n !hasActive && _stop();\n }, [hasActive]);\n\n const stop = (delay?: number) => {\n if (delay) {\n setActivity(TapState.exiting);\n return stopTimeout.set(delay);\n }\n _stop();\n };\n\n return [activity, { delayStart, start, stop }] as const;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Tappable\n */\nexport const Tappable = ({\n children,\n Component,\n onClick,\n onKeyDown: _onKeyDown,\n activeEffectDelay = ACTIVE_EFFECT_DELAY,\n stopPropagation = false,\n getRootRef,\n hasHover: _hasHover = true,\n hoverMode = 'background',\n hasActive: _hasActive = true,\n activeMode = 'background',\n focusVisibleMode = 'inside',\n onEnter,\n onLeave,\n className,\n hovered: hoveredProp,\n activated: activatedProp,\n borderRadiusMode = 'auto',\n ...props\n}: TappableProps) => {\n Component = Component || ((props.href ? 'a' : 'div') as React.ElementType);\n\n const { onHoverChange } = React.useContext(TappableContext);\n const insideTouchRoot = React.useContext(TouchRootContext);\n const platform = usePlatform();\n const { focusVisible, onBlur, onFocus } = useFocusVisible();\n const { sizeX = 'none' } = useAdaptivity();\n const hasPointerContext = useAdaptivityHasPointer();\n const hasHoverContext = useAdaptivityHasHover();\n\n const [clicks, setClicks] = React.useState<Wave[]>([]);\n const [childHover, setChildHover] = React.useState(false);\n const {\n value: _hovered,\n setTrue: setHoveredTrue,\n setFalse: setHoveredFalse,\n } = useBooleanState(false);\n\n const hovered = (_hovered || hoveredProp) && !props.disabled;\n const hasActive = _hasActive && !childHover && !props.disabled;\n const hasHover = hasHoverContext && _hasHover && !childHover;\n const isCustomElement =\n Component !== 'a' && Component !== 'button' && Component !== 'label' && !props.contentEditable;\n const isPresetHoverMode = isPresetStateMode(hoverMode);\n const isPresetActiveMode = isPresetStateMode(activeMode);\n const isPresetFocusVisibleMode = ['inside', 'outside'].includes(focusVisibleMode);\n\n const [activity, { start, stop, delayStart }] = useActivity(hasActive, activeEffectDelay);\n const active = activity === TapState.active || activity === TapState.exiting;\n const activated = (active || activatedProp) && !props.disabled;\n\n const containerRef = useExternRef(getRootRef);\n\n // hover propagation\n const childContext = React.useRef({ onHoverChange: setChildHover }).current;\n useIsomorphicLayoutEffect(() => {\n if (!hovered) {\n return noop;\n }\n onHoverChange(true);\n return () => onHoverChange(false);\n }, [hovered]);\n\n /*\n * [a11y]\n * Обрабатывает событие onkeydown\n * для кастомных доступных элементов:\n * - role=\"link\" (активация по Enter)\n * - role=\"button\" (активация по Space и Enter)\n */\n function onKeyDown(e: React.KeyboardEvent<HTMLElement>) {\n if (isCustomElement && shouldTriggerClickOnEnterOrSpace(e)) {\n e.preventDefault();\n containerRef.current?.click();\n }\n }\n\n const needWaves =\n platform === Platform.ANDROID && !hasPointerContext && hasActive && activeMode === 'background';\n\n const clearClicks = useTimeout(() => setClicks([]), WAVE_LIVE);\n\n function addClick(x: number, y: number) {\n const dateNow = Date.now();\n const filteredClicks = clicks.filter((click) => click.id + WAVE_LIVE > dateNow);\n\n setClicks([...filteredClicks, { x, y, id: dateNow }]);\n clearClicks.set();\n }\n\n function onStart({ originalEvent }: TouchEvent) {\n if (hasActive) {\n if (originalEvent.touches && originalEvent.touches.length > 1) {\n // r сожалению я так и не понял, что это делает и можно ли упихнуть его в Touch\n return stop();\n }\n\n if (needWaves) {\n const { top, left } = getOffsetRect(containerRef.current);\n const x = coordX(originalEvent) - (left ?? 0);\n const y = coordY(originalEvent) - (top ?? 0);\n addClick(x, y);\n }\n\n delayStart();\n }\n }\n\n function onMove({ isSlide }: TouchEvent) {\n if (isSlide) {\n stop();\n }\n }\n\n function onEnd({ duration }: TouchEvent) {\n if (activity === TapState.none) {\n return;\n }\n if (activity === TapState.pending) {\n // активировать при коротком тапе\n start();\n }\n\n // отключить без задержки при длинном тапе\n const activeDuration = duration - ACTIVE_DELAY;\n stop(activeDuration >= 100 ? 0 : activeEffectDelay - activeDuration);\n }\n\n const classes = classNames(\n className,\n styles['Tappable'],\n 'vkuiInternalTappable',\n platform === Platform.IOS && styles['Tappable--ios'],\n sizeX !== SizeType.REGULAR && sizeXClassNames[sizeX],\n hasHover && styles['Tappable--hasHover'],\n hasActive && styles['Tappable--hasActive'],\n hasHover && hovered && !isPresetHoverMode && hoverMode,\n hasActive && activated && !isPresetActiveMode && activeMode,\n focusVisible && !isPresetFocusVisibleMode && focusVisibleMode,\n hasHover && hovered && isPresetHoverMode && stylesHoverMode[hoverMode],\n hasActive && activated && isPresetActiveMode && stylesActiveMode[activeMode],\n focusVisible && styles['Tappable--focus-visible'],\n borderRadiusMode === 'inherit' && styles['Tappable--borderRadiusInherit'],\n );\n\n const handlers: RootComponentProps = {\n onStart: callMultiple(onStart, props.onStart),\n onMove: callMultiple(onMove, props.onMove),\n onEnd: callMultiple(onEnd, props.onEnd),\n onClick,\n onKeyDown: callMultiple(onKeyDown, _onKeyDown),\n };\n const role = props.href ? 'link' : 'button';\n\n return (\n <Touch\n onEnter={callMultiple(setHoveredTrue, onEnter)}\n onLeave={callMultiple(setHoveredFalse, onLeave)}\n type={Component === 'button' ? 'button' : undefined}\n tabIndex={isCustomElement && !props.disabled ? 0 : undefined}\n role={isCustomElement ? role : undefined}\n aria-disabled={isCustomElement ? props.disabled : undefined}\n stopPropagation={stopPropagation && !insideTouchRoot && !props.disabled}\n {...props}\n slideThreshold={20}\n usePointerHover\n className={classes}\n Component={Component}\n getRootRef={containerRef}\n onBlur={callMultiple(onBlur, props.onBlur)}\n onFocus={callMultiple(onFocus, props.onFocus)}\n {...(props.disabled ? {} : handlers)}\n >\n <TappableContext.Provider value={childContext}>{children}</TappableContext.Provider>\n {needWaves && (\n <span aria-hidden className={styles.Tappable__waves}>\n {clicks.map((wave) => (\n <span\n key={wave.id}\n className={styles.Tappable__wave}\n style={{ top: wave.y, left: wave.x }}\n />\n ))}\n </span>\n )}\n {((hasHover && hoverMode === 'background') || (hasActive && activeMode === 'background')) && (\n <span aria-hidden className={styles.Tappable__stateLayer} />\n )}\n {!props.disabled && isPresetFocusVisibleMode && (\n <FocusVisible visible={focusVisible} mode={focusVisibleMode as FocusVisibleMode} />\n )}\n </Touch>\n );\n};\n"],"names":["React","classNames","noop","mitt","useAdaptivity","useAdaptivityHasHover","useAdaptivityHasPointer","useBooleanState","useExternRef","useFocusVisible","usePlatform","useTimeout","shouldTriggerClickOnEnterOrSpace","SizeType","callMultiple","getOffsetRect","Platform","coordX","coordY","useIsomorphicLayoutEffect","FocusVisible","Touch","TouchRootContext","styles","sizeXClassNames","none","compact","stylesHoverMode","background","opacity","stylesActiveMode","WAVE_LIVE","ACTIVE_DELAY","ACTIVE_EFFECT_DELAY","activeBus","TapState","pending","active","exiting","TappableContext","createContext","onHoverChange","isPresetStateMode","stateMode","useActivity","hasActive","stopDelay","id","useMemo","Math","round","random","toString","activity","setActivity","useState","_stop","start","delayStart","activeTimeout","stopTimeout","set","clear","emit","onActiveChange","activeId","on","off","stop","delay","Tappable","children","Component","onClick","onKeyDown","_onKeyDown","activeEffectDelay","stopPropagation","getRootRef","hasHover","_hasHover","hoverMode","_hasActive","activeMode","focusVisibleMode","onEnter","onLeave","className","hovered","hoveredProp","activated","activatedProp","borderRadiusMode","props","href","useContext","insideTouchRoot","platform","focusVisible","onBlur","onFocus","sizeX","hasPointerContext","hasHoverContext","clicks","setClicks","childHover","setChildHover","value","_hovered","setTrue","setHoveredTrue","setFalse","setHoveredFalse","disabled","isCustomElement","contentEditable","isPresetHoverMode","isPresetActiveMode","isPresetFocusVisibleMode","includes","containerRef","childContext","useRef","current","e","preventDefault","click","needWaves","ANDROID","clearClicks","addClick","x","y","dateNow","Date","now","filteredClicks","filter","onStart","originalEvent","touches","length","top","left","onMove","isSlide","onEnd","duration","activeDuration","classes","IOS","REGULAR","handlers","role","type","undefined","tabIndex","aria-disabled","slideThreshold","usePointerHover","Provider","span","aria-hidden","Tappable__waves","map","wave","key","Tappable__wave","style","Tappable__stateLayer","visible","mode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Tappable/Tappable.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport mitt from 'mitt';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useFocusVisible } from '../../hooks/useFocusVisible';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { shouldTriggerClickOnEnterOrSpace } from '../../lib/accessibility';\nimport { SizeType } from '../../lib/adaptivity';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { getOffsetRect } from '../../lib/offset';\nimport { Platform } from '../../lib/platform';\nimport { coordX, coordY } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport {\n AnchorHTMLAttributesOnly,\n HasChildren,\n HasComponent,\n HasRootRef,\n LiteralUnion,\n} from '../../types';\nimport { FocusVisible, FocusVisibleMode } from '../FocusVisible/FocusVisible';\nimport { Touch, TouchEvent, TouchProps } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport styles from './Tappable.module.css';\n\nconst sizeXClassNames = {\n none: styles['Tappable--sizeX-none'],\n compact: styles['Tappable--sizeX-compact'],\n};\n\nconst stylesHoverMode = {\n background: styles['Tappable--hover-background'],\n opacity: styles['Tappable--hover-opacity'],\n};\n\nconst stylesActiveMode = {\n background: styles['Tappable--active-background'],\n opacity: styles['Tappable--active-opacity'],\n};\n\ntype StateMode = 'opacity' | 'background';\n\nconst WAVE_LIVE = 225;\n\nexport type TappableElementProps = Omit<\n React.AllHTMLAttributes<HTMLElement>,\n | 'onTouchStart'\n | 'onTouchMove'\n | 'onTouchEnd'\n | 'onTouchCancel'\n | 'onMouseDown'\n | 'onMouseMove'\n | 'onMouseUp'\n | 'onMouseLeave'\n> &\n AnchorHTMLAttributesOnly; // В AllHTMLAttributes не хватает типов для ссылок\n\nexport interface TappableProps\n extends TappableElementProps,\n HasRootRef<HTMLElement>,\n HasComponent,\n HasChildren,\n Pick<TouchProps, 'onStart' | 'onEnd' | 'onMove'> {\n /**\n * Длительность показа active-состояния\n */\n activeEffectDelay?: number;\n stopPropagation?: boolean;\n /**\n * Указывает, должен ли компонент реагировать на hover-состояние\n */\n hasHover?: boolean;\n /**\n * Позволяет управлять hovered-состоянием извне\n */\n hovered?: boolean;\n /**\n * Позволяет управлять activated-состоянием извне\n */\n activated?: boolean;\n /**\n * Указывает, должен ли компонент реагировать на active-состояние\n */\n hasActive?: boolean;\n /**\n * Стиль подсветки active-состояния. Если передать произвольную строку, она добавится как css-класс во время active\n */\n activeMode?: LiteralUnion<StateMode, string>;\n /**\n * Стиль подсветки hover-состояния. Если передать произвольную строку, она добавится как css-класс во время hover\n */\n hoverMode?: LiteralUnion<StateMode, string>;\n /**\n * Стиль аутлайна focus visible. Если передать произвольную строку, она добавится как css-класс во время focus-visible\n */\n focusVisibleMode?: LiteralUnion<FocusVisibleMode, string>;\n onEnter?(outputEvent: MouseEvent): void;\n onLeave?(outputEvent: MouseEvent): void;\n /**\n * Задает border-radius элементу\n * В режиме `auto` на маленьких экранах `border-radius: 0`, иначе определяется токеном `--vkui--size_border_radius--regular`\n */\n borderRadiusMode?: 'auto' | 'inherit';\n}\n\ninterface Wave {\n x: number;\n y: number;\n id: number;\n}\n\nexport interface RootComponentProps extends TouchProps {\n ref?: React.Ref<HTMLElement>;\n}\n\nexport const ACTIVE_DELAY = 70;\nexport const ACTIVE_EFFECT_DELAY = 600;\n\nconst activeBus = mitt<{ active: string }>();\nconst TapState = { none: 0, pending: 1, active: 2, exiting: 3 } as const;\n\ntype TappableContextInterface = { onHoverChange: (s: boolean) => void };\nconst TappableContext = React.createContext<TappableContextInterface>({\n onHoverChange: noop,\n});\n\nfunction isPresetStateMode(stateMode: LiteralUnion<StateMode, string>): stateMode is StateMode {\n switch (stateMode) {\n case 'opacity':\n case 'background':\n return true;\n default:\n return false;\n }\n}\n\nfunction useActivity(hasActive: boolean, stopDelay: number) {\n const id = React.useMemo(() => Math.round(Math.random() * 1e8).toString(16), []);\n\n const [activity, setActivity] = React.useState<(typeof TapState)[keyof typeof TapState]>(\n TapState.none,\n );\n const _stop = () => setActivity(TapState.none);\n const start = () => hasActive && setActivity(TapState.active);\n const delayStart = () => {\n hasActive && setActivity(TapState.pending);\n };\n\n const activeTimeout = useTimeout(start, ACTIVE_DELAY);\n const stopTimeout = useTimeout(_stop, stopDelay);\n\n useIsomorphicLayoutEffect(() => {\n if (activity === TapState.pending) {\n activeTimeout.set();\n return activeTimeout.clear;\n }\n if (activity === TapState.exiting) {\n return stopTimeout.clear;\n }\n if (activity === TapState.active) {\n activeBus.emit('active', id);\n }\n return noop;\n }, [activity]);\n\n useIsomorphicLayoutEffect(() => {\n if (activity === TapState.none) {\n return noop;\n }\n const onActiveChange = (activeId: string) => {\n activeId !== id && _stop();\n };\n activeBus.on('active', onActiveChange);\n return () => activeBus.off('active', onActiveChange);\n }, [activity === TapState.none]);\n\n useIsomorphicLayoutEffect(() => {\n !hasActive && _stop();\n }, [hasActive]);\n\n const stop = (delay?: number) => {\n if (delay) {\n setActivity(TapState.exiting);\n return stopTimeout.set(delay);\n }\n _stop();\n };\n\n return [activity, { delayStart, start, stop }] as const;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Tappable\n */\nexport const Tappable = ({\n children,\n Component,\n onClick,\n onKeyDown: _onKeyDown,\n activeEffectDelay = ACTIVE_EFFECT_DELAY,\n stopPropagation = false,\n getRootRef,\n hasHover: _hasHover = true,\n hoverMode = 'background',\n hasActive: _hasActive = true,\n activeMode = 'background',\n focusVisibleMode = 'inside',\n onEnter,\n onLeave,\n className,\n hovered: hoveredProp,\n activated: activatedProp,\n borderRadiusMode = 'auto',\n ...props\n}: TappableProps) => {\n Component = Component || ((props.href ? 'a' : 'div') as React.ElementType);\n\n const { onHoverChange } = React.useContext(TappableContext);\n const insideTouchRoot = React.useContext(TouchRootContext);\n const platform = usePlatform();\n const { focusVisible, onBlur, onFocus } = useFocusVisible();\n const { sizeX = 'none', hasHover: hasHoverContext = true } = useAdaptivity();\n const hasPointerContext = useAdaptivityHasPointer();\n\n const [clicks, setClicks] = React.useState<Wave[]>([]);\n const [childHover, setChildHover] = React.useState(false);\n const {\n value: _hovered,\n setTrue: setHoveredTrue,\n setFalse: setHoveredFalse,\n } = useBooleanState(false);\n\n const hovered = (_hovered || hoveredProp) && !props.disabled;\n const hasActive = _hasActive && !childHover && !props.disabled;\n const hasHover = hasHoverContext && _hasHover && !childHover;\n const isCustomElement =\n Component !== 'a' && Component !== 'button' && Component !== 'label' && !props.contentEditable;\n const isPresetHoverMode = isPresetStateMode(hoverMode);\n const isPresetActiveMode = isPresetStateMode(activeMode);\n const isPresetFocusVisibleMode = ['inside', 'outside'].includes(focusVisibleMode);\n\n const [activity, { start, stop, delayStart }] = useActivity(hasActive, activeEffectDelay);\n const active = activity === TapState.active || activity === TapState.exiting;\n const activated = (active || activatedProp) && !props.disabled;\n\n const containerRef = useExternRef(getRootRef);\n\n // hover propagation\n const childContext = React.useRef({ onHoverChange: setChildHover }).current;\n useIsomorphicLayoutEffect(() => {\n if (!hovered) {\n return noop;\n }\n onHoverChange(true);\n return () => onHoverChange(false);\n }, [hovered]);\n\n /*\n * [a11y]\n * Обрабатывает событие onkeydown\n * для кастомных доступных элементов:\n * - role=\"link\" (активация по Enter)\n * - role=\"button\" (активация по Space и Enter)\n */\n function onKeyDown(e: React.KeyboardEvent<HTMLElement>) {\n if (isCustomElement && shouldTriggerClickOnEnterOrSpace(e)) {\n e.preventDefault();\n containerRef.current?.click();\n }\n }\n\n const needWaves =\n platform === Platform.ANDROID && !hasPointerContext && hasActive && activeMode === 'background';\n\n const clearClicks = useTimeout(() => setClicks([]), WAVE_LIVE);\n\n function addClick(x: number, y: number) {\n const dateNow = Date.now();\n const filteredClicks = clicks.filter((click) => click.id + WAVE_LIVE > dateNow);\n\n setClicks([...filteredClicks, { x, y, id: dateNow }]);\n clearClicks.set();\n }\n\n function onStart({ originalEvent }: TouchEvent) {\n if (hasActive) {\n if (originalEvent.touches && originalEvent.touches.length > 1) {\n // r сожалению я так и не понял, что это делает и можно ли упихнуть его в Touch\n return stop();\n }\n\n if (needWaves) {\n const { top, left } = getOffsetRect(containerRef.current);\n const x = coordX(originalEvent) - (left ?? 0);\n const y = coordY(originalEvent) - (top ?? 0);\n addClick(x, y);\n }\n\n delayStart();\n }\n }\n\n function onMove({ isSlide }: TouchEvent) {\n if (isSlide) {\n stop();\n }\n }\n\n function onEnd({ duration }: TouchEvent) {\n if (activity === TapState.none) {\n return;\n }\n if (activity === TapState.pending) {\n // активировать при коротком тапе\n start();\n }\n\n // отключить без задержки при длинном тапе\n const activeDuration = duration - ACTIVE_DELAY;\n stop(activeDuration >= 100 ? 0 : activeEffectDelay - activeDuration);\n }\n\n const classes = classNames(\n className,\n styles['Tappable'],\n 'vkuiInternalTappable',\n platform === Platform.IOS && styles['Tappable--ios'],\n sizeX !== SizeType.REGULAR && sizeXClassNames[sizeX],\n hasHover && styles['Tappable--hasHover'],\n hasActive && styles['Tappable--hasActive'],\n hasHover && hovered && !isPresetHoverMode && hoverMode,\n hasActive && activated && !isPresetActiveMode && activeMode,\n focusVisible && !isPresetFocusVisibleMode && focusVisibleMode,\n hasHover && hovered && isPresetHoverMode && stylesHoverMode[hoverMode],\n hasActive && activated && isPresetActiveMode && stylesActiveMode[activeMode],\n focusVisible && styles['Tappable--focus-visible'],\n borderRadiusMode === 'inherit' && styles['Tappable--borderRadiusInherit'],\n );\n\n const handlers: RootComponentProps = {\n onStart: callMultiple(onStart, props.onStart),\n onMove: callMultiple(onMove, props.onMove),\n onEnd: callMultiple(onEnd, props.onEnd),\n onClick,\n onKeyDown: callMultiple(onKeyDown, _onKeyDown),\n };\n const role = props.href ? 'link' : 'button';\n\n return (\n <Touch\n onEnter={callMultiple(setHoveredTrue, onEnter)}\n onLeave={callMultiple(setHoveredFalse, onLeave)}\n type={Component === 'button' ? 'button' : undefined}\n tabIndex={isCustomElement && !props.disabled ? 0 : undefined}\n role={isCustomElement ? role : undefined}\n aria-disabled={isCustomElement ? props.disabled : undefined}\n stopPropagation={stopPropagation && !insideTouchRoot && !props.disabled}\n {...props}\n slideThreshold={20}\n usePointerHover\n className={classes}\n Component={Component}\n getRootRef={containerRef}\n onBlur={callMultiple(onBlur, props.onBlur)}\n onFocus={callMultiple(onFocus, props.onFocus)}\n {...(props.disabled ? {} : handlers)}\n >\n <TappableContext.Provider value={childContext}>{children}</TappableContext.Provider>\n {needWaves && (\n <span aria-hidden className={styles.Tappable__waves}>\n {clicks.map((wave) => (\n <span\n key={wave.id}\n className={styles.Tappable__wave}\n style={{ top: wave.y, left: wave.x }}\n />\n ))}\n </span>\n )}\n {((hasHover && hoverMode === 'background') || (hasActive && activeMode === 'background')) && (\n <span aria-hidden className={styles.Tappable__stateLayer} />\n )}\n {!props.disabled && isPresetFocusVisibleMode && (\n <FocusVisible visible={focusVisible} mode={focusVisibleMode as FocusVisibleMode} />\n )}\n </Touch>\n );\n};\n"],"names":["React","classNames","noop","mitt","useAdaptivity","useAdaptivityHasPointer","useBooleanState","useExternRef","useFocusVisible","usePlatform","useTimeout","shouldTriggerClickOnEnterOrSpace","SizeType","callMultiple","getOffsetRect","Platform","coordX","coordY","useIsomorphicLayoutEffect","FocusVisible","Touch","TouchRootContext","styles","sizeXClassNames","none","compact","stylesHoverMode","background","opacity","stylesActiveMode","WAVE_LIVE","ACTIVE_DELAY","ACTIVE_EFFECT_DELAY","activeBus","TapState","pending","active","exiting","TappableContext","createContext","onHoverChange","isPresetStateMode","stateMode","useActivity","hasActive","stopDelay","id","useMemo","Math","round","random","toString","activity","setActivity","useState","_stop","start","delayStart","activeTimeout","stopTimeout","set","clear","emit","onActiveChange","activeId","on","off","stop","delay","Tappable","children","Component","onClick","onKeyDown","_onKeyDown","activeEffectDelay","stopPropagation","getRootRef","hasHover","_hasHover","hoverMode","_hasActive","activeMode","focusVisibleMode","onEnter","onLeave","className","hovered","hoveredProp","activated","activatedProp","borderRadiusMode","props","href","useContext","insideTouchRoot","platform","focusVisible","onBlur","onFocus","sizeX","hasHoverContext","hasPointerContext","clicks","setClicks","childHover","setChildHover","value","_hovered","setTrue","setHoveredTrue","setFalse","setHoveredFalse","disabled","isCustomElement","contentEditable","isPresetHoverMode","isPresetActiveMode","isPresetFocusVisibleMode","includes","containerRef","childContext","useRef","current","e","preventDefault","click","needWaves","ANDROID","clearClicks","addClick","x","y","dateNow","Date","now","filteredClicks","filter","onStart","originalEvent","touches","length","top","left","onMove","isSlide","onEnd","duration","activeDuration","classes","IOS","REGULAR","handlers","role","type","undefined","tabIndex","aria-disabled","slideThreshold","usePointerHover","Provider","span","aria-hidden","Tappable__waves","map","wave","key","Tappable__wave","style","Tappable__stateLayer","visible","mode"],"mappings":"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"}
|
|
@@ -4,6 +4,8 @@ export interface CaptionProps extends TypographyProps, HasCaps {
|
|
|
4
4
|
level?: '1' | '2' | '3';
|
|
5
5
|
}
|
|
6
6
|
/**
|
|
7
|
+
* Используется для мелких подписей.
|
|
8
|
+
*
|
|
7
9
|
* @see https://vkcom.github.io/VKUI/#/Caption
|
|
8
10
|
*/
|
|
9
11
|
export declare const Caption: ({ className, level, caps, Component, normalize, ...restProps }: CaptionProps) => React.JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Caption.d.ts","sourceRoot":"","sources":["../../../../../src/components/Typography/Caption/Caption.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,OAAO,EAAc,eAAe,EAAE,MAAM,eAAe,CAAC;AASrE,MAAM,WAAW,YAAa,SAAQ,eAAe,EAAE,OAAO;IAC5D,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CACzB;AAED
|
|
1
|
+
{"version":3,"file":"Caption.d.ts","sourceRoot":"","sources":["../../../../../src/components/Typography/Caption/Caption.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,OAAO,EAAc,eAAe,EAAE,MAAM,eAAe,CAAC;AASrE,MAAM,WAAW,YAAa,SAAQ,eAAe,EAAE,OAAO;IAC5D,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CACzB;AAED;;;;GAIG;AACH,eAAO,MAAM,OAAO,mEAOjB,YAAY,sBASd,CAAC"}
|
|
@@ -8,6 +8,8 @@ const stylesLevel = {
|
|
|
8
8
|
'3': styles['Caption--level-3']
|
|
9
9
|
};
|
|
10
10
|
/**
|
|
11
|
+
* Используется для мелких подписей.
|
|
12
|
+
*
|
|
11
13
|
* @see https://vkcom.github.io/VKUI/#/Caption
|
|
12
14
|
*/ export const Caption = ({ className, level = '1', caps, Component = 'span', normalize = true, ...restProps })=>{
|
|
13
15
|
return /*#__PURE__*/ React.createElement(Typography, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/components/Typography/Caption/Caption.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { HasCaps, Typography, TypographyProps } from '../Typography';\nimport styles from './Caption.module.css';\n\nconst stylesLevel = {\n '1': styles['Caption--level-1'],\n '2': styles['Caption--level-2'],\n '3': styles['Caption--level-3'],\n};\n\nexport interface CaptionProps extends TypographyProps, HasCaps {\n level?: '1' | '2' | '3';\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Caption\n */\nexport const Caption = ({\n className,\n level = '1',\n caps,\n Component = 'span',\n normalize = true,\n ...restProps\n}: CaptionProps) => {\n return (\n <Typography\n Component={Component}\n normalize={normalize}\n className={classNames(className, caps && styles['Caption--caps'], stylesLevel[level])}\n {...restProps}\n />\n );\n};\n"],"names":["React","classNames","Typography","styles","stylesLevel","Caption","className","level","caps","Component","normalize","restProps"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAAkBC,UAAU,QAAyB,gBAAgB;AACrE,OAAOC,YAAY,uBAAuB;AAE1C,MAAMC,cAAc;IAClB,KAAKD,MAAM,CAAC,mBAAmB;IAC/B,KAAKA,MAAM,CAAC,mBAAmB;IAC/B,KAAKA,MAAM,CAAC,mBAAmB;AACjC;AAMA
|
|
1
|
+
{"version":3,"sources":["../../../../../src/components/Typography/Caption/Caption.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { HasCaps, Typography, TypographyProps } from '../Typography';\nimport styles from './Caption.module.css';\n\nconst stylesLevel = {\n '1': styles['Caption--level-1'],\n '2': styles['Caption--level-2'],\n '3': styles['Caption--level-3'],\n};\n\nexport interface CaptionProps extends TypographyProps, HasCaps {\n level?: '1' | '2' | '3';\n}\n\n/**\n * Используется для мелких подписей.\n *\n * @see https://vkcom.github.io/VKUI/#/Caption\n */\nexport const Caption = ({\n className,\n level = '1',\n caps,\n Component = 'span',\n normalize = true,\n ...restProps\n}: CaptionProps) => {\n return (\n <Typography\n Component={Component}\n normalize={normalize}\n className={classNames(className, caps && styles['Caption--caps'], stylesLevel[level])}\n {...restProps}\n />\n );\n};\n"],"names":["React","classNames","Typography","styles","stylesLevel","Caption","className","level","caps","Component","normalize","restProps"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAAkBC,UAAU,QAAyB,gBAAgB;AACrE,OAAOC,YAAY,uBAAuB;AAE1C,MAAMC,cAAc;IAClB,KAAKD,MAAM,CAAC,mBAAmB;IAC/B,KAAKA,MAAM,CAAC,mBAAmB;IAC/B,KAAKA,MAAM,CAAC,mBAAmB;AACjC;AAMA;;;;CAIC,GACD,OAAO,MAAME,UAAU,CAAC,EACtBC,SAAS,EACTC,QAAQ,GAAG,EACXC,IAAI,EACJC,YAAY,MAAM,EAClBC,YAAY,IAAI,EAChB,GAAGC,WACU;IACb,qBACE,oBAACT;QACCO,WAAWA;QACXC,WAAWA;QACXJ,WAAWL,WAAWK,WAAWE,QAAQL,MAAM,CAAC,gBAAgB,EAAEC,WAAW,CAACG,MAAM;QACnF,GAAGI,SAAS;;AAGnB,EAAE"}
|