@reactuses/core 2.2.0 → 2.2.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/dist/index.cjs +29 -24
- package/dist/index.d.ts +6 -3
- package/dist/index.mjs +30 -25
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -116,38 +116,41 @@ const StorageSerializers = {
|
|
|
116
116
|
}
|
|
117
117
|
};
|
|
118
118
|
function useStorage(key, defaults, getStorage, options = {}) {
|
|
119
|
-
|
|
119
|
+
const defaultOnError = React.useCallback((e) => {
|
|
120
|
+
console.error(e);
|
|
121
|
+
}, []);
|
|
120
122
|
let storage;
|
|
121
|
-
const {
|
|
122
|
-
onError = (e) => {
|
|
123
|
-
console.error(e);
|
|
124
|
-
}
|
|
125
|
-
} = options;
|
|
126
|
-
const data = defaults;
|
|
123
|
+
const { onError = defaultOnError, ignoreDefaults = true } = options;
|
|
127
124
|
try {
|
|
128
125
|
storage = getStorage();
|
|
129
126
|
} catch (err) {
|
|
130
|
-
|
|
127
|
+
onError(err);
|
|
131
128
|
}
|
|
132
129
|
const type = guessSerializerType(defaults);
|
|
133
|
-
const serializer = (
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
storage == null ? void 0 : storage.setItem(key, serializer.write(data));
|
|
141
|
-
return data;
|
|
142
|
-
}
|
|
143
|
-
} catch (e) {
|
|
144
|
-
onError(e);
|
|
145
|
-
}
|
|
146
|
-
});
|
|
130
|
+
const serializer = React.useMemo(
|
|
131
|
+
() => {
|
|
132
|
+
var _a;
|
|
133
|
+
return (_a = options.serializer) != null ? _a : StorageSerializers[type];
|
|
134
|
+
},
|
|
135
|
+
[options.serializer, type]
|
|
136
|
+
);
|
|
147
137
|
const [state, setState] = React.useState(defaults);
|
|
148
138
|
React.useEffect(() => {
|
|
139
|
+
const getStoredValue = () => {
|
|
140
|
+
try {
|
|
141
|
+
const raw = storage == null ? void 0 : storage.getItem(key);
|
|
142
|
+
if (raw !== void 0 && raw !== null && ignoreDefaults) {
|
|
143
|
+
return serializer.read(raw);
|
|
144
|
+
} else {
|
|
145
|
+
storage == null ? void 0 : storage.setItem(key, serializer.write(defaults));
|
|
146
|
+
return defaults;
|
|
147
|
+
}
|
|
148
|
+
} catch (e) {
|
|
149
|
+
onError(e);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
149
152
|
setState(getStoredValue());
|
|
150
|
-
}, [
|
|
153
|
+
}, [key, ignoreDefaults, defaults, serializer, storage, onError]);
|
|
151
154
|
const updateState = useEvent(
|
|
152
155
|
(valOrFunc) => {
|
|
153
156
|
const currentState = isFunction(valOrFunc) ? valOrFunc(state) : valOrFunc;
|
|
@@ -261,7 +264,9 @@ function useDarkMode(options = {}) {
|
|
|
261
264
|
} = options;
|
|
262
265
|
const prefersDarkMode = usePreferredDark(false);
|
|
263
266
|
const value = initialValue ? initialValue : prefersDarkMode ? "dark" : "light";
|
|
264
|
-
const [dark, setDark] = useStorage(storageKey, value, storage
|
|
267
|
+
const [dark, setDark] = useStorage(storageKey, value, storage, {
|
|
268
|
+
ignoreDefaults: false
|
|
269
|
+
});
|
|
265
270
|
const wrappedSetDark = React.useCallback(
|
|
266
271
|
(latestDark) => {
|
|
267
272
|
const element = window == null ? void 0 : window.document.querySelector(selector);
|
package/dist/index.d.ts
CHANGED
|
@@ -27,6 +27,10 @@ interface UseStorageOptions<T> {
|
|
|
27
27
|
* Default log error to `console.error`
|
|
28
28
|
*/
|
|
29
29
|
onError?: (error: unknown) => void;
|
|
30
|
+
/**
|
|
31
|
+
* ignore default value when storage has value
|
|
32
|
+
*/
|
|
33
|
+
ignoreDefaults?: boolean;
|
|
30
34
|
}
|
|
31
35
|
|
|
32
36
|
declare function useLocalStorage(key: string, defaults: string, options?: UseStorageOptions<string>): readonly [string | null, Dispatch<SetStateAction<string | null>>];
|
|
@@ -74,8 +78,7 @@ interface UseDarkOptions<T> {
|
|
|
74
78
|
*/
|
|
75
79
|
attribute?: string;
|
|
76
80
|
/**
|
|
77
|
-
* The initial value write the target element,
|
|
78
|
-
* must be set in SSR
|
|
81
|
+
* The initial classname value write the target element, Otherwise, it will follow the system by default
|
|
79
82
|
* @default 'light | dark'
|
|
80
83
|
*/
|
|
81
84
|
initialValue?: T;
|
|
@@ -92,7 +95,7 @@ interface UseDarkOptions<T> {
|
|
|
92
95
|
*/
|
|
93
96
|
storage?: () => Storage;
|
|
94
97
|
}
|
|
95
|
-
declare function useDarkMode<T extends string
|
|
98
|
+
declare function useDarkMode<T extends string>(options?: UseDarkOptions<T>): readonly [T | null, (latestDark: T) => void];
|
|
96
99
|
|
|
97
100
|
declare function useMediaQuery(query: string, defaultState?: boolean): boolean;
|
|
98
101
|
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useRef, useEffect, useLayoutEffect, useCallback, useState, useReducer
|
|
1
|
+
import React, { useRef, useEffect, useLayoutEffect, useCallback, useMemo, useState, useReducer } from 'react';
|
|
2
2
|
import { throttle, debounce, isEqual } from 'lodash';
|
|
3
3
|
|
|
4
4
|
function usePrevious(state) {
|
|
@@ -108,38 +108,41 @@ const StorageSerializers = {
|
|
|
108
108
|
}
|
|
109
109
|
};
|
|
110
110
|
function useStorage(key, defaults, getStorage, options = {}) {
|
|
111
|
-
|
|
111
|
+
const defaultOnError = useCallback((e) => {
|
|
112
|
+
console.error(e);
|
|
113
|
+
}, []);
|
|
112
114
|
let storage;
|
|
113
|
-
const {
|
|
114
|
-
onError = (e) => {
|
|
115
|
-
console.error(e);
|
|
116
|
-
}
|
|
117
|
-
} = options;
|
|
118
|
-
const data = defaults;
|
|
115
|
+
const { onError = defaultOnError, ignoreDefaults = true } = options;
|
|
119
116
|
try {
|
|
120
117
|
storage = getStorage();
|
|
121
118
|
} catch (err) {
|
|
122
|
-
|
|
119
|
+
onError(err);
|
|
123
120
|
}
|
|
124
121
|
const type = guessSerializerType(defaults);
|
|
125
|
-
const serializer = (
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
storage == null ? void 0 : storage.setItem(key, serializer.write(data));
|
|
133
|
-
return data;
|
|
134
|
-
}
|
|
135
|
-
} catch (e) {
|
|
136
|
-
onError(e);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
122
|
+
const serializer = useMemo(
|
|
123
|
+
() => {
|
|
124
|
+
var _a;
|
|
125
|
+
return (_a = options.serializer) != null ? _a : StorageSerializers[type];
|
|
126
|
+
},
|
|
127
|
+
[options.serializer, type]
|
|
128
|
+
);
|
|
139
129
|
const [state, setState] = useState(defaults);
|
|
140
130
|
useEffect(() => {
|
|
131
|
+
const getStoredValue = () => {
|
|
132
|
+
try {
|
|
133
|
+
const raw = storage == null ? void 0 : storage.getItem(key);
|
|
134
|
+
if (raw !== void 0 && raw !== null && ignoreDefaults) {
|
|
135
|
+
return serializer.read(raw);
|
|
136
|
+
} else {
|
|
137
|
+
storage == null ? void 0 : storage.setItem(key, serializer.write(defaults));
|
|
138
|
+
return defaults;
|
|
139
|
+
}
|
|
140
|
+
} catch (e) {
|
|
141
|
+
onError(e);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
141
144
|
setState(getStoredValue());
|
|
142
|
-
}, [
|
|
145
|
+
}, [key, ignoreDefaults, defaults, serializer, storage, onError]);
|
|
143
146
|
const updateState = useEvent(
|
|
144
147
|
(valOrFunc) => {
|
|
145
148
|
const currentState = isFunction(valOrFunc) ? valOrFunc(state) : valOrFunc;
|
|
@@ -253,7 +256,9 @@ function useDarkMode(options = {}) {
|
|
|
253
256
|
} = options;
|
|
254
257
|
const prefersDarkMode = usePreferredDark(false);
|
|
255
258
|
const value = initialValue ? initialValue : prefersDarkMode ? "dark" : "light";
|
|
256
|
-
const [dark, setDark] = useStorage(storageKey, value, storage
|
|
259
|
+
const [dark, setDark] = useStorage(storageKey, value, storage, {
|
|
260
|
+
ignoreDefaults: false
|
|
261
|
+
});
|
|
257
262
|
const wrappedSetDark = useCallback(
|
|
258
263
|
(latestDark) => {
|
|
259
264
|
const element = window == null ? void 0 : window.document.querySelector(selector);
|