@snack-uikit/utils 3.10.1 → 3.10.2-preview-05f26bf6.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 +3 -3
- package/dist/cjs/hooks/useDataPersist/sources/baseSource.d.ts +6 -6
- package/dist/cjs/hooks/useDataPersist/sources/baseSource.js +2 -2
- package/dist/cjs/hooks/useDataPersist/sources/localStorageSource.d.ts +1 -1
- package/dist/cjs/hooks/useDataPersist/sources/queryParamSource.d.ts +1 -1
- package/dist/cjs/hooks/useDataPersist/useDataPersist.d.ts +10 -10
- package/dist/cjs/hooks/useDataPersist/useDataPersist.js +4 -4
- package/dist/cjs/hooks/useDataPersist/useSource.d.ts +2 -2
- package/dist/cjs/hooks/useDataPersist/useSource.js +3 -3
- package/dist/esm/hooks/useDataPersist/sources/baseSource.d.ts +6 -6
- package/dist/esm/hooks/useDataPersist/sources/baseSource.js +2 -2
- package/dist/esm/hooks/useDataPersist/sources/localStorageSource.d.ts +1 -1
- package/dist/esm/hooks/useDataPersist/sources/queryParamSource.d.ts +1 -1
- package/dist/esm/hooks/useDataPersist/useDataPersist.d.ts +10 -10
- package/dist/esm/hooks/useDataPersist/useDataPersist.js +4 -6
- package/dist/esm/hooks/useDataPersist/useSource.d.ts +2 -2
- package/dist/esm/hooks/useDataPersist/useSource.js +3 -3
- package/package.json +2 -2
- package/src/hooks/useDataPersist/sources/baseSource.ts +9 -9
- package/src/hooks/useDataPersist/sources/localStorageSource.ts +1 -1
- package/src/hooks/useDataPersist/sources/queryParamSource.ts +1 -1
- package/src/hooks/useDataPersist/useDataPersist.ts +16 -17
- package/src/hooks/useDataPersist/useSource.ts +4 -4
package/README.md
CHANGED
|
@@ -75,9 +75,9 @@
|
|
|
75
75
|
### Props
|
|
76
76
|
| name | type | default value | description |
|
|
77
77
|
|------|------|---------------|-------------|
|
|
78
|
-
| options | `
|
|
79
|
-
| parser | `(
|
|
80
|
-
| serializer | `(
|
|
78
|
+
| options | `DataPersistOptions<TData>` | - | |
|
|
79
|
+
| parser | `(jsonData: string) => TData` | - | |
|
|
80
|
+
| serializer | `(data: TData) => string` | - | |
|
|
81
81
|
## useModalOpenState
|
|
82
82
|
`hook`
|
|
83
83
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export declare abstract class BaseSource<
|
|
1
|
+
export declare abstract class BaseSource<TData> {
|
|
2
2
|
filterKey: string;
|
|
3
3
|
private validate;
|
|
4
|
-
protected parser: (value: string) =>
|
|
5
|
-
protected serializer: (value:
|
|
4
|
+
protected parser: (value: string) => TData;
|
|
5
|
+
protected serializer: (value: TData) => string;
|
|
6
6
|
protected abstract getFromSource(): string;
|
|
7
7
|
protected abstract setToSource(value: string): void;
|
|
8
|
-
constructor(filterKey: string, validate: (value: unknown) => value is
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
constructor(filterKey: string, validate: (value: unknown) => value is TData, parser?: (value: string) => TData, serializer?: (value: TData) => string);
|
|
9
|
+
getData: () => NonNullable<TData> | null;
|
|
10
|
+
setData: (filter: TData) => void;
|
|
11
11
|
}
|
|
@@ -10,7 +10,7 @@ class BaseSource {
|
|
|
10
10
|
this.validate = validate;
|
|
11
11
|
this.parser = JSON.parse;
|
|
12
12
|
this.serializer = JSON.stringify;
|
|
13
|
-
this.
|
|
13
|
+
this.getData = () => {
|
|
14
14
|
try {
|
|
15
15
|
const filterFromQueryParams = this.getFromSource();
|
|
16
16
|
const parsedValue = filterFromQueryParams ? this.parser(filterFromQueryParams) : null;
|
|
@@ -20,7 +20,7 @@ class BaseSource {
|
|
|
20
20
|
return null;
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
|
-
this.
|
|
23
|
+
this.setData = filter => {
|
|
24
24
|
const encodedValue = this.serializer(filter);
|
|
25
25
|
this.setToSource(encodedValue);
|
|
26
26
|
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { StateProps } from './useSource';
|
|
2
|
-
export type
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
export type DataPersistOptions<T> = {
|
|
3
|
+
queryKey: string;
|
|
4
|
+
localStorageKey: string;
|
|
5
5
|
validateData(value: unknown): value is T;
|
|
6
6
|
};
|
|
7
|
-
type
|
|
8
|
-
options?:
|
|
9
|
-
parser?(
|
|
10
|
-
serializer?(
|
|
7
|
+
type DataPersistProps<TData> = Omit<StateProps<TData>, 'source'> & {
|
|
8
|
+
options?: DataPersistOptions<TData>;
|
|
9
|
+
parser?(jsonData: string): TData;
|
|
10
|
+
serializer?(data: TData): string;
|
|
11
11
|
};
|
|
12
|
-
export declare const useDataPersist: <
|
|
13
|
-
|
|
14
|
-
setDataToStorages: (data:
|
|
12
|
+
export declare const useDataPersist: <TData>({ options, parser, serializer }: DataPersistProps<TData>) => {
|
|
13
|
+
getDefaultData: () => NonNullable<TData> | null | undefined;
|
|
14
|
+
setDataToStorages: (data: TData) => void;
|
|
15
15
|
};
|
|
16
16
|
export {};
|
|
@@ -13,8 +13,8 @@ const useDataPersist = _ref => {
|
|
|
13
13
|
parser,
|
|
14
14
|
serializer
|
|
15
15
|
} = _ref;
|
|
16
|
-
const querySource = (0, react_1.useMemo)(() => options ? new sources_1.QueryParamSource(options.
|
|
17
|
-
const localStorageSource = (0, react_1.useMemo)(() => options ? new sources_1.LocalStorageSource(options.
|
|
16
|
+
const querySource = (0, react_1.useMemo)(() => options ? new sources_1.QueryParamSource(options.queryKey, options.validateData, parser, serializer) : undefined, [options, parser, serializer]);
|
|
17
|
+
const localStorageSource = (0, react_1.useMemo)(() => options ? new sources_1.LocalStorageSource(options.localStorageKey, options.validateData) : undefined, [options]);
|
|
18
18
|
const {
|
|
19
19
|
getData: getLocalStorageData,
|
|
20
20
|
setData: setLocalStorageData
|
|
@@ -31,12 +31,12 @@ const useDataPersist = _ref => {
|
|
|
31
31
|
setLocalStorageData(data);
|
|
32
32
|
setQueryParamsData(data);
|
|
33
33
|
}, [setLocalStorageData, setQueryParamsData]);
|
|
34
|
-
const
|
|
34
|
+
const getDefaultData = (0, react_1.useCallback)(() => {
|
|
35
35
|
const queryData = getQueryParamsData();
|
|
36
36
|
return queryData ? queryData : getLocalStorageData();
|
|
37
37
|
}, [getLocalStorageData, getQueryParamsData]);
|
|
38
38
|
return {
|
|
39
|
-
|
|
39
|
+
getDefaultData,
|
|
40
40
|
setDataToStorages
|
|
41
41
|
};
|
|
42
42
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { BaseSource } from './sources
|
|
1
|
+
import { BaseSource } from './sources';
|
|
2
2
|
export type StateProps<T> = {
|
|
3
3
|
source?: BaseSource<T>;
|
|
4
4
|
};
|
|
5
5
|
export declare const useSource: <T>({ source }: StateProps<T>) => {
|
|
6
6
|
getData: () => NonNullable<T> | null | undefined;
|
|
7
|
-
setData: (
|
|
7
|
+
setData: (data: T) => void;
|
|
8
8
|
};
|
|
@@ -9,13 +9,13 @@ const useSource = _ref => {
|
|
|
9
9
|
let {
|
|
10
10
|
source
|
|
11
11
|
} = _ref;
|
|
12
|
-
const setData = (0, react_1.useCallback)(
|
|
12
|
+
const setData = (0, react_1.useCallback)(data => {
|
|
13
13
|
if (!source) {
|
|
14
14
|
return;
|
|
15
15
|
}
|
|
16
|
-
source.
|
|
16
|
+
source.setData(data);
|
|
17
17
|
}, [source]);
|
|
18
|
-
const getData = (0, react_1.useCallback)(() => source === null || source === void 0 ? void 0 : source.
|
|
18
|
+
const getData = (0, react_1.useCallback)(() => source === null || source === void 0 ? void 0 : source.getData(), [source]);
|
|
19
19
|
return {
|
|
20
20
|
getData,
|
|
21
21
|
setData
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export declare abstract class BaseSource<
|
|
1
|
+
export declare abstract class BaseSource<TData> {
|
|
2
2
|
filterKey: string;
|
|
3
3
|
private validate;
|
|
4
|
-
protected parser: (value: string) =>
|
|
5
|
-
protected serializer: (value:
|
|
4
|
+
protected parser: (value: string) => TData;
|
|
5
|
+
protected serializer: (value: TData) => string;
|
|
6
6
|
protected abstract getFromSource(): string;
|
|
7
7
|
protected abstract setToSource(value: string): void;
|
|
8
|
-
constructor(filterKey: string, validate: (value: unknown) => value is
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
constructor(filterKey: string, validate: (value: unknown) => value is TData, parser?: (value: string) => TData, serializer?: (value: TData) => string);
|
|
9
|
+
getData: () => NonNullable<TData> | null;
|
|
10
|
+
setData: (filter: TData) => void;
|
|
11
11
|
}
|
|
@@ -4,7 +4,7 @@ export class BaseSource {
|
|
|
4
4
|
this.validate = validate;
|
|
5
5
|
this.parser = JSON.parse;
|
|
6
6
|
this.serializer = JSON.stringify;
|
|
7
|
-
this.
|
|
7
|
+
this.getData = () => {
|
|
8
8
|
try {
|
|
9
9
|
const filterFromQueryParams = this.getFromSource();
|
|
10
10
|
const parsedValue = filterFromQueryParams ? this.parser(filterFromQueryParams) : null;
|
|
@@ -15,7 +15,7 @@ export class BaseSource {
|
|
|
15
15
|
return null;
|
|
16
16
|
}
|
|
17
17
|
};
|
|
18
|
-
this.
|
|
18
|
+
this.setData = (filter) => {
|
|
19
19
|
const encodedValue = this.serializer(filter);
|
|
20
20
|
this.setToSource(encodedValue);
|
|
21
21
|
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { StateProps } from './useSource';
|
|
2
|
-
export type
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
export type DataPersistOptions<T> = {
|
|
3
|
+
queryKey: string;
|
|
4
|
+
localStorageKey: string;
|
|
5
5
|
validateData(value: unknown): value is T;
|
|
6
6
|
};
|
|
7
|
-
type
|
|
8
|
-
options?:
|
|
9
|
-
parser?(
|
|
10
|
-
serializer?(
|
|
7
|
+
type DataPersistProps<TData> = Omit<StateProps<TData>, 'source'> & {
|
|
8
|
+
options?: DataPersistOptions<TData>;
|
|
9
|
+
parser?(jsonData: string): TData;
|
|
10
|
+
serializer?(data: TData): string;
|
|
11
11
|
};
|
|
12
|
-
export declare const useDataPersist: <
|
|
13
|
-
|
|
14
|
-
setDataToStorages: (data:
|
|
12
|
+
export declare const useDataPersist: <TData>({ options, parser, serializer }: DataPersistProps<TData>) => {
|
|
13
|
+
getDefaultData: () => NonNullable<TData> | null | undefined;
|
|
14
|
+
setDataToStorages: (data: TData) => void;
|
|
15
15
|
};
|
|
16
16
|
export {};
|
|
@@ -2,10 +2,8 @@ import { useCallback, useMemo } from 'react';
|
|
|
2
2
|
import { LocalStorageSource, QueryParamSource } from './sources';
|
|
3
3
|
import { useSource } from './useSource';
|
|
4
4
|
export const useDataPersist = ({ options, parser, serializer }) => {
|
|
5
|
-
const querySource = useMemo(() => options
|
|
6
|
-
|
|
7
|
-
: undefined, [options, parser, serializer]);
|
|
8
|
-
const localStorageSource = useMemo(() => (options ? new LocalStorageSource(options.filterLocalStorageKey, options.validateData) : undefined), [options]);
|
|
5
|
+
const querySource = useMemo(() => options ? new QueryParamSource(options.queryKey, options.validateData, parser, serializer) : undefined, [options, parser, serializer]);
|
|
6
|
+
const localStorageSource = useMemo(() => (options ? new LocalStorageSource(options.localStorageKey, options.validateData) : undefined), [options]);
|
|
9
7
|
const { getData: getLocalStorageData, setData: setLocalStorageData } = useSource({
|
|
10
8
|
source: querySource,
|
|
11
9
|
});
|
|
@@ -16,9 +14,9 @@ export const useDataPersist = ({ options, parser, serializer }) => {
|
|
|
16
14
|
setLocalStorageData(data);
|
|
17
15
|
setQueryParamsData(data);
|
|
18
16
|
}, [setLocalStorageData, setQueryParamsData]);
|
|
19
|
-
const
|
|
17
|
+
const getDefaultData = useCallback(() => {
|
|
20
18
|
const queryData = getQueryParamsData();
|
|
21
19
|
return queryData ? queryData : getLocalStorageData();
|
|
22
20
|
}, [getLocalStorageData, getQueryParamsData]);
|
|
23
|
-
return {
|
|
21
|
+
return { getDefaultData, setDataToStorages };
|
|
24
22
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { BaseSource } from './sources
|
|
1
|
+
import { BaseSource } from './sources';
|
|
2
2
|
export type StateProps<T> = {
|
|
3
3
|
source?: BaseSource<T>;
|
|
4
4
|
};
|
|
5
5
|
export declare const useSource: <T>({ source }: StateProps<T>) => {
|
|
6
6
|
getData: () => NonNullable<T> | null | undefined;
|
|
7
|
-
setData: (
|
|
7
|
+
setData: (data: T) => void;
|
|
8
8
|
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
2
|
export const useSource = ({ source }) => {
|
|
3
|
-
const setData = useCallback((
|
|
3
|
+
const setData = useCallback((data) => {
|
|
4
4
|
if (!source) {
|
|
5
5
|
return;
|
|
6
6
|
}
|
|
7
|
-
source.
|
|
7
|
+
source.setData(data);
|
|
8
8
|
}, [source]);
|
|
9
|
-
const getData = useCallback(() => source === null || source === void 0 ? void 0 : source.
|
|
9
|
+
const getData = useCallback(() => source === null || source === void 0 ? void 0 : source.getData(), [source]);
|
|
10
10
|
return { getData, setData };
|
|
11
11
|
};
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Utils",
|
|
7
|
-
"version": "3.10.
|
|
7
|
+
"version": "3.10.2-preview-05f26bf6.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": "6fee645f4608f0384f0e44df312a82b4120739ac"
|
|
43
43
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
export abstract class BaseSource<
|
|
2
|
-
protected parser: (value: string) =>
|
|
3
|
-
protected serializer: (value:
|
|
1
|
+
export abstract class BaseSource<TData> {
|
|
2
|
+
protected parser: (value: string) => TData = JSON.parse;
|
|
3
|
+
protected serializer: (value: TData) => string = JSON.stringify;
|
|
4
4
|
protected abstract getFromSource(): string;
|
|
5
5
|
protected abstract setToSource(value: string): void;
|
|
6
6
|
|
|
7
7
|
constructor(
|
|
8
8
|
public filterKey: string,
|
|
9
|
-
private validate: (value: unknown) => value is
|
|
10
|
-
parser?: (value: string) =>
|
|
11
|
-
serializer?: (value:
|
|
9
|
+
private validate: (value: unknown) => value is TData,
|
|
10
|
+
parser?: (value: string) => TData,
|
|
11
|
+
serializer?: (value: TData) => string,
|
|
12
12
|
) {
|
|
13
13
|
if (parser) {
|
|
14
14
|
this.parser = parser;
|
|
@@ -18,10 +18,10 @@ export abstract class BaseSource<TFilter> {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
getData = () => {
|
|
22
22
|
try {
|
|
23
23
|
const filterFromQueryParams = this.getFromSource();
|
|
24
|
-
const parsedValue = filterFromQueryParams ? (this.parser(filterFromQueryParams) as
|
|
24
|
+
const parsedValue = filterFromQueryParams ? (this.parser(filterFromQueryParams) as TData) : null;
|
|
25
25
|
const isValid = parsedValue && this.validate(parsedValue);
|
|
26
26
|
return isValid ? parsedValue : null;
|
|
27
27
|
} catch {
|
|
@@ -29,7 +29,7 @@ export abstract class BaseSource<TFilter> {
|
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
setData = (filter: TData) => {
|
|
33
33
|
const encodedValue = this.serializer(filter);
|
|
34
34
|
this.setToSource(encodedValue);
|
|
35
35
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isBrowser } from '../../../utils';
|
|
2
2
|
import { BaseSource } from './baseSource';
|
|
3
3
|
|
|
4
|
-
export class LocalStorageSource<
|
|
4
|
+
export class LocalStorageSource<TData> extends BaseSource<TData> {
|
|
5
5
|
getFromSource(): string {
|
|
6
6
|
if (isBrowser()) {
|
|
7
7
|
return localStorage.getItem(this.filterKey) || '';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isBrowser } from '../../../utils';
|
|
2
2
|
import { BaseSource } from './baseSource';
|
|
3
3
|
|
|
4
|
-
export class QueryParamSource<
|
|
4
|
+
export class QueryParamSource<TData> extends BaseSource<TData> {
|
|
5
5
|
getFromSource(): string {
|
|
6
6
|
if (isBrowser()) {
|
|
7
7
|
return new URL(window.location.href).searchParams.get(this.filterKey) || '';
|
|
@@ -3,50 +3,49 @@ import { useCallback, useMemo } from 'react';
|
|
|
3
3
|
import { LocalStorageSource, QueryParamSource } from './sources';
|
|
4
4
|
import { StateProps, useSource } from './useSource';
|
|
5
5
|
|
|
6
|
-
export type
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
export type DataPersistOptions<T> = {
|
|
7
|
+
queryKey: string;
|
|
8
|
+
localStorageKey: string;
|
|
9
9
|
validateData(value: unknown): value is T;
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
-
type
|
|
13
|
-
options?:
|
|
14
|
-
parser?(
|
|
15
|
-
serializer?(
|
|
12
|
+
type DataPersistProps<TData> = Omit<StateProps<TData>, 'source'> & {
|
|
13
|
+
options?: DataPersistOptions<TData>;
|
|
14
|
+
parser?(jsonData: string): TData;
|
|
15
|
+
serializer?(data: TData): string;
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
-
export const useDataPersist = <
|
|
18
|
+
export const useDataPersist = <TData>({ options, parser, serializer }: DataPersistProps<TData>) => {
|
|
19
19
|
const querySource = useMemo(
|
|
20
20
|
() =>
|
|
21
|
-
options
|
|
22
|
-
? new QueryParamSource<TFilter>(options.filterQueryKey, options.validateData, parser, serializer)
|
|
23
|
-
: undefined,
|
|
21
|
+
options ? new QueryParamSource<TData>(options.queryKey, options.validateData, parser, serializer) : undefined,
|
|
24
22
|
[options, parser, serializer],
|
|
25
23
|
);
|
|
26
24
|
const localStorageSource = useMemo(
|
|
27
|
-
() => (options ? new LocalStorageSource<
|
|
25
|
+
() => (options ? new LocalStorageSource<TData>(options.localStorageKey, options.validateData) : undefined),
|
|
28
26
|
[options],
|
|
29
27
|
);
|
|
30
28
|
|
|
31
|
-
const { getData: getLocalStorageData, setData: setLocalStorageData } = useSource<
|
|
29
|
+
const { getData: getLocalStorageData, setData: setLocalStorageData } = useSource<TData>({
|
|
32
30
|
source: querySource,
|
|
33
31
|
});
|
|
34
|
-
|
|
32
|
+
|
|
33
|
+
const { getData: getQueryParamsData, setData: setQueryParamsData } = useSource<TData>({
|
|
35
34
|
source: localStorageSource,
|
|
36
35
|
});
|
|
37
36
|
|
|
38
37
|
const setDataToStorages = useCallback(
|
|
39
|
-
(data:
|
|
38
|
+
(data: TData) => {
|
|
40
39
|
setLocalStorageData(data);
|
|
41
40
|
setQueryParamsData(data);
|
|
42
41
|
},
|
|
43
42
|
[setLocalStorageData, setQueryParamsData],
|
|
44
43
|
);
|
|
45
44
|
|
|
46
|
-
const
|
|
45
|
+
const getDefaultData = useCallback(() => {
|
|
47
46
|
const queryData = getQueryParamsData();
|
|
48
47
|
return queryData ? queryData : getLocalStorageData();
|
|
49
48
|
}, [getLocalStorageData, getQueryParamsData]);
|
|
50
49
|
|
|
51
|
-
return {
|
|
50
|
+
return { getDefaultData, setDataToStorages };
|
|
52
51
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
2
|
|
|
3
|
-
import { BaseSource } from './sources
|
|
3
|
+
import { BaseSource } from './sources';
|
|
4
4
|
|
|
5
5
|
export type StateProps<T> = {
|
|
6
6
|
source?: BaseSource<T>;
|
|
@@ -8,16 +8,16 @@ export type StateProps<T> = {
|
|
|
8
8
|
|
|
9
9
|
export const useSource = <T>({ source }: StateProps<T>) => {
|
|
10
10
|
const setData = useCallback(
|
|
11
|
-
(
|
|
11
|
+
(data: T) => {
|
|
12
12
|
if (!source) {
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
|
-
source.
|
|
15
|
+
source.setData(data);
|
|
16
16
|
},
|
|
17
17
|
[source],
|
|
18
18
|
);
|
|
19
19
|
|
|
20
|
-
const getData = useCallback(() => source?.
|
|
20
|
+
const getData = useCallback(() => source?.getData(), [source]);
|
|
21
21
|
|
|
22
22
|
return { getData, setData };
|
|
23
23
|
};
|