@reactuses/core 2.2.2 → 2.2.3

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
@@ -163,7 +163,7 @@ function useStorage(key, defaults, getStorage, options = {}) {
163
163
  console.error(e);
164
164
  }, []);
165
165
  let storage;
166
- const { onError = defaultOnError, ignoreDefaults = true } = options;
166
+ const { onError = defaultOnError, csrData } = options;
167
167
  try {
168
168
  storage = getStorage();
169
169
  } catch (err) {
@@ -176,21 +176,22 @@ function useStorage(key, defaults, getStorage, options = {}) {
176
176
  }, [options.serializer, type]);
177
177
  const [state, setState] = React.useState(defaults);
178
178
  useDeepCompareEffect(() => {
179
+ const data = csrData ? isFunction(csrData) ? csrData() : csrData : defaults;
179
180
  const getStoredValue = () => {
180
181
  try {
181
182
  const raw = storage == null ? void 0 : storage.getItem(key);
182
- if (raw !== void 0 && raw !== null && ignoreDefaults) {
183
+ if (raw !== void 0 && raw !== null) {
183
184
  return serializer.read(raw);
184
185
  } else {
185
- storage == null ? void 0 : storage.setItem(key, serializer.write(defaults));
186
- return defaults;
186
+ storage == null ? void 0 : storage.setItem(key, serializer.write(data));
187
+ return data;
187
188
  }
188
189
  } catch (e) {
189
190
  onError(e);
190
191
  }
191
192
  };
192
193
  setState(getStoredValue());
193
- }, [key, ignoreDefaults, defaults, serializer, storage, onError]);
194
+ }, [key, defaults, serializer, storage, onError]);
194
195
  const updateState = useEvent(
195
196
  (valOrFunc) => {
196
197
  const currentState = isFunction(valOrFunc) ? valOrFunc(state) : valOrFunc;
@@ -247,6 +248,55 @@ function useInterval(callback, delay, options) {
247
248
  }, [delay, immediate]);
248
249
  }
249
250
 
