@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 CHANGED
@@ -116,38 +116,41 @@ const StorageSerializers = {
116
116
  }
117
117
  };
118
118
  function useStorage(key, defaults, getStorage, options = {}) {
119
- var _a;
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
- console.error(err);
127
+ onError(err);
131
128
  }
132
129
  const type = guessSerializerType(defaults);
133
- const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];
134
- const getStoredValue = useEvent(() => {
135
- try {
136
- const raw = storage == null ? void 0 : storage.getItem(key);
137
- if (raw !== void 0 && raw !== null) {
138
- return serializer.read(raw);
139
- } else {
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
- }, [getStoredValue, key]);
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, defaultValue follow system prefer color
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 | "light" | "dark">(options?: UseDarkOptions<T>): readonly [T | null, (latestDark: T) => void];
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, useMemo } from 'react';
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
- var _a;
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
- console.error(err);
119
+ onError(err);
123
120
  }
124
121
  const type = guessSerializerType(defaults);
125
- const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];
126
- const getStoredValue = useEvent(() => {
127
- try {
128
- const raw = storage == null ? void 0 : storage.getItem(key);
129
- if (raw !== void 0 && raw !== null) {
130
- return serializer.read(raw);
131
- } else {
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
- }, [getStoredValue, key]);
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);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reactuses/core",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "main": "./dist/index.cjs",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",