@cloud-ru/ds-utils 1.1.0 → 1.3.0
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/CHANGELOG.md +12 -0
- package/dist/cjs/hooks/useDataPersist/sources/index.d.ts +1 -0
- package/dist/cjs/hooks/useDataPersist/sources/index.js +1 -0
- package/dist/cjs/hooks/useDataPersist/sources/sessionStorageSource.d.ts +5 -0
- package/dist/cjs/hooks/useDataPersist/sources/sessionStorageSource.js +19 -0
- package/dist/cjs/hooks/useDataPersist/useDataPersist.d.ts +2 -0
- package/dist/cjs/hooks/useDataPersist/useDataPersist.js +18 -5
- package/dist/cjs/hooks/useDataPersist/useSource.js +6 -1
- package/dist/cjs/utils/componentPropsProcessors.d.ts +3 -3
- package/dist/esm/hooks/useDataPersist/sources/index.d.ts +1 -0
- package/dist/esm/hooks/useDataPersist/sources/index.js +1 -0
- package/dist/esm/hooks/useDataPersist/sources/sessionStorageSource.d.ts +5 -0
- package/dist/esm/hooks/useDataPersist/sources/sessionStorageSource.js +15 -0
- package/dist/esm/hooks/useDataPersist/useDataPersist.d.ts +2 -0
- package/dist/esm/hooks/useDataPersist/useDataPersist.js +19 -6
- package/dist/esm/hooks/useDataPersist/useSource.js +6 -1
- package/dist/esm/utils/componentPropsProcessors.d.ts +3 -3
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/hooks/useDataPersist/sources/index.ts +1 -0
- package/src/hooks/useDataPersist/sources/sessionStorageSource.ts +17 -0
- package/src/hooks/useDataPersist/useDataPersist.ts +32 -8
- package/src/hooks/useDataPersist/useSource.ts +5 -1
- package/src/utils/componentPropsProcessors.ts +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,18 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# 1.3.0 (2026-10-17)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- **FF-8949:** improve typings for componentPropsProcessors ([d17bae0](https://github.com/cloud-ru-tech/snack-v2/commit/d17bae0eaf11e56e3e631fd52a4da5d4bb97f7f4))
|
|
11
|
+
|
|
12
|
+
# 1.2.0 (2026-09-28)
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- **FF-9021:** add state storage prop ([ea2b24f](https://github.com/cloud-ru-tech/snack-v2/commit/ea2b24fc1c7525aa92074c7821b809937b69a22e))
|
|
17
|
+
|
|
6
18
|
# 1.1.0 (2026-08-24)
|
|
7
19
|
|
|
8
20
|
### Features
|
|
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./queryParamSource"), exports);
|
|
18
18
|
__exportStar(require("./localStorageSource"), exports);
|
|
19
19
|
__exportStar(require("./baseSource"), exports);
|
|
20
|
+
__exportStar(require("./sessionStorageSource"), exports);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SessionStorageSource = void 0;
|
|
4
|
+
const utils_1 = require("../../../utils");
|
|
5
|
+
const baseSource_1 = require("./baseSource");
|
|
6
|
+
class SessionStorageSource extends baseSource_1.BaseSource {
|
|
7
|
+
getFromSource() {
|
|
8
|
+
if ((0, utils_1.isBrowser)()) {
|
|
9
|
+
return sessionStorage.getItem(this.filterKey) || '';
|
|
10
|
+
}
|
|
11
|
+
return '';
|
|
12
|
+
}
|
|
13
|
+
setToSource(value) {
|
|
14
|
+
if ((0, utils_1.isBrowser)()) {
|
|
15
|
+
sessionStorage.setItem(this.filterKey, value);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.SessionStorageSource = SessionStorageSource;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { type StateProps } from './useSource';
|
|
2
|
+
export type DataPersistStorage = 'queryParams' | 'localStorage' | 'sessionStorage';
|
|
2
3
|
export type DataPersistOptions<T> = {
|
|
4
|
+
storages?: DataPersistStorage[];
|
|
3
5
|
queryKey: string;
|
|
4
6
|
localStorageKey: string;
|
|
5
7
|
validateData(value: unknown): value is T;
|
|
@@ -4,9 +4,21 @@ exports.useDataPersist = void 0;
|
|
|
4
4
|
const react_1 = require("react");
|
|
5
5
|
const sources_1 = require("./sources");
|
|
6
6
|
const useSource_1 = require("./useSource");
|
|
7
|
+
const DEFAULT_STORAGES = ['queryParams', 'localStorage'];
|
|
7
8
|
const useDataPersist = ({ options, parser, serializer }) => {
|
|
8
|
-
const
|
|
9
|
-
const
|
|
9
|
+
const storages = options?.storages ?? DEFAULT_STORAGES;
|
|
10
|
+
const querySource = (0, react_1.useMemo)(() => options && storages.includes('queryParams')
|
|
11
|
+
? new sources_1.QueryParamSource(options.queryKey, options.validateData, parser, serializer)
|
|
12
|
+
: undefined, [options, parser, serializer, storages]);
|
|
13
|
+
const localStorageSource = (0, react_1.useMemo)(() => options && storages.includes('localStorage')
|
|
14
|
+
? new sources_1.LocalStorageSource(options.localStorageKey, options.validateData)
|
|
15
|
+
: undefined, [options, storages]);
|
|
16
|
+
const sessionStorageSource = (0, react_1.useMemo)(() => options && storages.includes('sessionStorage')
|
|
17
|
+
? new sources_1.SessionStorageSource(options.localStorageKey, options.validateData)
|
|
18
|
+
: undefined, [options, storages]);
|
|
19
|
+
const { getData: getSessionStorageData, setData: setSessionStorageData } = (0, useSource_1.useSource)({
|
|
20
|
+
source: sessionStorageSource,
|
|
21
|
+
});
|
|
10
22
|
const { getData: getLocalStorageData, setData: setLocalStorageData } = (0, useSource_1.useSource)({
|
|
11
23
|
source: localStorageSource,
|
|
12
24
|
});
|
|
@@ -15,12 +27,13 @@ const useDataPersist = ({ options, parser, serializer }) => {
|
|
|
15
27
|
});
|
|
16
28
|
const setDataToStorages = (0, react_1.useCallback)((data) => {
|
|
17
29
|
setLocalStorageData(data);
|
|
30
|
+
setSessionStorageData(data);
|
|
18
31
|
setQueryParamsData(data);
|
|
19
|
-
}, [setLocalStorageData, setQueryParamsData]);
|
|
32
|
+
}, [setLocalStorageData, setSessionStorageData, setQueryParamsData]);
|
|
20
33
|
const getDefaultData = (0, react_1.useCallback)(() => {
|
|
21
34
|
const queryData = getQueryParamsData();
|
|
22
|
-
return queryData ?? getLocalStorageData();
|
|
23
|
-
}, [getLocalStorageData, getQueryParamsData]);
|
|
35
|
+
return queryData ?? getSessionStorageData() ?? getLocalStorageData();
|
|
36
|
+
}, [getLocalStorageData, getSessionStorageData, getQueryParamsData]);
|
|
24
37
|
return { getDefaultData, setDataToStorages };
|
|
25
38
|
};
|
|
26
39
|
exports.useDataPersist = useDataPersist;
|
|
@@ -7,7 +7,12 @@ const useSource = ({ source }) => {
|
|
|
7
7
|
if (!source) {
|
|
8
8
|
return;
|
|
9
9
|
}
|
|
10
|
-
|
|
10
|
+
try {
|
|
11
|
+
source.setData(data);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Ошибка одного хранилища не должна прерывать запись в остальные.
|
|
15
|
+
}
|
|
11
16
|
}, [source]);
|
|
12
17
|
const getData = (0, react_1.useCallback)(() => source?.getData() ?? undefined, [source]);
|
|
13
18
|
return { getData, setData };
|
|
@@ -6,14 +6,14 @@ export type WithSupportProps<T> = {
|
|
|
6
6
|
* Функция для исключения вспомогательных свойств (data-test-id & aria-*)
|
|
7
7
|
* @function helper
|
|
8
8
|
*/
|
|
9
|
-
export declare function excludeSupportProps<T extends Record<string, unknown>>(props: T): {}
|
|
9
|
+
export declare function excludeSupportProps<T extends Record<string, unknown>>(props: T): Omit<T, `data-${string}` | `aria-${string}`>;
|
|
10
10
|
/**
|
|
11
11
|
* Функция для отбора свойства data-test-id
|
|
12
12
|
* @function helper
|
|
13
13
|
*/
|
|
14
|
-
export declare function extractDataTestProps<T extends Record<string, unknown>>(props: T):
|
|
14
|
+
export declare function extractDataTestProps<T extends Record<string, unknown>>(props: T): Pick<T, `data-test-${string}`>;
|
|
15
15
|
/**
|
|
16
16
|
* Функция для отбора вспомогательных свойств (data-test-id & aria-*)
|
|
17
17
|
* @function helper
|
|
18
18
|
*/
|
|
19
|
-
export declare function extractSupportProps<T extends Record<string, unknown>>(props: T):
|
|
19
|
+
export declare function extractSupportProps<T extends Record<string, unknown>>(props: T): Pick<T, Extract<keyof T, `data-${string}` | `aria-${string}`>>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { isBrowser } from '../../../utils/index.js';
|
|
2
|
+
import { BaseSource } from './baseSource.js';
|
|
3
|
+
export class SessionStorageSource extends BaseSource {
|
|
4
|
+
getFromSource() {
|
|
5
|
+
if (isBrowser()) {
|
|
6
|
+
return sessionStorage.getItem(this.filterKey) || '';
|
|
7
|
+
}
|
|
8
|
+
return '';
|
|
9
|
+
}
|
|
10
|
+
setToSource(value) {
|
|
11
|
+
if (isBrowser()) {
|
|
12
|
+
sessionStorage.setItem(this.filterKey, value);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { type StateProps } from './useSource.js';
|
|
2
|
+
export type DataPersistStorage = 'queryParams' | 'localStorage' | 'sessionStorage';
|
|
2
3
|
export type DataPersistOptions<T> = {
|
|
4
|
+
storages?: DataPersistStorage[];
|
|
3
5
|
queryKey: string;
|
|
4
6
|
localStorageKey: string;
|
|
5
7
|
validateData(value: unknown): value is T;
|
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
import { useCallback, useMemo } from 'react';
|
|
2
|
-
import { LocalStorageSource, QueryParamSource } from './sources/index.js';
|
|
2
|
+
import { LocalStorageSource, QueryParamSource, SessionStorageSource } from './sources/index.js';
|
|
3
3
|
import { useSource } from './useSource.js';
|
|
4
|
+
const DEFAULT_STORAGES = ['queryParams', 'localStorage'];
|
|
4
5
|
export const useDataPersist = ({ options, parser, serializer }) => {
|
|
5
|
-
const
|
|
6
|
-
const
|
|
6
|
+
const storages = options?.storages ?? DEFAULT_STORAGES;
|
|
7
|
+
const querySource = useMemo(() => options && storages.includes('queryParams')
|
|
8
|
+
? new QueryParamSource(options.queryKey, options.validateData, parser, serializer)
|
|
9
|
+
: undefined, [options, parser, serializer, storages]);
|
|
10
|
+
const localStorageSource = useMemo(() => options && storages.includes('localStorage')
|
|
11
|
+
? new LocalStorageSource(options.localStorageKey, options.validateData)
|
|
12
|
+
: undefined, [options, storages]);
|
|
13
|
+
const sessionStorageSource = useMemo(() => options && storages.includes('sessionStorage')
|
|
14
|
+
? new SessionStorageSource(options.localStorageKey, options.validateData)
|
|
15
|
+
: undefined, [options, storages]);
|
|
16
|
+
const { getData: getSessionStorageData, setData: setSessionStorageData } = useSource({
|
|
17
|
+
source: sessionStorageSource,
|
|
18
|
+
});
|
|
7
19
|
const { getData: getLocalStorageData, setData: setLocalStorageData } = useSource({
|
|
8
20
|
source: localStorageSource,
|
|
9
21
|
});
|
|
@@ -12,11 +24,12 @@ export const useDataPersist = ({ options, parser, serializer }) => {
|
|
|
12
24
|
});
|
|
13
25
|
const setDataToStorages = useCallback((data) => {
|
|
14
26
|
setLocalStorageData(data);
|
|
27
|
+
setSessionStorageData(data);
|
|
15
28
|
setQueryParamsData(data);
|
|
16
|
-
}, [setLocalStorageData, setQueryParamsData]);
|
|
29
|
+
}, [setLocalStorageData, setSessionStorageData, setQueryParamsData]);
|
|
17
30
|
const getDefaultData = useCallback(() => {
|
|
18
31
|
const queryData = getQueryParamsData();
|
|
19
|
-
return queryData ?? getLocalStorageData();
|
|
20
|
-
}, [getLocalStorageData, getQueryParamsData]);
|
|
32
|
+
return queryData ?? getSessionStorageData() ?? getLocalStorageData();
|
|
33
|
+
}, [getLocalStorageData, getSessionStorageData, getQueryParamsData]);
|
|
21
34
|
return { getDefaultData, setDataToStorages };
|
|
22
35
|
};
|
|
@@ -4,7 +4,12 @@ export const useSource = ({ source }) => {
|
|
|
4
4
|
if (!source) {
|
|
5
5
|
return;
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
try {
|
|
8
|
+
source.setData(data);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
// Ошибка одного хранилища не должна прерывать запись в остальные.
|
|
12
|
+
}
|
|
8
13
|
}, [source]);
|
|
9
14
|
const getData = useCallback(() => source?.getData() ?? undefined, [source]);
|
|
10
15
|
return { getData, setData };
|
|
@@ -6,14 +6,14 @@ export type WithSupportProps<T> = {
|
|
|
6
6
|
* Функция для исключения вспомогательных свойств (data-test-id & aria-*)
|
|
7
7
|
* @function helper
|
|
8
8
|
*/
|
|
9
|
-
export declare function excludeSupportProps<T extends Record<string, unknown>>(props: T): {}
|
|
9
|
+
export declare function excludeSupportProps<T extends Record<string, unknown>>(props: T): Omit<T, `data-${string}` | `aria-${string}`>;
|
|
10
10
|
/**
|
|
11
11
|
* Функция для отбора свойства data-test-id
|
|
12
12
|
* @function helper
|
|
13
13
|
*/
|
|
14
|
-
export declare function extractDataTestProps<T extends Record<string, unknown>>(props: T):
|
|
14
|
+
export declare function extractDataTestProps<T extends Record<string, unknown>>(props: T): Pick<T, `data-test-${string}`>;
|
|
15
15
|
/**
|
|
16
16
|
* Функция для отбора вспомогательных свойств (data-test-id & aria-*)
|
|
17
17
|
* @function helper
|
|
18
18
|
*/
|
|
19
|
-
export declare function extractSupportProps<T extends Record<string, unknown>>(props: T):
|
|
19
|
+
export declare function extractSupportProps<T extends Record<string, unknown>>(props: T): Pick<T, Extract<keyof T, `data-${string}` | `aria-${string}`>>;
|