indicator-ui 1.0.46 → 1.0.48
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.
|
@@ -7,52 +7,59 @@ type FunReturnType<T> = {
|
|
|
7
7
|
revertScroll: RevertScroll<T>;
|
|
8
8
|
};
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
* при добавлении элементов в начало списка (prepend) или
|
|
12
|
-
* при изменение размера `layout` между `зоной видимости`
|
|
13
|
-
* и `началом элемента`.
|
|
10
|
+
* React-хук для фиксации и восстановления якоря скролла.
|
|
14
11
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* scrollHeight, а браузер сохраняет `scrollTop`.
|
|
12
|
+
* Предназначен для сохранения визуальной позиции скролла при изменении размеров
|
|
13
|
+
* скроллируемой области (например, при добавлении или удалении элементов).
|
|
18
14
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
15
|
+
* Типичный кейс — добавление элементов в начало scroll-контейнера:
|
|
16
|
+
* браузеры могут либо автоматически скорректировать позицию скролла,
|
|
17
|
+
* либо оставить её без изменений, что приводит к визуальному "прыжку".
|
|
21
18
|
*
|
|
22
19
|
* Принцип работы:
|
|
23
|
-
* 1.
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
20
|
+
* 1. Перед изменением layout вызывается {@link commitScroll},
|
|
21
|
+
* который сохраняет текущее состояние скролла.
|
|
22
|
+
* 2. Выполняются изменения DOM / layout (важно, чтобы браузер успел пересчитать размеры).
|
|
23
|
+
* 3. После этого вызывается {@link revertScroll}, который корректирует позицию скролла
|
|
24
|
+
* таким образом, чтобы пользователь визуально остался на том же месте.
|
|
27
25
|
*
|
|
28
|
-
*
|
|
29
|
-
* Между вызовами `commitScroll` и `revertScroll`
|
|
30
|
-
* изменение DOM должно происходить до этапа раскраски,
|
|
31
|
-
* на этапе просчета `layout`.
|
|
26
|
+
* Хук поддерживает настройку направления скролла по вертикали и горизонтали.
|
|
32
27
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* в начало списка.
|
|
28
|
+
* @template T
|
|
29
|
+
* Тип HTMLElement, для которого применяется якорь скролла.
|
|
36
30
|
*
|
|
37
|
-
* @
|
|
31
|
+
* @param {ScrollDirectionOptions} [props]
|
|
32
|
+
* Настройки направления движения скролла.
|
|
38
33
|
*
|
|
39
|
-
* @param
|
|
34
|
+
* @param {'top' | 'bottom'} [props.verticalDirection='bottom']
|
|
35
|
+
* Определяет, в какую сторонц двигается вертикальный scroll.
|
|
40
36
|
*
|
|
41
|
-
* @param props.
|
|
42
|
-
*
|
|
43
|
-
* Для prepend-сценариев обычно используется 'bottom' (по умолчанию).
|
|
37
|
+
* @param {'left' | 'right'} [props.horizontalDirection='right']
|
|
38
|
+
* Определяет, в какую сторонц двигается горизонтальный scroll.
|
|
44
39
|
*
|
|
45
|
-
* @
|
|
46
|
-
*
|
|
40
|
+
* @returns {FunReturnType<T>}
|
|
41
|
+
* Объект с методами управления якорем скролла.
|
|
47
42
|
*
|
|
48
|
-
* @returns
|
|
43
|
+
* @returns {Function} returns.commitScroll
|
|
44
|
+
* Функция для фиксации текущего состояния скролла.
|
|
49
45
|
*
|
|
50
|
-
* @returns.
|
|
51
|
-
*
|
|
46
|
+
* @returns {Function} returns.revertScroll
|
|
47
|
+
* Функция для восстановления позиции скролла на основе ранее сохранённого состояния.
|
|
52
48
|
*
|
|
53
|
-
* @
|
|
54
|
-
*
|
|
55
|
-
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* const { commitScroll, revertScroll } = useScrollAnchor<HTMLDivElement>();
|
|
52
|
+
*
|
|
53
|
+
* const handlePrependItems = () => {
|
|
54
|
+
* const commit = commitScroll(containerRef.current);
|
|
55
|
+
*
|
|
56
|
+
* prependItems();
|
|
57
|
+
*
|
|
58
|
+
* requestAnimationFrame(() => {
|
|
59
|
+
* revertScroll(containerRef.current, commit);
|
|
60
|
+
* });
|
|
61
|
+
* };
|
|
62
|
+
* ```
|
|
56
63
|
*/
|
|
57
64
|
export declare function useScrollAnchor<T extends HTMLElement>(props?: PropsType): FunReturnType<T>;
|
|
58
65
|
export {};
|
|
@@ -1,26 +1,59 @@
|
|
|
1
1
|
type Args = any[];
|
|
2
|
+
type Return = Promise<any> | void;
|
|
3
|
+
type Callback<TArgs extends Args, TReturn extends Return> = (...args: TArgs) => TReturn;
|
|
2
4
|
/**
|
|
3
|
-
* React-хук, возвращающий эксклюзивную версию callback-функции.
|
|
5
|
+
* React-хук, возвращающий "заблокированную" (эксклюзивную) версию callback-функции.
|
|
4
6
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
+
* Полученная функция может вызываться многократно, однако:
|
|
8
|
+
* пока выполняется текущий вызов, все последующие вызовы будут проигнорированы.
|
|
7
9
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* - любых операций, где нужен mutex на выполнение
|
|
10
|
+
* Хук поддерживает как синхронные, так и асинхронные callback-функции.
|
|
11
|
+
* В случае Promise-базированного callback блокировка снимается после его завершения
|
|
12
|
+
* (`finally`). Для синхронных функций разблокировка происходит сразу после выполнения.
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* Дополнительно можно указать задержку (`delay`), которая определяет время (в миллисекундах)
|
|
15
|
+
* между завершением callback-функции и снятием блокировки.
|
|
16
|
+
*
|
|
17
|
+
* Типичные сценарии использования:
|
|
18
|
+
* - защита кнопок отправки форм от повторных кликов
|
|
19
|
+
* - предотвращение параллельного выполнения async side-effect'ов
|
|
20
|
+
* - реализация простого mutex-механизма на уровне UI
|
|
21
|
+
*
|
|
22
|
+
* @template TArgs
|
|
23
|
+
* Кортеж аргументов callback-функции.
|
|
24
|
+
*
|
|
25
|
+
* @template TReturn
|
|
26
|
+
* Тип возвращаемого значения callback-функции.
|
|
27
|
+
* Может быть `void` для синхронных операций или `Promise<any>` для асинхронных.
|
|
28
|
+
*
|
|
29
|
+
* @param {Callback<TArgs, TReturn>} callback
|
|
30
|
+
* Синхронная или асинхронная функция, вызовы которой должны выполняться эксклюзивно.
|
|
31
|
+
*
|
|
32
|
+
* @param {number} [delay=0]
|
|
33
|
+
* Задержка в миллисекундах перед снятием блокировки после завершения callback-функции.
|
|
34
|
+
*
|
|
35
|
+
* @returns {(…args: TArgs) => TReturn | void}
|
|
36
|
+
* Функция с той же сигнатурой, что и `callback`, но с защитой от параллельных вызовов.
|
|
37
|
+
* Если вызов был проигнорирован из-за активной блокировки, возвращается `void`.
|
|
16
38
|
*
|
|
17
39
|
* @example
|
|
40
|
+
* ```ts
|
|
18
41
|
* const save = useLockedCallback(async (data: string) => {
|
|
19
|
-
* await api.save(data)
|
|
20
|
-
* })
|
|
42
|
+
* await api.save(data);
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* save('hello'); // выполнится
|
|
46
|
+
* save('world'); // будет проигнорирован, если предыдущий вызов ещё не завершён
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* const onClick = useLockedCallback(() => {
|
|
52
|
+
* console.log('clicked');
|
|
53
|
+
* }, 500);
|
|
21
54
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
55
|
+
* // повторный вызов будет доступен только через 500ms
|
|
56
|
+
* ```
|
|
24
57
|
*/
|
|
25
|
-
export declare function useLockedCallback<TArgs extends Args>(callback:
|
|
58
|
+
export declare function useLockedCallback<TArgs extends Args, TReturn extends Return>(callback: Callback<TArgs, TReturn>, delay?: number): (...args: TArgs) => TReturn | undefined;
|
|
26
59
|
export {};
|