@hh.ru/magritte-internal-drop-base 6.0.3 → 6.0.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/DropBase.js +1 -1
- package/index.css +1 -1
- package/index.d.ts +1 -1
- package/intersectionManager.d.ts +2 -1
- package/intersectionManager.js.map +1 -1
- package/package.json +2 -2
- package/scrollManager.d.ts +2 -1
- package/scrollManager.js.map +1 -1
- package/types.d.ts +2 -1
- package/useRenderParams.js +11 -1
- package/useRenderParams.js.map +1 -1
package/DropBase.js
CHANGED
|
@@ -15,7 +15,7 @@ import '@hh.ru/magritte-common-func-utils';
|
|
|
15
15
|
import '@hh.ru/magritte-common-metrics';
|
|
16
16
|
import './calculateRect.js';
|
|
17
17
|
|
|
18
|
-
var styles = {"drop-base":"magritte-drop-base___uJNG4_6-0-
|
|
18
|
+
var styles = {"drop-base":"magritte-drop-base___uJNG4_6-0-4","dropBase":"magritte-drop-base___uJNG4_6-0-4"};
|
|
19
19
|
|
|
20
20
|
const DropBaseComponent = ({ visible, children, arrowGuardDistance, activatorRef, host, alignment, direction, preferredViewport, onClose, autoFocusWhenOpened = false, closeByClickOutside = true, animationTimeout, animationClassNames, guardDistance = 8, role, occupyAllAvailableViewportHeight = false, forcePosition = false, widthEqualToActivator = false, keyboardNavigationMode = null, ignoreIntersections = false, style = {}, onAppear, onBeforeExit, onAfterExit, ...props }, ref) => {
|
|
21
21
|
const dropNodeRef = useRef(null);
|
package/index.css
CHANGED
package/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * from '@hh.ru/magritte-internal-drop-base/DropBase';
|
|
2
|
-
export
|
|
2
|
+
export * from '@hh.ru/magritte-internal-drop-base/types';
|
|
3
3
|
export { INITIAL_HEIGHT_VALUE } from '@hh.ru/magritte-internal-drop-base/useRenderParams';
|
package/intersectionManager.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import { RefObject } from 'react';
|
|
2
|
-
|
|
2
|
+
import { ActivatorElementType } from '@hh.ru/magritte-internal-drop-base/types';
|
|
3
|
+
export declare const useIntersectionSubscription: (activatorRef: RefObject<ActivatorElementType>, isVisible: boolean, ignore: boolean, callback: VoidFunction) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intersectionManager.js","sources":["../src/intersectionManager.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef } from 'react';\n\n// теоретически на один активатор может быть завязано несколько дропов (например дроп и тултип)\n// поэтому храним коллекцию коллбеков для каждого активатора\nconst intersectionCallbacks = new Map<
|
|
1
|
+
{"version":3,"file":"intersectionManager.js","sources":["../src/intersectionManager.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef } from 'react';\n\nimport { ActivatorElementType } from '@hh.ru/magritte-internal-drop-base/types';\n\n// теоретически на один активатор может быть завязано несколько дропов (например дроп и тултип)\n// поэтому храним коллекцию коллбеков для каждого активатора\nconst intersectionCallbacks = new Map<ActivatorElementType, VoidFunction[]>();\nlet observer: IntersectionObserver;\n// Т.к. IntersectionObserver при первом вызове observe(element) сразу вызывает коллбек для элемента\n// необходимо игнорировать первый вызов коллбека после вызова observe, т.к. о изменении состояния сигнализирует только\n// второй вызов коллбека. Для этого используем set элементов, для которых был вызван observe, но еще не был вызван коллбек\nconst ignoreImmediateCallback = new Set<ActivatorElementType>();\n\nconst notifyAndClearSubscriptions = (element: HTMLElement) => {\n if (ignoreImmediateCallback.has(element)) {\n ignoreImmediateCallback.delete(element);\n return;\n }\n const callbacks = intersectionCallbacks.get(element);\n if (callbacks) {\n callbacks.forEach((callback) => callback());\n }\n intersectionCallbacks.delete(element);\n observer.unobserve(element);\n};\n\nconst initialize = () => {\n if (observer) {\n return;\n }\n\n observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n notifyAndClearSubscriptions(entry.target as HTMLElement);\n });\n });\n};\n\nconst observeIntersectionsOfElement = (element: ActivatorElementType, callback: VoidFunction) => {\n initialize();\n if (!intersectionCallbacks.has(element)) {\n intersectionCallbacks.set(element, []);\n ignoreImmediateCallback.add(element);\n observer.observe(element);\n }\n intersectionCallbacks.get(element)?.push(callback);\n};\n\nconst unobserveIntersectionsOfElement = (element: ActivatorElementType | null, callback: VoidFunction) => {\n if (!element) {\n return;\n }\n const callbacks = intersectionCallbacks.get(element);\n if (!callbacks) {\n return;\n }\n const filteredCallbacks = callbacks.filter((cb) => cb !== callback);\n if (filteredCallbacks.length === 0) {\n intersectionCallbacks.delete(element);\n observer.unobserve(element);\n return;\n }\n\n intersectionCallbacks.set(element, filteredCallbacks);\n};\n\nexport const useIntersectionSubscription = (\n activatorRef: RefObject<ActivatorElementType>,\n isVisible: boolean,\n ignore: boolean,\n callback: VoidFunction\n): void => {\n const intersectionCallbackRef = useRef(callback);\n intersectionCallbackRef.current = callback;\n\n const intersectionCallback = useCallback(() => intersectionCallbackRef.current(), []);\n\n useEffect(() => {\n if (!activatorRef.current || !isVisible || ignore) {\n return;\n }\n const target = activatorRef.current;\n observeIntersectionsOfElement(target, intersectionCallback);\n // eslint-disable-next-line consistent-return\n return () => {\n unobserveIntersectionsOfElement(target, intersectionCallback);\n };\n }, [isVisible, activatorRef, intersectionCallback, ignore]);\n};\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hh.ru/magritte-internal-drop-base",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.4",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -36,5 +36,5 @@
|
|
|
36
36
|
"publishConfig": {
|
|
37
37
|
"access": "public"
|
|
38
38
|
},
|
|
39
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "64a3b66ffa68df840b776eab36c09aa039bc3b78"
|
|
40
40
|
}
|
package/scrollManager.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { RefObject } from 'react';
|
|
2
|
+
import { ActivatorElementType } from '@hh.ru/magritte-internal-drop-base/types';
|
|
2
3
|
interface SubscriptionCallback {
|
|
3
4
|
(target: HTMLElement, deltaX: number, deltaY: number): void;
|
|
4
5
|
}
|
|
5
6
|
export declare const deleteScrollSubscription: (callback: SubscriptionCallback) => void;
|
|
6
|
-
export declare const useScrollSubscription: (activatorRef: RefObject<
|
|
7
|
+
export declare const useScrollSubscription: (activatorRef: RefObject<ActivatorElementType>, dropRef: RefObject<HTMLElement>, isVisible: boolean) => void;
|
|
7
8
|
export {};
|
package/scrollManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrollManager.js","sources":["../src/scrollManager.ts"],"sourcesContent":["import { MutableRefObject, RefObject, useCallback, useEffect, useRef } from 'react';\n\nimport { requestAnimation } from '@hh.ru/magritte-common-func-utils';\n\nlet isInitialized = false;\n\ninterface SubscriptionCallback {\n (target: HTMLElement, deltaX: number, deltaY: number): void;\n}\n\nconst scrollSubscriptions: Array<SubscriptionCallback> = [];\nconst canceledScrollSubscriptions: Map<HTMLElement, Array<SubscriptionCallback>> = new Map();\nconst lastScrollPosition: Map<HTMLElement, { x: number; y: number }> = new Map();\n\nconst scrollHandler = (event: Event) => {\n const target = event.target as HTMLElement;\n if (!target) {\n return;\n }\n\n const lastPosition = lastScrollPosition.get(target) || null;\n if (lastPosition === null) {\n // если мы не знаем предыдущую позицию для данного скроллящегося контейнера, то мы не сможем посчитать дельту\n // поэтому просто запоминаем текущую позицию и предотвращаем дальнейший обработку события\n lastScrollPosition.set(target, { x: target.scrollLeft, y: target.scrollTop });\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n // обращения к scrollLeft и scrollTop вызывают рефлоу, поэтому кешируем их значения\n const scrollValues = { scrollLeft: target.scrollLeft, scrollTop: target.scrollTop };\n const scrollDelta = {\n x: scrollValues.scrollLeft - lastPosition.x,\n y: scrollValues.scrollTop - lastPosition.y,\n };\n\n lastScrollPosition.set(target, { x: scrollValues.scrollLeft, y: scrollValues.scrollTop });\n\n if (scrollSubscriptions.length === 0) {\n return;\n }\n const canceledSubscriptions = canceledScrollSubscriptions.get(target);\n\n const subscriptions =\n canceledSubscriptions === undefined\n ? scrollSubscriptions\n : scrollSubscriptions.filter((subscription) => !canceledSubscriptions.includes(subscription));\n\n subscriptions.forEach((subscription) => subscription(target, scrollDelta.x, scrollDelta.y));\n};\n\nconst initialize = () => {\n if (isInitialized) {\n return;\n }\n\n isInitialized = true;\n document.addEventListener('scroll', scrollHandler, { capture: true, passive: false });\n};\n\nconst suspendSubscription = (callback: SubscriptionCallback): void => {\n const index = scrollSubscriptions.indexOf(callback);\n if (index !== -1) {\n scrollSubscriptions.splice(index, 1);\n }\n};\n\nconst reviveSubscription = (callback: SubscriptionCallback): void => {\n initialize();\n scrollSubscriptions.push(callback);\n};\n\nexport const deleteScrollSubscription = (callback: SubscriptionCallback): void => {\n const index = scrollSubscriptions.indexOf(callback);\n if (index !== -1) {\n scrollSubscriptions.splice(index, 1);\n }\n for (const [key, callbacks] of canceledScrollSubscriptions.entries()) {\n const index = callbacks.indexOf(callback);\n if (index !== -1) {\n canceledScrollSubscriptions.set(key, callbacks.splice(index, 1));\n }\n }\n};\n\nconst unsubscribeFromTarget = (target: HTMLElement, callback: SubscriptionCallback): void => {\n if (!canceledScrollSubscriptions.has(target)) {\n canceledScrollSubscriptions.set(target, []);\n }\n canceledScrollSubscriptions.get(target)?.push(callback);\n};\n\nconst updateDropTranslation = requestAnimation(\n (\n _,\n params: {\n dropRef: RefObject<HTMLElement>;\n deltaX: number;\n deltaY: number;\n currentTranslationRef: MutableRefObject<{ x: number; y: number }>;\n }\n ) => {\n const { dropRef, deltaX, deltaY, currentTranslationRef } = params;\n if (!dropRef.current) {\n return;\n }\n currentTranslationRef.current.x -= deltaX;\n currentTranslationRef.current.y -= deltaY;\n dropRef.current.style.transform = `translate3d(${currentTranslationRef.current.x}px, ${currentTranslationRef.current.y}px, 0)`;\n }\n);\n\nexport const useScrollSubscription = (\n activatorRef: RefObject<HTMLElement>,\n dropRef: RefObject<HTMLElement>,\n isVisible: boolean\n): void => {\n /**\n * список id скроллящихся элементов для которых была выполнена проверка\n * влияет ли их скролл на взаимное положение активатора и дропа\n */\n const processedScrollContainers = useRef<Set<HTMLElement>>(new Set());\n /**\n * текущее значение трансформации дропа\n * при каждом ререндере сбрасывается, т.к. дроп при каждом ререндере пересчитывает свою позицию\n */\n const currentTranslationRef = useRef({ x: 0, y: 0 });\n currentTranslationRef.current = { x: 0, y: 0 };\n /**\n * ссылка на последнее значение расстояния между активатором и дропом,\n * используется для определения изменения взаимного положения активатора и дропа\n */\n const visibleRef = useRef(isVisible);\n visibleRef.current = isVisible;\n\n const scrollCallback = useCallback(\n (target: HTMLElement, deltaX: number, deltaY: number) => {\n if (!visibleRef.current || !dropRef.current || !activatorRef.current) {\n return;\n }\n\n // Если это первый скролл данного контейнера, то проверяем содержит ли он активатор и дроп\n // Если он содержит только что-то одно, значит его скролл будет влиять на взаимное расположение дропа\n // и активатора, в этом случае помечяем его как обработанный и меняем позицию дропа при его скролле.\n // Если же он не влияет на взаимное расположение дропа и активатора, то отписываемся от дальнейших\n // оповещений о его скролле.\n if (!processedScrollContainers.current.has(target)) {\n const targetContainsActivator = target.contains(activatorRef.current);\n const targetContainsDrop = target.contains(dropRef.current);\n\n if (targetContainsActivator === targetContainsDrop) {\n unsubscribeFromTarget(target, scrollCallback);\n return;\n }\n processedScrollContainers.current.add(target);\n }\n\n updateDropTranslation({ deltaX, deltaY, dropRef, currentTranslationRef });\n },\n [activatorRef, dropRef]\n );\n\n useEffect(() => {\n // eslint-disable-next-line no-unused-expressions\n isVisible ? reviveSubscription(scrollCallback) : suspendSubscription(scrollCallback);\n }, [isVisible, scrollCallback]);\n\n useEffect(() => {\n return () => deleteScrollSubscription(scrollCallback);\n }, [scrollCallback]);\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scrollManager.js","sources":["../src/scrollManager.ts"],"sourcesContent":["import { MutableRefObject, RefObject, useCallback, useEffect, useRef } from 'react';\n\nimport { requestAnimation } from '@hh.ru/magritte-common-func-utils';\nimport { ActivatorElementType } from '@hh.ru/magritte-internal-drop-base/types';\n\nlet isInitialized = false;\n\ninterface SubscriptionCallback {\n (target: HTMLElement, deltaX: number, deltaY: number): void;\n}\n\nconst scrollSubscriptions: Array<SubscriptionCallback> = [];\nconst canceledScrollSubscriptions: Map<HTMLElement, Array<SubscriptionCallback>> = new Map();\nconst lastScrollPosition: Map<HTMLElement, { x: number; y: number }> = new Map();\n\nconst scrollHandler = (event: Event) => {\n const target = event.target as HTMLElement;\n if (!target) {\n return;\n }\n\n const lastPosition = lastScrollPosition.get(target) || null;\n if (lastPosition === null) {\n // если мы не знаем предыдущую позицию для данного скроллящегося контейнера, то мы не сможем посчитать дельту\n // поэтому просто запоминаем текущую позицию и предотвращаем дальнейший обработку события\n lastScrollPosition.set(target, { x: target.scrollLeft, y: target.scrollTop });\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n // обращения к scrollLeft и scrollTop вызывают рефлоу, поэтому кешируем их значения\n const scrollValues = { scrollLeft: target.scrollLeft, scrollTop: target.scrollTop };\n const scrollDelta = {\n x: scrollValues.scrollLeft - lastPosition.x,\n y: scrollValues.scrollTop - lastPosition.y,\n };\n\n lastScrollPosition.set(target, { x: scrollValues.scrollLeft, y: scrollValues.scrollTop });\n\n if (scrollSubscriptions.length === 0) {\n return;\n }\n const canceledSubscriptions = canceledScrollSubscriptions.get(target);\n\n const subscriptions =\n canceledSubscriptions === undefined\n ? scrollSubscriptions\n : scrollSubscriptions.filter((subscription) => !canceledSubscriptions.includes(subscription));\n\n subscriptions.forEach((subscription) => subscription(target, scrollDelta.x, scrollDelta.y));\n};\n\nconst initialize = () => {\n if (isInitialized) {\n return;\n }\n\n isInitialized = true;\n document.addEventListener('scroll', scrollHandler, { capture: true, passive: false });\n};\n\nconst suspendSubscription = (callback: SubscriptionCallback): void => {\n const index = scrollSubscriptions.indexOf(callback);\n if (index !== -1) {\n scrollSubscriptions.splice(index, 1);\n }\n};\n\nconst reviveSubscription = (callback: SubscriptionCallback): void => {\n initialize();\n scrollSubscriptions.push(callback);\n};\n\nexport const deleteScrollSubscription = (callback: SubscriptionCallback): void => {\n const index = scrollSubscriptions.indexOf(callback);\n if (index !== -1) {\n scrollSubscriptions.splice(index, 1);\n }\n for (const [key, callbacks] of canceledScrollSubscriptions.entries()) {\n const index = callbacks.indexOf(callback);\n if (index !== -1) {\n canceledScrollSubscriptions.set(key, callbacks.splice(index, 1));\n }\n }\n};\n\nconst unsubscribeFromTarget = (target: HTMLElement, callback: SubscriptionCallback): void => {\n if (!canceledScrollSubscriptions.has(target)) {\n canceledScrollSubscriptions.set(target, []);\n }\n canceledScrollSubscriptions.get(target)?.push(callback);\n};\n\nconst updateDropTranslation = requestAnimation(\n (\n _,\n params: {\n dropRef: RefObject<HTMLElement>;\n deltaX: number;\n deltaY: number;\n currentTranslationRef: MutableRefObject<{ x: number; y: number }>;\n }\n ) => {\n const { dropRef, deltaX, deltaY, currentTranslationRef } = params;\n if (!dropRef.current) {\n return;\n }\n currentTranslationRef.current.x -= deltaX;\n currentTranslationRef.current.y -= deltaY;\n dropRef.current.style.transform = `translate3d(${currentTranslationRef.current.x}px, ${currentTranslationRef.current.y}px, 0)`;\n }\n);\n\nexport const useScrollSubscription = (\n activatorRef: RefObject<ActivatorElementType>,\n dropRef: RefObject<HTMLElement>,\n isVisible: boolean\n): void => {\n /**\n * список id скроллящихся элементов для которых была выполнена проверка\n * влияет ли их скролл на взаимное положение активатора и дропа\n */\n const processedScrollContainers = useRef<Set<HTMLElement>>(new Set());\n /**\n * текущее значение трансформации дропа\n * при каждом ререндере сбрасывается, т.к. дроп при каждом ререндере пересчитывает свою позицию\n */\n const currentTranslationRef = useRef({ x: 0, y: 0 });\n currentTranslationRef.current = { x: 0, y: 0 };\n /**\n * ссылка на последнее значение расстояния между активатором и дропом,\n * используется для определения изменения взаимного положения активатора и дропа\n */\n const visibleRef = useRef(isVisible);\n visibleRef.current = isVisible;\n\n const scrollCallback = useCallback(\n (target: HTMLElement, deltaX: number, deltaY: number) => {\n if (!visibleRef.current || !dropRef.current || !activatorRef.current) {\n return;\n }\n\n // Если это первый скролл данного контейнера, то проверяем содержит ли он активатор и дроп\n // Если он содержит только что-то одно, значит его скролл будет влиять на взаимное расположение дропа\n // и активатора, в этом случае помечяем его как обработанный и меняем позицию дропа при его скролле.\n // Если же он не влияет на взаимное расположение дропа и активатора, то отписываемся от дальнейших\n // оповещений о его скролле.\n if (!processedScrollContainers.current.has(target)) {\n const targetContainsActivator = target.contains(activatorRef.current);\n const targetContainsDrop = target.contains(dropRef.current);\n\n if (targetContainsActivator === targetContainsDrop) {\n unsubscribeFromTarget(target, scrollCallback);\n return;\n }\n processedScrollContainers.current.add(target);\n }\n\n updateDropTranslation({ deltaX, deltaY, dropRef, currentTranslationRef });\n },\n [activatorRef, dropRef]\n );\n\n useEffect(() => {\n // eslint-disable-next-line no-unused-expressions\n isVisible ? reviveSubscription(scrollCallback) : suspendSubscription(scrollCallback);\n }, [isVisible, scrollCallback]);\n\n useEffect(() => {\n return () => deleteScrollSubscription(scrollCallback);\n }, [scrollCallback]);\n};\n"],"names":[],"mappings":"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"}
|
package/types.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import type { RefObject, ReactNode, CSSProperties } from 'react';
|
|
2
2
|
import type { CSSTransitionClassNames } from 'react-transition-group/CSSTransition';
|
|
3
3
|
import { KeyboardNavigationMode } from '@hh.ru/magritte-common-keyboard';
|
|
4
|
+
export type ActivatorElementType = HTMLElement | SVGElement;
|
|
4
5
|
export interface DropBasePermanentProps {
|
|
5
6
|
/** DOM нода хоста в рамках которого нужно рендерить компонент, по дефолту рендер будет в body */
|
|
6
7
|
host?: RefObject<HTMLElement>;
|
|
7
8
|
/** Флаг отвечает за показ компонента, `true` — показать, `false` — скрыть */
|
|
8
9
|
visible?: boolean;
|
|
9
10
|
/** Элемент активатор, относительно которого показывать всплывающую подсказку */
|
|
10
|
-
activatorRef: RefObject<
|
|
11
|
+
activatorRef: RefObject<ActivatorElementType>;
|
|
11
12
|
/** Расстояние от края DropBase до середины стрелки, если стрелки нет — то не указывать*/
|
|
12
13
|
arrowGuardDistance?: ArrowGuardDistance;
|
|
13
14
|
/** Задает виртуальный viewport */
|
package/useRenderParams.js
CHANGED
|
@@ -90,7 +90,17 @@ const useRenderParams = ({ direction, alignment, activatorRef, dropElementRef, h
|
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
92
92
|
if (widthEqualToActivator) {
|
|
93
|
-
|
|
93
|
+
let activatorWidth;
|
|
94
|
+
// сначала пытаемся получить ширину без трансформаций, getBoundingClientRect используем в последнюю очередь
|
|
95
|
+
if (activatorElement instanceof HTMLElement) {
|
|
96
|
+
activatorWidth = activatorElement.offsetWidth;
|
|
97
|
+
}
|
|
98
|
+
else if (activatorElement instanceof SVGGraphicsElement) {
|
|
99
|
+
activatorWidth = activatorElement.getBBox().width;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
activatorWidth = activatorElement.getBoundingClientRect().width;
|
|
103
|
+
}
|
|
94
104
|
dropElement.style.width = `${activatorWidth}px`;
|
|
95
105
|
}
|
|
96
106
|
hasScrollRef.current = checkScroll(dropScrollableContainerRef.current);
|
package/useRenderParams.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRenderParams.js","sources":["../src/useRenderParams.ts"],"sourcesContent":["import { useEffect, useLayoutEffect, useState, RefObject, useCallback, useRef } from 'react';\n\nimport { getOffsetElement } from '@hh.ru/magritte-common-metrics';\nimport { calculateRect, VIEWPORT_GUARD_DISTANCE } from '@hh.ru/magritte-internal-drop-base/calculateRect';\nimport type {\n ActivatorOffset,\n DropBaseProps,\n DropMetrics,\n RectPosition,\n CustomVisualViewport,\n CalculateRectType,\n ArrowGuardDistance,\n BaseArrowGuardDistance,\n DOMRectLike,\n DropBaseHorizontalPosition,\n DropBaseVerticalPosition,\n DropBaseHorizontalPositionWithoutCenter,\n DropBaseVerticalPositionWithoutCenter,\n Metrics,\n} from '@hh.ru/magritte-internal-drop-base/types';\n\nexport const allowedAlignmentForVerticalDirection = ['left', 'right', 'center'] as const;\nexport const allowedAlignmentForHorizontalDirection = ['top', 'bottom', 'center'] as const;\n\nexport const allowedAlignmentForVerticalDirectionWithoutCenter = ['left', 'right'] as const;\nexport const allowedAlignmentForHorizontalDirectionWithoutCenter = ['top', 'bottom'] as const;\n\nexport const verticalDirections = ['top', 'bottom'] as const;\nexport const horizontalDirections = ['left', 'right'] as const;\n\nexport const START_OFFSET = -10000;\nexport const INITIAL_HEIGHT_VALUE = 'force-initial-height';\n\ninterface FindDynamicPositionHor {\n directions: typeof horizontalDirections;\n alignments:\n | typeof allowedAlignmentForHorizontalDirection\n | typeof allowedAlignmentForHorizontalDirectionWithoutCenter;\n}\n\ninterface FindDynamicPositionVert {\n directions: typeof verticalDirections;\n alignments: typeof allowedAlignmentForVerticalDirection | typeof allowedAlignmentForVerticalDirectionWithoutCenter;\n}\n\ninterface FindDynamicPositionElementMetrics {\n activatorMetrics: DOMRect;\n dropMetrics: DOMRectLike;\n viewportMetrics: CustomVisualViewport;\n activatorOffset: ActivatorOffset;\n forceFitIntoViewport?: boolean;\n guardDistance: number;\n arrowGuardDistance?: ArrowGuardDistance;\n occupyAllAvailableViewportHeight: boolean;\n}\n\ntype ResultPosition = {\n viewportMetrics: CustomVisualViewport;\n hasScroll?: boolean;\n dropMetricsRelativeToViewport: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n };\n dropMetrics: DropMetrics;\n} & (\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n);\n\ntype GetDropMetricsByPositionAndAlignment<\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n> = FindDynamicPositionElementMetrics & Pick<DropBaseProps<T>, 'direction' | 'alignment'>;\n\nexport const getDropMetricsByPositionAndAlignment = <\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n>({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n alignment,\n arrowGuardDistance,\n activatorOffset,\n forceFitIntoViewport,\n guardDistance,\n occupyAllAvailableViewportHeight,\n}: GetDropMetricsByPositionAndAlignment<T>): ResultPosition | null => {\n const arrowGuardDistanceByPosition = (arrowGuardDistance as BaseArrowGuardDistance<T>)?.[direction];\n const minimalRectForActivatorWithDrop: RectPosition = (calculateRect as CalculateRectType<T>)[direction][alignment](\n {\n activatorMetrics,\n dropMetrics,\n viewportMetrics: window.visualViewport as VisualViewport,\n preferredViewportMetrics: viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n arrowGuardDistance: arrowGuardDistanceByPosition?.[alignment],\n occupyAllAvailableViewportHeight,\n }\n );\n\n const isFitIntoViewport =\n minimalRectForActivatorWithDrop.left >= 0 &&\n minimalRectForActivatorWithDrop.right >= 0 &&\n minimalRectForActivatorWithDrop.bottom >= 0 &&\n minimalRectForActivatorWithDrop.top >= 0 &&\n minimalRectForActivatorWithDrop.top > viewportMetrics.pageTop &&\n minimalRectForActivatorWithDrop.bottom < viewportMetrics.pageTop + viewportMetrics.height &&\n minimalRectForActivatorWithDrop.left > viewportMetrics.pageLeft &&\n minimalRectForActivatorWithDrop.right < viewportMetrics.pageLeft + viewportMetrics.width;\n\n if (isFitIntoViewport || forceFitIntoViewport) {\n return {\n direction,\n alignment,\n dropMetrics: minimalRectForActivatorWithDrop.dropMetrics,\n viewportMetrics: minimalRectForActivatorWithDrop.viewportMetrics,\n dropMetricsRelativeToViewport: {\n top: minimalRectForActivatorWithDrop.top,\n left: minimalRectForActivatorWithDrop.left,\n right: minimalRectForActivatorWithDrop.right,\n bottom: minimalRectForActivatorWithDrop.bottom,\n },\n } as ResultPosition;\n }\n\n return null;\n};\n\nexport function findDynamicPosition<T extends FindDynamicPositionHor | FindDynamicPositionVert>(\n {\n activatorMetrics,\n arrowGuardDistance,\n dropMetrics,\n viewportMetrics,\n activatorOffset,\n guardDistance,\n occupyAllAvailableViewportHeight,\n }: FindDynamicPositionElementMetrics,\n { directions, alignments }: T\n): ResultPosition | null {\n for (const direction of directions) {\n for (const align of alignments) {\n const result = getDropMetricsByPositionAndAlignment({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n arrowGuardDistance,\n alignment: align,\n activatorOffset,\n guardDistance,\n occupyAllAvailableViewportHeight,\n });\n\n if (result) {\n return result;\n }\n }\n }\n\n return null;\n}\n\nexport type RenderParamsProps<\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n> = Omit<DropBaseProps<T>, 'children' | 'animationClassNames' | 'animationTimeout' | 'guardDistance' | 'role'> & {\n dropElementRef: RefObject<HTMLElement>;\n dropScrollableContainerRef: RefObject<HTMLElement>;\n guardDistance: number;\n widthEqualToActivator?: boolean;\n};\n\nconst checkScroll = (element: HTMLElement | null) =>\n element ? element.scrollHeight - element.clientHeight > 0 : false;\n\nexport const useRenderParams = <\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n>({\n direction,\n alignment,\n activatorRef,\n dropElementRef,\n host,\n arrowGuardDistance,\n preferredViewport,\n visible,\n guardDistance,\n occupyAllAvailableViewportHeight,\n dropScrollableContainerRef,\n forcePosition,\n widthEqualToActivator,\n}: RenderParamsProps<T>): {\n metrics: Metrics;\n position:\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter;\n} => {\n const minimalDropHeightRef = useRef<undefined | number>(undefined);\n const [calculateDirection, setCalculateDirection] = useState<typeof direction>(direction);\n const [calculateAlignment, setCalculateAlignment] = useState<typeof alignment>(alignment);\n const [_occupyAllAvailableViewportHeight, setOccupyAllAvailableViewportHeight] = useState(\n occupyAllAvailableViewportHeight ?? false\n );\n const [result, setResult] = useState<ResultPosition>();\n type Position = { top: number; left: number; height?: string | number };\n const [position, setPosition] = useState<Position>({\n left: START_OFFSET,\n top: START_OFFSET,\n height: 'auto',\n });\n const hasScrollRef = useRef<boolean | null>(null);\n\n const updateRenderParams = useCallback(\n (fromObserver?: boolean) => {\n const activatorElement = activatorRef.current;\n const dropElement = dropElementRef.current;\n const hostElement = host ? host.current : document.body;\n\n if (!dropElement || !activatorElement || !visible) {\n return;\n }\n\n if (widthEqualToActivator) {\n const activatorWidth = activatorElement.offsetWidth;\n dropElement.style.width = `${activatorWidth}px`;\n }\n\n hasScrollRef.current = checkScroll(dropScrollableContainerRef.current);\n const useAvailableViewportHeightForDrop =\n (hasScrollRef.current && fromObserver) || _occupyAllAvailableViewportHeight;\n\n const element = activatorElement;\n const activatorMetrics = element.getBoundingClientRect();\n const dropMetricsRaw = dropElement.getBoundingClientRect();\n const dropMetrics: DOMRectLike = {\n top: dropMetricsRaw.top,\n left: dropMetricsRaw.left,\n right: dropMetricsRaw.right,\n bottom: dropMetricsRaw.bottom,\n height: dropMetricsRaw.height,\n width: dropMetricsRaw.width,\n };\n const viewport = window.visualViewport;\n\n if (minimalDropHeightRef.current && dropMetrics.height < minimalDropHeightRef.current) {\n minimalDropHeightRef.current = dropMetrics.height;\n }\n\n if (useAvailableViewportHeightForDrop) {\n minimalDropHeightRef.current = minimalDropHeightRef.current ?? dropMetrics.height;\n dropMetrics.height = minimalDropHeightRef.current;\n dropMetrics.bottom = dropMetrics.top + dropMetrics.height;\n }\n\n if (viewport === null) {\n throw new Error('Magritte component DropBase: Viewport data is null');\n }\n\n const viewports: CustomVisualViewport[] = [\n {\n pageTop: viewport.pageTop,\n pageLeft: viewport.pageLeft,\n width: viewport.width,\n height: viewport.height,\n },\n ];\n\n const preferredViewportElement = preferredViewport?.current;\n\n /**\n * Метрики расчета кастомного viewport, случай когда хотим\n * поционировать дроп внутри границ другого элемента\n * Если дроп не влезает в кастомный viewport помещаем его\n * в реальный viewport\n **/\n if (preferredViewportElement) {\n const preferredViewportMetrics = preferredViewportElement.getBoundingClientRect();\n\n /**\n * Высота кастомного viewport в случае если элемент находится\n * в рамках реального viewport с верхней стороны\n **/\n const viewportHeightForPositiveTop =\n preferredViewportMetrics.bottom > viewport.height\n ? viewport.height - preferredViewportMetrics.top\n : preferredViewportMetrics.height;\n /**\n * Высота кастомного viewport в случае если элемент не находится\n * в рамках реального viewport с верхней стороны\n * (часть блока проскролили)\n **/\n const viewportHeightForNegativeTop =\n preferredViewportMetrics.bottom < 0 ? 0 : preferredViewportMetrics.bottom;\n /**\n * Ширина кастомного viewport в случае если элемент находится\n * в рамках реального viewport с левой стороны\n **/\n const viewportWidthForPositiveLeft =\n preferredViewportMetrics.right > viewport.width\n ? viewport.width - preferredViewportMetrics.left\n : preferredViewportMetrics.width;\n /**\n * Ширина кастомного viewport в случае если элемент не находится\n * в рамках реального viewport с левой стороны\n * (часть блока проскролили)\n **/\n const viewportWidthForForNegativeLeft =\n preferredViewportMetrics.right < 0 ? 0 : preferredViewportMetrics.right;\n\n viewports.unshift({\n /* Имитация pageTop, pageLeft кастомного viewport, при скроле могут быть\n * смещения либо по границе реального viewport если часть\n * кастомного ушла за границу реального viewport, либо\n * если кастомный viewport находится в границе реального viewport\n **/\n pageTop:\n preferredViewportMetrics.top < 0\n ? viewport.pageTop\n : viewport.pageTop + preferredViewportMetrics.top,\n pageLeft:\n preferredViewportMetrics.left < 0\n ? viewport.pageLeft\n : viewport.pageLeft + preferredViewportMetrics.left,\n width:\n preferredViewportMetrics.left < 0\n ? viewportWidthForForNegativeLeft\n : viewportWidthForPositiveLeft,\n height:\n preferredViewportMetrics.top < 0 ? viewportHeightForNegativeTop : viewportHeightForPositiveTop,\n });\n }\n\n for (const viewportMetrics of viewports) {\n const activatorOffset = hostElement\n ? getOffsetElement(activatorElement, hostElement)\n : { offsetLeft: 0, offsetTop: 0 };\n\n let result: ResultPosition | null = getDropMetricsByPositionAndAlignment({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n arrowGuardDistance,\n alignment,\n activatorOffset,\n guardDistance,\n occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,\n forceFitIntoViewport: forcePosition,\n });\n\n if (result === null) {\n result = findDynamicPosition<FindDynamicPositionHor>(\n {\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n activatorOffset,\n arrowGuardDistance,\n guardDistance,\n occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,\n },\n {\n directions: horizontalDirections,\n alignments: occupyAllAvailableViewportHeight\n ? allowedAlignmentForHorizontalDirectionWithoutCenter\n : allowedAlignmentForHorizontalDirection,\n }\n );\n }\n\n if (result === null) {\n result = findDynamicPosition<FindDynamicPositionVert>(\n {\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n activatorOffset,\n arrowGuardDistance,\n guardDistance,\n occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,\n },\n {\n directions: verticalDirections,\n alignments: occupyAllAvailableViewportHeight\n ? allowedAlignmentForVerticalDirectionWithoutCenter\n : allowedAlignmentForVerticalDirection,\n }\n );\n }\n\n if (result === null && viewports[viewports.length - 1] === viewportMetrics) {\n result = getDropMetricsByPositionAndAlignment({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n alignment,\n activatorOffset,\n arrowGuardDistance,\n forceFitIntoViewport: true,\n guardDistance,\n occupyAllAvailableViewportHeight: false,\n });\n\n if (result?.dropMetrics.height) {\n result.dropMetrics.height = INITIAL_HEIGHT_VALUE;\n }\n }\n\n if (result !== null) {\n setCalculateDirection(result.direction);\n setCalculateAlignment(result.alignment);\n setPosition(result.dropMetrics);\n hasScrollRef.current = checkScroll(dropScrollableContainerRef.current);\n setResult(result);\n\n return;\n }\n }\n },\n [\n visible,\n activatorRef,\n dropElementRef,\n dropScrollableContainerRef,\n host,\n alignment,\n direction,\n arrowGuardDistance,\n preferredViewport,\n guardDistance,\n _occupyAllAvailableViewportHeight,\n occupyAllAvailableViewportHeight,\n forcePosition,\n widthEqualToActivator,\n ]\n );\n\n useEffect(() => {\n if (occupyAllAvailableViewportHeight && result) {\n if (hasScrollRef.current) {\n return;\n }\n\n if (\n result.direction === 'top' ||\n ((result.direction === 'left' || result.direction === 'right') && result.alignment === 'bottom')\n ) {\n setOccupyAllAvailableViewportHeight(\n result?.dropMetricsRelativeToViewport.top - result.viewportMetrics.pageTop < VIEWPORT_GUARD_DISTANCE\n );\n }\n\n if (\n result.direction === 'bottom' ||\n ((result.direction === 'left' || result.direction === 'right') && result.alignment === 'top')\n ) {\n setOccupyAllAvailableViewportHeight(\n result.viewportMetrics.pageTop +\n result.viewportMetrics.height -\n result.dropMetricsRelativeToViewport.bottom <\n VIEWPORT_GUARD_DISTANCE\n );\n }\n }\n }, [result, occupyAllAvailableViewportHeight, _occupyAllAvailableViewportHeight]);\n\n useLayoutEffect(updateRenderParams, [updateRenderParams]);\n\n useEffect(() => {\n const activatorElement = activatorRef.current;\n const hostElement = host ? host.current : document.body;\n\n const updatePosition = () => {\n updateRenderParams(true);\n };\n\n const resizeObserver = new ResizeObserver(updatePosition);\n const observer = new MutationObserver(updatePosition);\n\n if (hostElement === document.body) {\n window.addEventListener('resize', updatePosition);\n } else if (hostElement) {\n resizeObserver.observe(hostElement);\n }\n if (hostElement !== document.body && occupyAllAvailableViewportHeight) {\n resizeObserver.observe(document.body);\n }\n if (activatorElement) {\n resizeObserver.observe(activatorElement);\n }\n if (activatorElement) {\n observer.observe(activatorElement, { attributes: true, childList: false, subtree: false });\n }\n if (preferredViewport?.current) {\n resizeObserver.observe(preferredViewport.current);\n }\n\n return () => {\n resizeObserver.disconnect();\n observer.disconnect();\n\n if (hostElement === document.body) {\n removeEventListener('resize', updatePosition);\n }\n };\n }, [updateRenderParams, activatorRef, host, preferredViewport, occupyAllAvailableViewportHeight]);\n\n return {\n position: {\n direction: calculateDirection,\n alignment: calculateAlignment,\n } as\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter,\n metrics: position,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useRenderParams.js","sources":["../src/useRenderParams.ts"],"sourcesContent":["import { useEffect, useLayoutEffect, useState, RefObject, useCallback, useRef } from 'react';\n\nimport { getOffsetElement } from '@hh.ru/magritte-common-metrics';\nimport { calculateRect, VIEWPORT_GUARD_DISTANCE } from '@hh.ru/magritte-internal-drop-base/calculateRect';\nimport type {\n ActivatorOffset,\n DropBaseProps,\n DropMetrics,\n RectPosition,\n CustomVisualViewport,\n CalculateRectType,\n ArrowGuardDistance,\n BaseArrowGuardDistance,\n DOMRectLike,\n DropBaseHorizontalPosition,\n DropBaseVerticalPosition,\n DropBaseHorizontalPositionWithoutCenter,\n DropBaseVerticalPositionWithoutCenter,\n Metrics,\n} from '@hh.ru/magritte-internal-drop-base/types';\n\nexport const allowedAlignmentForVerticalDirection = ['left', 'right', 'center'] as const;\nexport const allowedAlignmentForHorizontalDirection = ['top', 'bottom', 'center'] as const;\n\nexport const allowedAlignmentForVerticalDirectionWithoutCenter = ['left', 'right'] as const;\nexport const allowedAlignmentForHorizontalDirectionWithoutCenter = ['top', 'bottom'] as const;\n\nexport const verticalDirections = ['top', 'bottom'] as const;\nexport const horizontalDirections = ['left', 'right'] as const;\n\nexport const START_OFFSET = -10000;\nexport const INITIAL_HEIGHT_VALUE = 'force-initial-height';\n\ninterface FindDynamicPositionHor {\n directions: typeof horizontalDirections;\n alignments:\n | typeof allowedAlignmentForHorizontalDirection\n | typeof allowedAlignmentForHorizontalDirectionWithoutCenter;\n}\n\ninterface FindDynamicPositionVert {\n directions: typeof verticalDirections;\n alignments: typeof allowedAlignmentForVerticalDirection | typeof allowedAlignmentForVerticalDirectionWithoutCenter;\n}\n\ninterface FindDynamicPositionElementMetrics {\n activatorMetrics: DOMRect;\n dropMetrics: DOMRectLike;\n viewportMetrics: CustomVisualViewport;\n activatorOffset: ActivatorOffset;\n forceFitIntoViewport?: boolean;\n guardDistance: number;\n arrowGuardDistance?: ArrowGuardDistance;\n occupyAllAvailableViewportHeight: boolean;\n}\n\ntype ResultPosition = {\n viewportMetrics: CustomVisualViewport;\n hasScroll?: boolean;\n dropMetricsRelativeToViewport: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n };\n dropMetrics: DropMetrics;\n} & (\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n);\n\ntype GetDropMetricsByPositionAndAlignment<\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n> = FindDynamicPositionElementMetrics & Pick<DropBaseProps<T>, 'direction' | 'alignment'>;\n\nexport const getDropMetricsByPositionAndAlignment = <\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n>({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n alignment,\n arrowGuardDistance,\n activatorOffset,\n forceFitIntoViewport,\n guardDistance,\n occupyAllAvailableViewportHeight,\n}: GetDropMetricsByPositionAndAlignment<T>): ResultPosition | null => {\n const arrowGuardDistanceByPosition = (arrowGuardDistance as BaseArrowGuardDistance<T>)?.[direction];\n const minimalRectForActivatorWithDrop: RectPosition = (calculateRect as CalculateRectType<T>)[direction][alignment](\n {\n activatorMetrics,\n dropMetrics,\n viewportMetrics: window.visualViewport as VisualViewport,\n preferredViewportMetrics: viewportMetrics,\n direction,\n activatorOffset,\n guardDistance,\n arrowGuardDistance: arrowGuardDistanceByPosition?.[alignment],\n occupyAllAvailableViewportHeight,\n }\n );\n\n const isFitIntoViewport =\n minimalRectForActivatorWithDrop.left >= 0 &&\n minimalRectForActivatorWithDrop.right >= 0 &&\n minimalRectForActivatorWithDrop.bottom >= 0 &&\n minimalRectForActivatorWithDrop.top >= 0 &&\n minimalRectForActivatorWithDrop.top > viewportMetrics.pageTop &&\n minimalRectForActivatorWithDrop.bottom < viewportMetrics.pageTop + viewportMetrics.height &&\n minimalRectForActivatorWithDrop.left > viewportMetrics.pageLeft &&\n minimalRectForActivatorWithDrop.right < viewportMetrics.pageLeft + viewportMetrics.width;\n\n if (isFitIntoViewport || forceFitIntoViewport) {\n return {\n direction,\n alignment,\n dropMetrics: minimalRectForActivatorWithDrop.dropMetrics,\n viewportMetrics: minimalRectForActivatorWithDrop.viewportMetrics,\n dropMetricsRelativeToViewport: {\n top: minimalRectForActivatorWithDrop.top,\n left: minimalRectForActivatorWithDrop.left,\n right: minimalRectForActivatorWithDrop.right,\n bottom: minimalRectForActivatorWithDrop.bottom,\n },\n } as ResultPosition;\n }\n\n return null;\n};\n\nexport function findDynamicPosition<T extends FindDynamicPositionHor | FindDynamicPositionVert>(\n {\n activatorMetrics,\n arrowGuardDistance,\n dropMetrics,\n viewportMetrics,\n activatorOffset,\n guardDistance,\n occupyAllAvailableViewportHeight,\n }: FindDynamicPositionElementMetrics,\n { directions, alignments }: T\n): ResultPosition | null {\n for (const direction of directions) {\n for (const align of alignments) {\n const result = getDropMetricsByPositionAndAlignment({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n arrowGuardDistance,\n alignment: align,\n activatorOffset,\n guardDistance,\n occupyAllAvailableViewportHeight,\n });\n\n if (result) {\n return result;\n }\n }\n }\n\n return null;\n}\n\nexport type RenderParamsProps<\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n> = Omit<DropBaseProps<T>, 'children' | 'animationClassNames' | 'animationTimeout' | 'guardDistance' | 'role'> & {\n dropElementRef: RefObject<HTMLElement>;\n dropScrollableContainerRef: RefObject<HTMLElement>;\n guardDistance: number;\n widthEqualToActivator?: boolean;\n};\n\nconst checkScroll = (element: HTMLElement | null) =>\n element ? element.scrollHeight - element.clientHeight > 0 : false;\n\nexport const useRenderParams = <\n T extends\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter\n>({\n direction,\n alignment,\n activatorRef,\n dropElementRef,\n host,\n arrowGuardDistance,\n preferredViewport,\n visible,\n guardDistance,\n occupyAllAvailableViewportHeight,\n dropScrollableContainerRef,\n forcePosition,\n widthEqualToActivator,\n}: RenderParamsProps<T>): {\n metrics: Metrics;\n position:\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter;\n} => {\n const minimalDropHeightRef = useRef<undefined | number>(undefined);\n const [calculateDirection, setCalculateDirection] = useState<typeof direction>(direction);\n const [calculateAlignment, setCalculateAlignment] = useState<typeof alignment>(alignment);\n const [_occupyAllAvailableViewportHeight, setOccupyAllAvailableViewportHeight] = useState(\n occupyAllAvailableViewportHeight ?? false\n );\n const [result, setResult] = useState<ResultPosition>();\n type Position = { top: number; left: number; height?: string | number };\n const [position, setPosition] = useState<Position>({\n left: START_OFFSET,\n top: START_OFFSET,\n height: 'auto',\n });\n const hasScrollRef = useRef<boolean | null>(null);\n\n const updateRenderParams = useCallback(\n (fromObserver?: boolean) => {\n const activatorElement = activatorRef.current;\n const dropElement = dropElementRef.current;\n const hostElement = host ? host.current : document.body;\n\n if (!dropElement || !activatorElement || !visible) {\n return;\n }\n\n if (widthEqualToActivator) {\n let activatorWidth;\n // сначала пытаемся получить ширину без трансформаций, getBoundingClientRect используем в последнюю очередь\n if (activatorElement instanceof HTMLElement) {\n activatorWidth = activatorElement.offsetWidth;\n } else if (activatorElement instanceof SVGGraphicsElement) {\n activatorWidth = activatorElement.getBBox().width;\n } else {\n activatorWidth = activatorElement.getBoundingClientRect().width;\n }\n dropElement.style.width = `${activatorWidth}px`;\n }\n\n hasScrollRef.current = checkScroll(dropScrollableContainerRef.current);\n const useAvailableViewportHeightForDrop =\n (hasScrollRef.current && fromObserver) || _occupyAllAvailableViewportHeight;\n\n const element = activatorElement;\n const activatorMetrics = element.getBoundingClientRect();\n const dropMetricsRaw = dropElement.getBoundingClientRect();\n const dropMetrics: DOMRectLike = {\n top: dropMetricsRaw.top,\n left: dropMetricsRaw.left,\n right: dropMetricsRaw.right,\n bottom: dropMetricsRaw.bottom,\n height: dropMetricsRaw.height,\n width: dropMetricsRaw.width,\n };\n const viewport = window.visualViewport;\n\n if (minimalDropHeightRef.current && dropMetrics.height < minimalDropHeightRef.current) {\n minimalDropHeightRef.current = dropMetrics.height;\n }\n\n if (useAvailableViewportHeightForDrop) {\n minimalDropHeightRef.current = minimalDropHeightRef.current ?? dropMetrics.height;\n dropMetrics.height = minimalDropHeightRef.current;\n dropMetrics.bottom = dropMetrics.top + dropMetrics.height;\n }\n\n if (viewport === null) {\n throw new Error('Magritte component DropBase: Viewport data is null');\n }\n\n const viewports: CustomVisualViewport[] = [\n {\n pageTop: viewport.pageTop,\n pageLeft: viewport.pageLeft,\n width: viewport.width,\n height: viewport.height,\n },\n ];\n\n const preferredViewportElement = preferredViewport?.current;\n\n /**\n * Метрики расчета кастомного viewport, случай когда хотим\n * поционировать дроп внутри границ другого элемента\n * Если дроп не влезает в кастомный viewport помещаем его\n * в реальный viewport\n **/\n if (preferredViewportElement) {\n const preferredViewportMetrics = preferredViewportElement.getBoundingClientRect();\n\n /**\n * Высота кастомного viewport в случае если элемент находится\n * в рамках реального viewport с верхней стороны\n **/\n const viewportHeightForPositiveTop =\n preferredViewportMetrics.bottom > viewport.height\n ? viewport.height - preferredViewportMetrics.top\n : preferredViewportMetrics.height;\n /**\n * Высота кастомного viewport в случае если элемент не находится\n * в рамках реального viewport с верхней стороны\n * (часть блока проскролили)\n **/\n const viewportHeightForNegativeTop =\n preferredViewportMetrics.bottom < 0 ? 0 : preferredViewportMetrics.bottom;\n /**\n * Ширина кастомного viewport в случае если элемент находится\n * в рамках реального viewport с левой стороны\n **/\n const viewportWidthForPositiveLeft =\n preferredViewportMetrics.right > viewport.width\n ? viewport.width - preferredViewportMetrics.left\n : preferredViewportMetrics.width;\n /**\n * Ширина кастомного viewport в случае если элемент не находится\n * в рамках реального viewport с левой стороны\n * (часть блока проскролили)\n **/\n const viewportWidthForForNegativeLeft =\n preferredViewportMetrics.right < 0 ? 0 : preferredViewportMetrics.right;\n\n viewports.unshift({\n /* Имитация pageTop, pageLeft кастомного viewport, при скроле могут быть\n * смещения либо по границе реального viewport если часть\n * кастомного ушла за границу реального viewport, либо\n * если кастомный viewport находится в границе реального viewport\n **/\n pageTop:\n preferredViewportMetrics.top < 0\n ? viewport.pageTop\n : viewport.pageTop + preferredViewportMetrics.top,\n pageLeft:\n preferredViewportMetrics.left < 0\n ? viewport.pageLeft\n : viewport.pageLeft + preferredViewportMetrics.left,\n width:\n preferredViewportMetrics.left < 0\n ? viewportWidthForForNegativeLeft\n : viewportWidthForPositiveLeft,\n height:\n preferredViewportMetrics.top < 0 ? viewportHeightForNegativeTop : viewportHeightForPositiveTop,\n });\n }\n\n for (const viewportMetrics of viewports) {\n const activatorOffset = hostElement\n ? getOffsetElement(activatorElement, hostElement)\n : { offsetLeft: 0, offsetTop: 0 };\n\n let result: ResultPosition | null = getDropMetricsByPositionAndAlignment({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n arrowGuardDistance,\n alignment,\n activatorOffset,\n guardDistance,\n occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,\n forceFitIntoViewport: forcePosition,\n });\n\n if (result === null) {\n result = findDynamicPosition<FindDynamicPositionHor>(\n {\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n activatorOffset,\n arrowGuardDistance,\n guardDistance,\n occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,\n },\n {\n directions: horizontalDirections,\n alignments: occupyAllAvailableViewportHeight\n ? allowedAlignmentForHorizontalDirectionWithoutCenter\n : allowedAlignmentForHorizontalDirection,\n }\n );\n }\n\n if (result === null) {\n result = findDynamicPosition<FindDynamicPositionVert>(\n {\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n activatorOffset,\n arrowGuardDistance,\n guardDistance,\n occupyAllAvailableViewportHeight: useAvailableViewportHeightForDrop,\n },\n {\n directions: verticalDirections,\n alignments: occupyAllAvailableViewportHeight\n ? allowedAlignmentForVerticalDirectionWithoutCenter\n : allowedAlignmentForVerticalDirection,\n }\n );\n }\n\n if (result === null && viewports[viewports.length - 1] === viewportMetrics) {\n result = getDropMetricsByPositionAndAlignment({\n activatorMetrics,\n dropMetrics,\n viewportMetrics,\n direction,\n alignment,\n activatorOffset,\n arrowGuardDistance,\n forceFitIntoViewport: true,\n guardDistance,\n occupyAllAvailableViewportHeight: false,\n });\n\n if (result?.dropMetrics.height) {\n result.dropMetrics.height = INITIAL_HEIGHT_VALUE;\n }\n }\n\n if (result !== null) {\n setCalculateDirection(result.direction);\n setCalculateAlignment(result.alignment);\n setPosition(result.dropMetrics);\n hasScrollRef.current = checkScroll(dropScrollableContainerRef.current);\n setResult(result);\n\n return;\n }\n }\n },\n [\n visible,\n activatorRef,\n dropElementRef,\n dropScrollableContainerRef,\n host,\n alignment,\n direction,\n arrowGuardDistance,\n preferredViewport,\n guardDistance,\n _occupyAllAvailableViewportHeight,\n occupyAllAvailableViewportHeight,\n forcePosition,\n widthEqualToActivator,\n ]\n );\n\n useEffect(() => {\n if (occupyAllAvailableViewportHeight && result) {\n if (hasScrollRef.current) {\n return;\n }\n\n if (\n result.direction === 'top' ||\n ((result.direction === 'left' || result.direction === 'right') && result.alignment === 'bottom')\n ) {\n setOccupyAllAvailableViewportHeight(\n result?.dropMetricsRelativeToViewport.top - result.viewportMetrics.pageTop < VIEWPORT_GUARD_DISTANCE\n );\n }\n\n if (\n result.direction === 'bottom' ||\n ((result.direction === 'left' || result.direction === 'right') && result.alignment === 'top')\n ) {\n setOccupyAllAvailableViewportHeight(\n result.viewportMetrics.pageTop +\n result.viewportMetrics.height -\n result.dropMetricsRelativeToViewport.bottom <\n VIEWPORT_GUARD_DISTANCE\n );\n }\n }\n }, [result, occupyAllAvailableViewportHeight, _occupyAllAvailableViewportHeight]);\n\n useLayoutEffect(updateRenderParams, [updateRenderParams]);\n\n useEffect(() => {\n const activatorElement = activatorRef.current;\n const hostElement = host ? host.current : document.body;\n\n const updatePosition = () => {\n updateRenderParams(true);\n };\n\n const resizeObserver = new ResizeObserver(updatePosition);\n const observer = new MutationObserver(updatePosition);\n\n if (hostElement === document.body) {\n window.addEventListener('resize', updatePosition);\n } else if (hostElement) {\n resizeObserver.observe(hostElement);\n }\n if (hostElement !== document.body && occupyAllAvailableViewportHeight) {\n resizeObserver.observe(document.body);\n }\n if (activatorElement) {\n resizeObserver.observe(activatorElement);\n }\n if (activatorElement) {\n observer.observe(activatorElement, { attributes: true, childList: false, subtree: false });\n }\n if (preferredViewport?.current) {\n resizeObserver.observe(preferredViewport.current);\n }\n\n return () => {\n resizeObserver.disconnect();\n observer.disconnect();\n\n if (hostElement === document.body) {\n removeEventListener('resize', updatePosition);\n }\n };\n }, [updateRenderParams, activatorRef, host, preferredViewport, occupyAllAvailableViewportHeight]);\n\n return {\n position: {\n direction: calculateDirection,\n alignment: calculateAlignment,\n } as\n | DropBaseHorizontalPosition\n | DropBaseVerticalPosition\n | DropBaseHorizontalPositionWithoutCenter\n | DropBaseVerticalPositionWithoutCenter,\n metrics: position,\n };\n};\n"],"names":[],"mappings":"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"}
|