@vkontakte/vkui 5.7.1 → 5.7.2
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/Banner/Banner.js +1 -1
- package/dist/cjs/components/Banner/Banner.js.map +1 -1
- package/dist/cjs/components/Checkbox/Checkbox.js +3 -1
- package/dist/cjs/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js +4 -2
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cjs/components/Group/Group.js +2 -3
- package/dist/cjs/components/Group/Group.js.map +1 -1
- package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js +13 -11
- package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/cjs/components/Image/Image.js +52 -37
- package/dist/cjs/components/Image/Image.js.map +1 -1
- package/dist/cjs/components/ImageBase/ImageBase.js +20 -1
- package/dist/cjs/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/cjs/components/MiniInfoCell/MiniInfoCell.js +1 -1
- package/dist/cjs/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
- package/dist/cjs/components/PopoutRoot/PopoutRoot.js +1 -3
- package/dist/cjs/components/PopoutRoot/PopoutRoot.js.map +1 -1
- package/dist/cjs/components/PopoutWrapper/PopoutWrapper.js +1 -1
- package/dist/cjs/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
- package/dist/cjs/components/SelectMimicry/SelectMimicry.d.ts +1 -1
- package/dist/cjs/components/SelectMimicry/SelectMimicry.js +8 -3
- package/dist/cjs/components/SelectMimicry/SelectMimicry.js.map +1 -1
- package/dist/cjs/components/SimpleCell/SimpleCell.js +0 -1
- package/dist/cjs/components/SimpleCell/SimpleCell.js.map +1 -1
- package/dist/cjs/components/View/View.js +4 -4
- package/dist/cjs/components/View/View.js.map +1 -1
- package/dist/cjs/components/View/ViewInfinite.js +4 -4
- package/dist/cjs/components/View/ViewInfinite.js.map +1 -1
- package/dist/cjs/hooks/useAdaptivityHasHover.js +4 -3
- package/dist/cjs/hooks/useAdaptivityHasHover.js.map +1 -1
- package/dist/cjs/hooks/useAdaptivityHasPointer.js +5 -5
- package/dist/cjs/hooks/useAdaptivityHasPointer.js.map +1 -1
- package/dist/cjs/hooks/useAutoFocus.d.ts +2 -0
- package/dist/cjs/hooks/useAutoFocus.js +23 -0
- package/dist/cjs/hooks/useAutoFocus.js.map +1 -0
- package/dist/cjs/hooks/useChipsSelect.js +5 -4
- package/dist/cjs/hooks/useChipsSelect.js.map +1 -1
- package/dist/cjs/hooks/useFocusWithin.js +3 -0
- package/dist/cjs/hooks/useFocusWithin.js.map +1 -1
- package/dist/cjs/hooks/useIsClient.js +2 -1
- package/dist/cjs/hooks/useIsClient.js.map +1 -1
- package/dist/components/Banner/Banner.js +2 -2
- package/dist/components/Banner/Banner.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.js +3 -1
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/ChipsSelect/ChipsSelect.js +4 -2
- package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/components/Group/Group.js +2 -3
- package/dist/components/Group/Group.js.map +1 -1
- package/dist/components/HorizontalScroll/HorizontalScroll.js +13 -11
- package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/components/Image/Image.js +54 -39
- package/dist/components/Image/Image.js.map +1 -1
- package/dist/components/ImageBase/ImageBase.js +20 -1
- package/dist/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/components/MiniInfoCell/MiniInfoCell.js +1 -1
- package/dist/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
- package/dist/components/PopoutRoot/PopoutRoot.js +1 -3
- package/dist/components/PopoutRoot/PopoutRoot.js.map +1 -1
- package/dist/components/PopoutWrapper/PopoutWrapper.js +1 -1
- package/dist/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
- package/dist/components/SelectMimicry/SelectMimicry.d.ts +1 -1
- package/dist/components/SelectMimicry/SelectMimicry.js +8 -3
- package/dist/components/SelectMimicry/SelectMimicry.js.map +1 -1
- package/dist/components/SimpleCell/SimpleCell.js +0 -1
- package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
- package/dist/components/View/View.js +4 -4
- package/dist/components/View/View.js.map +1 -1
- package/dist/components/View/ViewInfinite.js +4 -4
- package/dist/components/View/ViewInfinite.js.map +1 -1
- package/dist/components.css +22 -22
- package/dist/components.css.map +1 -1
- package/dist/components.js.tmp +757 -698
- package/dist/cssm/components/ActionSheet/ActionSheet.module.css +3 -3
- package/dist/cssm/components/Alert/Alert.module.css +4 -4
- package/dist/cssm/components/Banner/Banner.js +2 -2
- package/dist/cssm/components/Banner/Banner.js.map +1 -1
- package/dist/cssm/components/Banner/Banner.module.css +2 -2
- package/dist/cssm/components/Checkbox/Checkbox.js +3 -1
- package/dist/cssm/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/cssm/components/Checkbox/Checkbox.module.css +6 -0
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js +3 -1
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cssm/components/FocusVisible/FocusVisible.module.css +4 -4
- package/dist/cssm/components/Group/Group.js +2 -3
- package/dist/cssm/components/Group/Group.js.map +1 -1
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +13 -11
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/cssm/components/Image/Image.js +46 -33
- package/dist/cssm/components/Image/Image.js.map +1 -1
- package/dist/cssm/components/ImageBase/ImageBase.js +20 -1
- package/dist/cssm/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js +1 -1
- package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
- package/dist/cssm/components/ModalPage/ModalPage.module.css +0 -4
- package/dist/cssm/components/ModalRoot/ModalRoot.module.css +2 -2
- package/dist/cssm/components/PanelHeader/PanelHeader.module.css +4 -2
- package/dist/cssm/components/PanelHeaderContext/PanelHeaderContext.module.css +8 -8
- package/dist/cssm/components/Placeholder/Placeholder.module.css +1 -0
- package/dist/cssm/components/PopoutRoot/PopoutRoot.js +1 -3
- package/dist/cssm/components/PopoutRoot/PopoutRoot.js.map +1 -1
- package/dist/cssm/components/PopoutRoot/PopoutRoot.module.css +0 -4
- package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js +1 -1
- package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
- package/dist/cssm/components/PopoutWrapper/PopoutWrapper.module.css +2 -2
- package/dist/cssm/components/Popover/Popover.module.css +2 -2
- package/dist/cssm/components/PullToRefresh/PullToRefresh.module.css +4 -4
- package/dist/cssm/components/RichTooltip/RichTooltip.module.css +2 -2
- package/dist/cssm/components/Root/Root.module.css +12 -13
- package/dist/cssm/components/ScreenSpinner/ScreenSpinner.module.css +5 -5
- package/dist/cssm/components/SelectMimicry/SelectMimicry.d.ts +1 -1
- package/dist/cssm/components/SelectMimicry/SelectMimicry.js +6 -2
- package/dist/cssm/components/SelectMimicry/SelectMimicry.js.map +1 -1
- package/dist/cssm/components/SimpleCell/SimpleCell.js +0 -1
- package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
- package/dist/cssm/components/Snackbar/Snackbar.module.css +4 -4
- package/dist/cssm/components/Tappable/Tappable.module.css +2 -2
- package/dist/cssm/components/TextTooltip/TextTooltip.module.css +2 -2
- package/dist/cssm/components/View/View.js +4 -4
- package/dist/cssm/components/View/View.js.map +1 -1
- package/dist/cssm/components/View/View.module.css +16 -16
- package/dist/cssm/components/View/ViewInfinite.js +4 -4
- package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
- package/dist/cssm/hooks/useAdaptivityHasHover.js +4 -3
- package/dist/cssm/hooks/useAdaptivityHasHover.js.map +1 -1
- package/dist/cssm/hooks/useAdaptivityHasPointer.js +5 -5
- package/dist/cssm/hooks/useAdaptivityHasPointer.js.map +1 -1
- package/dist/cssm/hooks/useAutoFocus.d.ts +2 -0
- package/dist/cssm/hooks/useAutoFocus.js +12 -0
- package/dist/cssm/hooks/useAutoFocus.js.map +1 -0
- package/dist/cssm/hooks/useChipsSelect.js +5 -4
- package/dist/cssm/hooks/useChipsSelect.js.map +1 -1
- package/dist/cssm/hooks/useFocusWithin.js +3 -0
- package/dist/cssm/hooks/useFocusWithin.js.map +1 -1
- package/dist/cssm/hooks/useIsClient.js +2 -1
- package/dist/cssm/hooks/useIsClient.js.map +1 -1
- package/dist/cssm/styles/constants.css +1 -1
- package/dist/hooks/useAdaptivityHasHover.js +4 -3
- package/dist/hooks/useAdaptivityHasHover.js.map +1 -1
- package/dist/hooks/useAdaptivityHasPointer.js +5 -5
- package/dist/hooks/useAdaptivityHasPointer.js.map +1 -1
- package/dist/hooks/useAutoFocus.d.ts +2 -0
- package/dist/hooks/useAutoFocus.js +12 -0
- package/dist/hooks/useAutoFocus.js.map +1 -0
- package/dist/hooks/useChipsSelect.js +5 -4
- package/dist/hooks/useChipsSelect.js.map +1 -1
- package/dist/hooks/useFocusWithin.js +3 -0
- package/dist/hooks/useFocusWithin.js.map +1 -1
- package/dist/hooks/useIsClient.js +2 -1
- package/dist/hooks/useIsClient.js.map +1 -1
- package/dist/vkui.css +22 -22
- package/dist/vkui.css.map +1 -1
- package/dist/vkui.js.tmp +757 -698
- package/package.json +1 -1
|
@@ -247,10 +247,10 @@ class ViewInfiniteComponent extends React.Component {
|
|
|
247
247
|
}
|
|
248
248
|
transitionEndHandler = (e)=>{
|
|
249
249
|
if ((!e || [
|
|
250
|
-
styles['
|
|
251
|
-
styles['
|
|
252
|
-
styles['
|
|
253
|
-
styles['
|
|
250
|
+
styles['animation-ios-next-forward'],
|
|
251
|
+
styles['animation-ios-prev-back'],
|
|
252
|
+
styles['animation-view-next-forward'],
|
|
253
|
+
styles['animation-view-prev-back']
|
|
254
254
|
].includes(e.animationName)) && this.state.prevPanel !== null) {
|
|
255
255
|
this.flushTransition(this.state.prevPanel, Boolean(this.state.isBack));
|
|
256
256
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/View/ViewInfinite.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { withContext } from '../../hoc/withContext';\nimport { withPlatform } from '../../hoc/withPlatform';\nimport { canUseDOM, DOMProps, withDOM } from '../../lib/dom';\nimport { getNavId, NavIdProps } from '../../lib/getNavId';\nimport { Platform } from '../../lib/platform';\nimport { animationEvent, transitionEvent } from '../../lib/supportEvents';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasPlatform } from '../../types';\nimport { ScrollContext, ScrollContextInterface } from '../AppRoot/ScrollContext';\nimport {\n ConfigProviderContext,\n ConfigProviderContextInterface,\n} from '../ConfigProvider/ConfigProviderContext';\nimport { NavTransitionProvider } from '../NavTransitionContext/NavTransitionContext';\nimport { SplitColContext, SplitColContextProps } from '../SplitCol/SplitColContext';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport { swipeBackExcluded } from './utils';\nimport styles from './View.module.css';\n\nconst warn = warnOnce('ViewInfinite');\n\nenum SwipeBackResults {\n fail = 1,\n success,\n}\n\ninterface Scrolls {\n [index: string]: Array<number | undefined>;\n}\n\ninterface ViewsScrolls {\n [index: string]: Scrolls;\n}\n\ntype TransitionEventHandler = (e?: TransitionEvent) => void;\n\nlet scrollsCache: ViewsScrolls = {};\n\nexport type TransitionParams = { from: string | null; to: string | null };\n\nexport interface ViewInfiniteProps\n extends React.HTMLAttributes<HTMLElement>,\n HasPlatform,\n NavIdProps {\n activePanel: string;\n onTransition?(params: TransitionParams & { isBack: boolean }): void;\n /**\n * callback свайпа назад\n */\n onSwipeBack?(): void;\n /**\n * callback начала анимации свайпа назад.\n */\n onSwipeBackStart?(activePanel: string | null): void | 'prevent';\n /**\n * callback завершения анимации отмененного пользователем свайпа\n */\n onSwipeBackCancel?(): void;\n history?: string[];\n isBackCheck?(params: TransitionParams): boolean;\n /**\n * @ignore\n */\n splitCol?: SplitColContextProps;\n /**\n * @ignore\n */\n configProvider?: ConfigProviderContextInterface;\n /**\n * @ignore\n */\n scroll?: ScrollContextInterface;\n}\n\nexport interface ViewInfiniteState {\n animated: boolean;\n\n visiblePanels: Array<string | null>;\n activePanel: string | null;\n isBack?: boolean;\n prevPanel: string | null;\n nextPanel: string | null;\n\n swipingBack: boolean;\n swipeBackPrevented: boolean;\n swipeBackStartX: number;\n swipeBackShift: number;\n swipeBackNextPanel: string | null;\n swipeBackPrevPanel: string | null;\n swipeBackResult: SwipeBackResults | null;\n\n browserSwipe: boolean;\n}\n\nclass ViewInfiniteComponent extends React.Component<\n ViewInfiniteProps & DOMProps,\n ViewInfiniteState\n> {\n private static readonly SWIPE_BACK_AREA = 70;\n\n constructor(props: ViewInfiniteProps) {\n super(props);\n\n this.state = {\n animated: false,\n\n visiblePanels: [props.activePanel],\n activePanel: props.activePanel,\n isBack: undefined,\n prevPanel: null,\n nextPanel: null,\n\n swipingBack: false,\n swipeBackPrevented: false,\n swipeBackStartX: 0,\n swipeBackShift: 0,\n swipeBackNextPanel: null,\n swipeBackPrevPanel: null,\n swipeBackResult: null,\n\n browserSwipe: false,\n };\n }\n\n static defaultProps: Partial<ViewInfiniteProps> = {\n history: [],\n };\n\n private scrolls = scrollsCache[getNavId(this.props, warn) as string] || {};\n private transitionFinishTimeout: ReturnType<typeof setTimeout> | undefined = undefined;\n private animationFinishTimeout: ReturnType<typeof setTimeout> | undefined = undefined;\n\n get document() {\n return this.props.document;\n }\n\n get window() {\n return this.props.window;\n }\n\n get panels() {\n return React.Children.toArray(this.props.children) as React.ReactElement[];\n }\n\n panelNodes: { [id: string]: HTMLDivElement | null } = {};\n\n componentWillUnmount() {\n const id = getNavId(this.props);\n if (id) {\n scrollsCache[id] = this.scrolls;\n }\n if (this.animationFinishTimeout) {\n clearTimeout(this.animationFinishTimeout);\n }\n }\n\n componentDidUpdate(prevProps: ViewInfiniteProps, prevState: ViewInfiniteState) {\n // Нужен переход\n if (\n prevProps.activePanel !== this.props.activePanel &&\n !prevState.swipingBack &&\n !prevState.browserSwipe\n ) {\n let isBack = false;\n\n if (this.props.isBackCheck) {\n isBack = this.props.isBackCheck({\n from: prevProps.activePanel,\n to: this.props.activePanel,\n });\n } else {\n const firstLayerId = this.panels\n .map((panel) => getNavId(panel.props, warn))\n .find((id) => id === prevProps.activePanel || id === this.props.activePanel);\n isBack = firstLayerId === this.props.activePanel;\n }\n\n this.blurActiveElement();\n\n const prevScrolls = this.scrolls[prevProps.activePanel] || [];\n const scrolls = {\n ...this.scrolls,\n [prevProps.activePanel]: [...prevScrolls, this.props.scroll?.getScroll().y],\n };\n this.scrolls = scrolls;\n\n if (this.shouldDisableTransitionMotion()) {\n this.flushTransition(prevProps.activePanel, isBack);\n } else {\n this.setState({\n visiblePanels: [prevProps.activePanel, this.props.activePanel],\n prevPanel: prevProps.activePanel,\n nextPanel: this.props.activePanel,\n activePanel: null,\n animated: true,\n isBack,\n });\n\n // Фолбек анимации перехода\n if (!animationEvent.supported) {\n if (this.animationFinishTimeout) {\n clearTimeout(this.animationFinishTimeout);\n }\n this.animationFinishTimeout = setTimeout(\n this.transitionEndHandler,\n this.props.platform === Platform.ANDROID || this.props.platform === Platform.VKCOM\n ? 300\n : 600,\n );\n }\n }\n }\n\n // Закончилась анимация свайпа назад\n if (prevProps.activePanel !== this.props.activePanel && prevState.swipingBack) {\n const nextPanel = this.state.swipeBackNextPanel;\n const prevPanel = this.state.swipeBackPrevPanel;\n let scrollPosition: undefined | number = undefined;\n\n this.scrolls = {\n ...this.scrolls,\n };\n\n if (prevPanel !== null) {\n const prevPanelScrolls = [...(this.scrolls[prevPanel] || [])].slice(0, -1);\n this.scrolls[prevPanel] = prevPanelScrolls;\n }\n if (nextPanel !== null) {\n const newPanelScrolls = [...(this.scrolls[nextPanel] || [])];\n scrollPosition = newPanelScrolls.pop();\n this.scrolls[nextPanel] = newPanelScrolls;\n }\n\n this.setState(\n {\n swipeBackPrevPanel: null,\n swipeBackNextPanel: null,\n swipingBack: false,\n swipeBackResult: null,\n swipeBackStartX: 0,\n swipeBackShift: 0,\n activePanel: nextPanel,\n visiblePanels: [nextPanel],\n },\n () => {\n this.props.scroll?.scrollTo(0, scrollPosition);\n prevProps.onTransition &&\n prevProps.onTransition({\n isBack: true,\n from: prevPanel,\n to: nextPanel,\n });\n },\n );\n }\n\n // Началась анимация завершения свайпа назад.\n if (!prevState.swipeBackResult && this.state.swipeBackResult) {\n this.waitTransitionFinish(\n this.pickPanel(this.state.swipeBackNextPanel),\n this.swipingBackTransitionEndHandler,\n );\n }\n\n // Если свайп назад отменился (когда пользователь недостаточно сильно свайпнул)\n if (\n prevState.swipeBackResult === SwipeBackResults.fail &&\n !this.state.swipeBackResult &&\n this.state.activePanel !== null\n ) {\n const newPanelScrolls = [...(this.scrolls[this.state.activePanel] || [])];\n const scrollPosition = newPanelScrolls.pop();\n this.scrolls = {\n ...this.scrolls,\n [this.state.activePanel]: newPanelScrolls,\n };\n\n this.props.scroll?.scrollTo(0, scrollPosition);\n }\n\n // Закончился Safari свайп\n if (prevProps.activePanel !== this.props.activePanel && this.state.browserSwipe) {\n this.setState({\n browserSwipe: false,\n nextPanel: null,\n prevPanel: null,\n animated: false,\n visiblePanels: [this.props.activePanel],\n activePanel: this.props.activePanel,\n });\n }\n }\n\n shouldDisableTransitionMotion(): boolean {\n return (\n this.props.configProvider?.transitionMotionEnabled === false ||\n !this.props.splitCol?.animate ||\n this.props.platform === Platform.VKCOM\n );\n }\n\n waitTransitionFinish(\n elem: HTMLElement | null | undefined,\n eventHandler: TransitionEventHandler,\n ): void {\n if (transitionEvent.supported && transitionEvent.name && elem) {\n elem.removeEventListener(\n transitionEvent.name as keyof HTMLElementEventMap,\n eventHandler as EventListener,\n );\n elem.addEventListener(\n transitionEvent.name as keyof HTMLElementEventMap,\n eventHandler as EventListener,\n );\n } else {\n if (this.transitionFinishTimeout) {\n clearTimeout(this.transitionFinishTimeout);\n }\n\n this.transitionFinishTimeout = setTimeout(\n eventHandler,\n this.props.platform === Platform.ANDROID || this.props.platform === Platform.VKCOM\n ? 300\n : 600,\n );\n }\n }\n\n blurActiveElement(): void {\n if (typeof this.window !== 'undefined' && this.document?.activeElement) {\n (this.document.activeElement as HTMLElement).blur();\n }\n }\n\n pickPanel(id: string | null) {\n if (id === null) {\n return undefined;\n }\n return this.panelNodes[id];\n }\n\n flushTransition(prevPanel: string, isBack: boolean) {\n const activePanel = this.props.activePanel;\n\n const prevPanelScrolls = [...(this.scrolls[prevPanel] || [])].slice(0, -1);\n const newPanelScrolls = [...(this.scrolls[activePanel] || [])];\n const scrollPosition = isBack ? newPanelScrolls.pop() : 0;\n if (isBack) {\n this.scrolls = {\n ...this.scrolls,\n [prevPanel]: prevPanelScrolls,\n [activePanel]: newPanelScrolls,\n };\n }\n\n this.setState(\n {\n prevPanel: null,\n nextPanel: null,\n visiblePanels: [activePanel],\n activePanel: activePanel,\n animated: false,\n isBack: undefined,\n },\n () => {\n this.props.scroll?.scrollTo(0, isBack ? scrollPosition : 0);\n this.props.onTransition &&\n this.props.onTransition({ isBack, from: prevPanel, to: activePanel });\n },\n );\n }\n\n transitionEndHandler = (e?: React.AnimationEvent): void => {\n if (\n (!e ||\n [\n styles['vkui-animation-ios-next-forward'],\n styles['vkui-animation-ios-prev-back'],\n styles['vkui-animation-view-next-forward'],\n styles['vkui-animation-view-prev-back'],\n ].includes(e.animationName)) &&\n this.state.prevPanel !== null\n ) {\n this.flushTransition(this.state.prevPanel, Boolean(this.state.isBack));\n }\n };\n\n swipingBackTransitionEndHandler = (e?: TransitionEvent): void => {\n // indexOf because of vendor prefixes in old browsers\n if (\n !e ||\n (e.propertyName.includes('transform') &&\n e.target === this.pickPanel(this.state.swipeBackNextPanel))\n ) {\n switch (this.state.swipeBackResult) {\n case SwipeBackResults.fail:\n this.onSwipeBackCancel();\n break;\n case SwipeBackResults.success:\n this.onSwipeBackSuccess();\n }\n }\n };\n\n onSwipeBackSuccess(): void {\n this.props.onSwipeBack && this.props.onSwipeBack();\n }\n\n onSwipeBackCancel(): void {\n this.props.onSwipeBackCancel && this.props.onSwipeBackCancel();\n this.setState({\n swipeBackPrevPanel: null,\n swipeBackNextPanel: null,\n swipingBack: false,\n swipeBackResult: null,\n swipeBackStartX: 0,\n swipeBackShift: 0,\n });\n }\n\n onMoveX = (event: TouchEvent): void => {\n if (\n !this.window ||\n this.props.platform !== Platform.IOS ||\n this.state.swipeBackPrevented ||\n swipeBackExcluded(event) ||\n this.shouldDisableTransitionMotion()\n ) {\n return;\n }\n\n if (!this.props.configProvider?.isWebView) {\n if (\n (event.startX <= ViewInfiniteComponent.SWIPE_BACK_AREA ||\n event.startX >= this.window.innerWidth - ViewInfiniteComponent.SWIPE_BACK_AREA) &&\n !this.state.browserSwipe\n ) {\n this.setState({ browserSwipe: true });\n }\n\n return;\n }\n\n if (\n !this.props.onSwipeBack ||\n (this.state.animated && event.startX <= ViewInfiniteComponent.SWIPE_BACK_AREA)\n ) {\n return;\n }\n\n if (\n !this.state.swipingBack &&\n event.startX <= ViewInfiniteComponent.SWIPE_BACK_AREA &&\n this.props.history &&\n this.props.history.length > 1\n ) {\n if (this.props.onSwipeBackStart) {\n const payload = this.props.onSwipeBackStart(this.state.activePanel);\n if (payload === 'prevent') {\n this.setState({ swipeBackPrevented: true });\n return;\n }\n }\n\n if (this.state.activePanel !== null) {\n // Note: вызываем закрытие клавиатуры. В iOS это нативное поведение при свайпе.\n this.blurActiveElement();\n const prevScrolls = this.scrolls[this.state.activePanel] || [];\n this.scrolls = {\n ...this.scrolls,\n [this.state.activePanel]: [...prevScrolls, this.props.scroll?.getScroll().y],\n };\n }\n\n this.setState({\n swipingBack: true,\n swipeBackStartX: event.startX,\n swipeBackPrevPanel: this.state.activePanel,\n swipeBackNextPanel: this.props.history.slice(-2)[0],\n });\n }\n\n if (this.state.swipingBack) {\n let swipeBackShift;\n if (event.shiftX < 0) {\n swipeBackShift = 0;\n } else if (event.shiftX > this.window.innerWidth - this.state.swipeBackStartX) {\n swipeBackShift = this.window.innerWidth;\n } else {\n swipeBackShift = event.shiftX;\n }\n this.setState({ swipeBackShift });\n }\n };\n\n onEnd = (event: TouchEvent): void => {\n if (this.state.swipingBack && this.window) {\n const speed = (this.state.swipeBackShift / event.duration) * 1000;\n if (this.state.swipeBackShift === 0) {\n this.onSwipeBackCancel();\n } else if (this.state.swipeBackShift >= this.window.innerWidth) {\n this.onSwipeBackSuccess();\n } else if (\n speed > 250 ||\n this.state.swipeBackStartX + this.state.swipeBackShift > this.window.innerWidth / 2\n ) {\n this.setState({ swipeBackResult: SwipeBackResults.success });\n } else {\n this.setState({ swipeBackResult: SwipeBackResults.fail });\n }\n }\n if (this.state.swipeBackPrevented) {\n this.setState({ swipeBackPrevented: false });\n }\n };\n\n calcPanelSwipeStyles(panelId: string | undefined): React.CSSProperties {\n if (!canUseDOM || !this.window) {\n return {};\n }\n\n const isPrev = panelId === this.state.swipeBackPrevPanel;\n const isNext = panelId === this.state.swipeBackNextPanel;\n\n if ((!isPrev && !isNext) || this.state.swipeBackResult) {\n return {};\n }\n\n let prevPanelTranslate = `${this.state.swipeBackShift}px`;\n let nextPanelTranslate = `${\n -50 + (this.state.swipeBackShift * 100) / this.window.innerWidth / 2\n }%`;\n let prevPanelShadow =\n (0.3 * (this.window.innerWidth - this.state.swipeBackShift)) / this.window.innerWidth;\n\n if (this.state.swipeBackResult) {\n return isPrev ? { boxShadow: `-2px 0 12px rgba(0, 0, 0, ${prevPanelShadow})` } : {};\n }\n\n if (isNext) {\n return {\n transform: `translate3d(${nextPanelTranslate}, 0, 0)`,\n WebkitTransform: `translate3d(${nextPanelTranslate}, 0, 0)`,\n };\n }\n if (isPrev) {\n return {\n transform: `translate3d(${prevPanelTranslate}, 0, 0)`,\n WebkitTransform: `translate3d(${prevPanelTranslate}, 0, 0)`,\n boxShadow: `-2px 0 12px rgba(0, 0, 0, ${prevPanelShadow})`,\n };\n }\n\n return {};\n }\n\n render() {\n const {\n platform,\n activePanel: _1,\n splitCol,\n configProvider,\n history,\n id,\n nav,\n onTransition,\n onSwipeBack,\n onSwipeBackStart,\n onSwipeBackCancel,\n window,\n document,\n scroll,\n isBackCheck,\n className,\n ...restProps\n } = this.props;\n const {\n prevPanel,\n nextPanel,\n activePanel,\n isBack,\n animated,\n swipeBackPrevPanel,\n swipeBackNextPanel,\n swipeBackResult,\n swipingBack,\n } = this.state;\n\n const panels = this.panels\n .filter((panel) => {\n const panelId = getNavId(panel.props, warn);\n\n return (\n (panelId !== undefined && this.state.visiblePanels.includes(panelId)) ||\n panelId === swipeBackPrevPanel ||\n panelId === swipeBackNextPanel\n );\n })\n .sort((panel) => {\n const panelId = getNavId(panel.props, warn);\n const isPrevPanel = panelId === prevPanel || panelId === swipeBackPrevPanel;\n const isNextPanel = panelId === nextPanel || panelId === swipeBackNextPanel;\n\n if (isNextPanel) {\n return swipingBack || this.state.isBack ? -1 : 1;\n }\n\n if (isPrevPanel) {\n return swipingBack || this.state.isBack ? 1 : -1;\n }\n\n return 0;\n });\n\n const disableAnimation = this.shouldDisableTransitionMotion();\n\n return (\n <Touch\n Component=\"section\"\n {...restProps}\n className={classNames(\n styles['View'],\n platform === Platform.IOS && classNames(styles['View--ios'], 'vkuiInternalView--ios'),\n !disableAnimation && this.state.animated && styles['View--animated'],\n !disableAnimation && this.state.swipingBack && styles['View--swiping-back'],\n disableAnimation && styles['View--no-motion'],\n className,\n )}\n onMoveX={this.onMoveX}\n onEnd={this.onEnd}\n >\n <div className={styles['View__panels']}>\n {panels.map((panel: React.ReactElement) => {\n const panelId = getNavId(panel.props, warn);\n const isPrev = panelId === prevPanel || panelId === swipeBackPrevPanel;\n const compensateScroll =\n isPrev || panelId === swipeBackNextPanel || (panelId === nextPanel && isBack);\n const isTransitionTarget = animated && panelId === (isBack ? prevPanel : nextPanel);\n const scrollList = (panelId && this.scrolls[panelId]) || [];\n const scroll = scrollList[scrollList.length - 1] || 0;\n\n return (\n <div\n className={classNames(\n styles['View__panel'],\n panelId === activePanel && styles['View__panel--active'],\n panelId === prevPanel && styles['View__panel--prev'],\n panelId === nextPanel && styles['View__panel--next'],\n panelId === swipeBackPrevPanel && styles['View__panel--swipe-back-prev'],\n panelId === swipeBackNextPanel && styles['View__panel--swipe-back-next'],\n swipeBackResult === SwipeBackResults.success &&\n styles['View__panel--swipe-back-success'],\n swipeBackResult === SwipeBackResults.fail &&\n styles['View__panel--swipe-back-failed'],\n )}\n onAnimationEnd={isTransitionTarget ? this.transitionEndHandler : undefined}\n ref={(el) => panelId !== undefined && (this.panelNodes[panelId] = el)}\n style={this.calcPanelSwipeStyles(panelId)}\n key={panelId}\n >\n <div\n className={styles['View__panel-in']}\n style={{ marginTop: compensateScroll ? -scroll : undefined }}\n >\n <NavTransitionProvider\n entering={panelId === nextPanel || panelId === swipeBackNextPanel}\n >\n {panel}\n </NavTransitionProvider>\n </div>\n </div>\n );\n })}\n </div>\n </Touch>\n );\n }\n}\n\nexport const ViewInfinite = withContext(\n withContext(\n withContext(\n withPlatform(withDOM<ViewInfiniteProps>(ViewInfiniteComponent)),\n SplitColContext,\n 'splitCol',\n ),\n ConfigProviderContext,\n 'configProvider',\n ),\n ScrollContext,\n 'scroll',\n);\n"],"names":["React","classNames","withContext","withPlatform","canUseDOM","withDOM","getNavId","Platform","animationEvent","transitionEvent","warnOnce","ScrollContext","ConfigProviderContext","NavTransitionProvider","SplitColContext","Touch","swipeBackExcluded","styles","warn","SwipeBackResults","fail","success","scrollsCache","ViewInfiniteComponent","Component","SWIPE_BACK_AREA","constructor","props","state","animated","visiblePanels","activePanel","isBack","undefined","prevPanel","nextPanel","swipingBack","swipeBackPrevented","swipeBackStartX","swipeBackShift","swipeBackNextPanel","swipeBackPrevPanel","swipeBackResult","browserSwipe","defaultProps","history","scrolls","transitionFinishTimeout","animationFinishTimeout","document","window","panels","Children","toArray","children","panelNodes","componentWillUnmount","id","clearTimeout","componentDidUpdate","prevProps","prevState","isBackCheck","from","to","firstLayerId","map","panel","find","blurActiveElement","prevScrolls","scroll","getScroll","y","shouldDisableTransitionMotion","flushTransition","setState","supported","setTimeout","transitionEndHandler","platform","ANDROID","VKCOM","scrollPosition","prevPanelScrolls","slice","newPanelScrolls","pop","scrollTo","onTransition","waitTransitionFinish","pickPanel","swipingBackTransitionEndHandler","configProvider","transitionMotionEnabled","splitCol","animate","elem","eventHandler","name","removeEventListener","addEventListener","activeElement","blur","e","includes","animationName","Boolean","propertyName","target","onSwipeBackCancel","onSwipeBackSuccess","onSwipeBack","onMoveX","event","IOS","isWebView","startX","innerWidth","length","onSwipeBackStart","payload","shiftX","onEnd","speed","duration","calcPanelSwipeStyles","panelId","isPrev","isNext","prevPanelTranslate","nextPanelTranslate","prevPanelShadow","boxShadow","transform","WebkitTransform","render","_1","nav","className","restProps","filter","sort","isPrevPanel","isNextPanel","disableAnimation","div","compensateScroll","isTransitionTarget","scrollList","onAnimationEnd","ref","el","style","key","marginTop","entering","ViewInfinite"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/View/ViewInfinite.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { withContext } from '../../hoc/withContext';\nimport { withPlatform } from '../../hoc/withPlatform';\nimport { canUseDOM, DOMProps, withDOM } from '../../lib/dom';\nimport { getNavId, NavIdProps } from '../../lib/getNavId';\nimport { Platform } from '../../lib/platform';\nimport { animationEvent, transitionEvent } from '../../lib/supportEvents';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasPlatform } from '../../types';\nimport { ScrollContext, ScrollContextInterface } from '../AppRoot/ScrollContext';\nimport {\n ConfigProviderContext,\n ConfigProviderContextInterface,\n} from '../ConfigProvider/ConfigProviderContext';\nimport { NavTransitionProvider } from '../NavTransitionContext/NavTransitionContext';\nimport { SplitColContext, SplitColContextProps } from '../SplitCol/SplitColContext';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport { swipeBackExcluded } from './utils';\nimport styles from './View.module.css';\n\nconst warn = warnOnce('ViewInfinite');\n\nenum SwipeBackResults {\n fail = 1,\n success,\n}\n\ninterface Scrolls {\n [index: string]: Array<number | undefined>;\n}\n\ninterface ViewsScrolls {\n [index: string]: Scrolls;\n}\n\ntype TransitionEventHandler = (e?: TransitionEvent) => void;\n\nlet scrollsCache: ViewsScrolls = {};\n\nexport type TransitionParams = { from: string | null; to: string | null };\n\nexport interface ViewInfiniteProps\n extends React.HTMLAttributes<HTMLElement>,\n HasPlatform,\n NavIdProps {\n activePanel: string;\n onTransition?(params: TransitionParams & { isBack: boolean }): void;\n /**\n * callback свайпа назад\n */\n onSwipeBack?(): void;\n /**\n * callback начала анимации свайпа назад.\n */\n onSwipeBackStart?(activePanel: string | null): void | 'prevent';\n /**\n * callback завершения анимации отмененного пользователем свайпа\n */\n onSwipeBackCancel?(): void;\n history?: string[];\n isBackCheck?(params: TransitionParams): boolean;\n /**\n * @ignore\n */\n splitCol?: SplitColContextProps;\n /**\n * @ignore\n */\n configProvider?: ConfigProviderContextInterface;\n /**\n * @ignore\n */\n scroll?: ScrollContextInterface;\n}\n\nexport interface ViewInfiniteState {\n animated: boolean;\n\n visiblePanels: Array<string | null>;\n activePanel: string | null;\n isBack?: boolean;\n prevPanel: string | null;\n nextPanel: string | null;\n\n swipingBack: boolean;\n swipeBackPrevented: boolean;\n swipeBackStartX: number;\n swipeBackShift: number;\n swipeBackNextPanel: string | null;\n swipeBackPrevPanel: string | null;\n swipeBackResult: SwipeBackResults | null;\n\n browserSwipe: boolean;\n}\n\nclass ViewInfiniteComponent extends React.Component<\n ViewInfiniteProps & DOMProps,\n ViewInfiniteState\n> {\n private static readonly SWIPE_BACK_AREA = 70;\n\n constructor(props: ViewInfiniteProps) {\n super(props);\n\n this.state = {\n animated: false,\n\n visiblePanels: [props.activePanel],\n activePanel: props.activePanel,\n isBack: undefined,\n prevPanel: null,\n nextPanel: null,\n\n swipingBack: false,\n swipeBackPrevented: false,\n swipeBackStartX: 0,\n swipeBackShift: 0,\n swipeBackNextPanel: null,\n swipeBackPrevPanel: null,\n swipeBackResult: null,\n\n browserSwipe: false,\n };\n }\n\n static defaultProps: Partial<ViewInfiniteProps> = {\n history: [],\n };\n\n private scrolls = scrollsCache[getNavId(this.props, warn) as string] || {};\n private transitionFinishTimeout: ReturnType<typeof setTimeout> | undefined = undefined;\n private animationFinishTimeout: ReturnType<typeof setTimeout> | undefined = undefined;\n\n get document() {\n return this.props.document;\n }\n\n get window() {\n return this.props.window;\n }\n\n get panels() {\n return React.Children.toArray(this.props.children) as React.ReactElement[];\n }\n\n panelNodes: { [id: string]: HTMLDivElement | null } = {};\n\n componentWillUnmount() {\n const id = getNavId(this.props);\n if (id) {\n scrollsCache[id] = this.scrolls;\n }\n if (this.animationFinishTimeout) {\n clearTimeout(this.animationFinishTimeout);\n }\n }\n\n componentDidUpdate(prevProps: ViewInfiniteProps, prevState: ViewInfiniteState) {\n // Нужен переход\n if (\n prevProps.activePanel !== this.props.activePanel &&\n !prevState.swipingBack &&\n !prevState.browserSwipe\n ) {\n let isBack = false;\n\n if (this.props.isBackCheck) {\n isBack = this.props.isBackCheck({\n from: prevProps.activePanel,\n to: this.props.activePanel,\n });\n } else {\n const firstLayerId = this.panels\n .map((panel) => getNavId(panel.props, warn))\n .find((id) => id === prevProps.activePanel || id === this.props.activePanel);\n isBack = firstLayerId === this.props.activePanel;\n }\n\n this.blurActiveElement();\n\n const prevScrolls = this.scrolls[prevProps.activePanel] || [];\n const scrolls = {\n ...this.scrolls,\n [prevProps.activePanel]: [...prevScrolls, this.props.scroll?.getScroll().y],\n };\n this.scrolls = scrolls;\n\n if (this.shouldDisableTransitionMotion()) {\n this.flushTransition(prevProps.activePanel, isBack);\n } else {\n this.setState({\n visiblePanels: [prevProps.activePanel, this.props.activePanel],\n prevPanel: prevProps.activePanel,\n nextPanel: this.props.activePanel,\n activePanel: null,\n animated: true,\n isBack,\n });\n\n // Фолбек анимации перехода\n if (!animationEvent.supported) {\n if (this.animationFinishTimeout) {\n clearTimeout(this.animationFinishTimeout);\n }\n this.animationFinishTimeout = setTimeout(\n this.transitionEndHandler,\n this.props.platform === Platform.ANDROID || this.props.platform === Platform.VKCOM\n ? 300\n : 600,\n );\n }\n }\n }\n\n // Закончилась анимация свайпа назад\n if (prevProps.activePanel !== this.props.activePanel && prevState.swipingBack) {\n const nextPanel = this.state.swipeBackNextPanel;\n const prevPanel = this.state.swipeBackPrevPanel;\n let scrollPosition: undefined | number = undefined;\n\n this.scrolls = {\n ...this.scrolls,\n };\n\n if (prevPanel !== null) {\n const prevPanelScrolls = [...(this.scrolls[prevPanel] || [])].slice(0, -1);\n this.scrolls[prevPanel] = prevPanelScrolls;\n }\n if (nextPanel !== null) {\n const newPanelScrolls = [...(this.scrolls[nextPanel] || [])];\n scrollPosition = newPanelScrolls.pop();\n this.scrolls[nextPanel] = newPanelScrolls;\n }\n\n this.setState(\n {\n swipeBackPrevPanel: null,\n swipeBackNextPanel: null,\n swipingBack: false,\n swipeBackResult: null,\n swipeBackStartX: 0,\n swipeBackShift: 0,\n activePanel: nextPanel,\n visiblePanels: [nextPanel],\n },\n () => {\n this.props.scroll?.scrollTo(0, scrollPosition);\n prevProps.onTransition &&\n prevProps.onTransition({\n isBack: true,\n from: prevPanel,\n to: nextPanel,\n });\n },\n );\n }\n\n // Началась анимация завершения свайпа назад.\n if (!prevState.swipeBackResult && this.state.swipeBackResult) {\n this.waitTransitionFinish(\n this.pickPanel(this.state.swipeBackNextPanel),\n this.swipingBackTransitionEndHandler,\n );\n }\n\n // Если свайп назад отменился (когда пользователь недостаточно сильно свайпнул)\n if (\n prevState.swipeBackResult === SwipeBackResults.fail &&\n !this.state.swipeBackResult &&\n this.state.activePanel !== null\n ) {\n const newPanelScrolls = [...(this.scrolls[this.state.activePanel] || [])];\n const scrollPosition = newPanelScrolls.pop();\n this.scrolls = {\n ...this.scrolls,\n [this.state.activePanel]: newPanelScrolls,\n };\n\n this.props.scroll?.scrollTo(0, scrollPosition);\n }\n\n // Закончился Safari свайп\n if (prevProps.activePanel !== this.props.activePanel && this.state.browserSwipe) {\n this.setState({\n browserSwipe: false,\n nextPanel: null,\n prevPanel: null,\n animated: false,\n visiblePanels: [this.props.activePanel],\n activePanel: this.props.activePanel,\n });\n }\n }\n\n shouldDisableTransitionMotion(): boolean {\n return (\n this.props.configProvider?.transitionMotionEnabled === false ||\n !this.props.splitCol?.animate ||\n this.props.platform === Platform.VKCOM\n );\n }\n\n waitTransitionFinish(\n elem: HTMLElement | null | undefined,\n eventHandler: TransitionEventHandler,\n ): void {\n if (transitionEvent.supported && transitionEvent.name && elem) {\n elem.removeEventListener(\n transitionEvent.name as keyof HTMLElementEventMap,\n eventHandler as EventListener,\n );\n elem.addEventListener(\n transitionEvent.name as keyof HTMLElementEventMap,\n eventHandler as EventListener,\n );\n } else {\n if (this.transitionFinishTimeout) {\n clearTimeout(this.transitionFinishTimeout);\n }\n\n this.transitionFinishTimeout = setTimeout(\n eventHandler,\n this.props.platform === Platform.ANDROID || this.props.platform === Platform.VKCOM\n ? 300\n : 600,\n );\n }\n }\n\n blurActiveElement(): void {\n if (typeof this.window !== 'undefined' && this.document?.activeElement) {\n (this.document.activeElement as HTMLElement).blur();\n }\n }\n\n pickPanel(id: string | null) {\n if (id === null) {\n return undefined;\n }\n return this.panelNodes[id];\n }\n\n flushTransition(prevPanel: string, isBack: boolean) {\n const activePanel = this.props.activePanel;\n\n const prevPanelScrolls = [...(this.scrolls[prevPanel] || [])].slice(0, -1);\n const newPanelScrolls = [...(this.scrolls[activePanel] || [])];\n const scrollPosition = isBack ? newPanelScrolls.pop() : 0;\n if (isBack) {\n this.scrolls = {\n ...this.scrolls,\n [prevPanel]: prevPanelScrolls,\n [activePanel]: newPanelScrolls,\n };\n }\n\n this.setState(\n {\n prevPanel: null,\n nextPanel: null,\n visiblePanels: [activePanel],\n activePanel: activePanel,\n animated: false,\n isBack: undefined,\n },\n () => {\n this.props.scroll?.scrollTo(0, isBack ? scrollPosition : 0);\n this.props.onTransition &&\n this.props.onTransition({ isBack, from: prevPanel, to: activePanel });\n },\n );\n }\n\n transitionEndHandler = (e?: React.AnimationEvent): void => {\n if (\n (!e ||\n [\n styles['animation-ios-next-forward'],\n styles['animation-ios-prev-back'],\n styles['animation-view-next-forward'],\n styles['animation-view-prev-back'],\n ].includes(e.animationName)) &&\n this.state.prevPanel !== null\n ) {\n this.flushTransition(this.state.prevPanel, Boolean(this.state.isBack));\n }\n };\n\n swipingBackTransitionEndHandler = (e?: TransitionEvent): void => {\n // indexOf because of vendor prefixes in old browsers\n if (\n !e ||\n (e.propertyName.includes('transform') &&\n e.target === this.pickPanel(this.state.swipeBackNextPanel))\n ) {\n switch (this.state.swipeBackResult) {\n case SwipeBackResults.fail:\n this.onSwipeBackCancel();\n break;\n case SwipeBackResults.success:\n this.onSwipeBackSuccess();\n }\n }\n };\n\n onSwipeBackSuccess(): void {\n this.props.onSwipeBack && this.props.onSwipeBack();\n }\n\n onSwipeBackCancel(): void {\n this.props.onSwipeBackCancel && this.props.onSwipeBackCancel();\n this.setState({\n swipeBackPrevPanel: null,\n swipeBackNextPanel: null,\n swipingBack: false,\n swipeBackResult: null,\n swipeBackStartX: 0,\n swipeBackShift: 0,\n });\n }\n\n onMoveX = (event: TouchEvent): void => {\n if (\n !this.window ||\n this.props.platform !== Platform.IOS ||\n this.state.swipeBackPrevented ||\n swipeBackExcluded(event) ||\n this.shouldDisableTransitionMotion()\n ) {\n return;\n }\n\n if (!this.props.configProvider?.isWebView) {\n if (\n (event.startX <= ViewInfiniteComponent.SWIPE_BACK_AREA ||\n event.startX >= this.window.innerWidth - ViewInfiniteComponent.SWIPE_BACK_AREA) &&\n !this.state.browserSwipe\n ) {\n this.setState({ browserSwipe: true });\n }\n\n return;\n }\n\n if (\n !this.props.onSwipeBack ||\n (this.state.animated && event.startX <= ViewInfiniteComponent.SWIPE_BACK_AREA)\n ) {\n return;\n }\n\n if (\n !this.state.swipingBack &&\n event.startX <= ViewInfiniteComponent.SWIPE_BACK_AREA &&\n this.props.history &&\n this.props.history.length > 1\n ) {\n if (this.props.onSwipeBackStart) {\n const payload = this.props.onSwipeBackStart(this.state.activePanel);\n if (payload === 'prevent') {\n this.setState({ swipeBackPrevented: true });\n return;\n }\n }\n\n if (this.state.activePanel !== null) {\n // Note: вызываем закрытие клавиатуры. В iOS это нативное поведение при свайпе.\n this.blurActiveElement();\n const prevScrolls = this.scrolls[this.state.activePanel] || [];\n this.scrolls = {\n ...this.scrolls,\n [this.state.activePanel]: [...prevScrolls, this.props.scroll?.getScroll().y],\n };\n }\n\n this.setState({\n swipingBack: true,\n swipeBackStartX: event.startX,\n swipeBackPrevPanel: this.state.activePanel,\n swipeBackNextPanel: this.props.history.slice(-2)[0],\n });\n }\n\n if (this.state.swipingBack) {\n let swipeBackShift;\n if (event.shiftX < 0) {\n swipeBackShift = 0;\n } else if (event.shiftX > this.window.innerWidth - this.state.swipeBackStartX) {\n swipeBackShift = this.window.innerWidth;\n } else {\n swipeBackShift = event.shiftX;\n }\n this.setState({ swipeBackShift });\n }\n };\n\n onEnd = (event: TouchEvent): void => {\n if (this.state.swipingBack && this.window) {\n const speed = (this.state.swipeBackShift / event.duration) * 1000;\n if (this.state.swipeBackShift === 0) {\n this.onSwipeBackCancel();\n } else if (this.state.swipeBackShift >= this.window.innerWidth) {\n this.onSwipeBackSuccess();\n } else if (\n speed > 250 ||\n this.state.swipeBackStartX + this.state.swipeBackShift > this.window.innerWidth / 2\n ) {\n this.setState({ swipeBackResult: SwipeBackResults.success });\n } else {\n this.setState({ swipeBackResult: SwipeBackResults.fail });\n }\n }\n if (this.state.swipeBackPrevented) {\n this.setState({ swipeBackPrevented: false });\n }\n };\n\n calcPanelSwipeStyles(panelId: string | undefined): React.CSSProperties {\n if (!canUseDOM || !this.window) {\n return {};\n }\n\n const isPrev = panelId === this.state.swipeBackPrevPanel;\n const isNext = panelId === this.state.swipeBackNextPanel;\n\n if ((!isPrev && !isNext) || this.state.swipeBackResult) {\n return {};\n }\n\n let prevPanelTranslate = `${this.state.swipeBackShift}px`;\n let nextPanelTranslate = `${\n -50 + (this.state.swipeBackShift * 100) / this.window.innerWidth / 2\n }%`;\n let prevPanelShadow =\n (0.3 * (this.window.innerWidth - this.state.swipeBackShift)) / this.window.innerWidth;\n\n if (this.state.swipeBackResult) {\n return isPrev ? { boxShadow: `-2px 0 12px rgba(0, 0, 0, ${prevPanelShadow})` } : {};\n }\n\n if (isNext) {\n return {\n transform: `translate3d(${nextPanelTranslate}, 0, 0)`,\n WebkitTransform: `translate3d(${nextPanelTranslate}, 0, 0)`,\n };\n }\n if (isPrev) {\n return {\n transform: `translate3d(${prevPanelTranslate}, 0, 0)`,\n WebkitTransform: `translate3d(${prevPanelTranslate}, 0, 0)`,\n boxShadow: `-2px 0 12px rgba(0, 0, 0, ${prevPanelShadow})`,\n };\n }\n\n return {};\n }\n\n render() {\n const {\n platform,\n activePanel: _1,\n splitCol,\n configProvider,\n history,\n id,\n nav,\n onTransition,\n onSwipeBack,\n onSwipeBackStart,\n onSwipeBackCancel,\n window,\n document,\n scroll,\n isBackCheck,\n className,\n ...restProps\n } = this.props;\n const {\n prevPanel,\n nextPanel,\n activePanel,\n isBack,\n animated,\n swipeBackPrevPanel,\n swipeBackNextPanel,\n swipeBackResult,\n swipingBack,\n } = this.state;\n\n const panels = this.panels\n .filter((panel) => {\n const panelId = getNavId(panel.props, warn);\n\n return (\n (panelId !== undefined && this.state.visiblePanels.includes(panelId)) ||\n panelId === swipeBackPrevPanel ||\n panelId === swipeBackNextPanel\n );\n })\n .sort((panel) => {\n const panelId = getNavId(panel.props, warn);\n const isPrevPanel = panelId === prevPanel || panelId === swipeBackPrevPanel;\n const isNextPanel = panelId === nextPanel || panelId === swipeBackNextPanel;\n\n if (isNextPanel) {\n return swipingBack || this.state.isBack ? -1 : 1;\n }\n\n if (isPrevPanel) {\n return swipingBack || this.state.isBack ? 1 : -1;\n }\n\n return 0;\n });\n\n const disableAnimation = this.shouldDisableTransitionMotion();\n\n return (\n <Touch\n Component=\"section\"\n {...restProps}\n className={classNames(\n styles['View'],\n platform === Platform.IOS && classNames(styles['View--ios'], 'vkuiInternalView--ios'),\n !disableAnimation && this.state.animated && styles['View--animated'],\n !disableAnimation && this.state.swipingBack && styles['View--swiping-back'],\n disableAnimation && styles['View--no-motion'],\n className,\n )}\n onMoveX={this.onMoveX}\n onEnd={this.onEnd}\n >\n <div className={styles['View__panels']}>\n {panels.map((panel: React.ReactElement) => {\n const panelId = getNavId(panel.props, warn);\n const isPrev = panelId === prevPanel || panelId === swipeBackPrevPanel;\n const compensateScroll =\n isPrev || panelId === swipeBackNextPanel || (panelId === nextPanel && isBack);\n const isTransitionTarget = animated && panelId === (isBack ? prevPanel : nextPanel);\n const scrollList = (panelId && this.scrolls[panelId]) || [];\n const scroll = scrollList[scrollList.length - 1] || 0;\n\n return (\n <div\n className={classNames(\n styles['View__panel'],\n panelId === activePanel && styles['View__panel--active'],\n panelId === prevPanel && styles['View__panel--prev'],\n panelId === nextPanel && styles['View__panel--next'],\n panelId === swipeBackPrevPanel && styles['View__panel--swipe-back-prev'],\n panelId === swipeBackNextPanel && styles['View__panel--swipe-back-next'],\n swipeBackResult === SwipeBackResults.success &&\n styles['View__panel--swipe-back-success'],\n swipeBackResult === SwipeBackResults.fail &&\n styles['View__panel--swipe-back-failed'],\n )}\n onAnimationEnd={isTransitionTarget ? this.transitionEndHandler : undefined}\n ref={(el) => panelId !== undefined && (this.panelNodes[panelId] = el)}\n style={this.calcPanelSwipeStyles(panelId)}\n key={panelId}\n >\n <div\n className={styles['View__panel-in']}\n style={{ marginTop: compensateScroll ? -scroll : undefined }}\n >\n <NavTransitionProvider\n entering={panelId === nextPanel || panelId === swipeBackNextPanel}\n >\n {panel}\n </NavTransitionProvider>\n </div>\n </div>\n );\n })}\n </div>\n </Touch>\n );\n }\n}\n\nexport const ViewInfinite = withContext(\n withContext(\n withContext(\n withPlatform(withDOM<ViewInfiniteProps>(ViewInfiniteComponent)),\n SplitColContext,\n 'splitCol',\n ),\n ConfigProviderContext,\n 'configProvider',\n ),\n ScrollContext,\n 'scroll',\n);\n"],"names":["React","classNames","withContext","withPlatform","canUseDOM","withDOM","getNavId","Platform","animationEvent","transitionEvent","warnOnce","ScrollContext","ConfigProviderContext","NavTransitionProvider","SplitColContext","Touch","swipeBackExcluded","styles","warn","SwipeBackResults","fail","success","scrollsCache","ViewInfiniteComponent","Component","SWIPE_BACK_AREA","constructor","props","state","animated","visiblePanels","activePanel","isBack","undefined","prevPanel","nextPanel","swipingBack","swipeBackPrevented","swipeBackStartX","swipeBackShift","swipeBackNextPanel","swipeBackPrevPanel","swipeBackResult","browserSwipe","defaultProps","history","scrolls","transitionFinishTimeout","animationFinishTimeout","document","window","panels","Children","toArray","children","panelNodes","componentWillUnmount","id","clearTimeout","componentDidUpdate","prevProps","prevState","isBackCheck","from","to","firstLayerId","map","panel","find","blurActiveElement","prevScrolls","scroll","getScroll","y","shouldDisableTransitionMotion","flushTransition","setState","supported","setTimeout","transitionEndHandler","platform","ANDROID","VKCOM","scrollPosition","prevPanelScrolls","slice","newPanelScrolls","pop","scrollTo","onTransition","waitTransitionFinish","pickPanel","swipingBackTransitionEndHandler","configProvider","transitionMotionEnabled","splitCol","animate","elem","eventHandler","name","removeEventListener","addEventListener","activeElement","blur","e","includes","animationName","Boolean","propertyName","target","onSwipeBackCancel","onSwipeBackSuccess","onSwipeBack","onMoveX","event","IOS","isWebView","startX","innerWidth","length","onSwipeBackStart","payload","shiftX","onEnd","speed","duration","calcPanelSwipeStyles","panelId","isPrev","isNext","prevPanelTranslate","nextPanelTranslate","prevPanelShadow","boxShadow","transform","WebkitTransform","render","_1","nav","className","restProps","filter","sort","isPrevPanel","isNextPanel","disableAnimation","div","compensateScroll","isTransitionTarget","scrollList","onAnimationEnd","ref","el","style","key","marginTop","entering","ViewInfinite"],"mappings":"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"}
|
|
@@ -5,9 +5,10 @@ import { useIsClient } from './useIsClient';
|
|
|
5
5
|
export function useAdaptivityHasHover(deferDetect = true) {
|
|
6
6
|
const { hasHover: hasHoverContext } = React.useContext(AdaptivityContext);
|
|
7
7
|
const hasHover = hasHoverContext === undefined ? hasHoverLib : hasHoverContext;
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
const needTwoPassRendering = deferDetect || hasHoverContext === undefined;
|
|
9
|
+
const isClient = useIsClient(!needTwoPassRendering);
|
|
10
|
+
if (!isClient || hasHoverContext !== undefined) {
|
|
11
|
+
return hasHoverContext;
|
|
11
12
|
}
|
|
12
13
|
return hasHover;
|
|
13
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useAdaptivityHasHover.ts"],"sourcesContent":["import * as React from 'react';\nimport { hasHover as hasHoverLib } from '@vkontakte/vkjs';\nimport { AdaptivityContext } from '../components/AdaptivityProvider/AdaptivityContext';\nimport { useIsClient } from './useIsClient';\n\n/**\n * Определение происходит с помощью `window.matchMedia`. Для того, чтобы не было ошибок при гидратации, по умолчанию\n * откладываем определение на второй рендер.\n *\n * [No SSR] Если передать `false`, то определение будет сразу.\n */\nexport function useAdaptivityHasHover(deferDetect?: true): undefined | boolean;\nexport function useAdaptivityHasHover(deferDetect?: false): boolean;\nexport function useAdaptivityHasHover(deferDetect = true): undefined | boolean {\n const { hasHover: hasHoverContext } = React.useContext(AdaptivityContext);\n const hasHover = hasHoverContext === undefined ? hasHoverLib : hasHoverContext;\n\n const isClient = useIsClient(!
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useAdaptivityHasHover.ts"],"sourcesContent":["import * as React from 'react';\nimport { hasHover as hasHoverLib } from '@vkontakte/vkjs';\nimport { AdaptivityContext } from '../components/AdaptivityProvider/AdaptivityContext';\nimport { useIsClient } from './useIsClient';\n\n/**\n * Определение происходит с помощью `window.matchMedia`. Для того, чтобы не было ошибок при гидратации, по умолчанию\n * откладываем определение на второй рендер.\n *\n * [No SSR] Если передать `false`, то определение будет сразу.\n */\nexport function useAdaptivityHasHover(deferDetect?: true): undefined | boolean;\nexport function useAdaptivityHasHover(deferDetect?: false): boolean;\nexport function useAdaptivityHasHover(deferDetect = true): undefined | boolean {\n const { hasHover: hasHoverContext } = React.useContext(AdaptivityContext);\n const hasHover = hasHoverContext === undefined ? hasHoverLib : hasHoverContext;\n\n const needTwoPassRendering = deferDetect || hasHoverContext === undefined;\n\n const isClient = useIsClient(!needTwoPassRendering);\n if (!isClient || hasHoverContext !== undefined) {\n return hasHoverContext;\n }\n\n return hasHover;\n}\n"],"names":["React","hasHover","hasHoverLib","AdaptivityContext","useIsClient","useAdaptivityHasHover","deferDetect","hasHoverContext","useContext","undefined","needTwoPassRendering","isClient"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,YAAYC,WAAW,QAAQ,kBAAkB;AAC1D,SAASC,iBAAiB,QAAQ,qDAAqD;AACvF,SAASC,WAAW,QAAQ,gBAAgB;AAU5C,OAAO,SAASC,sBAAsBC,cAAc,IAAI;IACtD,MAAM,EAAEL,UAAUM,eAAe,EAAE,GAAGP,MAAMQ,UAAU,CAACL;IACvD,MAAMF,WAAWM,oBAAoBE,YAAYP,cAAcK;IAE/D,MAAMG,uBAAuBJ,eAAeC,oBAAoBE;IAEhE,MAAME,WAAWP,YAAY,CAACM;IAC9B,IAAI,CAACC,YAAYJ,oBAAoBE,WAAW;QAC9C,OAAOF;IACT;IAEA,OAAON;AACT"}
|
|
@@ -4,12 +4,12 @@ import { AdaptivityContext } from '../components/AdaptivityProvider/AdaptivityCo
|
|
|
4
4
|
import { useIsClient } from './useIsClient';
|
|
5
5
|
export function useAdaptivityHasPointer(deferDetect = true) {
|
|
6
6
|
const { hasPointer: hasPointerContext } = React.useContext(AdaptivityContext);
|
|
7
|
-
const
|
|
8
|
-
const isClient = useIsClient(!
|
|
9
|
-
if (!isClient) {
|
|
10
|
-
return
|
|
7
|
+
const needTwoPassRendering = deferDetect || hasPointerContext === undefined;
|
|
8
|
+
const isClient = useIsClient(!needTwoPassRendering);
|
|
9
|
+
if (!isClient || hasPointerContext !== undefined) {
|
|
10
|
+
return hasPointerContext;
|
|
11
11
|
}
|
|
12
|
-
return
|
|
12
|
+
return hasPointerLib;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
//# sourceMappingURL=useAdaptivityHasPointer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useAdaptivityHasPointer.ts"],"sourcesContent":["import * as React from 'react';\nimport { hasMouse as hasPointerLib } from '@vkontakte/vkjs';\nimport { AdaptivityContext } from '../components/AdaptivityProvider/AdaptivityContext';\nimport { useIsClient } from './useIsClient';\n\n/**\n * Определение происходит с помощью `window.matchMedia`. Для того, чтобы не было ошибок при гидратации, по умолчанию\n * откладываем определение на второй рендер.\n *\n * [No SSR] Если передать `false`, то определение будет сразу.\n */\nexport function useAdaptivityHasPointer(deferDetect?: true): undefined | boolean; // prettier-ignore\nexport function useAdaptivityHasPointer(deferDetect?: false): boolean;\nexport function useAdaptivityHasPointer(deferDetect = true): undefined | boolean {\n const { hasPointer: hasPointerContext } = React.useContext(AdaptivityContext);\n const
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useAdaptivityHasPointer.ts"],"sourcesContent":["import * as React from 'react';\nimport { hasMouse as hasPointerLib } from '@vkontakte/vkjs';\nimport { AdaptivityContext } from '../components/AdaptivityProvider/AdaptivityContext';\nimport { useIsClient } from './useIsClient';\n\n/**\n * Определение происходит с помощью `window.matchMedia`. Для того, чтобы не было ошибок при гидратации, по умолчанию\n * откладываем определение на второй рендер.\n *\n * [No SSR] Если передать `false`, то определение будет сразу.\n */\nexport function useAdaptivityHasPointer(deferDetect?: true): undefined | boolean; // prettier-ignore\nexport function useAdaptivityHasPointer(deferDetect?: false): boolean;\nexport function useAdaptivityHasPointer(deferDetect = true): undefined | boolean {\n const { hasPointer: hasPointerContext } = React.useContext(AdaptivityContext);\n\n const needTwoPassRendering = deferDetect || hasPointerContext === undefined;\n\n const isClient = useIsClient(!needTwoPassRendering);\n if (!isClient || hasPointerContext !== undefined) {\n return hasPointerContext;\n }\n\n return hasPointerLib;\n}\n"],"names":["React","hasMouse","hasPointerLib","AdaptivityContext","useIsClient","useAdaptivityHasPointer","deferDetect","hasPointer","hasPointerContext","useContext","needTwoPassRendering","undefined","isClient"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,YAAYC,aAAa,QAAQ,kBAAkB;AAC5D,SAASC,iBAAiB,QAAQ,qDAAqD;AACvF,SAASC,WAAW,QAAQ,gBAAgB;AAU5C,OAAO,SAASC,wBAAwBC,cAAc,IAAI;IACxD,MAAM,EAAEC,YAAYC,iBAAiB,EAAE,GAAGR,MAAMS,UAAU,CAACN;IAE3D,MAAMO,uBAAuBJ,eAAeE,sBAAsBG;IAElE,MAAMC,WAAWR,YAAY,CAACM;IAC9B,IAAI,CAACE,YAAYJ,sBAAsBG,WAAW;QAChD,OAAOH;IACT;IAEA,OAAON;AACT"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';
|
|
3
|
+
export function useAutoFocus(ref, autoFocus) {
|
|
4
|
+
useIsomorphicLayoutEffect(()=>{
|
|
5
|
+
if (!autoFocus || !ref.current) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
ref.current.focus();
|
|
9
|
+
}, []);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=useAutoFocus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useAutoFocus.ts"],"sourcesContent":["import React from 'react';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\n\nexport function useAutoFocus(\n ref: React.RefObject<HTMLElement | null>,\n autoFocus: boolean | undefined,\n) {\n useIsomorphicLayoutEffect(() => {\n if (!autoFocus || !ref.current) {\n return;\n }\n\n ref.current.focus();\n }, []);\n}\n"],"names":["React","useIsomorphicLayoutEffect","useAutoFocus","ref","autoFocus","current","focus"],"mappings":"AAAA,OAAOA,WAAW,QAAQ;AAC1B,SAASC,yBAAyB,QAAQ,mCAAmC;AAE7E,OAAO,SAASC,aACdC,GAAwC,EACxCC,SAA8B;IAE9BH,0BAA0B;QACxB,IAAI,CAACG,aAAa,CAACD,IAAIE,OAAO,EAAE;YAC9B;QACF;QAEAF,IAAIE,OAAO,CAACC,KAAK;IACnB,GAAG,EAAE;AACP"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { useChipsInput } from './useChipsInput';
|
|
3
3
|
export const useChipsSelect = (props)=>{
|
|
4
|
-
const { options, filterFn, getOptionLabel, getOptionValue } = props;
|
|
4
|
+
const { options, filterFn, getOptionLabel, getOptionValue, showSelected } = props;
|
|
5
5
|
const [opened, setOpened] = React.useState(false);
|
|
6
6
|
const [focusedOptionIndex, setFocusedOptionIndex] = React.useState(0);
|
|
7
7
|
const [focusedOption, setFocusedOption] = React.useState(null);
|
|
@@ -24,8 +24,8 @@ export const useChipsSelect = (props)=>{
|
|
|
24
24
|
fieldValue,
|
|
25
25
|
getOptionLabel
|
|
26
26
|
]);
|
|
27
|
-
filteredOptions = React.useMemo(()
|
|
28
|
-
if (!filteredOptions.length) {
|
|
27
|
+
filteredOptions = React.useMemo(function filterOutSelectedIfNeeded() {
|
|
28
|
+
if (!filteredOptions.length || showSelected) {
|
|
29
29
|
return filteredOptions;
|
|
30
30
|
}
|
|
31
31
|
const filteredSet = new Set(filteredOptions);
|
|
@@ -41,7 +41,8 @@ export const useChipsSelect = (props)=>{
|
|
|
41
41
|
}, [
|
|
42
42
|
filteredOptions,
|
|
43
43
|
selectedOptions,
|
|
44
|
-
getOptionValue
|
|
44
|
+
getOptionValue,
|
|
45
|
+
showSelected
|
|
45
46
|
]);
|
|
46
47
|
return {
|
|
47
48
|
...chipsInputState,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useChipsSelect.ts"],"sourcesContent":["import * as React from 'react';\nimport { ChipOption } from '../components/Chip/Chip';\nimport { ChipsSelectProps } from '../components/ChipsSelect/ChipsSelect';\nimport { useChipsInput } from './useChipsInput';\n\nexport const useChipsSelect = <Option extends ChipOption>(\n props: Partial<ChipsSelectProps<Option>>,\n) => {\n const { options, filterFn, getOptionLabel, getOptionValue } = props;\n\n const [opened, setOpened] = React.useState(false);\n const [focusedOptionIndex, setFocusedOptionIndex] = React.useState<number | null>(0);\n const [focusedOption, setFocusedOption] = React.useState<Option | null>(null);\n\n const { fieldValue, selectedOptions, ...chipsInputState } = useChipsInput(props);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement> | undefined) => {\n if (!e) {\n return;\n }\n chipsInputState.handleInputChange(e);\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n }\n };\n\n let filteredOptions = React.useMemo(() => {\n return filterFn\n ? options!.filter((option) => filterFn(fieldValue, option, getOptionLabel))\n : (options as Option[]);\n }, [options, filterFn, fieldValue, getOptionLabel]);\n\n filteredOptions = React.useMemo(()
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useChipsSelect.ts"],"sourcesContent":["import * as React from 'react';\nimport { ChipOption } from '../components/Chip/Chip';\nimport { ChipsSelectProps } from '../components/ChipsSelect/ChipsSelect';\nimport { useChipsInput } from './useChipsInput';\n\nexport const useChipsSelect = <Option extends ChipOption>(\n props: Partial<ChipsSelectProps<Option>>,\n) => {\n const { options, filterFn, getOptionLabel, getOptionValue, showSelected } = props;\n\n const [opened, setOpened] = React.useState(false);\n const [focusedOptionIndex, setFocusedOptionIndex] = React.useState<number | null>(0);\n const [focusedOption, setFocusedOption] = React.useState<Option | null>(null);\n\n const { fieldValue, selectedOptions, ...chipsInputState } = useChipsInput(props);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement> | undefined) => {\n if (!e) {\n return;\n }\n chipsInputState.handleInputChange(e);\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n }\n };\n\n let filteredOptions = React.useMemo(() => {\n return filterFn\n ? options!.filter((option) => filterFn(fieldValue, option, getOptionLabel))\n : (options as Option[]);\n }, [options, filterFn, fieldValue, getOptionLabel]);\n\n filteredOptions = React.useMemo(\n function filterOutSelectedIfNeeded() {\n if (!filteredOptions.length || showSelected) {\n return filteredOptions;\n }\n\n const filteredSet = new Set(filteredOptions);\n const selected = selectedOptions.map((item) => getOptionValue!(item));\n\n for (const item of filteredSet) {\n if (selected.includes(getOptionValue!(item))) {\n filteredSet.delete(item);\n }\n }\n\n return [...filteredSet];\n },\n [filteredOptions, selectedOptions, getOptionValue, showSelected],\n );\n\n return {\n ...chipsInputState,\n fieldValue,\n handleInputChange,\n opened,\n setOpened,\n filteredOptions,\n focusedOptionIndex,\n setFocusedOptionIndex,\n focusedOption,\n setFocusedOption,\n selectedOptions,\n };\n};\n"],"names":["React","useChipsInput","useChipsSelect","props","options","filterFn","getOptionLabel","getOptionValue","showSelected","opened","setOpened","useState","focusedOptionIndex","setFocusedOptionIndex","focusedOption","setFocusedOption","fieldValue","selectedOptions","chipsInputState","handleInputChange","e","filteredOptions","useMemo","filter","option","filterOutSelectedIfNeeded","length","filteredSet","Set","selected","map","item","includes","delete"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAG/B,SAASC,aAAa,QAAQ,kBAAkB;AAEhD,OAAO,MAAMC,iBAAiB,CAC5BC;IAEA,MAAM,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,cAAc,EAAEC,cAAc,EAAEC,YAAY,EAAE,GAAGL;IAE5E,MAAM,CAACM,QAAQC,UAAU,GAAGV,MAAMW,QAAQ,CAAC;IAC3C,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGb,MAAMW,QAAQ,CAAgB;IAClF,MAAM,CAACG,eAAeC,iBAAiB,GAAGf,MAAMW,QAAQ,CAAgB;IAExE,MAAM,EAAEK,UAAU,EAAEC,eAAe,EAAE,GAAGC,iBAAiB,GAAGjB,cAAcE;IAE1E,MAAMgB,oBAAoB,CAACC;QACzB,IAAI,CAACA,GAAG;YACN;QACF;QACAF,gBAAgBC,iBAAiB,CAACC;QAElC,IAAI,CAACX,QAAQ;YACXC,UAAU;YACVG,sBAAsB;QACxB;IACF;IAEA,IAAIQ,kBAAkBrB,MAAMsB,OAAO,CAAC;QAClC,OAAOjB,WACHD,QAASmB,MAAM,CAAC,CAACC,SAAWnB,SAASW,YAAYQ,QAAQlB,mBACxDF;IACP,GAAG;QAACA;QAASC;QAAUW;QAAYV;KAAe;IAElDe,kBAAkBrB,MAAMsB,OAAO,CAC7B,SAASG;QACP,IAAI,CAACJ,gBAAgBK,MAAM,IAAIlB,cAAc;YAC3C,OAAOa;QACT;QAEA,MAAMM,cAAc,IAAIC,IAAIP;QAC5B,MAAMQ,WAAWZ,gBAAgBa,GAAG,CAAC,CAACC,OAASxB,eAAgBwB;QAE/D,KAAK,MAAMA,QAAQJ,YAAa;YAC9B,IAAIE,SAASG,QAAQ,CAACzB,eAAgBwB,QAAQ;gBAC5CJ,YAAYM,MAAM,CAACF;YACrB;QACF;QAEA,OAAO;eAAIJ;SAAY;IACzB,GACA;QAACN;QAAiBJ;QAAiBV;QAAgBC;KAAa;IAGlE,OAAO;QACL,GAAGU,eAAe;QAClBF;QACAG;QACAV;QACAC;QACAW;QACAT;QACAC;QACAC;QACAC;QACAE;IACF;AACF,EAAE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { useDOM } from '../lib/dom';
|
|
3
|
+
import { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';
|
|
3
4
|
import { useGlobalEventListener } from './useGlobalEventListener';
|
|
4
5
|
export function useFocusWithin(ref) {
|
|
5
6
|
const { document } = useDOM();
|
|
@@ -14,6 +15,8 @@ export function useFocusWithin(ref) {
|
|
|
14
15
|
const focus = isFocusWithin();
|
|
15
16
|
focus !== focusWithin && setFocusWithin(focus);
|
|
16
17
|
};
|
|
18
|
+
// Проверяем autoFocus
|
|
19
|
+
useIsomorphicLayoutEffect(listener, []);
|
|
17
20
|
useGlobalEventListener(document, 'focus', listener, {
|
|
18
21
|
capture: true
|
|
19
22
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useFocusWithin.ts"],"sourcesContent":["import React from 'react';\nimport { useDOM } from '../lib/dom';\nimport { useGlobalEventListener } from './useGlobalEventListener';\n\nexport function useFocusWithin(ref: React.RefObject<HTMLElement | null>): boolean {\n const { document } = useDOM();\n const isFocusWithin = () => {\n if (!ref.current || !document) {\n return false;\n }\n\n return ref.current.contains(document.activeElement);\n };\n\n const [focusWithin, setFocusWithin] = React.useState<boolean>(isFocusWithin);\n\n const listener = () => {\n const focus = isFocusWithin();\n focus !== focusWithin && setFocusWithin(focus);\n };\n\n useGlobalEventListener(document, 'focus', listener, { capture: true });\n useGlobalEventListener(document, 'blur', listener, { capture: true });\n\n return focusWithin;\n}\n"],"names":["React","useDOM","useGlobalEventListener","useFocusWithin","ref","document","isFocusWithin","current","contains","activeElement","focusWithin","setFocusWithin","useState","listener","focus","capture"],"mappings":"AAAA,OAAOA,WAAW,QAAQ;AAC1B,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,sBAAsB,QAAQ,2BAA2B;AAElE,OAAO,SAASC,eAAeC,GAAwC;IACrE,MAAM,EAAEC,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useFocusWithin.ts"],"sourcesContent":["import React from 'react';\nimport { useDOM } from '../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\nimport { useGlobalEventListener } from './useGlobalEventListener';\n\nexport function useFocusWithin(ref: React.RefObject<HTMLElement | null>): boolean {\n const { document } = useDOM();\n const isFocusWithin = () => {\n if (!ref.current || !document) {\n return false;\n }\n\n return ref.current.contains(document.activeElement);\n };\n\n const [focusWithin, setFocusWithin] = React.useState<boolean>(isFocusWithin);\n\n const listener = () => {\n const focus = isFocusWithin();\n focus !== focusWithin && setFocusWithin(focus);\n };\n\n // Проверяем autoFocus\n useIsomorphicLayoutEffect(listener, []);\n\n useGlobalEventListener(document, 'focus', listener, { capture: true });\n useGlobalEventListener(document, 'blur', listener, { capture: true });\n\n return focusWithin;\n}\n"],"names":["React","useDOM","useIsomorphicLayoutEffect","useGlobalEventListener","useFocusWithin","ref","document","isFocusWithin","current","contains","activeElement","focusWithin","setFocusWithin","useState","listener","focus","capture"],"mappings":"AAAA,OAAOA,WAAW,QAAQ;AAC1B,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,yBAAyB,QAAQ,mCAAmC;AAC7E,SAASC,sBAAsB,QAAQ,2BAA2B;AAElE,OAAO,SAASC,eAAeC,GAAwC;IACrE,MAAM,EAAEC,QAAQ,EAAE,GAAGL;IACrB,MAAMM,gBAAgB;QACpB,IAAI,CAACF,IAAIG,OAAO,IAAI,CAACF,UAAU;YAC7B,OAAO;QACT;QAEA,OAAOD,IAAIG,OAAO,CAACC,QAAQ,CAACH,SAASI,aAAa;IACpD;IAEA,MAAM,CAACC,aAAaC,eAAe,GAAGZ,MAAMa,QAAQ,CAAUN;IAE9D,MAAMO,WAAW;QACf,MAAMC,QAAQR;QACdQ,UAAUJ,eAAeC,eAAeG;IAC1C;IAEA,sBAAsB;IACtBb,0BAA0BY,UAAU,EAAE;IAEtCX,uBAAuBG,UAAU,SAASQ,UAAU;QAAEE,SAAS;IAAK;IACpEb,uBAAuBG,UAAU,QAAQQ,UAAU;QAAEE,SAAS;IAAK;IAEnE,OAAOL;AACT"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';
|
|
2
3
|
/**
|
|
3
4
|
* Хук для two-pass рендеринга.
|
|
4
5
|
*
|
|
@@ -8,7 +9,7 @@ import * as React from 'react';
|
|
|
8
9
|
* @see {@link https://beta.reactjs.org/apis/react-dom/hydrate#handling-different-client-and-server-content React Docs}
|
|
9
10
|
*/ export function useIsClient(initial = false) {
|
|
10
11
|
const [isClient, setIsClient] = React.useState(initial);
|
|
11
|
-
|
|
12
|
+
useIsomorphicLayoutEffect(()=>{
|
|
12
13
|
setIsClient(true);
|
|
13
14
|
}, []);
|
|
14
15
|
return isClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useIsClient.ts"],"sourcesContent":["import * as React from 'react';\n\n/**\n * Хук для two-pass рендеринга.\n *\n * ВНИМАНИЕ: Этот подход сделает ваши компоненты медленнее, потому что они\n * должны рендериться дважды, поэтому используйте хук с осторожностью.\n *\n * @see {@link https://beta.reactjs.org/apis/react-dom/hydrate#handling-different-client-and-server-content React Docs}\n */\nexport function useIsClient(initial = false) {\n const [isClient, setIsClient] = React.useState(initial);\n\n
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useIsClient.ts"],"sourcesContent":["import * as React from 'react';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\n\n/**\n * Хук для two-pass рендеринга.\n *\n * ВНИМАНИЕ: Этот подход сделает ваши компоненты медленнее, потому что они\n * должны рендериться дважды, поэтому используйте хук с осторожностью.\n *\n * @see {@link https://beta.reactjs.org/apis/react-dom/hydrate#handling-different-client-and-server-content React Docs}\n */\nexport function useIsClient(initial = false) {\n const [isClient, setIsClient] = React.useState(initial);\n\n useIsomorphicLayoutEffect(() => {\n setIsClient(true);\n }, []);\n\n return isClient;\n}\n"],"names":["React","useIsomorphicLayoutEffect","useIsClient","initial","isClient","setIsClient","useState"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,yBAAyB,QAAQ,mCAAmC;AAE7E;;;;;;;CAOC,GACD,OAAO,SAASC,YAAYC,UAAU,KAAK;IACzC,MAAM,CAACC,UAAUC,YAAY,GAAGL,MAAMM,QAAQ,CAACH;IAE/CF,0BAA0B;QACxBI,YAAY;IACd,GAAG,EAAE;IAEL,OAAOD;AACT"}
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
--vkui_internal--z_index_panel_header_context: 4;
|
|
38
38
|
--vkui_internal--z_index_panel_header_fade: 5;
|
|
39
39
|
--vkui_internal--z_index_pull_to_refresh: 9;
|
|
40
|
-
--vkui_internal--
|
|
40
|
+
--vkui_internal--z_index_panel_header: 10;
|
|
41
41
|
--vkui_internal--z_index_split_layout_panel_header: 11;
|
|
42
42
|
|
|
43
43
|
/* z_index Tappable isolate */
|
|
@@ -6,9 +6,10 @@ export function useAdaptivityHasHover() {
|
|
|
6
6
|
var deferDetect = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
7
7
|
var _React_useContext = React.useContext(AdaptivityContext), hasHoverContext = _React_useContext.hasHover;
|
|
8
8
|
var hasHover = hasHoverContext === undefined ? hasHoverLib : hasHoverContext;
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
var needTwoPassRendering = deferDetect || hasHoverContext === undefined;
|
|
10
|
+
var isClient = useIsClient(!needTwoPassRendering);
|
|
11
|
+
if (!isClient || hasHoverContext !== undefined) {
|
|
12
|
+
return hasHoverContext;
|
|
12
13
|
}
|
|
13
14
|
return hasHover;
|
|
14
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useAdaptivityHasHover.ts"],"sourcesContent":["import * as React from 'react';\nimport { hasHover as hasHoverLib } from '@vkontakte/vkjs';\nimport { AdaptivityContext } from '../components/AdaptivityProvider/AdaptivityContext';\nimport { useIsClient } from './useIsClient';\n\n/**\n * Определение происходит с помощью `window.matchMedia`. Для того, чтобы не было ошибок при гидратации, по умолчанию\n * откладываем определение на второй рендер.\n *\n * [No SSR] Если передать `false`, то определение будет сразу.\n */\nexport function useAdaptivityHasHover(deferDetect?: true): undefined | boolean;\nexport function useAdaptivityHasHover(deferDetect?: false): boolean;\nexport function useAdaptivityHasHover(deferDetect = true): undefined | boolean {\n const { hasHover: hasHoverContext } = React.useContext(AdaptivityContext);\n const hasHover = hasHoverContext === undefined ? hasHoverLib : hasHoverContext;\n\n const isClient = useIsClient(!
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useAdaptivityHasHover.ts"],"sourcesContent":["import * as React from 'react';\nimport { hasHover as hasHoverLib } from '@vkontakte/vkjs';\nimport { AdaptivityContext } from '../components/AdaptivityProvider/AdaptivityContext';\nimport { useIsClient } from './useIsClient';\n\n/**\n * Определение происходит с помощью `window.matchMedia`. Для того, чтобы не было ошибок при гидратации, по умолчанию\n * откладываем определение на второй рендер.\n *\n * [No SSR] Если передать `false`, то определение будет сразу.\n */\nexport function useAdaptivityHasHover(deferDetect?: true): undefined | boolean;\nexport function useAdaptivityHasHover(deferDetect?: false): boolean;\nexport function useAdaptivityHasHover(deferDetect = true): undefined | boolean {\n const { hasHover: hasHoverContext } = React.useContext(AdaptivityContext);\n const hasHover = hasHoverContext === undefined ? hasHoverLib : hasHoverContext;\n\n const needTwoPassRendering = deferDetect || hasHoverContext === undefined;\n\n const isClient = useIsClient(!needTwoPassRendering);\n if (!isClient || hasHoverContext !== undefined) {\n return hasHoverContext;\n }\n\n return hasHover;\n}\n"],"names":["React","hasHover","hasHoverLib","AdaptivityContext","useIsClient","useAdaptivityHasHover","deferDetect","useContext","hasHoverContext","undefined","needTwoPassRendering","isClient"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,YAAYC,WAAW,QAAQ,kBAAkB;AAC1D,SAASC,iBAAiB,QAAQ,qDAAqD;AACvF,SAASC,WAAW,QAAQ,gBAAgB;AAU5C,OAAO,SAASC;QAAsBC,cAAAA,iEAAc;IAClD,IAAsCN,oBAAAA,MAAMO,UAAU,CAACJ,oBAA/CF,AAAUO,kBAAoBR,kBAA9BC;IACR,IAAMA,WAAWO,oBAAoBC,YAAYP,cAAcM;IAE/D,IAAME,uBAAuBJ,eAAeE,oBAAoBC;IAEhE,IAAME,WAAWP,YAAY,CAACM;IAC9B,IAAI,CAACC,YAAYH,oBAAoBC,WAAW;QAC9C,OAAOD;IACT;IAEA,OAAOP;AACT"}
|
|
@@ -5,12 +5,12 @@ import { useIsClient } from "./useIsClient";
|
|
|
5
5
|
export function useAdaptivityHasPointer() {
|
|
6
6
|
var deferDetect = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
7
7
|
var _React_useContext = React.useContext(AdaptivityContext), hasPointerContext = _React_useContext.hasPointer;
|
|
8
|
-
var
|
|
9
|
-
var isClient = useIsClient(!
|
|
10
|
-
if (!isClient) {
|
|
11
|
-
return
|
|
8
|
+
var needTwoPassRendering = deferDetect || hasPointerContext === undefined;
|
|
9
|
+
var isClient = useIsClient(!needTwoPassRendering);
|
|
10
|
+
if (!isClient || hasPointerContext !== undefined) {
|
|
11
|
+
return hasPointerContext;
|
|
12
12
|
}
|
|
13
|
-
return
|
|
13
|
+
return hasPointerLib;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
//# sourceMappingURL=useAdaptivityHasPointer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useAdaptivityHasPointer.ts"],"sourcesContent":["import * as React from 'react';\nimport { hasMouse as hasPointerLib } from '@vkontakte/vkjs';\nimport { AdaptivityContext } from '../components/AdaptivityProvider/AdaptivityContext';\nimport { useIsClient } from './useIsClient';\n\n/**\n * Определение происходит с помощью `window.matchMedia`. Для того, чтобы не было ошибок при гидратации, по умолчанию\n * откладываем определение на второй рендер.\n *\n * [No SSR] Если передать `false`, то определение будет сразу.\n */\nexport function useAdaptivityHasPointer(deferDetect?: true): undefined | boolean; // prettier-ignore\nexport function useAdaptivityHasPointer(deferDetect?: false): boolean;\nexport function useAdaptivityHasPointer(deferDetect = true): undefined | boolean {\n const { hasPointer: hasPointerContext } = React.useContext(AdaptivityContext);\n const
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useAdaptivityHasPointer.ts"],"sourcesContent":["import * as React from 'react';\nimport { hasMouse as hasPointerLib } from '@vkontakte/vkjs';\nimport { AdaptivityContext } from '../components/AdaptivityProvider/AdaptivityContext';\nimport { useIsClient } from './useIsClient';\n\n/**\n * Определение происходит с помощью `window.matchMedia`. Для того, чтобы не было ошибок при гидратации, по умолчанию\n * откладываем определение на второй рендер.\n *\n * [No SSR] Если передать `false`, то определение будет сразу.\n */\nexport function useAdaptivityHasPointer(deferDetect?: true): undefined | boolean; // prettier-ignore\nexport function useAdaptivityHasPointer(deferDetect?: false): boolean;\nexport function useAdaptivityHasPointer(deferDetect = true): undefined | boolean {\n const { hasPointer: hasPointerContext } = React.useContext(AdaptivityContext);\n\n const needTwoPassRendering = deferDetect || hasPointerContext === undefined;\n\n const isClient = useIsClient(!needTwoPassRendering);\n if (!isClient || hasPointerContext !== undefined) {\n return hasPointerContext;\n }\n\n return hasPointerLib;\n}\n"],"names":["React","hasMouse","hasPointerLib","AdaptivityContext","useIsClient","useAdaptivityHasPointer","deferDetect","useContext","hasPointer","hasPointerContext","needTwoPassRendering","undefined","isClient"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,YAAYC,aAAa,QAAQ,kBAAkB;AAC5D,SAASC,iBAAiB,QAAQ,qDAAqD;AACvF,SAASC,WAAW,QAAQ,gBAAgB;AAU5C,OAAO,SAASC;QAAwBC,cAAAA,iEAAc;IACpD,IAA0CN,oBAAAA,MAAMO,UAAU,CAACJ,oBAAnDK,AAAYC,oBAAsBT,kBAAlCQ;IAER,IAAME,uBAAuBJ,eAAeG,sBAAsBE;IAElE,IAAMC,WAAWR,YAAY,CAACM;IAC9B,IAAI,CAACE,YAAYH,sBAAsBE,WAAW;QAChD,OAAOF;IACT;IAEA,OAAOP;AACT"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { useIsomorphicLayoutEffect } from "../lib/useIsomorphicLayoutEffect";
|
|
3
|
+
export function useAutoFocus(ref, autoFocus) {
|
|
4
|
+
useIsomorphicLayoutEffect(function() {
|
|
5
|
+
if (!autoFocus || !ref.current) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
ref.current.focus();
|
|
9
|
+
}, []);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=useAutoFocus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useAutoFocus.ts"],"sourcesContent":["import React from 'react';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\n\nexport function useAutoFocus(\n ref: React.RefObject<HTMLElement | null>,\n autoFocus: boolean | undefined,\n) {\n useIsomorphicLayoutEffect(() => {\n if (!autoFocus || !ref.current) {\n return;\n }\n\n ref.current.focus();\n }, []);\n}\n"],"names":["React","useIsomorphicLayoutEffect","useAutoFocus","ref","autoFocus","current","focus"],"mappings":"AAAA,OAAOA,WAAW,QAAQ;AAC1B,SAASC,yBAAyB,QAAQ,mCAAmC;AAE7E,OAAO,SAASC,aACdC,GAAwC,EACxCC,SAA8B;IAE9BH,0BAA0B;QACxB,IAAI,CAACG,aAAa,CAACD,IAAIE,OAAO,EAAE;YAC9B;QACF;QAEAF,IAAIE,OAAO,CAACC,KAAK;IACnB,GAAG,EAAE;AACP"}
|
|
@@ -6,7 +6,7 @@ import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
|
|
|
6
6
|
import * as React from "react";
|
|
7
7
|
import { useChipsInput } from "./useChipsInput";
|
|
8
8
|
export var useChipsSelect = function(props) {
|
|
9
|
-
var options = props.options, filterFn = props.filterFn, getOptionLabel = props.getOptionLabel, getOptionValue = props.getOptionValue;
|
|
9
|
+
var options = props.options, filterFn = props.filterFn, getOptionLabel = props.getOptionLabel, getOptionValue = props.getOptionValue, showSelected = props.showSelected;
|
|
10
10
|
var _React_useState = _sliced_to_array(React.useState(false), 2), opened = _React_useState[0], setOpened = _React_useState[1];
|
|
11
11
|
var _React_useState1 = _sliced_to_array(React.useState(0), 2), focusedOptionIndex = _React_useState1[0], setFocusedOptionIndex = _React_useState1[1];
|
|
12
12
|
var _React_useState2 = _sliced_to_array(React.useState(null), 2), focusedOption = _React_useState2[0], setFocusedOption = _React_useState2[1];
|
|
@@ -34,8 +34,8 @@ export var useChipsSelect = function(props) {
|
|
|
34
34
|
fieldValue,
|
|
35
35
|
getOptionLabel
|
|
36
36
|
]);
|
|
37
|
-
filteredOptions = React.useMemo(function() {
|
|
38
|
-
if (!filteredOptions.length) {
|
|
37
|
+
filteredOptions = React.useMemo(function filterOutSelectedIfNeeded() {
|
|
38
|
+
if (!filteredOptions.length || showSelected) {
|
|
39
39
|
return filteredOptions;
|
|
40
40
|
}
|
|
41
41
|
var filteredSet = new Set(filteredOptions);
|
|
@@ -68,7 +68,8 @@ export var useChipsSelect = function(props) {
|
|
|
68
68
|
}, [
|
|
69
69
|
filteredOptions,
|
|
70
70
|
selectedOptions,
|
|
71
|
-
getOptionValue
|
|
71
|
+
getOptionValue,
|
|
72
|
+
showSelected
|
|
72
73
|
]);
|
|
73
74
|
return _object_spread_props(_object_spread({}, chipsInputState), {
|
|
74
75
|
fieldValue: fieldValue,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useChipsSelect.ts"],"sourcesContent":["import * as React from 'react';\nimport { ChipOption } from '../components/Chip/Chip';\nimport { ChipsSelectProps } from '../components/ChipsSelect/ChipsSelect';\nimport { useChipsInput } from './useChipsInput';\n\nexport const useChipsSelect = <Option extends ChipOption>(\n props: Partial<ChipsSelectProps<Option>>,\n) => {\n const { options, filterFn, getOptionLabel, getOptionValue } = props;\n\n const [opened, setOpened] = React.useState(false);\n const [focusedOptionIndex, setFocusedOptionIndex] = React.useState<number | null>(0);\n const [focusedOption, setFocusedOption] = React.useState<Option | null>(null);\n\n const { fieldValue, selectedOptions, ...chipsInputState } = useChipsInput(props);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement> | undefined) => {\n if (!e) {\n return;\n }\n chipsInputState.handleInputChange(e);\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n }\n };\n\n let filteredOptions = React.useMemo(() => {\n return filterFn\n ? options!.filter((option) => filterFn(fieldValue, option, getOptionLabel))\n : (options as Option[]);\n }, [options, filterFn, fieldValue, getOptionLabel]);\n\n filteredOptions = React.useMemo(()
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useChipsSelect.ts"],"sourcesContent":["import * as React from 'react';\nimport { ChipOption } from '../components/Chip/Chip';\nimport { ChipsSelectProps } from '../components/ChipsSelect/ChipsSelect';\nimport { useChipsInput } from './useChipsInput';\n\nexport const useChipsSelect = <Option extends ChipOption>(\n props: Partial<ChipsSelectProps<Option>>,\n) => {\n const { options, filterFn, getOptionLabel, getOptionValue, showSelected } = props;\n\n const [opened, setOpened] = React.useState(false);\n const [focusedOptionIndex, setFocusedOptionIndex] = React.useState<number | null>(0);\n const [focusedOption, setFocusedOption] = React.useState<Option | null>(null);\n\n const { fieldValue, selectedOptions, ...chipsInputState } = useChipsInput(props);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement> | undefined) => {\n if (!e) {\n return;\n }\n chipsInputState.handleInputChange(e);\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n }\n };\n\n let filteredOptions = React.useMemo(() => {\n return filterFn\n ? options!.filter((option) => filterFn(fieldValue, option, getOptionLabel))\n : (options as Option[]);\n }, [options, filterFn, fieldValue, getOptionLabel]);\n\n filteredOptions = React.useMemo(\n function filterOutSelectedIfNeeded() {\n if (!filteredOptions.length || showSelected) {\n return filteredOptions;\n }\n\n const filteredSet = new Set(filteredOptions);\n const selected = selectedOptions.map((item) => getOptionValue!(item));\n\n for (const item of filteredSet) {\n if (selected.includes(getOptionValue!(item))) {\n filteredSet.delete(item);\n }\n }\n\n return [...filteredSet];\n },\n [filteredOptions, selectedOptions, getOptionValue, showSelected],\n );\n\n return {\n ...chipsInputState,\n fieldValue,\n handleInputChange,\n opened,\n setOpened,\n filteredOptions,\n focusedOptionIndex,\n setFocusedOptionIndex,\n focusedOption,\n setFocusedOption,\n selectedOptions,\n };\n};\n"],"names":["React","useChipsInput","useChipsSelect","props","options","filterFn","getOptionLabel","getOptionValue","showSelected","useState","opened","setOpened","focusedOptionIndex","setFocusedOptionIndex","focusedOption","setFocusedOption","fieldValue","selectedOptions","chipsInputState","handleInputChange","e","filteredOptions","useMemo","filter","option","filterOutSelectedIfNeeded","length","filteredSet","Set","selected","map","item","includes","delete"],"mappings":";;;;;AAAA,YAAYA,WAAW,QAAQ;AAG/B,SAASC,aAAa,QAAQ,kBAAkB;AAEhD,OAAO,IAAMC,iBAAiB,SAC5BC;IAEA,IAAQC,UAAoED,MAApEC,SAASC,WAA2DF,MAA3DE,UAAUC,iBAAiDH,MAAjDG,gBAAgBC,iBAAiCJ,MAAjCI,gBAAgBC,eAAiBL,MAAjBK;IAE3D,IAA4BR,mCAAAA,MAAMS,QAAQ,CAAC,YAApCC,SAAqBV,oBAAbW,YAAaX;IAC5B,IAAoDA,oCAAAA,MAAMS,QAAQ,CAAgB,QAA3EG,qBAA6CZ,qBAAzBa,wBAAyBb;IACpD,IAA0CA,oCAAAA,MAAMS,QAAQ,CAAgB,WAAjEK,gBAAmCd,qBAApBe,mBAAoBf;IAE1C,IAA4DC,iBAAAA,cAAcE,QAAlEa,aAAoDf,eAApDe,YAAYC,kBAAwChB,eAAxCgB,iBAAoBC,6CAAoBjB;QAApDe;QAAYC;;IAEpB,IAAME,oBAAoB,SAACC;QACzB,IAAI,CAACA,GAAG;YACN;QACF;QACAF,gBAAgBC,iBAAiB,CAACC;QAElC,IAAI,CAACV,QAAQ;YACXC,UAAU;YACVE,sBAAsB;QACxB;IACF;IAEA,IAAIQ,kBAAkBrB,MAAMsB,OAAO,CAAC;QAClC,OAAOjB,WACHD,QAASmB,MAAM,CAAC,SAACC;mBAAWnB,SAASW,YAAYQ,QAAQlB;aACxDF;IACP,GAAG;QAACA;QAASC;QAAUW;QAAYV;KAAe;IAElDe,kBAAkBrB,MAAMsB,OAAO,CAC7B,SAASG;QACP,IAAI,CAACJ,gBAAgBK,MAAM,IAAIlB,cAAc;YAC3C,OAAOa;QACT;QAEA,IAAMM,cAAc,IAAIC,IAAIP;QAC5B,IAAMQ,WAAWZ,gBAAgBa,GAAG,CAAC,SAACC;mBAASxB,eAAgBwB;;YAE1D,kCAAA,2BAAA;;YAAL,QAAK,YAAcJ,gCAAd,SAAA,6BAAA,QAAA,yBAAA,iCAA2B;gBAA3B,IAAMI,OAAN;gBACH,IAAIF,SAASG,QAAQ,CAACzB,eAAgBwB,QAAQ;oBAC5CJ,YAAYM,MAAM,CAACF;gBACrB;YACF;;YAJK;YAAA;;;qBAAA,6BAAA;oBAAA;;;oBAAA;0BAAA;;;;QAML,OAAQ,qBAAGJ;IACb,GACA;QAACN;QAAiBJ;QAAiBV;QAAgBC;KAAa;IAGlE,OAAO,wCACFU;QACHF,YAAAA;QACAG,mBAAAA;QACAT,QAAAA;QACAC,WAAAA;QACAU,iBAAAA;QACAT,oBAAAA;QACAC,uBAAAA;QACAC,eAAAA;QACAC,kBAAAA;QACAE,iBAAAA;;AAEJ,EAAE"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
|
|
2
2
|
import React from "react";
|
|
3
3
|
import { useDOM } from "../lib/dom";
|
|
4
|
+
import { useIsomorphicLayoutEffect } from "../lib/useIsomorphicLayoutEffect";
|
|
4
5
|
import { useGlobalEventListener } from "./useGlobalEventListener";
|
|
5
6
|
export function useFocusWithin(ref) {
|
|
6
7
|
var document = useDOM().document;
|
|
@@ -15,6 +16,8 @@ export function useFocusWithin(ref) {
|
|
|
15
16
|
var focus = isFocusWithin();
|
|
16
17
|
focus !== focusWithin && setFocusWithin(focus);
|
|
17
18
|
};
|
|
19
|
+
// Проверяем autoFocus
|
|
20
|
+
useIsomorphicLayoutEffect(listener, []);
|
|
18
21
|
useGlobalEventListener(document, "focus", listener, {
|
|
19
22
|
capture: true
|
|
20
23
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useFocusWithin.ts"],"sourcesContent":["import React from 'react';\nimport { useDOM } from '../lib/dom';\nimport { useGlobalEventListener } from './useGlobalEventListener';\n\nexport function useFocusWithin(ref: React.RefObject<HTMLElement | null>): boolean {\n const { document } = useDOM();\n const isFocusWithin = () => {\n if (!ref.current || !document) {\n return false;\n }\n\n return ref.current.contains(document.activeElement);\n };\n\n const [focusWithin, setFocusWithin] = React.useState<boolean>(isFocusWithin);\n\n const listener = () => {\n const focus = isFocusWithin();\n focus !== focusWithin && setFocusWithin(focus);\n };\n\n useGlobalEventListener(document, 'focus', listener, { capture: true });\n useGlobalEventListener(document, 'blur', listener, { capture: true });\n\n return focusWithin;\n}\n"],"names":["React","useDOM","useGlobalEventListener","useFocusWithin","ref","document","isFocusWithin","current","contains","activeElement","useState","focusWithin","setFocusWithin","listener","focus","capture"],"mappings":";AAAA,OAAOA,WAAW,QAAQ;AAC1B,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,sBAAsB,QAAQ,2BAA2B;AAElE,OAAO,SAASC,eAAeC,GAAwC;IACrE,IAAM,AAAEC,
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useFocusWithin.ts"],"sourcesContent":["import React from 'react';\nimport { useDOM } from '../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\nimport { useGlobalEventListener } from './useGlobalEventListener';\n\nexport function useFocusWithin(ref: React.RefObject<HTMLElement | null>): boolean {\n const { document } = useDOM();\n const isFocusWithin = () => {\n if (!ref.current || !document) {\n return false;\n }\n\n return ref.current.contains(document.activeElement);\n };\n\n const [focusWithin, setFocusWithin] = React.useState<boolean>(isFocusWithin);\n\n const listener = () => {\n const focus = isFocusWithin();\n focus !== focusWithin && setFocusWithin(focus);\n };\n\n // Проверяем autoFocus\n useIsomorphicLayoutEffect(listener, []);\n\n useGlobalEventListener(document, 'focus', listener, { capture: true });\n useGlobalEventListener(document, 'blur', listener, { capture: true });\n\n return focusWithin;\n}\n"],"names":["React","useDOM","useIsomorphicLayoutEffect","useGlobalEventListener","useFocusWithin","ref","document","isFocusWithin","current","contains","activeElement","useState","focusWithin","setFocusWithin","listener","focus","capture"],"mappings":";AAAA,OAAOA,WAAW,QAAQ;AAC1B,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,yBAAyB,QAAQ,mCAAmC;AAC7E,SAASC,sBAAsB,QAAQ,2BAA2B;AAElE,OAAO,SAASC,eAAeC,GAAwC;IACrE,IAAM,AAAEC,WAAaL,SAAbK;IACR,IAAMC,gBAAgB;QACpB,IAAI,CAACF,IAAIG,OAAO,IAAI,CAACF,UAAU;YAC7B,OAAO;QACT;QAEA,OAAOD,IAAIG,OAAO,CAACC,QAAQ,CAACH,SAASI,aAAa;IACpD;IAEA,IAAsCV,mCAAAA,MAAMW,QAAQ,CAAUJ,oBAAvDK,cAA+BZ,oBAAlBa,iBAAkBb;IAEtC,IAAMc,WAAW;QACf,IAAMC,QAAQR;QACdQ,UAAUH,eAAeC,eAAeE;IAC1C;IAEA,sBAAsB;IACtBb,0BAA0BY,UAAU,EAAE;IAEtCX,uBAAuBG,UAAU,SAASQ,UAAU;QAAEE,SAAS;IAAK;IACpEb,uBAAuBG,UAAU,QAAQQ,UAAU;QAAEE,SAAS;IAAK;IAEnE,OAAOJ;AACT"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
|
|
2
2
|
import * as React from "react";
|
|
3
|
+
import { useIsomorphicLayoutEffect } from "../lib/useIsomorphicLayoutEffect";
|
|
3
4
|
/**
|
|
4
5
|
* Хук для two-pass рендеринга.
|
|
5
6
|
*
|
|
@@ -10,7 +11,7 @@ import * as React from "react";
|
|
|
10
11
|
*/ export function useIsClient() {
|
|
11
12
|
var initial = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
|
|
12
13
|
var _React_useState = _sliced_to_array(React.useState(initial), 2), isClient = _React_useState[0], setIsClient = _React_useState[1];
|
|
13
|
-
|
|
14
|
+
useIsomorphicLayoutEffect(function() {
|
|
14
15
|
setIsClient(true);
|
|
15
16
|
}, []);
|
|
16
17
|
return isClient;
|