@hh.ru/magritte-internal-drop-base 6.0.4 → 7.0.1
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.d.ts +196 -6
- package/DropBase.js +9 -30
- package/DropBase.js.map +1 -1
- package/findBestFitPlacement.d.ts +69 -0
- package/findBestFitPlacement.js +270 -0
- package/findBestFitPlacement.js.map +1 -0
- package/index.css +1 -1
- package/index.d.ts +0 -1
- package/index.js +3 -3
- package/package.json +4 -4
- package/positionManager.d.ts +11 -0
- package/positionManager.js +200 -0
- package/positionManager.js.map +1 -0
- package/types.d.ts +34 -172
- package/useMonitorResize.d.ts +25 -0
- package/useMonitorResize.js +61 -0
- package/useMonitorResize.js.map +1 -0
- package/calculateRect.d.ts +0 -18
- package/calculateRect.js +0 -319
- package/calculateRect.js.map +0 -1
- package/scrollManager.d.ts +0 -8
- package/scrollManager.js +0 -131
- package/scrollManager.js.map +0 -1
- package/useRenderParams.d.ts +0 -53
- package/useRenderParams.js +0 -345
- package/useRenderParams.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"positionManager.js","sources":["../src/positionManager.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef, useLayoutEffect, MutableRefObject } from 'react';\n\nimport { requestAnimation } from '@hh.ru/magritte-common-func-utils';\nimport {\n findBestFitPlacement,\n getMetrics,\n applyPlacementToDrop,\n} from '@hh.ru/magritte-internal-drop-base/findBestFitPlacement';\nimport type {\n ArrowGuardDistance,\n ActivatorElementType,\n Placement,\n RefCallbackFactory,\n} from '@hh.ru/magritte-internal-drop-base/types';\nimport { useMonitorResize } from '@hh.ru/magritte-internal-drop-base/useMonitorResize';\n\nlet isInitialized = false;\n\ninterface SubscriptionCallback {\n (target: HTMLElement): void;\n}\n\nconst scrollSubscriptions: Array<SubscriptionCallback> = [];\nconst canceledScrollSubscriptions: Map<HTMLElement, Array<SubscriptionCallback>> = new Map();\n\nconst scrollHandler = (event: Event) => {\n const target = event.target as HTMLElement;\n if (!target) {\n return;\n }\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));\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\nexport const usePositionManager = (\n activatorRef: RefObject<ActivatorElementType>,\n dropRef: RefObject<HTMLElement>,\n isVisible: boolean,\n placement: Placement | Placement[],\n customViewport: RefObject<HTMLElement> | undefined,\n allowShrinkHeightToFitIntoViewport: boolean,\n widthEqualToActivator: boolean,\n arrowGuardDistance: ArrowGuardDistance,\n guardDistanceToActivator: number,\n guardDistanceToViewport: number,\n minDropHeight: number,\n forceDropMetricsUpdate: MutableRefObject<VoidFunction> | undefined\n): {\n resizeRefCallbackFactory: RefCallbackFactory;\n bestFitPlacementRect: DOMRect | undefined;\n} => {\n const bestFitPlacementRef = useRef<DOMRect>();\n const dropMetricsRef = useRef<DOMRect>();\n\n const prefferedPlacementRef = useRef<Placement>();\n\n const updateMetricsSyncRef = useRef<VoidFunction>(() => void 0);\n const updateMetricsRef = useRef<VoidFunction>(() => void 0);\n\n const { getResizeObserver, observeResizeRefCallbackFactory, getObservedElementsInfoMap } = useMonitorResize(\n dropMetricsRef,\n updateMetricsRef\n );\n\n const getDropMetrics = useCallback(() => {\n if (dropMetricsRef.current) {\n return dropMetricsRef.current;\n }\n if (!dropRef.current) {\n return new DOMRect();\n }\n\n const scrollPositions: { node: HTMLElement; top: number; left: number }[] = [];\n for (const info of getObservedElementsInfoMap().values()) {\n if (info.isScrollable && info.node) {\n scrollPositions.push({\n node: info.node,\n top: info.node.scrollTop,\n left: info.node.scrollLeft,\n });\n }\n }\n\n dropRef.current.style.width = '';\n dropRef.current.style.height = '';\n dropMetricsRef.current = dropRef.current.getBoundingClientRect();\n if (bestFitPlacementRef.current) {\n applyPlacementToDrop(dropRef, bestFitPlacementRef.current);\n }\n for (const { node, top, left } of scrollPositions) {\n node.scrollTop = top;\n node.scrollLeft = left;\n }\n return dropMetricsRef.current;\n }, [dropRef, getObservedElementsInfoMap]);\n\n // Создаю синхронную функцию для обновления размещения дропа и обновления атрибутов на элементе\n // и сразу же создаю вресию оберунтую в raf. Синхронная версия нужна при первом показе, т.к. на атрибуты на элементе\n // может быть завязана анимация, которая должна начаться сразу же после показа. raf версия нужна для реакции на\n // скролл/ресайз и т.д.\n updateMetricsSyncRef.current = () => {\n if (!dropRef.current || !isVisible) {\n bestFitPlacementRef.current = undefined;\n return;\n }\n const { activatorRect, viewportRect, offsetParentRect } = getMetrics({\n activatorRef,\n customViewport,\n dropRef,\n });\n const dropRect = getDropMetrics();\n const {\n rect,\n parsedPlacement: choosenPlacement,\n placement: prefferedPlacement,\n } = findBestFitPlacement({\n placements: Array.isArray(placement) ? placement : [placement],\n activatorRect,\n viewportRect,\n offsetParentRect,\n dropWidth: dropRect.width,\n dropHeight: dropRect.height,\n guardDistanceToActivator,\n guardDistanceToViewport,\n minDropHeight,\n widthEqualToActivator,\n allowShrinkHeightToFitIntoViewport,\n arrowGuardDistance,\n prefferedPlacement: prefferedPlacementRef.current,\n });\n prefferedPlacementRef.current = prefferedPlacement;\n applyPlacementToDrop(dropRef, rect);\n dropRef.current.dataset.magritteDropBaseDirection = choosenPlacement.direction;\n dropRef.current.dataset.magritteDropBaseAlignment = choosenPlacement.alignment;\n bestFitPlacementRef.current = rect;\n };\n updateMetricsRef.current = requestAnimation(updateMetricsSyncRef.current);\n\n if (forceDropMetricsUpdate) {\n forceDropMetricsUpdate.current = () => {\n dropMetricsRef.current = undefined;\n updateMetricsRef.current();\n };\n }\n\n useEffect(() => {\n if (!isVisible) {\n prefferedPlacementRef.current = undefined;\n return () => void 0;\n }\n const activatorElement = activatorRef.current;\n const customViewportElement = customViewport?.current;\n const resizeHandler = () => updateMetricsRef.current();\n activatorElement && getResizeObserver().observe(activatorElement);\n customViewportElement && getResizeObserver().observe(customViewportElement);\n window.addEventListener('resize', resizeHandler);\n return () => {\n activatorElement && getResizeObserver().unobserve(activatorElement);\n customViewportElement && getResizeObserver().unobserve(customViewportElement);\n window.removeEventListener('resize', resizeHandler);\n };\n }, [activatorRef, getResizeObserver, customViewport, isVisible]);\n\n useLayoutEffect(() => {\n isVisible && updateMetricsSyncRef.current();\n }, [isVisible, placement]);\n\n /**\n * список id скроллящихся элементов для которых была выполнена проверка\n * влияет ли их скролл на взаимное положение активатора и дропа.\n * Получение сделано с помощью отдельной функции чтобы не создавать сет на каждый ререндер.\n */\n const processedScrollContainers = useRef<Set<HTMLElement>>();\n const getProcessedScrollContainers = (): Set<HTMLElement> => {\n processedScrollContainers.current = processedScrollContainers.current || new Set();\n return processedScrollContainers.current;\n };\n\n const visibleRef = useRef(isVisible);\n visibleRef.current = isVisible;\n\n const scrollHandler = useCallback(\n (target: HTMLElement) => {\n if (!visibleRef.current || !dropRef.current || !activatorRef.current) {\n return;\n }\n\n // Если это первый скролл данного контейнера, то проверяем содержит ли он активатор\n // Если он не содержит активатор, то можно отписаться от дальнейших оповещений о его скролле.\n if (!getProcessedScrollContainers().has(target)) {\n if (!target.contains(activatorRef.current)) {\n unsubscribeFromTarget(target, scrollHandler);\n return;\n }\n getProcessedScrollContainers().add(target);\n }\n\n updateMetricsRef.current();\n },\n [activatorRef, dropRef]\n );\n\n useEffect(() => {\n // eslint-disable-next-line no-unused-expressions\n isVisible ? reviveSubscription(scrollHandler) : suspendSubscription(scrollHandler);\n }, [isVisible, scrollHandler]);\n\n useEffect(() => {\n return () => deleteScrollSubscription(scrollHandler);\n }, [scrollHandler]);\n\n return {\n resizeRefCallbackFactory: observeResizeRefCallbackFactory,\n bestFitPlacementRect: bestFitPlacementRef.current,\n };\n};\n"],"names":[],"mappings":"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"}
|
package/types.d.ts
CHANGED
|
@@ -1,10 +1,24 @@
|
|
|
1
|
-
import type { RefObject, ReactNode, CSSProperties } from 'react';
|
|
1
|
+
import type { RefObject, ReactNode, CSSProperties, RefCallback, HTMLAttributes } from 'react';
|
|
2
2
|
import type { CSSTransitionClassNames } from 'react-transition-group/CSSTransition';
|
|
3
3
|
import { KeyboardNavigationMode } from '@hh.ru/magritte-common-keyboard';
|
|
4
4
|
export type ActivatorElementType = HTMLElement | SVGElement;
|
|
5
|
-
export interface
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
export interface RefCallbackFactory {
|
|
6
|
+
(id: string, observe?: boolean, isScrollabel?: boolean): RefCallback<HTMLElement>;
|
|
7
|
+
}
|
|
8
|
+
export type VerticalDirection = 'top' | 'bottom';
|
|
9
|
+
export type HorizontalDirection = 'left' | 'right';
|
|
10
|
+
export type AlignmentForVerticalDirection = 'left' | 'right' | 'center';
|
|
11
|
+
export type AlignmentForHorizontalDirection = 'top' | 'bottom' | 'center';
|
|
12
|
+
export interface ParsedPlacement {
|
|
13
|
+
direction: VerticalDirection | HorizontalDirection;
|
|
14
|
+
alignment: AlignmentForVerticalDirection | AlignmentForHorizontalDirection;
|
|
15
|
+
}
|
|
16
|
+
export type Placement = `${VerticalDirection}-${AlignmentForVerticalDirection}` | `${HorizontalDirection}-${AlignmentForHorizontalDirection}`;
|
|
17
|
+
export type ArrowGuardDistance = Partial<Record<VerticalDirection, Record<AlignmentForVerticalDirection, number>> & Record<HorizontalDirection, Record<AlignmentForHorizontalDirection, number>>>;
|
|
18
|
+
type ReactHandlerProps = {
|
|
19
|
+
[K in keyof HTMLAttributes<HTMLDivElement> as K extends `on${string}` ? K : never]: HTMLAttributes<HTMLDivElement>[K];
|
|
20
|
+
};
|
|
21
|
+
export type DropBasePermanentProps = {
|
|
8
22
|
/** Флаг отвечает за показ компонента, `true` — показать, `false` — скрыть */
|
|
9
23
|
visible?: boolean;
|
|
10
24
|
/** Элемент активатор, относительно которого показывать всплывающую подсказку */
|
|
@@ -14,7 +28,7 @@ export interface DropBasePermanentProps {
|
|
|
14
28
|
/** Задает виртуальный viewport */
|
|
15
29
|
preferredViewport?: RefObject<HTMLElement>;
|
|
16
30
|
/** Рендер функция, которая должна вернуть сам Drop, в аргументах передается вычисляемая позиция */
|
|
17
|
-
children: (
|
|
31
|
+
children: (ref: RefCallbackFactory) => ReactNode;
|
|
18
32
|
/**
|
|
19
33
|
* Колбек вызываемый при необходимости закрыть компонент в результате внешних событий. Например при клике
|
|
20
34
|
* вовне дропа или при перекрытии активатора другим элементом. Должен устанавливать флаг visible в false.
|
|
@@ -33,16 +47,9 @@ export interface DropBasePermanentProps {
|
|
|
33
47
|
exit?: number | undefined;
|
|
34
48
|
};
|
|
35
49
|
/** Защитное расстояние в px от активатора до DropBase */
|
|
36
|
-
|
|
50
|
+
guardDistanceToActivator?: number;
|
|
37
51
|
/** Aria role для задания семантики в screen reader */
|
|
38
52
|
role?: string;
|
|
39
|
-
/** Флаг позволяет занять максимально возможную высоту компоненту, по viewport */
|
|
40
|
-
occupyAllAvailableViewportHeight?: boolean;
|
|
41
|
-
/**
|
|
42
|
-
* Флаг, при выставлении которого в true DropBase будет выпадать в указанном направлении даже
|
|
43
|
-
* если при этом он не умещается во Viewport
|
|
44
|
-
* */
|
|
45
|
-
forcePosition?: boolean;
|
|
46
53
|
/** Флаг включающий автоматическое выставление ширины равной ширине активатора */
|
|
47
54
|
widthEqualToActivator?: boolean;
|
|
48
55
|
/**
|
|
@@ -60,163 +67,18 @@ export interface DropBasePermanentProps {
|
|
|
60
67
|
onBeforeExit?: VoidFunction;
|
|
61
68
|
/** Колбек, который будет вызван после анимации закрытия */
|
|
62
69
|
onAfterExit?: VoidFunction;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
export interface ActivatorOffset {
|
|
79
|
-
offsetLeft: number;
|
|
80
|
-
offsetTop: number;
|
|
81
|
-
}
|
|
82
|
-
export interface DropBaseVerticalPosition {
|
|
83
|
-
direction: 'top' | 'bottom';
|
|
84
|
-
alignment: 'left' | 'right' | 'center';
|
|
85
|
-
}
|
|
86
|
-
export interface DropBaseHorizontalPosition {
|
|
87
|
-
direction: 'left' | 'right';
|
|
88
|
-
alignment: 'top' | 'bottom' | 'center';
|
|
89
|
-
}
|
|
90
|
-
export interface DropBaseVerticalPositionWithoutCenter {
|
|
91
|
-
direction: 'top' | 'bottom';
|
|
92
|
-
alignment: 'left' | 'right';
|
|
93
|
-
}
|
|
94
|
-
export interface DropBaseHorizontalPositionWithoutCenter {
|
|
95
|
-
direction: 'left' | 'right';
|
|
96
|
-
alignment: 'top' | 'bottom';
|
|
97
|
-
}
|
|
98
|
-
export type DropBaseProps<T extends DropBaseHorizontalPosition | DropBaseVerticalPosition | DropBaseVerticalPositionWithoutCenter | DropBaseHorizontalPositionWithoutCenter> = DropBasePermanentProps & T;
|
|
99
|
-
export interface DropMetrics {
|
|
100
|
-
left: number;
|
|
101
|
-
top: number;
|
|
102
|
-
height: number | string;
|
|
103
|
-
}
|
|
104
|
-
export interface RectPosition {
|
|
105
|
-
top: number;
|
|
106
|
-
left: number;
|
|
107
|
-
right: number;
|
|
108
|
-
bottom: number;
|
|
109
|
-
dropMetrics: DropMetrics;
|
|
110
|
-
viewportMetrics: CustomVisualViewport;
|
|
111
|
-
}
|
|
112
|
-
export interface DOMRectLike {
|
|
113
|
-
top: number;
|
|
114
|
-
bottom: number;
|
|
115
|
-
left: number;
|
|
116
|
-
right: number;
|
|
117
|
-
height: number;
|
|
118
|
-
width: number;
|
|
119
|
-
}
|
|
120
|
-
export interface CalculateRect<T> {
|
|
121
|
-
(props: {
|
|
122
|
-
activatorMetrics: DOMRect;
|
|
123
|
-
dropMetrics: DOMRectLike;
|
|
124
|
-
viewportMetrics: VisualViewport;
|
|
125
|
-
preferredViewportMetrics: CustomVisualViewport;
|
|
126
|
-
direction: T;
|
|
127
|
-
activatorOffset: ActivatorOffset;
|
|
128
|
-
guardDistance: number;
|
|
129
|
-
arrowGuardDistance?: number;
|
|
130
|
-
occupyAllAvailableViewportHeight?: boolean;
|
|
131
|
-
}): RectPosition;
|
|
132
|
-
}
|
|
133
|
-
export type CalculateRectType<K extends DropBaseVerticalPosition | DropBaseHorizontalPosition> = {
|
|
134
|
-
[D in DropBaseProps<K>['direction']]: {
|
|
135
|
-
[A in DropBaseProps<K>['alignment']]: CalculateRect<D>;
|
|
136
|
-
};
|
|
137
|
-
};
|
|
138
|
-
export interface CustomVisualViewport {
|
|
139
|
-
pageTop: number;
|
|
140
|
-
pageLeft: number;
|
|
141
|
-
width: number;
|
|
142
|
-
height: number;
|
|
143
|
-
}
|
|
144
|
-
interface BaseAlignPositionArgs<T> {
|
|
145
|
-
activatorMetrics: DOMRect;
|
|
146
|
-
dropMetrics: DOMRectLike;
|
|
147
|
-
viewportMetrics: VisualViewport;
|
|
148
|
-
direction: T;
|
|
149
|
-
activatorOffset: ActivatorOffset;
|
|
150
|
-
shift: number;
|
|
151
|
-
isNegativeArrowShift?: boolean;
|
|
152
|
-
arrowGuardDistance?: number;
|
|
153
|
-
guardDistance: number;
|
|
154
|
-
occupyAllAvailableViewportHeight?: boolean;
|
|
155
|
-
preferredViewportMetrics: CustomVisualViewport;
|
|
156
|
-
}
|
|
157
|
-
export interface BaseAlignPosition<T> {
|
|
158
|
-
(args: BaseAlignPositionArgs<T>): RectPosition;
|
|
159
|
-
}
|
|
160
|
-
export interface GetEdgeOppositeDirectionArgs {
|
|
161
|
-
activatorPosition: number;
|
|
162
|
-
viewportShift: number;
|
|
163
|
-
activatorOffset: number;
|
|
164
|
-
shift: number;
|
|
165
|
-
isNegativeArrowShift: boolean;
|
|
166
|
-
activatorSize: number;
|
|
167
|
-
arrowGuardDistance?: number;
|
|
168
|
-
}
|
|
169
|
-
export interface GetEageCoincidingWithDirectionArgs {
|
|
170
|
-
activatorPosition: number;
|
|
171
|
-
dropSize: number;
|
|
172
|
-
viewportShift: number;
|
|
173
|
-
isNegativePosition: boolean;
|
|
174
|
-
activatorOffset: number;
|
|
175
|
-
activatorSize: number;
|
|
176
|
-
guardDistance: number;
|
|
177
|
-
}
|
|
178
|
-
export interface GetPointToCenterActivator {
|
|
179
|
-
point: number;
|
|
180
|
-
offsetPoint: number;
|
|
181
|
-
contentSize: number;
|
|
182
|
-
activatorSize: number;
|
|
183
|
-
}
|
|
184
|
-
export interface CalculateDropHeightAvailableViewportResult {
|
|
185
|
-
/** Top позиция дроп компонента относительно host */
|
|
186
|
-
top: number;
|
|
187
|
-
/** Max высота, которую может занимать DropBase */
|
|
188
|
-
height: number;
|
|
189
|
-
/** Left позиция дроп компонента относительно host */
|
|
190
|
-
left: number;
|
|
191
|
-
/** Позиция дроп компонента относительно viewport */
|
|
192
|
-
topPositionForViewport: number;
|
|
193
|
-
}
|
|
194
|
-
export interface CalculateDropHeightAvailableViewportArgs {
|
|
195
|
-
(props: {
|
|
196
|
-
/** Top позиция drop компонента относительно host */
|
|
197
|
-
topPositionForDrop: number;
|
|
198
|
-
/** Left позиция drop компонента относительно host */
|
|
199
|
-
leftPositionForDrop: number;
|
|
200
|
-
/**
|
|
201
|
-
* Позиция дроп компонента относительно viewport,
|
|
202
|
-
* когда host отличный от body, метрика top drop-base не совпадет с этой точкой
|
|
203
|
-
* */
|
|
204
|
-
topPositionForViewport: number;
|
|
205
|
-
/**
|
|
206
|
-
* Метрики viewport в рамках которого будет распологаться компонент
|
|
207
|
-
* */
|
|
208
|
-
preferredViewportMetrics: CustomVisualViewport;
|
|
209
|
-
/**
|
|
210
|
-
* Метрики выпадающего блока (top, left). Height содержит
|
|
211
|
-
* число в случае если включена опция occupyAllAvailableViewportHeight,
|
|
212
|
-
* иначе там 'auto'
|
|
213
|
-
*/
|
|
214
|
-
dropMetrics: DOMRectLike;
|
|
215
|
-
}): CalculateDropHeightAvailableViewportResult;
|
|
216
|
-
}
|
|
217
|
-
export interface Metrics {
|
|
218
|
-
top: number;
|
|
219
|
-
left: number;
|
|
220
|
-
height?: number | string;
|
|
221
|
-
}
|
|
70
|
+
/** Название размещения или список размещений куда допускается выпадание дропа */
|
|
71
|
+
placement: Placement | Placement[];
|
|
72
|
+
/** Флаг, включающий изменение высоты дропа для размещения во вьюпорте */
|
|
73
|
+
allowShrinkHeightToFitIntoViewport?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Минимальный отступ от границ вьюпорта по вертикали, применяется только при установке
|
|
76
|
+
* флага allowShrinkHeightToFitIntoViewport
|
|
77
|
+
*/
|
|
78
|
+
guardDistanceToViewport?: number;
|
|
79
|
+
/** Минимальный размер дропа, применяется только при установке флага allowShrinkHeightToFitIntoViewport */
|
|
80
|
+
minHeight?: number;
|
|
81
|
+
/** ref на элемент в котором будет отрендерен дроп */
|
|
82
|
+
host?: RefObject<HTMLElement>;
|
|
83
|
+
} & ReactHandlerProps;
|
|
222
84
|
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { RefCallback, MutableRefObject } from 'react';
|
|
2
|
+
import { RefCallbackFactory } from '@hh.ru/magritte-internal-drop-base/types';
|
|
3
|
+
interface ObservedElementInfo {
|
|
4
|
+
node: HTMLElement | null;
|
|
5
|
+
isScrollable: boolean;
|
|
6
|
+
refCallback: RefCallback<HTMLElement>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* При изменении размера содержимого дропа необходимо перезапускать пересчет позиции.
|
|
10
|
+
* Для отслеживания изменения размер используется ResizeObserver вызывающий код обновления позиции и размера дропа.
|
|
11
|
+
* Проблема в том, что нельзя просто подписаться на изменение размера самой внешней обертки дропа, т.к. для нее
|
|
12
|
+
* размер жестко задается кодом отвечающим за позиционирование. Т.е. даже при изменении размера содержимого внешняя
|
|
13
|
+
* обертка не поменяет свой размер. Кроме того в дропе может быть несколько независимых частей размер которых
|
|
14
|
+
* может измениться. Этот хук возвращает фабрику refcallback'ов. При вызове фабрики создается refcallback который
|
|
15
|
+
* подписывает ResizeObserver на изменение размера элемента. При передаче в аргументе для фабрики одного и того же
|
|
16
|
+
* id, будет возвращен тот же самый refcallback, т.е. проблемы с изменением ссылки передаваемой в проп не возникает.
|
|
17
|
+
* Далее эта фабрика передается в рендер функцию Drop/Tooltip и используется для подписки на изменение размера
|
|
18
|
+
* различных частей.
|
|
19
|
+
*/
|
|
20
|
+
export declare const useMonitorResize: (dropMetricsRef: MutableRefObject<DOMRect | undefined>, updateMetricsRef: MutableRefObject<VoidFunction>) => {
|
|
21
|
+
observeResizeRefCallbackFactory: RefCallbackFactory;
|
|
22
|
+
getResizeObserver: () => ResizeObserver;
|
|
23
|
+
getObservedElementsInfoMap: () => Map<string, ObservedElementInfo>;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { useRef, useCallback } from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* При изменении размера содержимого дропа необходимо перезапускать пересчет позиции.
|
|
6
|
+
* Для отслеживания изменения размер используется ResizeObserver вызывающий код обновления позиции и размера дропа.
|
|
7
|
+
* Проблема в том, что нельзя просто подписаться на изменение размера самой внешней обертки дропа, т.к. для нее
|
|
8
|
+
* размер жестко задается кодом отвечающим за позиционирование. Т.е. даже при изменении размера содержимого внешняя
|
|
9
|
+
* обертка не поменяет свой размер. Кроме того в дропе может быть несколько независимых частей размер которых
|
|
10
|
+
* может измениться. Этот хук возвращает фабрику refcallback'ов. При вызове фабрики создается refcallback который
|
|
11
|
+
* подписывает ResizeObserver на изменение размера элемента. При передаче в аргументе для фабрики одного и того же
|
|
12
|
+
* id, будет возвращен тот же самый refcallback, т.е. проблемы с изменением ссылки передаваемой в проп не возникает.
|
|
13
|
+
* Далее эта фабрика передается в рендер функцию Drop/Tooltip и используется для подписки на изменение размера
|
|
14
|
+
* различных частей.
|
|
15
|
+
*/
|
|
16
|
+
const useMonitorResize = (dropMetricsRef, updateMetricsRef) => {
|
|
17
|
+
const resizeObserverRef = useRef();
|
|
18
|
+
const getResizeObserver = useCallback(() => {
|
|
19
|
+
if (!resizeObserverRef.current) {
|
|
20
|
+
resizeObserverRef.current = new ResizeObserver(() => {
|
|
21
|
+
dropMetricsRef.current = undefined;
|
|
22
|
+
updateMetricsRef.current();
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return resizeObserverRef.current;
|
|
26
|
+
}, [dropMetricsRef, updateMetricsRef]);
|
|
27
|
+
const observedElementsInfoMapRef = useRef();
|
|
28
|
+
const getObservedElementsInfoMap = useCallback(() => {
|
|
29
|
+
observedElementsInfoMapRef.current = observedElementsInfoMapRef.current || new Map();
|
|
30
|
+
return observedElementsInfoMapRef.current;
|
|
31
|
+
}, []);
|
|
32
|
+
const observeResizeRefCallbackFactory = (id, observe = true, isScrollable = false) => {
|
|
33
|
+
if (getObservedElementsInfoMap().has(id)) {
|
|
34
|
+
return getObservedElementsInfoMap().get(id)?.refCallback;
|
|
35
|
+
}
|
|
36
|
+
const refCallback = (node) => {
|
|
37
|
+
const info = getObservedElementsInfoMap().get(id);
|
|
38
|
+
const currentNode = info.node;
|
|
39
|
+
if (currentNode === node) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
currentNode && observe && getResizeObserver().unobserve(currentNode);
|
|
43
|
+
info.node = node;
|
|
44
|
+
node && observe && getResizeObserver().observe(node);
|
|
45
|
+
};
|
|
46
|
+
getObservedElementsInfoMap().set(id, {
|
|
47
|
+
node: null,
|
|
48
|
+
refCallback,
|
|
49
|
+
isScrollable,
|
|
50
|
+
});
|
|
51
|
+
return refCallback;
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
observeResizeRefCallbackFactory,
|
|
55
|
+
getResizeObserver,
|
|
56
|
+
getObservedElementsInfoMap,
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export { useMonitorResize };
|
|
61
|
+
//# sourceMappingURL=useMonitorResize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMonitorResize.js","sources":["../src/useMonitorResize.ts"],"sourcesContent":["import { useCallback, useRef, RefCallback, MutableRefObject } from 'react';\n\nimport { RefCallbackFactory } from '@hh.ru/magritte-internal-drop-base/types';\n\ninterface ObservedElementInfo {\n node: HTMLElement | null;\n isScrollable: boolean;\n refCallback: RefCallback<HTMLElement>;\n}\n\n/**\n * При изменении размера содержимого дропа необходимо перезапускать пересчет позиции.\n * Для отслеживания изменения размер используется ResizeObserver вызывающий код обновления позиции и размера дропа.\n * Проблема в том, что нельзя просто подписаться на изменение размера самой внешней обертки дропа, т.к. для нее\n * размер жестко задается кодом отвечающим за позиционирование. Т.е. даже при изменении размера содержимого внешняя\n * обертка не поменяет свой размер. Кроме того в дропе может быть несколько независимых частей размер которых\n * может измениться. Этот хук возвращает фабрику refcallback'ов. При вызове фабрики создается refcallback который\n * подписывает ResizeObserver на изменение размера элемента. При передаче в аргументе для фабрики одного и того же\n * id, будет возвращен тот же самый refcallback, т.е. проблемы с изменением ссылки передаваемой в проп не возникает.\n * Далее эта фабрика передается в рендер функцию Drop/Tooltip и используется для подписки на изменение размера\n * различных частей.\n */\nexport const useMonitorResize = (\n dropMetricsRef: MutableRefObject<DOMRect | undefined>,\n updateMetricsRef: MutableRefObject<VoidFunction>\n): {\n observeResizeRefCallbackFactory: RefCallbackFactory;\n getResizeObserver: () => ResizeObserver;\n getObservedElementsInfoMap: () => Map<string, ObservedElementInfo>;\n} => {\n const resizeObserverRef = useRef<ResizeObserver>();\n const getResizeObserver = useCallback(() => {\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n dropMetricsRef.current = undefined;\n updateMetricsRef.current();\n });\n }\n return resizeObserverRef.current;\n }, [dropMetricsRef, updateMetricsRef]);\n\n const observedElementsInfoMapRef = useRef<Map<string, ObservedElementInfo>>();\n const getObservedElementsInfoMap = useCallback(() => {\n observedElementsInfoMapRef.current = observedElementsInfoMapRef.current || new Map();\n return observedElementsInfoMapRef.current;\n }, []);\n\n const observeResizeRefCallbackFactory: RefCallbackFactory = (id, observe = true, isScrollable = false) => {\n if (getObservedElementsInfoMap().has(id)) {\n return getObservedElementsInfoMap().get(id)?.refCallback as RefCallback<HTMLElement>;\n }\n\n const refCallback = (node: HTMLElement | null) => {\n const info = getObservedElementsInfoMap().get(id) as ObservedElementInfo;\n const currentNode = info.node;\n if (currentNode === node) {\n return;\n }\n currentNode && observe && getResizeObserver().unobserve(currentNode);\n info.node = node;\n node && observe && getResizeObserver().observe(node);\n };\n\n getObservedElementsInfoMap().set(id, {\n node: null,\n refCallback,\n isScrollable,\n });\n return refCallback;\n };\n\n return {\n observeResizeRefCallbackFactory,\n getResizeObserver,\n getObservedElementsInfoMap,\n };\n};\n"],"names":[],"mappings":";;AAUA;;;;;;;;;;;AAWG;MACU,gBAAgB,GAAG,CAC5B,cAAqD,EACrD,gBAAgD,KAKhD;AACA,IAAA,MAAM,iBAAiB,GAAG,MAAM,EAAkB,CAAC;AACnD,IAAA,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAK;AACvC,QAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE;AAC5B,YAAA,iBAAiB,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,MAAK;AAChD,gBAAA,cAAc,CAAC,OAAO,GAAG,SAAS,CAAC;gBACnC,gBAAgB,CAAC,OAAO,EAAE,CAAC;AAC/B,aAAC,CAAC,CAAC;AACN,SAAA;QACD,OAAO,iBAAiB,CAAC,OAAO,CAAC;AACrC,KAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEvC,IAAA,MAAM,0BAA0B,GAAG,MAAM,EAAoC,CAAC;AAC9E,IAAA,MAAM,0BAA0B,GAAG,WAAW,CAAC,MAAK;QAChD,0BAA0B,CAAC,OAAO,GAAG,0BAA0B,CAAC,OAAO,IAAI,IAAI,GAAG,EAAE,CAAC;QACrF,OAAO,0BAA0B,CAAC,OAAO,CAAC;KAC7C,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,+BAA+B,GAAuB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,YAAY,GAAG,KAAK,KAAI;AACrG,QAAA,IAAI,0BAA0B,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACtC,OAAO,0BAA0B,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,WAAuC,CAAC;AACxF,SAAA;AAED,QAAA,MAAM,WAAW,GAAG,CAAC,IAAwB,KAAI;YAC7C,MAAM,IAAI,GAAG,0BAA0B,EAAE,CAAC,GAAG,CAAC,EAAE,CAAwB,CAAC;AACzE,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;YAC9B,IAAI,WAAW,KAAK,IAAI,EAAE;gBACtB,OAAO;AACV,aAAA;YACD,WAAW,IAAI,OAAO,IAAI,iBAAiB,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AACrE,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,IAAI,OAAO,IAAI,iBAAiB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzD,SAAC,CAAC;AAEF,QAAA,0BAA0B,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;AACjC,YAAA,IAAI,EAAE,IAAI;YACV,WAAW;YACX,YAAY;AACf,SAAA,CAAC,CAAC;AACH,QAAA,OAAO,WAAW,CAAC;AACvB,KAAC,CAAC;IAEF,OAAO;QACH,+BAA+B;QAC/B,iBAAiB;QACjB,0BAA0B;KAC7B,CAAC;AACN;;;;"}
|
package/calculateRect.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { BaseAlignPosition, CalculateRect, CalculateRectType, DropBaseHorizontalPosition, DropBaseVerticalPosition } from '@hh.ru/magritte-internal-drop-base/types';
|
|
2
|
-
export declare const VIEWPORT_GUARD_DISTANCE = 16;
|
|
3
|
-
/**
|
|
4
|
-
* API для расчета метрик дропдауна и viewport | контейнера в котором
|
|
5
|
-
* хотим рисовать дропдаун. Cчитает метрики в случае - когда direction = VerticalPosition.
|
|
6
|
-
* Т.е. дропдаун показываем снизу или сверху активатора.
|
|
7
|
-
* Предоставляем три публичных метода для расположения относительно края активатора:
|
|
8
|
-
* left - выравнивание по левому краю
|
|
9
|
-
* right - выравнивание по правому краю
|
|
10
|
-
* center - выравнивание по центру
|
|
11
|
-
* */
|
|
12
|
-
export declare const calculateRectForVerticalPosition: {
|
|
13
|
-
left: CalculateRect<DropBaseVerticalPosition['direction']>;
|
|
14
|
-
right: CalculateRect<DropBaseVerticalPosition['direction']>;
|
|
15
|
-
center: CalculateRect<DropBaseVerticalPosition['direction']>;
|
|
16
|
-
_baseAlign: BaseAlignPosition<DropBaseVerticalPosition['direction']>;
|
|
17
|
-
};
|
|
18
|
-
export declare const calculateRect: CalculateRectType<DropBaseHorizontalPosition> & CalculateRectType<DropBaseVerticalPosition>;
|