@snack-uikit/utils 3.7.1-preview-922d2ce6.0 → 3.7.1-preview-74c13173.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/README.md +1 -1
- package/dist/cjs/hooks/useSaveFilterState.d.ts +4 -4
- package/dist/cjs/hooks/useSaveFilterState.js +5 -3
- package/dist/cjs/hooks/useSaveState/sources/baseSource.d.ts +3 -3
- package/dist/cjs/hooks/useSaveState/sources/baseSource.js +9 -9
- package/dist/cjs/hooks/useSaveState/useSaveState.d.ts +1 -1
- package/dist/esm/hooks/useSaveFilterState.d.ts +4 -4
- package/dist/esm/hooks/useSaveFilterState.js +7 -3
- package/dist/esm/hooks/useSaveState/sources/baseSource.d.ts +3 -3
- package/dist/esm/hooks/useSaveState/sources/baseSource.js +9 -9
- package/dist/esm/hooks/useSaveState/useSaveState.d.ts +1 -1
- package/package.json +2 -2
- package/src/hooks/useSaveFilterState.ts +20 -8
- package/src/hooks/useSaveState/sources/baseSource.ts +10 -10
- package/src/hooks/useSaveState/useSaveState.ts +2 -1
package/README.md
CHANGED
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
| filter* | `TFilter` | - | |
|
|
87
87
|
| options | `FilterStateOptions<TFilter>` | - | |
|
|
88
88
|
| parser | `(jsonFilter: string) => TFilter` | - | |
|
|
89
|
-
|
|
|
89
|
+
| serializer | `(filter: TFilter) => string` | - | |
|
|
90
90
|
## ThemeProvider
|
|
91
91
|
Провайдер, предназначенный для работы с темами
|
|
92
92
|
### Props
|
|
@@ -2,12 +2,12 @@ import { StateProps } from './useSaveState';
|
|
|
2
2
|
export type FilterStateOptions<T> = {
|
|
3
3
|
filterQueryKey: string;
|
|
4
4
|
filterLocalStorageKey: string;
|
|
5
|
-
validateData
|
|
5
|
+
validateData(value: unknown): value is T;
|
|
6
6
|
};
|
|
7
7
|
type FilterStateProps<TFilter> = Omit<StateProps<TFilter>, 'source'> & {
|
|
8
8
|
options?: FilterStateOptions<TFilter>;
|
|
9
|
-
parser
|
|
10
|
-
|
|
9
|
+
parser?(jsonFilter: string): TFilter;
|
|
10
|
+
serializer?(filter: TFilter): string;
|
|
11
11
|
};
|
|
12
|
-
export declare const useSaveFilterState: <TFilter>({ options, filter, onLoadFilter }: FilterStateProps<TFilter>) => void;
|
|
12
|
+
export declare const useSaveFilterState: <TFilter>({ options, filter, onLoadFilter, parser, serializer, }: FilterStateProps<TFilter>) => void;
|
|
13
13
|
export {};
|
|
@@ -10,7 +10,9 @@ const useSaveFilterState = _ref => {
|
|
|
10
10
|
let {
|
|
11
11
|
options,
|
|
12
12
|
filter,
|
|
13
|
-
onLoadFilter
|
|
13
|
+
onLoadFilter,
|
|
14
|
+
parser,
|
|
15
|
+
serializer
|
|
14
16
|
} = _ref;
|
|
15
17
|
const [queryFilter, setQueryFilter] = (0, react_1.useState)(null);
|
|
16
18
|
const [localStorageFilter, setLocalStorageFilter] = (0, react_1.useState)(null);
|
|
@@ -30,8 +32,8 @@ const useSaveFilterState = _ref => {
|
|
|
30
32
|
localStorage: true
|
|
31
33
|
}));
|
|
32
34
|
}, []);
|
|
33
|
-
const querySource = (0, react_1.useMemo)(() => options ? new useSaveState_1.QueryParamSource(options.filterQueryKey, options.validateData) : undefined, [options]);
|
|
34
|
-
const localStorageSource = (0, react_1.useMemo)(() => options ? new useSaveState_1.LocalStorageSource(options.filterLocalStorageKey, options.validateData) : undefined, [options]);
|
|
35
|
+
const querySource = (0, react_1.useMemo)(() => options ? new useSaveState_1.QueryParamSource(options.filterQueryKey, options.validateData, parser, serializer) : undefined, [options, parser, serializer]);
|
|
36
|
+
const localStorageSource = (0, react_1.useMemo)(() => options ? new useSaveState_1.LocalStorageSource(options.filterLocalStorageKey, options.validateData, parser, serializer) : undefined, [options, parser, serializer]);
|
|
35
37
|
(0, useSaveState_1.useSaveState)({
|
|
36
38
|
filter,
|
|
37
39
|
onLoadFilter: onLoadQueryParams,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export declare abstract class BaseSource<TFilter> {
|
|
2
2
|
filterKey: string;
|
|
3
3
|
private validate;
|
|
4
|
-
protected
|
|
5
|
-
protected
|
|
4
|
+
protected parser: (value: string) => TFilter;
|
|
5
|
+
protected serializer: (value: TFilter) => string;
|
|
6
6
|
protected abstract getFormSource(): string;
|
|
7
7
|
protected abstract setToSource(value: string): void;
|
|
8
|
-
constructor(filterKey: string, validate: (value: unknown) => value is TFilter,
|
|
8
|
+
constructor(filterKey: string, validate: (value: unknown) => value is TFilter, parser?: (value: string) => TFilter, serializer?: (value: TFilter) => string);
|
|
9
9
|
getFilter: () => NonNullable<TFilter> | null;
|
|
10
10
|
setFilter: (filter: TFilter) => void;
|
|
11
11
|
}
|
|
@@ -5,26 +5,26 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.BaseSource = void 0;
|
|
7
7
|
class BaseSource {
|
|
8
|
-
constructor(filterKey, validate,
|
|
8
|
+
constructor(filterKey, validate, parser, serializer) {
|
|
9
9
|
this.filterKey = filterKey;
|
|
10
10
|
this.validate = validate;
|
|
11
|
-
this.
|
|
12
|
-
this.
|
|
11
|
+
this.parser = JSON.parse;
|
|
12
|
+
this.serializer = JSON.stringify;
|
|
13
13
|
this.getFilter = () => {
|
|
14
14
|
const filterFromQueryParams = this.getFormSource();
|
|
15
|
-
const parsedValue = filterFromQueryParams ? this.
|
|
15
|
+
const parsedValue = filterFromQueryParams ? this.parser(filterFromQueryParams) : null;
|
|
16
16
|
const isValid = parsedValue && this.validate(parsedValue);
|
|
17
17
|
return isValid ? parsedValue : null;
|
|
18
18
|
};
|
|
19
19
|
this.setFilter = filter => {
|
|
20
|
-
const encodedValue = this.
|
|
20
|
+
const encodedValue = this.serializer(filter);
|
|
21
21
|
this.setToSource(encodedValue);
|
|
22
22
|
};
|
|
23
|
-
if (
|
|
24
|
-
this.
|
|
23
|
+
if (parser) {
|
|
24
|
+
this.parser = parser;
|
|
25
25
|
}
|
|
26
|
-
if (
|
|
27
|
-
this.
|
|
26
|
+
if (serializer) {
|
|
27
|
+
this.serializer = serializer;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BaseSource } from './sources/baseSource';
|
|
2
2
|
export type StateProps<T> = {
|
|
3
3
|
filter: T;
|
|
4
|
-
onLoadFilter
|
|
4
|
+
onLoadFilter(filter: T | null): void;
|
|
5
5
|
source?: BaseSource<T>;
|
|
6
6
|
};
|
|
7
7
|
export declare const useSaveState: <T>({ filter, onLoadFilter, source }: StateProps<T>) => void;
|
|
@@ -2,12 +2,12 @@ import { StateProps } from './useSaveState';
|
|
|
2
2
|
export type FilterStateOptions<T> = {
|
|
3
3
|
filterQueryKey: string;
|
|
4
4
|
filterLocalStorageKey: string;
|
|
5
|
-
validateData
|
|
5
|
+
validateData(value: unknown): value is T;
|
|
6
6
|
};
|
|
7
7
|
type FilterStateProps<TFilter> = Omit<StateProps<TFilter>, 'source'> & {
|
|
8
8
|
options?: FilterStateOptions<TFilter>;
|
|
9
|
-
parser
|
|
10
|
-
|
|
9
|
+
parser?(jsonFilter: string): TFilter;
|
|
10
|
+
serializer?(filter: TFilter): string;
|
|
11
11
|
};
|
|
12
|
-
export declare const useSaveFilterState: <TFilter>({ options, filter, onLoadFilter }: FilterStateProps<TFilter>) => void;
|
|
12
|
+
export declare const useSaveFilterState: <TFilter>({ options, filter, onLoadFilter, parser, serializer, }: FilterStateProps<TFilter>) => void;
|
|
13
13
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
2
|
import { LocalStorageSource, QueryParamSource, useSaveState } from './useSaveState';
|
|
3
|
-
export const useSaveFilterState = ({ options, filter, onLoadFilter }) => {
|
|
3
|
+
export const useSaveFilterState = ({ options, filter, onLoadFilter, parser, serializer, }) => {
|
|
4
4
|
const [queryFilter, setQueryFilter] = useState(null);
|
|
5
5
|
const [localStorageFilter, setLocalStorageFilter] = useState(null);
|
|
6
6
|
const [isLoaded, setIsLoaded] = useState({
|
|
@@ -15,8 +15,12 @@ export const useSaveFilterState = ({ options, filter, onLoadFilter }) => {
|
|
|
15
15
|
setLocalStorageFilter(value);
|
|
16
16
|
setIsLoaded(prev => (Object.assign(Object.assign({}, prev), { localStorage: true })));
|
|
17
17
|
}, []);
|
|
18
|
-
const querySource = useMemo(() =>
|
|
19
|
-
|
|
18
|
+
const querySource = useMemo(() => options
|
|
19
|
+
? new QueryParamSource(options.filterQueryKey, options.validateData, parser, serializer)
|
|
20
|
+
: undefined, [options, parser, serializer]);
|
|
21
|
+
const localStorageSource = useMemo(() => options
|
|
22
|
+
? new LocalStorageSource(options.filterLocalStorageKey, options.validateData, parser, serializer)
|
|
23
|
+
: undefined, [options, parser, serializer]);
|
|
20
24
|
useSaveState({ filter, onLoadFilter: onLoadQueryParams, source: querySource });
|
|
21
25
|
useSaveState({ filter, onLoadFilter: onLoadLocalStorage, source: localStorageSource });
|
|
22
26
|
useEffect(() => {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export declare abstract class BaseSource<TFilter> {
|
|
2
2
|
filterKey: string;
|
|
3
3
|
private validate;
|
|
4
|
-
protected
|
|
5
|
-
protected
|
|
4
|
+
protected parser: (value: string) => TFilter;
|
|
5
|
+
protected serializer: (value: TFilter) => string;
|
|
6
6
|
protected abstract getFormSource(): string;
|
|
7
7
|
protected abstract setToSource(value: string): void;
|
|
8
|
-
constructor(filterKey: string, validate: (value: unknown) => value is TFilter,
|
|
8
|
+
constructor(filterKey: string, validate: (value: unknown) => value is TFilter, parser?: (value: string) => TFilter, serializer?: (value: TFilter) => string);
|
|
9
9
|
getFilter: () => NonNullable<TFilter> | null;
|
|
10
10
|
setFilter: (filter: TFilter) => void;
|
|
11
11
|
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
export class BaseSource {
|
|
2
|
-
constructor(filterKey, validate,
|
|
2
|
+
constructor(filterKey, validate, parser, serializer) {
|
|
3
3
|
this.filterKey = filterKey;
|
|
4
4
|
this.validate = validate;
|
|
5
|
-
this.
|
|
6
|
-
this.
|
|
5
|
+
this.parser = JSON.parse;
|
|
6
|
+
this.serializer = JSON.stringify;
|
|
7
7
|
this.getFilter = () => {
|
|
8
8
|
const filterFromQueryParams = this.getFormSource();
|
|
9
|
-
const parsedValue = filterFromQueryParams ? this.
|
|
9
|
+
const parsedValue = filterFromQueryParams ? this.parser(filterFromQueryParams) : null;
|
|
10
10
|
const isValid = parsedValue && this.validate(parsedValue);
|
|
11
11
|
return isValid ? parsedValue : null;
|
|
12
12
|
};
|
|
13
13
|
this.setFilter = (filter) => {
|
|
14
|
-
const encodedValue = this.
|
|
14
|
+
const encodedValue = this.serializer(filter);
|
|
15
15
|
this.setToSource(encodedValue);
|
|
16
16
|
};
|
|
17
|
-
if (
|
|
18
|
-
this.
|
|
17
|
+
if (parser) {
|
|
18
|
+
this.parser = parser;
|
|
19
19
|
}
|
|
20
|
-
if (
|
|
21
|
-
this.
|
|
20
|
+
if (serializer) {
|
|
21
|
+
this.serializer = serializer;
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BaseSource } from './sources/baseSource';
|
|
2
2
|
export type StateProps<T> = {
|
|
3
3
|
filter: T;
|
|
4
|
-
onLoadFilter
|
|
4
|
+
onLoadFilter(filter: T | null): void;
|
|
5
5
|
source?: BaseSource<T>;
|
|
6
6
|
};
|
|
7
7
|
export declare const useSaveState: <T>({ filter, onLoadFilter, source }: StateProps<T>) => void;
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Utils",
|
|
7
|
-
"version": "3.7.1-preview-
|
|
7
|
+
"version": "3.7.1-preview-74c13173.0",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -39,5 +39,5 @@
|
|
|
39
39
|
"react-swipeable": "7.0.2",
|
|
40
40
|
"uncontrollable": "8.0.4"
|
|
41
41
|
},
|
|
42
|
-
"gitHead": "
|
|
42
|
+
"gitHead": "a3a4d2281eb9a1143c3a60efd0ccca4daa5c246c"
|
|
43
43
|
}
|
|
@@ -5,16 +5,22 @@ import { LocalStorageSource, QueryParamSource, StateProps, useSaveState } from '
|
|
|
5
5
|
export type FilterStateOptions<T> = {
|
|
6
6
|
filterQueryKey: string;
|
|
7
7
|
filterLocalStorageKey: string;
|
|
8
|
-
validateData
|
|
8
|
+
validateData(value: unknown): value is T;
|
|
9
9
|
};
|
|
10
10
|
|
|
11
11
|
type FilterStateProps<TFilter> = Omit<StateProps<TFilter>, 'source'> & {
|
|
12
12
|
options?: FilterStateOptions<TFilter>;
|
|
13
|
-
parser
|
|
14
|
-
|
|
13
|
+
parser?(jsonFilter: string): TFilter;
|
|
14
|
+
serializer?(filter: TFilter): string;
|
|
15
15
|
};
|
|
16
16
|
|
|
17
|
-
export const useSaveFilterState = <TFilter>({
|
|
17
|
+
export const useSaveFilterState = <TFilter>({
|
|
18
|
+
options,
|
|
19
|
+
filter,
|
|
20
|
+
onLoadFilter,
|
|
21
|
+
parser,
|
|
22
|
+
serializer,
|
|
23
|
+
}: FilterStateProps<TFilter>) => {
|
|
18
24
|
const [queryFilter, setQueryFilter] = useState<TFilter | null>(null);
|
|
19
25
|
const [localStorageFilter, setLocalStorageFilter] = useState<TFilter | null>(null);
|
|
20
26
|
const [isLoaded, setIsLoaded] = useState<{ localStorage: boolean; queryParams: boolean }>({
|
|
@@ -33,12 +39,18 @@ export const useSaveFilterState = <TFilter>({ options, filter, onLoadFilter }: F
|
|
|
33
39
|
}, []);
|
|
34
40
|
|
|
35
41
|
const querySource = useMemo(
|
|
36
|
-
() =>
|
|
37
|
-
|
|
42
|
+
() =>
|
|
43
|
+
options
|
|
44
|
+
? new QueryParamSource<TFilter>(options.filterQueryKey, options.validateData, parser, serializer)
|
|
45
|
+
: undefined,
|
|
46
|
+
[options, parser, serializer],
|
|
38
47
|
);
|
|
39
48
|
const localStorageSource = useMemo(
|
|
40
|
-
() =>
|
|
41
|
-
|
|
49
|
+
() =>
|
|
50
|
+
options
|
|
51
|
+
? new LocalStorageSource<TFilter>(options.filterLocalStorageKey, options.validateData, parser, serializer)
|
|
52
|
+
: undefined,
|
|
53
|
+
[options, parser, serializer],
|
|
42
54
|
);
|
|
43
55
|
|
|
44
56
|
useSaveState<TFilter>({ filter, onLoadFilter: onLoadQueryParams, source: querySource });
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
export abstract class BaseSource<TFilter> {
|
|
2
|
-
protected
|
|
3
|
-
protected
|
|
2
|
+
protected parser: (value: string) => TFilter = JSON.parse;
|
|
3
|
+
protected serializer: (value: TFilter) => string = JSON.stringify;
|
|
4
4
|
protected abstract getFormSource(): string;
|
|
5
5
|
protected abstract setToSource(value: string): void;
|
|
6
6
|
|
|
7
7
|
constructor(
|
|
8
8
|
public filterKey: string,
|
|
9
9
|
private validate: (value: unknown) => value is TFilter,
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
parser?: (value: string) => TFilter,
|
|
11
|
+
serializer?: (value: TFilter) => string,
|
|
12
12
|
) {
|
|
13
|
-
if (
|
|
14
|
-
this.
|
|
13
|
+
if (parser) {
|
|
14
|
+
this.parser = parser;
|
|
15
15
|
}
|
|
16
|
-
if (
|
|
17
|
-
this.
|
|
16
|
+
if (serializer) {
|
|
17
|
+
this.serializer = serializer;
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
getFilter = () => {
|
|
22
22
|
const filterFromQueryParams = this.getFormSource();
|
|
23
|
-
const parsedValue = filterFromQueryParams ? (this.
|
|
23
|
+
const parsedValue = filterFromQueryParams ? (this.parser(filterFromQueryParams) as TFilter) : null;
|
|
24
24
|
const isValid = parsedValue && this.validate(parsedValue);
|
|
25
25
|
return isValid ? parsedValue : null;
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
setFilter = (filter: TFilter) => {
|
|
29
|
-
const encodedValue = this.
|
|
29
|
+
const encodedValue = this.serializer(filter);
|
|
30
30
|
this.setToSource(encodedValue);
|
|
31
31
|
};
|
|
32
32
|
}
|
|
@@ -4,12 +4,13 @@ import { BaseSource } from './sources/baseSource';
|
|
|
4
4
|
|
|
5
5
|
export type StateProps<T> = {
|
|
6
6
|
filter: T;
|
|
7
|
-
onLoadFilter
|
|
7
|
+
onLoadFilter(filter: T | null): void;
|
|
8
8
|
source?: BaseSource<T>;
|
|
9
9
|
};
|
|
10
10
|
|
|
11
11
|
export const useSaveState = <T>({ filter, onLoadFilter, source }: StateProps<T>) => {
|
|
12
12
|
const [isLoaded, setIsLoaded] = useState<boolean>(false);
|
|
13
|
+
|
|
13
14
|
useEffect(() => {
|
|
14
15
|
if (!source) {
|
|
15
16
|
return;
|