251
+ function useDarkMode(options) {
252
+ const {
253
+ selector = "html",
254
+ attribute = "class",
255
+ classNameDark = "",
256
+ classNameLight = "",
257
+ storageKey = "reactuses-color-scheme",
258
+ storage = () => isBrowser ? localStorage : void 0,
259
+ defaultValue = false
260
+ } = options;
261
+ const value = () => {
262
+ return window.matchMedia("(prefers-color-scheme: dark)").matches;
263
+ };
264
+ const [dark, setDark] = useStorage(
265
+ storageKey,
266
+ defaultValue,
267
+ storage,
268
+ {
269
+ csrData: value
270
+ }
271
+ );
272
+ React.useEffect(() => {
273
+ const element = window == null ? void 0 : window.document.querySelector(selector);
274
+ if (!element) {
275
+ return;
276
+ }
277
+ if (attribute === "class") {
278
+ dark && classNameDark && element.classList.add(classNameDark);
279
+ !dark && classNameLight && element.classList.add(classNameLight);
280
+ } else {
281
+ dark && classNameDark && element.setAttribute(attribute, classNameDark);
282
+ !dark && classNameLight && element.setAttribute(attribute, classNameLight);
283
+ }
284
+ return () => {
285
+ if (!element) {
286
+ return;
287
+ }
288
+ if (attribute === "class") {
289
+ dark && classNameDark && element.classList.remove(classNameDark);
290
+ !dark && classNameLight && element.classList.remove(classNameLight);
291
+ } else {
292
+ dark && classNameDark && element.removeAttribute(attribute);
293
+ !dark && classNameLight && element.removeAttribute(attribute);
294
+ }
295
+ };
296
+ }, [attribute, classNameDark, classNameLight, dark, selector]);
297
+ return [dark, () => setDark((dark2) => !dark2), setDark];
298
+ }
299
+
250
300
  const getInitialState = (query, defaultState) => {
251
301
  if (defaultState !== void 0) {
252
302
  return defaultState;
@@ -294,39 +344,6 @@ function usePreferredDark(defaultState) {
294
344
  return useMediaQuery("(prefers-color-scheme: dark)", defaultState);
295
345
  }
296
346
 
297
- function useDarkMode(options = {}) {
298
- const {
299
- selector = "html",
300
- attribute = "class",
301
- initialValue,
302
- storageKey = "reactuses-color-scheme",
303
- storage = () => isBrowser ? localStorage : void 0
304
- } = options;
305
- const prefersDarkMode = usePreferredDark(false);
306
- const value = initialValue ? initialValue : prefersDarkMode ? "dark" : "light";
307
- const [dark, setDark] = useStorage(storageKey, value, storage, {
308
- ignoreDefaults: false
309
- });
310
- const wrappedSetDark = React.useCallback(
311
- (latestDark) => {
312
- const element = window == null ? void 0 : window.document.querySelector(selector);
313
- if (!element) {
314
- return;
315
- }
316
- if (attribute === "class") {
317
- latestDark && element.classList.add(latestDark);
318
- dark && element.classList.remove(dark);
319
- } else {
320
- latestDark && element.setAttribute(attribute, latestDark);
321
- dark && element.removeAttribute(attribute);
322
- }
323
- setDark(latestDark);
324
- },
325
- [attribute, dark, selector, setDark]
326
- );
327
- return [dark, wrappedSetDark];
328
- }
329
-
330
347
  function useMount(fn) {
331
348
  if (isDev) {
332
349
  if (!isFunction(fn)) {
@@ -550,7 +567,7 @@ function useLatestElement(target, defaultElement) {
550
567
  const ref = React.useRef(getTargetElement(target, defaultElement));
551
568
  React.useEffect(() => {
552
569
  ref.current = getTargetElement(target, defaultElement);
553
- }, [defaultElement, target]);
570
+ });
554
571
  return ref;
555
572
  }
556
573
 
@@ -2395,21 +2412,21 @@ function useClipBorad() {
2395
2412
 
2396
2413
  function useClickOutSide(target, handler) {
2397
2414
  const savedHandler = useLatest(handler);
2415
+ const element = useLatestElement(target);
2398
2416
  const listener = (event) => {
2399
- const element = getTargetElement(target);
2400
- if (!element) {
2417
+ if (!element.current) {
2401
2418
  return;
2402
2419
  }
2403
2420
  const elements = event.composedPath();
2404
- if (element === event.target || elements.includes(element)) {
2421
+ if (element.current === event.target || elements.includes(element.current)) {
2405
2422
  return;
2406
2423
  }
2407
2424
  savedHandler.current(event);
2408
2425
  };
2409
- useEventListener("mousedown", listener, () => window, {
2426
+ useEventListener("mousedown", listener, defaultWindow, {
2410
2427
  passive: true
2411
2428
  });
2412
- useEventListener("touchstart", listener, () => window, {
2429
+ useEventListener("touchstart", listener, defaultWindow, {
2413
2430
  passive: true
2414
2431
  });
2415
2432
  }
package/dist/index.d.ts CHANGED
@@ -28,9 +28,9 @@ interface UseStorageOptions<T> {
28
28
  */
29
29
  onError?: (error: unknown) => void;
30
30
  /**
31
- * ignore default value when storage has value
31
+ * set to storage when nodata in effect, fallback to defaults
32
32
  */
33
- ignoreDefaults?: boolean;
33
+ csrData?: T | (() => T);
34
34
  }
35
35
 
36
36
  declare function useLocalStorage(key: string, defaults: string, options?: UseStorageOptions<string>): readonly [string | null, Dispatch<SetStateAction<string | null>>];
@@ -64,7 +64,7 @@ declare function useInterval(callback: () => void, delay?: number | null, option
64
64
  immediate?: boolean;
65
65
  }): void;
66
66
 
67
- interface UseDarkOptions<T> {
67
+ interface UseDarkOptions {
68
68
  /**
69
69
  * CSS Selector for the target element applying to
70
70
  *
@@ -78,10 +78,10 @@ interface UseDarkOptions<T> {
78
78
  */
79
79
  attribute?: string;
80
80
  /**
81
- * The initial classname value write the target element, Otherwise, it will follow the system by default
82
- * @default 'light | dark'
81
+ * isomorphic default value
82
+ * @default false
83
83
  */
84
- initialValue?: T;
84
+ defaultValue?: boolean;
85
85
  /**
86
86
  * Key to persist the data into localStorage/sessionStorage.
87
87
  *
@@ -94,8 +94,16 @@ interface UseDarkOptions<T> {
94
94
  * @default localStorage
95
95
  */
96
96
  storage?: () => Storage;
97
+ /**
98
+ * name dark apply to element
99
+ */
100
+ classNameDark: string;
101
+ /**
102
+ * name light apply to element
103
+ */
104
+ classNameLight: string;
97
105
  }
98
- declare function useDarkMode<T extends string>(options?: UseDarkOptions<T>): readonly [T | null, (latestDark: T) => void];
106
+ declare function useDarkMode(options: UseDarkOptions): readonly [boolean | null, () => void, react.Dispatch<react.SetStateAction<boolean | null>>];
99
107
 
100
108
  declare function useMediaQuery(query: string, defaultState?: boolean): boolean;
101
109
 
package/dist/index.mjs CHANGED
@@ -155,7 +155,7 @@ function useStorage(key, defaults, getStorage, options = {}) {
155
155
  console.error(e);
156
156
  }, []);
157
157
  let storage;
158
- const { onError = defaultOnError, ignoreDefaults = true } = options;
158
+ const { onError = defaultOnError, csrData } = options;
159
159
  try {
160
160
  storage = getStorage();
161
161
  } catch (err) {
@@ -168,21 +168,22 @@ function useStorage(key, defaults, getStorage, options = {}) {
168
168
  }, [options.serializer, type]);
169
169
  const [state, setState] = useState(defaults);
170
170
  useDeepCompareEffect(() => {
171
+ const data = csrData ? isFunction(csrData) ? csrData() : csrData : defaults;
171
172
  const getStoredValue = () => {
172
173
  try {
173
174
  const raw = storage == null ? void 0 : storage.getItem(key);
174
- if (raw !== void 0 && raw !== null && ignoreDefaults) {
175
+ if (raw !== void 0 && raw !== null) {
175
176
  return serializer.read(raw);
176
177
  } else {
177
- storage == null ? void 0 : storage.setItem(key, serializer.write(defaults));
178
- return defaults;
178
+ storage == null ? void 0 : storage.setItem(key, serializer.write(data));
179
+ return data;
179
180
  }
180
181
  } catch (e) {
181
182
  onError(e);
182
183
  }
183
184
  };
184
185
  setState(getStoredValue());
185
- }, [key, ignoreDefaults, defaults, serializer, storage, onError]);
186
+ }, [key, defaults, serializer, storage, onError]);
186
187
  const updateState = useEvent(
187
188
  (valOrFunc) => {
188
189
  const currentState = isFunction(valOrFunc) ? valOrFunc(state) : valOrFunc;
@@ -239,6 +240,55 @@ function useInterval(callback, delay, options) {
239
240
  }, [delay, immediate]);
240
241
  }
241
242
 
243
+ function useDarkMode(options) {
244
+ const {
245
+ selector = "html",
246
+ attribute = "class",
247
+ classNameDark = "",
248
+ classNameLight = "",
249
+ storageKey = "reactuses-color-scheme",
250
+ storage = () => isBrowser ? localStorage : void 0,
251
+ defaultValue = false
252
+ } = options;
253
+ const value = () => {
254
+ return window.matchMedia("(prefers-color-scheme: dark)").matches;
255
+ };
256
+ const [dark, setDark] = useStorage(
257
+ storageKey,
258
+ defaultValue,
259
+ storage,
260
+ {
261
+ csrData: value
262
+ }
263
+ );
264
+ useEffect(() => {
265
+ const element = window == null ? void 0 : window.document.querySelector(selector);
266
+ if (!element) {
267
+ return;
268
+ }
269
+ if (attribute === "class") {
270
+ dark && classNameDark && element.classList.add(classNameDark);
271
+ !dark && classNameLight && element.classList.add(classNameLight);
272
+ } else {
273
+ dark && classNameDark && element.setAttribute(attribute, classNameDark);
274
+ !dark && classNameLight && element.setAttribute(attribute, classNameLight);
275
+ }
276
+ return () => {
277
+ if (!element) {
278
+ return;
279
+ }
280
+ if (attribute === "class") {
281
+ dark && classNameDark && element.classList.remove(classNameDark);
282
+ !dark && classNameLight && element.classList.remove(classNameLight);
283
+ } else {
284
+ dark && classNameDark && element.removeAttribute(attribute);
285
+ !dark && classNameLight && element.removeAttribute(attribute);
286
+ }
287
+ };
288
+ }, [attribute, classNameDark, classNameLight, dark, selector]);
289
+ return [dark, () => setDark((dark2) => !dark2), setDark];
290
+ }
291
+
242
292
  const getInitialState = (query, defaultState) => {
243
293
  if (defaultState !== void 0) {
244
294
  return defaultState;
@@ -286,39 +336,6 @@ function usePreferredDark(defaultState) {
286
336
  return useMediaQuery("(prefers-color-scheme: dark)", defaultState);
287
337
  }
288
338
 
289
- function useDarkMode(options = {}) {
290
- const {
291
- selector = "html",
292
- attribute = "class",
293
- initialValue,
294
- storageKey = "reactuses-color-scheme",
295
- storage = () => isBrowser ? localStorage : void 0
296
- } = options;
297
- const prefersDarkMode = usePreferredDark(false);
298
- const value = initialValue ? initialValue : prefersDarkMode ? "dark" : "light";
299
- const [dark, setDark] = useStorage(storageKey, value, storage, {
300
- ignoreDefaults: false
301
- });
302
- const wrappedSetDark = useCallback(
303
- (latestDark) => {
304
- const element = window == null ? void 0 : window.document.querySelector(selector);
305
- if (!element) {
306
- return;
307
- }
308
- if (attribute === "class") {
309
- latestDark && element.classList.add(latestDark);
310
- dark && element.classList.remove(dark);
311
- } else {
312
- latestDark && element.setAttribute(attribute, latestDark);
313
- dark && element.removeAttribute(attribute);
314
- }
315
- setDark(latestDark);
316
- },
317
- [attribute, dark, selector, setDark]
318
- );
319
- return [dark, wrappedSetDark];
320
- }
321
-
322
339
  function useMount(fn) {
323
340
  if (isDev) {
324
341
  if (!isFunction(fn)) {
@@ -542,7 +559,7 @@ function useLatestElement(target, defaultElement) {
542
559
  const ref = useRef(getTargetElement(target, defaultElement));
543
560
  useEffect(() => {
544
561
  ref.current = getTargetElement(target, defaultElement);
545
- }, [defaultElement, target]);
562
+ });
546
563
  return ref;
547
564
  }
548
565
 
@@ -2387,21 +2404,21 @@ function useClipBorad() {
2387
2404
 
2388
2405
  function useClickOutSide(target, handler) {
2389
2406
  const savedHandler = useLatest(handler);
2407
+ const element = useLatestElement(target);
2390
2408
  const listener = (event) => {
2391
- const element = getTargetElement(target);
2392
- if (!element) {
2409
+ if (!element.current) {
2393
2410
  return;
2394
2411
  }
2395
2412
  const elements = event.composedPath();
2396
- if (element === event.target || elements.includes(element)) {
2413
+ if (element.current === event.target || elements.includes(element.current)) {
2397
2414
  return;
2398
2415
  }
2399
2416
  savedHandler.current(event);
2400
2417
  };
2401
- useEventListener("mousedown", listener, () => window, {
2418
+ useEventListener("mousedown", listener, defaultWindow, {
2402
2419
  passive: true
2403
2420
  });
2404
- useEventListener("touchstart", listener, () => window, {
2421
+ useEventListener("touchstart", listener, defaultWindow, {
2405
2422
  passive: true
2406
2423
  });
2407
2424
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reactuses/core",
3
- "version": "2.2.2",
3
+ "version": "2.2.3",
4
4
  "main": "./dist/index.cjs",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",