@reactuses/core 1.0.7 → 1.1.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.
@@ -13,38 +13,6 @@ function usePrevious(state) {
13
13
  return ref.current;
14
14
  }
15
15
 
16
- var __async$2 = (__this, __arguments, generator) => {
17
- return new Promise((resolve, reject) => {
18
- var fulfilled = (value) => {
19
- try {
20
- step(generator.next(value));
21
- } catch (e) {
22
- reject(e);
23
- }
24
- };
25
- var rejected = (value) => {
26
- try {
27
- step(generator.throw(value));
28
- } catch (e) {
29
- reject(e);
30
- }
31
- };
32
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
33
- step((generator = generator.apply(__this, __arguments)).next());
34
- });
35
- };
36
- function useMarkdown(filepath) {
37
- const [content, setContent] = react.useState("");
38
- react.useEffect(() => {
39
- const getContent = () => __async$2(this, null, function* () {
40
- const data = yield (yield fetch(filepath)).text();
41
- setContent(data);
42
- });
43
- getContent();
44
- }, [filepath]);
45
- return content;
46
- }
47
-
48
16
  function useLatest(value) {
49
17
  const ref = react.useRef(value);
50
18
  react.useEffect(() => {
@@ -161,7 +129,7 @@ function useStorage(key, defaults, getStorage, options = {}) {
161
129
  const getStoredValue = () => {
162
130
  try {
163
131
  const raw = storage == null ? void 0 : storage.getItem(key);
164
- if (raw) {
132
+ if (raw !== void 0 && raw !== null) {
165
133
  return serializer.read(raw);
166
134
  } else {
167
135
  storage == null ? void 0 : storage.setItem(key, serializer.write(data));
@@ -231,29 +199,47 @@ function useInterval(callback, delay, options) {
231
199
  }, [delay, immediate]);
232
200
  }
233
201
 
234
- function useMediaQuery(query, serverFallback) {
235
- const getServerSnapshot = serverFallback !== void 0 ? () => serverFallback : void 0;
236
- const [getSnapshot, subscribe] = react.useMemo(() => {
237
- const mediaQueryList = window.matchMedia(query);
238
- return [
239
- () => mediaQueryList.matches,
240
- (notify) => {
241
- try {
242
- mediaQueryList.addEventListener("change", notify);
243
- } catch (e) {
244
- mediaQueryList.addListener(notify);
245
- }
246
- return () => {
247
- try {
248
- mediaQueryList.removeEventListener("change", notify);
249
- } catch (e) {
250
- mediaQueryList.removeListener(notify);
251
- }
252
- };
202
+ const getInitialState = (query, defaultState) => {
203
+ if (isBrowser) {
204
+ return window.matchMedia(query).matches;
205
+ }
206
+ if (defaultState !== void 0) {
207
+ return defaultState;
208
+ }
209
+ if (process.env.NODE_ENV !== "production") {
210
+ console.warn(
211
+ "`useMediaQuery` When server side rendering, defaultState should be defined to prevent a hydration mismatches."
212
+ );
213
+ }
214
+ return false;
215
+ };
216
+ function useMediaQuery(query, defaultState) {
217
+ const [state, setState] = react.useState(getInitialState(query, defaultState));
218
+ react.useEffect(() => {
219
+ let mounted = true;
220
+ const mql = window.matchMedia(query);
221
+ const onChange = () => {
222
+ if (!mounted) {
223
+ return;
253
224
  }
254
- ];
225
+ setState(!!mql.matches);
226
+ };
227
+ if ("addEventListener" in mql) {
228
+ mql.addEventListener("change", onChange);
229
+ } else {
230
+ mql.addListener(onChange);
231
+ }
232
+ setState(mql.matches);
233
+ return () => {
234
+ mounted = false;
235
+ if ("removeEventListener" in mql) {
236
+ mql.removeEventListener("change", onChange);
237
+ } else {
238
+ mql.removeListener(onChange);
239
+ }
240
+ };
255
241
  }, [query]);
256
- return react.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
242
+ return state;
257
243
  }
258
244
 
259
245
  function usePreferredDark(defaultState) {
@@ -268,7 +254,7 @@ function useDarkMode(options = {}) {
268
254
  storageKey = "reactuses-color-scheme",
269
255
  storage = () => isBrowser ? localStorage : void 0
270
256
  } = options;
271
- const prefersDarkMode = usePreferredDark();
257
+ const prefersDarkMode = usePreferredDark(false);
272
258
  const value = initialValue ? initialValue : prefersDarkMode ? "dark" : "light";
273
259
  const [dark, setDark] = useStorage(storageKey, value, storage);
274
260
  react.useEffect(() => {
@@ -488,6 +474,7 @@ function off(obj, ...args) {
488
474
  );
489
475
  }
490
476
  }
477
+ const defaultWindow = isBrowser ? window : void 0;
491
478
 
492
479
  function getTargetElement(target, defaultElement) {
493
480
  if (!isBrowser) {
@@ -1533,15 +1520,15 @@ function usePageLeave() {
1533
1520
  const from = event.relatedTarget || event.toElement;
1534
1521
  setIsLeft(!from);
1535
1522
  };
1536
- useEventListener("mouseout", handler, window, { passive: true });
1537
- useEventListener("mouseleave", handler, document, { passive: true });
1538
- useEventListener("mouseenter", handler, document, { passive: true });
1523
+ useEventListener("mouseout", handler, () => window, { passive: true });
1524
+ useEventListener("mouseleave", handler, () => document, { passive: true });
1525
+ useEventListener("mouseenter", handler, () => document, { passive: true });
1539
1526
  return isLeft;
1540
1527
  }
1541
1528
 
1542
1529
  function useDocumentVisibility() {
1543
1530
  const [visible, setVisible] = react.useState(() => {
1544
- if (!document) {
1531
+ if (typeof document === "undefined") {
1545
1532
  return "visible";
1546
1533
  } else {
1547
1534
  return document.visibilityState;
@@ -1552,7 +1539,7 @@ function useDocumentVisibility() {
1552
1539
  () => {
1553
1540
  setVisible(document.visibilityState);
1554
1541
  },
1555
- document
1542
+ () => document
1556
1543
  );
1557
1544
  return visible;
1558
1545
  }
@@ -1647,7 +1634,7 @@ function useFileDialog(options = {}) {
1647
1634
  const [files, setFiles] = react.useState(null);
1648
1635
  const inputRef = react.useRef();
1649
1636
  const initFn = react.useCallback(() => {
1650
- if (!document) {
1637
+ if (typeof document === "undefined") {
1651
1638
  return void 0;
1652
1639
  }
1653
1640
  const input = document.createElement("input");
@@ -1865,8 +1852,8 @@ function useMousePressed(target, options = {}) {
1865
1852
  setSourceType(null);
1866
1853
  }, []);
1867
1854
  useEventListener("mousedown", onPressed("mouse"), target, { passive: true });
1868
- useEventListener("mouseleave", onReleased, window, { passive: true });
1869
- useEventListener("mouseup", onReleased, window, { passive: true });
1855
+ useEventListener("mouseleave", onReleased, () => window, { passive: true });
1856
+ useEventListener("mouseup", onReleased, () => window, { passive: true });
1870
1857
  useMount(() => {
1871
1858
  const element = getTargetElement(target);
1872
1859
  if (drag) {
@@ -2102,8 +2089,8 @@ function useVirtualList(list = [], options) {
2102
2089
  }
2103
2090
 
2104
2091
  function usePreferredColorScheme(defaultState) {
2105
- const isLight = useMediaQuery("(prefers-color-scheme: light)");
2106
- const isDark = useMediaQuery("(prefers-color-scheme: dark)");
2092
+ const isLight = useMediaQuery("(prefers-color-scheme: light)", false);
2093
+ const isDark = useMediaQuery("(prefers-color-scheme: dark)", false);
2107
2094
  if (!isBrowser && defaultState) {
2108
2095
  return defaultState;
2109
2096
  }
@@ -2111,9 +2098,9 @@ function usePreferredColorScheme(defaultState) {
2111
2098
  }
2112
2099
 
2113
2100
  function usePreferredContrast(defaultState) {
2114
- const isMore = useMediaQuery("(prefers-contrast: more)");
2115
- const isLess = useMediaQuery("(prefers-contrast: less)");
2116
- const isCustom = useMediaQuery("(prefers-contrast: custom)");
2101
+ const isMore = useMediaQuery("(prefexrs-contrast: more)", false);
2102
+ const isLess = useMediaQuery("(prefers-contrast: less)", false);
2103
+ const isCustom = useMediaQuery("(prefers-contrast: custom)", false);
2117
2104
  if (!isBrowser && defaultState) {
2118
2105
  return defaultState;
2119
2106
  }
@@ -2125,14 +2112,17 @@ function useActiveElement() {
2125
2112
  const listener = react.useCallback(() => {
2126
2113
  setActive(window == null ? void 0 : window.document.activeElement);
2127
2114
  }, []);
2128
- useEventListener("blur", listener, window, true);
2129
- useEventListener("focus", listener, window, true);
2115
+ useEventListener("blur", listener, () => window, true);
2116
+ useEventListener("focus", listener, () => window, true);
2130
2117
  return active;
2131
2118
  }
2132
2119
 
2133
2120
  function useDraggable(target, options = {}) {
2134
2121
  var _a, _b;
2135
- const draggingElement = getTargetElement(options.draggingElement, window);
2122
+ const draggingElement = getTargetElement(
2123
+ options.draggingElement,
2124
+ defaultWindow
2125
+ );
2136
2126
  const draggingHandle = getTargetElement((_a = options.handle) != null ? _a : target);
2137
2127
  const [position, setPositon] = react.useState(
2138
2128
  (_b = options.initialValue) != null ? _b : { x: 0, y: 0 }
@@ -2294,7 +2284,7 @@ function useElementVisibility(target, options = {}) {
2294
2284
 
2295
2285
  function useWindowsFocus() {
2296
2286
  const [focused, setFocused] = react.useState(() => {
2297
- if (!window) {
2287
+ if (!isBrowser) {
2298
2288
  return false;
2299
2289
  }
2300
2290
  return window.document.hasFocus();
@@ -2393,10 +2383,10 @@ function useClickOutSide(target, handler) {
2393
2383
  }
2394
2384
  savedHandler.current(event);
2395
2385
  };
2396
- useEventListener("mousedown", listener, window, {
2386
+ useEventListener("mousedown", listener, () => window, {
2397
2387
  passive: true
2398
2388
  });
2399
- useEventListener("touchstart", listener, window, {
2389
+ useEventListener("touchstart", listener, () => window, {
2400
2390
  passive: true
2401
2391
  });
2402
2392
  }
@@ -2451,7 +2441,6 @@ exports.useKeyModifier = useKeyModifier;
2451
2441
  exports.useLatest = useLatest;
2452
2442
  exports.useLocalStorage = useLocalStorage;
2453
2443
  exports.useLongPress = useLongPress;
2454
- exports.useMarkdown = useMarkdown;
2455
2444
  exports.useMediaDevices = useMediaDevices$1;
2456
2445
  exports.useMediaQuery = useMediaQuery;
2457
2446
  exports.useMount = useMount;
@@ -1,12 +1,10 @@
1
1
  import * as react from 'react';
2
- import { useEffect, useLayoutEffect, Dispatch, SetStateAction, MutableRefObject, DependencyList, EffectCallback, RefObject, CSSProperties } from 'react';
2
+ import { MutableRefObject, useEffect, useLayoutEffect, Dispatch, SetStateAction, DependencyList, EffectCallback, RefObject, CSSProperties } from 'react';
3
3
  import * as lodash from 'lodash';
4
4
 
5
5
  declare function usePrevious<T>(state: T): T | undefined;
6
6
 
7
- declare function useMarkdown(filepath: string): string;
8
-
9
- declare function useLatest<T>(value: T): React.MutableRefObject<T>;
7
+ declare function useLatest<T>(value: T): MutableRefObject<T>;
10
8
 
11
9
  declare function useFirstMountState(): boolean;
12
10
 
@@ -43,9 +41,9 @@ declare function useSessionStorage(key: string, defaults: boolean, options?: Use
43
41
  declare function useSessionStorage<T>(key: string, defaults: T, options?: UseStorageOptions<T>): readonly [T | null, Dispatch<SetStateAction<T | null>>];
44
42
  declare function useSessionStorage<T = unknown>(key: string, defaults: null, options?: UseStorageOptions<T>): readonly [T | null, Dispatch<SetStateAction<T | null>>];
45
43
 
46
- declare type Fn = (this: any, ...args: any[]) => any;
47
- declare type Stoppable = [boolean, Fn, Fn];
48
- declare type PointerType = "mouse" | "touch" | "pen";
44
+ type Fn = (this: any, ...args: any[]) => any;
45
+ type Stoppable = [boolean, Fn, Fn];
46
+ type PointerType = "mouse" | "touch" | "pen";
49
47
  interface Position {
50
48
  x: number;
51
49
  y: number;
@@ -92,7 +90,7 @@ interface UseDarkOptions<T> {
92
90
  }
93
91
  declare function useDarkMode<T extends string | "light" | "dark">(options?: UseDarkOptions<T>): readonly [T | null, react.Dispatch<react.SetStateAction<T | null>>];
94
92
 
95
- declare function useMediaQuery(query: string, serverFallback?: boolean): boolean;
93
+ declare function useMediaQuery(query: string, defaultState?: boolean): boolean;
96
94
 
97
95
  declare function usePreferredDark(defaultState?: boolean): boolean;
98
96
 
@@ -153,11 +151,11 @@ declare function useTimeout(ms?: number, options?: UseTimeoutFnOptions): Stoppab
153
151
 
154
152
  declare function useMountedState(): () => boolean;
155
153
 
156
- declare type TargetValue<T> = T | undefined | null;
157
- declare type TargetType = HTMLElement | Element | Window | Document | EventTarget;
158
- declare type BasicTarget<T extends TargetType = Element> = (() => TargetValue<T>) | TargetValue<T> | MutableRefObject<TargetValue<T>>;
154
+ type TargetValue<T> = T | undefined | null;
155
+ type TargetType = HTMLElement | Element | Window | Document | EventTarget;
156
+ type BasicTarget<T extends TargetType = Element> = (() => TargetValue<T>) | TargetValue<T> | MutableRefObject<TargetValue<T>>;
159
157
 
160
- declare type Target = BasicTarget<HTMLElement | Element | Window | Document | EventTarget>;
158
+ type Target = BasicTarget<HTMLElement | Element | Window | Document | EventTarget>;
161
159
  declare function useEventListener<K extends keyof WindowEventMap>(eventName: K, handler: (event: WindowEventMap[K]) => void, element?: Window, options?: boolean | AddEventListenerOptions): void;
162
160
  declare function useEventListener<K extends keyof DocumentEventMap>(eventName: K, handler: (event: DocumentEventMap[K]) => void, element: Document, options?: boolean | AddEventListenerOptions): void;
163
161
  declare function useEventListener<K extends keyof HTMLElementEventMap, T extends HTMLElement = HTMLDivElement>(eventName: K, handler: (event: HTMLElementEventMap[K]) => void, element: T, options?: boolean | AddEventListenerOptions): void;
@@ -167,7 +165,7 @@ declare function useEventListener(eventName: string, handler: (...p: any) => voi
167
165
 
168
166
  declare function useCounter(initialValue?: number | (() => number), max?: number | null, min?: number | null): readonly [number, (newState: number | ((prev: number) => number) | (() => number)) => void, (delta?: number) => void, (delta?: number) => void, () => void];
169
167
 
170
- declare type RafLoopReturns = readonly [() => void, () => void, () => boolean];
168
+ type RafLoopReturns = readonly [() => void, () => void, () => boolean];
171
169
  declare function useRafFn(callback: FrameRequestCallback, initiallyActive?: boolean): RafLoopReturns;
172
170
 
173
171
  interface IDisposable {
@@ -182,7 +180,7 @@ declare function useFavicon(href: string, baseUrl?: string, rel?: string): void;
182
180
 
183
181
  declare function useMutationObserver(callback: MutationCallback, target: BasicTarget, options?: MutationObserverInit): () => void;
184
182
 
185
- declare type DepsEqualFnType<TDeps extends DependencyList> = (prevDeps: TDeps, nextDeps: TDeps) => boolean;
183
+ type DepsEqualFnType<TDeps extends DependencyList> = (prevDeps: TDeps, nextDeps: TDeps) => boolean;
186
184
  declare function useCustomCompareEffect<TDeps extends DependencyList>(effect: EffectCallback, deps: TDeps, depsEqual: DepsEqualFnType<TDeps>): void;
187
185
 
188
186
  declare function useDeepCompareEffect(effect: EffectCallback, deps: DependencyList): void;
@@ -224,12 +222,12 @@ interface UseScriptTagOptions {
224
222
  */
225
223
  attrs?: Record<string, string>;
226
224
  }
227
- declare type Status = "idle" | "loading" | "ready" | "error";
225
+ type Status = "idle" | "loading" | "ready" | "error";
228
226
  declare function useScriptTag(src: string, onLoaded?: (el: HTMLScriptElement) => void, options?: UseScriptTagOptions): readonly [HTMLScriptElement | null, Status, (waitForScriptLoad?: boolean) => Promise<HTMLScriptElement | boolean>, () => void];
229
227
 
230
- declare type IState = PermissionState | "";
231
- declare type DescriptorNamePolyfill = "accelerometer" | "accessibility-events" | "ambient-light-sensor" | "background-sync" | "camera" | "clipboard-read" | "clipboard-write" | "gyroscope" | "magnetometer" | "microphone" | "notifications" | "payment-handler" | "persistent-storage" | "push" | "speaker";
232
- declare type GeneralPermissionDescriptor = PermissionDescriptor | {
228
+ type IState = PermissionState | "";
229
+ type DescriptorNamePolyfill = "accelerometer" | "accessibility-events" | "ambient-light-sensor" | "background-sync" | "camera" | "clipboard-read" | "clipboard-write" | "gyroscope" | "magnetometer" | "microphone" | "notifications" | "payment-handler" | "persistent-storage" | "push" | "speaker";
230
+ type GeneralPermissionDescriptor = PermissionDescriptor | {
233
231
  name: DescriptorNamePolyfill;
234
232
  };
235
233
  declare function usePermission(permissionDesc: GeneralPermissionDescriptor | GeneralPermissionDescriptor["name"]): IState;
@@ -252,7 +250,7 @@ declare function useIdle(ms?: number, initialState?: boolean, events?: (keyof Wi
252
250
 
253
251
  declare const _default$1: () => {};
254
252
 
255
- declare type UseTextDirectionValue = "ltr" | "rtl" | "auto";
253
+ type UseTextDirectionValue = "ltr" | "rtl" | "auto";
256
254
  interface UseTextDirectionOptions {
257
255
  /**
258
256
  * CSS Selector for the target element applying to
@@ -495,7 +493,7 @@ interface UseInfiniteScrollOptions extends UseScrollOptions {
495
493
  }
496
494
  declare function useInfiniteScroll(target: BasicTarget<HTMLElement | SVGElement | Window | Document>, onLoadMore: (state: ReturnType<typeof useScroll>) => void | Promise<void>, options?: UseInfiniteScrollOptions): void;
497
495
 
498
- declare type KeyModifier = "Alt" | "AltGraph" | "CapsLock" | "Control" | "Fn" | "FnLock" | "Meta" | "NumLock" | "ScrollLock" | "Shift" | "Symbol" | "SymbolLock";
496
+ type KeyModifier = "Alt" | "AltGraph" | "CapsLock" | "Control" | "Fn" | "FnLock" | "Meta" | "NumLock" | "ScrollLock" | "Shift" | "Symbol" | "SymbolLock";
499
497
  interface UseModifierOptions {
500
498
  /**
501
499
  * Event names that will prompt update to modifier states
@@ -512,8 +510,8 @@ interface UseModifierOptions {
512
510
  }
513
511
  declare function useKeyModifier(modifier: KeyModifier, options?: UseModifierOptions): boolean;
514
512
 
515
- declare type IHookStateInitialSetter<S> = () => S;
516
- declare type IHookStateInitAction<S> = S | IHookStateInitialSetter<S>;
513
+ type IHookStateInitialSetter<S> = () => S;
514
+ type IHookStateInitAction<S> = S | IHookStateInitialSetter<S>;
517
515
 
518
516
  interface MousePressedOptions {
519
517
  /**
@@ -535,7 +533,7 @@ interface MousePressedOptions {
535
533
  */
536
534
  initialValue?: IHookStateInitAction<boolean>;
537
535
  }
538
- declare type MouseSourceType = "mouse" | "touch" | null;
536
+ type MouseSourceType = "mouse" | "touch" | null;
539
537
  declare function useMousePressed(target?: BasicTarget, options?: MousePressedOptions): readonly [boolean, MouseSourceType];
540
538
 
541
539
  declare function useScrollLock(target: BasicTarget<HTMLElement | SVGElement | Window | Document>, initialState?: boolean): readonly [boolean, (flag: boolean) => void];
@@ -582,10 +580,10 @@ interface UseVirtualListReturn<T> {
582
580
  }
583
581
  declare function useVirtualList<T = any>(list: T[] | undefined, options: UseVirtualListOptions): UseVirtualListReturn<T>;
584
582
 
585
- declare type ColorScheme = "dark" | "light" | "no-preference";
583
+ type ColorScheme = "dark" | "light" | "no-preference";
586
584
  declare function usePreferredColorScheme(defaultState?: ColorScheme): ColorScheme;
587
585
 
588
- declare type Contrast = "more" | "less" | "custom" | "no-preference";
586
+ type Contrast = "more" | "less" | "custom" | "no-preference";
589
587
  declare function usePreferredContrast(defaultState?: Contrast): Contrast;
590
588
 
591
589
  declare function useActiveElement<T extends Element>(): T | null;
@@ -707,9 +705,9 @@ declare function useClipBorad(): readonly [
707
705
  (txt: string) => Promise<void>
708
706
  ];
709
707
 
710
- declare type EventType = MouseEvent | TouchEvent;
708
+ type EventType = MouseEvent | TouchEvent;
711
709
  declare function useClickOutSide(target: BasicTarget, handler: (evt: EventType) => void): void;
712
710
 
713
711
  declare function useCycleList<T>(list: T[], i?: number): readonly [T, (i?: number) => void, (i?: number) => void];
714
712
 
715
- export { useActiveElement, useClickOutSide as useClickOutside, useClipBorad as useClipboard, useCounter, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useFavicon, useFileDialog, useFirstMountState, _default as useFps, useFullscreen, useGeolocation, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMarkdown, _default$1 as useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useResizeObserver, useScriptTag, useScroll, useScrollLock, useSessionStorage, useTextDirection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, _default$3 as useUpdateEffect, _default$2 as useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
713
+ export { useActiveElement, useClickOutSide as useClickOutside, useClipBorad as useClipboard, useCounter, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useFavicon, useFileDialog, useFirstMountState, _default as useFps, useFullscreen, useGeolocation, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, _default$1 as useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useResizeObserver, useScriptTag, useScroll, useScrollLock, useSessionStorage, useTextDirection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, _default$3 as useUpdateEffect, _default$2 as useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
@@ -1,4 +1,4 @@
1
- import { useRef, useEffect, useState, useLayoutEffect, useCallback, useReducer, useMemo, useSyncExternalStore } from 'react';
1
+ import { useRef, useEffect, useLayoutEffect, useCallback, useState, useReducer, useMemo } from 'react';
2
2
  import { throttle, debounce, isEqual } from 'lodash';
3
3
 
4
4
  function usePrevious(state) {
@@ -9,38 +9,6 @@ function usePrevious(state) {
9
9
  return ref.current;
10
10
  }
11
11
 
12
- var __async$2 = (__this, __arguments, generator) => {
13
- return new Promise((resolve, reject) => {
14
- var fulfilled = (value) => {
15
- try {
16
- step(generator.next(value));
17
- } catch (e) {
18
- reject(e);
19
- }
20
- };
21
- var rejected = (value) => {
22
- try {
23
- step(generator.throw(value));
24
- } catch (e) {
25
- reject(e);
26
- }
27
- };
28
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
29
- step((generator = generator.apply(__this, __arguments)).next());
30
- });
31
- };
32
- function useMarkdown(filepath) {
33
- const [content, setContent] = useState("");
34
- useEffect(() => {
35
- const getContent = () => __async$2(this, null, function* () {
36
- const data = yield (yield fetch(filepath)).text();
37
- setContent(data);
38
- });
39
- getContent();
40
- }, [filepath]);
41
- return content;
42
- }
43
-
44
12
  function useLatest(value) {
45
13
  const ref = useRef(value);
46
14
  useEffect(() => {
@@ -157,7 +125,7 @@ function useStorage(key, defaults, getStorage, options = {}) {
157
125
  const getStoredValue = () => {
158
126
  try {
159
127
  const raw = storage == null ? void 0 : storage.getItem(key);
160
- if (raw) {
128
+ if (raw !== void 0 && raw !== null) {
161
129
  return serializer.read(raw);
162
130
  } else {
163
131
  storage == null ? void 0 : storage.setItem(key, serializer.write(data));
@@ -227,29 +195,47 @@ function useInterval(callback, delay, options) {
227
195
  }, [delay, immediate]);
228
196
  }
229
197
 
230
- function useMediaQuery(query, serverFallback) {
231
- const getServerSnapshot = serverFallback !== void 0 ? () => serverFallback : void 0;
232
- const [getSnapshot, subscribe] = useMemo(() => {
233
- const mediaQueryList = window.matchMedia(query);
234
- return [
235
- () => mediaQueryList.matches,
236
- (notify) => {
237
- try {
238
- mediaQueryList.addEventListener("change", notify);
239
- } catch (e) {
240
- mediaQueryList.addListener(notify);
241
- }
242
- return () => {
243
- try {
244
- mediaQueryList.removeEventListener("change", notify);
245
- } catch (e) {
246
- mediaQueryList.removeListener(notify);
247
- }
248
- };
198
+ const getInitialState = (query, defaultState) => {
199
+ if (isBrowser) {
200
+ return window.matchMedia(query).matches;
201
+ }
202
+ if (defaultState !== void 0) {
203
+ return defaultState;
204
+ }
205
+ if (process.env.NODE_ENV !== "production") {
206
+ console.warn(
207
+ "`useMediaQuery` When server side rendering, defaultState should be defined to prevent a hydration mismatches."
208
+ );
209
+ }
210
+ return false;
211
+ };
212
+ function useMediaQuery(query, defaultState) {
213
+ const [state, setState] = useState(getInitialState(query, defaultState));
214
+ useEffect(() => {
215
+ let mounted = true;
216
+ const mql = window.matchMedia(query);
217
+ const onChange = () => {
218
+ if (!mounted) {
219
+ return;
249
220
  }
250
- ];
221
+ setState(!!mql.matches);
222
+ };
223
+ if ("addEventListener" in mql) {
224
+ mql.addEventListener("change", onChange);
225
+ } else {
226
+ mql.addListener(onChange);
227
+ }
228
+ setState(mql.matches);
229
+ return () => {
230
+ mounted = false;
231
+ if ("removeEventListener" in mql) {
232
+ mql.removeEventListener("change", onChange);
233
+ } else {
234
+ mql.removeListener(onChange);
235
+ }
236
+ };
251
237
  }, [query]);
252
- return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
238
+ return state;
253
239
  }
254
240
 
255
241
  function usePreferredDark(defaultState) {
@@ -264,7 +250,7 @@ function useDarkMode(options = {}) {
264
250
  storageKey = "reactuses-color-scheme",
265
251
  storage = () => isBrowser ? localStorage : void 0
266
252
  } = options;
267
- const prefersDarkMode = usePreferredDark();
253
+ const prefersDarkMode = usePreferredDark(false);
268
254
  const value = initialValue ? initialValue : prefersDarkMode ? "dark" : "light";
269
255
  const [dark, setDark] = useStorage(storageKey, value, storage);
270
256
  useEffect(() => {
@@ -484,6 +470,7 @@ function off(obj, ...args) {
484
470
  );
485
471
  }
486
472
  }
473
+ const defaultWindow = isBrowser ? window : void 0;
487
474
 
488
475
  function getTargetElement(target, defaultElement) {
489
476
  if (!isBrowser) {
@@ -1529,15 +1516,15 @@ function usePageLeave() {
1529
1516
  const from = event.relatedTarget || event.toElement;
1530
1517
  setIsLeft(!from);
1531
1518
  };
1532
- useEventListener("mouseout", handler, window, { passive: true });
1533
- useEventListener("mouseleave", handler, document, { passive: true });
1534
- useEventListener("mouseenter", handler, document, { passive: true });
1519
+ useEventListener("mouseout", handler, () => window, { passive: true });
1520
+ useEventListener("mouseleave", handler, () => document, { passive: true });
1521
+ useEventListener("mouseenter", handler, () => document, { passive: true });
1535
1522
  return isLeft;
1536
1523
  }
1537
1524
 
1538
1525
  function useDocumentVisibility() {
1539
1526
  const [visible, setVisible] = useState(() => {
1540
- if (!document) {
1527
+ if (typeof document === "undefined") {
1541
1528
  return "visible";
1542
1529
  } else {
1543
1530
  return document.visibilityState;
@@ -1548,7 +1535,7 @@ function useDocumentVisibility() {
1548
1535
  () => {
1549
1536
  setVisible(document.visibilityState);
1550
1537
  },
1551
- document
1538
+ () => document
1552
1539
  );
1553
1540
  return visible;
1554
1541
  }
@@ -1643,7 +1630,7 @@ function useFileDialog(options = {}) {
1643
1630
  const [files, setFiles] = useState(null);
1644
1631
  const inputRef = useRef();
1645
1632
  const initFn = useCallback(() => {
1646
- if (!document) {
1633
+ if (typeof document === "undefined") {
1647
1634
  return void 0;
1648
1635
  }
1649
1636
  const input = document.createElement("input");
@@ -1861,8 +1848,8 @@ function useMousePressed(target, options = {}) {
1861
1848
  setSourceType(null);
1862
1849
  }, []);
1863
1850
  useEventListener("mousedown", onPressed("mouse"), target, { passive: true });
1864
- useEventListener("mouseleave", onReleased, window, { passive: true });
1865
- useEventListener("mouseup", onReleased, window, { passive: true });
1851
+ useEventListener("mouseleave", onReleased, () => window, { passive: true });
1852
+ useEventListener("mouseup", onReleased, () => window, { passive: true });
1866
1853
  useMount(() => {
1867
1854
  const element = getTargetElement(target);
1868
1855
  if (drag) {
@@ -2098,8 +2085,8 @@ function useVirtualList(list = [], options) {
2098
2085
  }
2099
2086
 
2100
2087
  function usePreferredColorScheme(defaultState) {
2101
- const isLight = useMediaQuery("(prefers-color-scheme: light)");
2102
- const isDark = useMediaQuery("(prefers-color-scheme: dark)");
2088
+ const isLight = useMediaQuery("(prefers-color-scheme: light)", false);
2089
+ const isDark = useMediaQuery("(prefers-color-scheme: dark)", false);
2103
2090
  if (!isBrowser && defaultState) {
2104
2091
  return defaultState;
2105
2092
  }
@@ -2107,9 +2094,9 @@ function usePreferredColorScheme(defaultState) {
2107
2094
  }
2108
2095
 
2109
2096
  function usePreferredContrast(defaultState) {
2110
- const isMore = useMediaQuery("(prefers-contrast: more)");
2111
- const isLess = useMediaQuery("(prefers-contrast: less)");
2112
- const isCustom = useMediaQuery("(prefers-contrast: custom)");
2097
+ const isMore = useMediaQuery("(prefexrs-contrast: more)", false);
2098
+ const isLess = useMediaQuery("(prefers-contrast: less)", false);
2099
+ const isCustom = useMediaQuery("(prefers-contrast: custom)", false);
2113
2100
  if (!isBrowser && defaultState) {
2114
2101
  return defaultState;
2115
2102
  }
@@ -2121,14 +2108,17 @@ function useActiveElement() {
2121
2108
  const listener = useCallback(() => {
2122
2109
  setActive(window == null ? void 0 : window.document.activeElement);
2123
2110
  }, []);
2124
- useEventListener("blur", listener, window, true);
2125
- useEventListener("focus", listener, window, true);
2111
+ useEventListener("blur", listener, () => window, true);
2112
+ useEventListener("focus", listener, () => window, true);
2126
2113
  return active;
2127
2114
  }
2128
2115
 
2129
2116
  function useDraggable(target, options = {}) {
2130
2117
  var _a, _b;
2131
- const draggingElement = getTargetElement(options.draggingElement, window);
2118
+ const draggingElement = getTargetElement(
2119
+ options.draggingElement,
2120
+ defaultWindow
2121
+ );
2132
2122
  const draggingHandle = getTargetElement((_a = options.handle) != null ? _a : target);
2133
2123
  const [position, setPositon] = useState(
2134
2124
  (_b = options.initialValue) != null ? _b : { x: 0, y: 0 }
@@ -2290,7 +2280,7 @@ function useElementVisibility(target, options = {}) {
2290
2280
 
2291
2281
  function useWindowsFocus() {
2292
2282
  const [focused, setFocused] = useState(() => {
2293
- if (!window) {
2283
+ if (!isBrowser) {
2294
2284
  return false;
2295
2285
  }
2296
2286
  return window.document.hasFocus();
@@ -2389,10 +2379,10 @@ function useClickOutSide(target, handler) {
2389
2379
  }
2390
2380
  savedHandler.current(event);
2391
2381
  };
2392
- useEventListener("mousedown", listener, window, {
2382
+ useEventListener("mousedown", listener, () => window, {
2393
2383
  passive: true
2394
2384
  });
2395
- useEventListener("touchstart", listener, window, {
2385
+ useEventListener("touchstart", listener, () => window, {
2396
2386
  passive: true
2397
2387
  });
2398
2388
  }
@@ -2413,4 +2403,4 @@ function useCycleList(list, i = 0) {
2413
2403
  return [list[index], next, prev];
2414
2404
  }
2415
2405
 
2416
- export { useActiveElement, useClickOutSide as useClickOutside, useClipBorad as useClipboard, useCounter, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useFavicon, useFileDialog, useFirstMountState, useFps$1 as useFps, useFullscreen, useGeolocation, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMarkdown, useMediaDevices$1 as useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useResizeObserver, useScriptTag, useScroll, useScrollLock, useSessionStorage, useTextDirection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, useUpdateEffect, useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
2406
+ export { useActiveElement, useClickOutSide as useClickOutside, useClipBorad as useClipboard, useCounter, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useFavicon, useFileDialog, useFirstMountState, useFps$1 as useFps, useFullscreen, useGeolocation, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMediaDevices$1 as useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useResizeObserver, useScriptTag, useScroll, useScrollLock, useSessionStorage, useTextDirection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, useUpdateEffect, useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
package/package.json CHANGED
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "name": "@reactuses/core",
3
- "version": "1.0.7",
4
- "main": "./index.cjs",
5
- "module": "./index.mjs",
6
- "types": "./index.d.ts",
3
+ "version": "1.1.1",
4
+ "main": "./dist/index.cjs",
5
+ "module": "./dist/index.mjs",
6
+ "types": "./dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "package.json",
10
+ "LICENSE",
11
+ "README.md"
12
+ ],
7
13
  "sideEffects": false,
8
14
  "license": "Unlicense",
9
15
  "homepage": "https://www.reactuse.com/",
@@ -15,21 +21,59 @@
15
21
  "bugs": {
16
22
  "url": "https://github.com/childrentime/reactuse/issues"
17
23
  },
24
+ "scripts": {
25
+ "lint": "eslint \"{hooks,tests}/**/*.{ts,tsx}\"",
26
+ "build": "esno scripts/build.ts",
27
+ "build:rollup": "cross-env NODE_OPTIONS=\"--max-old-space-size=6144\" rollup -c",
28
+ "publish:ci": "esno scripts/publish.ts",
29
+ "release:prepare": "bump",
30
+ "release": "esno scripts/release.ts",
31
+ "test": "jest",
32
+ "test:coverage": "jest --coverage"
33
+ },
34
+ "dependencies": {
35
+ "@testing-library/react": "^13.4.0",
36
+ "lodash": "^4.17.21",
37
+ "screenfull": "^5.0.0"
38
+ },
18
39
  "devDependencies": {
40
+ "@babel/cli": "^7.19.3",
41
+ "@babel/core": "^7.20.2",
42
+ "@babel/preset-env": "^7.20.2",
43
+ "@babel/preset-react": "^7.18.6",
44
+ "@babel/preset-typescript": "^7.18.6",
45
+ "@jsdevtools/version-bump-prompt": "^6.1.0",
46
+ "@rollup/plugin-commonjs": "^22.0.2",
47
+ "@rollup/plugin-json": "^4.1.0",
48
+ "@rollup/plugin-node-resolve": "^14.1.0",
49
+ "@rollup/plugin-replace": "^4.0.0",
50
+ "@types/fs-extra": "^9.0.13",
51
+ "@types/jest": "^27.5.2",
19
52
  "@types/lodash": "^4.14.184",
53
+ "@types/node": "^18.11.9",
54
+ "@types/react": "^18.0.25",
20
55
  "@typescript-eslint/eslint-plugin": "^5.36.1",
21
56
  "@typescript-eslint/parser": "^5.36.1",
57
+ "babel-jest": "^29.0.2",
58
+ "consola": "^2.15.3",
59
+ "cross-env": "^7.0.3",
60
+ "esbuild-register": "^3.4.1",
22
61
  "eslint": "^8.23.0",
23
62
  "eslint-config-prettier": "^8.5.0",
24
63
  "eslint-plugin-react": "^7.31.5",
25
- "eslint-plugin-react-hooks": "^4.6.0"
26
- },
27
- "scripts": {
28
- "lint": "eslint \"{hooks,tests}/**/*.{ts,tsx}\""
29
- },
30
- "dependencies": {
31
- "lodash": "^4.17.21",
32
- "screenfull": "^5.0.0"
64
+ "eslint-plugin-react-hooks": "^4.6.0",
65
+ "esno": "^0.16.3",
66
+ "fast-glob": "^3.2.12",
67
+ "fs-extra": "^10.1.0",
68
+ "jest": "^29.0.2",
69
+ "jest-environment-jsdom": "^29.0.2",
70
+ "react": "^18.2.0",
71
+ "react-dom": "^18.2.0",
72
+ "rollup": "^2.79.0",
73
+ "rollup-plugin-dts": "^4.2.2",
74
+ "rollup-plugin-esbuild": "^4.10.1",
75
+ "ts-node": "^10.9.1",
76
+ "typescript": "^4.8.2"
33
77
  },
34
78
  "keywords": [
35
79
  "react",