@reactuses/core 1.0.6 → 1.1.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.
File without changes
File without changes
@@ -13,38 +13,6 @@ function usePrevious(state) {
13
13
  return ref.current;
14
14
  }
15
15
 
16
- var __async$1 = (__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$1(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));
@@ -240,7 +208,7 @@ const getInitialState = (query, defaultState) => {
240
208
  }
241
209
  if (process.env.NODE_ENV !== "production") {
242
210
  console.warn(
243
- "`useMedia` When server side rendering, defaultState should be defined to prevent a hydration mismatches."
211
+ "`useMediaQuery` When server side rendering, defaultState should be defined to prevent a hydration mismatches."
244
212
  );
245
213
  }
246
214
  return false;
@@ -286,7 +254,7 @@ function useDarkMode(options = {}) {
286
254
  storageKey = "reactuses-color-scheme",
287
255
  storage = () => isBrowser ? localStorage : void 0
288
256
  } = options;
289
- const prefersDarkMode = usePreferredDark();
257
+ const prefersDarkMode = usePreferredDark(false);
290
258
  const value = initialValue ? initialValue : prefersDarkMode ? "dark" : "light";
291
259
  const [dark, setDark] = useStorage(storageKey, value, storage);
292
260
  react.useEffect(() => {
@@ -506,6 +474,7 @@ function off(obj, ...args) {
506
474
  );
507
475
  }
508
476
  }
477
+ const defaultWindow = isBrowser ? window : void 0;
509
478
 
510
479
  function getTargetElement(target, defaultElement) {
511
480
  if (!isBrowser) {
@@ -1551,15 +1520,15 @@ function usePageLeave() {
1551
1520
  const from = event.relatedTarget || event.toElement;
1552
1521
  setIsLeft(!from);
1553
1522
  };
1554
- useEventListener("mouseout", handler, window, { passive: true });
1555
- useEventListener("mouseleave", handler, document, { passive: true });
1556
- 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 });
1557
1526
  return isLeft;
1558
1527
  }
1559
1528
 
1560
1529
  function useDocumentVisibility() {
1561
1530
  const [visible, setVisible] = react.useState(() => {
1562
- if (!document) {
1531
+ if (typeof document === "undefined") {
1563
1532
  return "visible";
1564
1533
  } else {
1565
1534
  return document.visibilityState;
@@ -1570,7 +1539,7 @@ function useDocumentVisibility() {
1570
1539
  () => {
1571
1540
  setVisible(document.visibilityState);
1572
1541
  },
1573
- document
1542
+ () => document
1574
1543
  );
1575
1544
  return visible;
1576
1545
  }
@@ -1665,7 +1634,7 @@ function useFileDialog(options = {}) {
1665
1634
  const [files, setFiles] = react.useState(null);
1666
1635
  const inputRef = react.useRef();
1667
1636
  const initFn = react.useCallback(() => {
1668
- if (!document) {
1637
+ if (typeof document === "undefined") {
1669
1638
  return void 0;
1670
1639
  }
1671
1640
  const input = document.createElement("input");
@@ -1787,7 +1756,7 @@ var __spreadValues = (a, b) => {
1787
1756
  return a;
1788
1757
  };
1789
1758
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
1790
- var __async = (__this, __arguments, generator) => {
1759
+ var __async$1 = (__this, __arguments, generator) => {
1791
1760
  return new Promise((resolve, reject) => {
1792
1761
  var fulfilled = (value) => {
1793
1762
  try {
@@ -1818,7 +1787,7 @@ function useInfiniteScroll(target, onLoadMore, options = {}) {
1818
1787
  }));
1819
1788
  const di = state[3][direction];
1820
1789
  useUpdateEffect(() => {
1821
- const fn = () => __async(this, null, function* () {
1790
+ const fn = () => __async$1(this, null, function* () {
1822
1791
  var _a2, _b2;
1823
1792
  const element = getTargetElement(target);
1824
1793
  const previous = {
@@ -1883,8 +1852,8 @@ function useMousePressed(target, options = {}) {
1883
1852
  setSourceType(null);
1884
1853
  }, []);
1885
1854
  useEventListener("mousedown", onPressed("mouse"), target, { passive: true });
1886
- useEventListener("mouseleave", onReleased, window, { passive: true });
1887
- useEventListener("mouseup", onReleased, window, { passive: true });
1855
+ useEventListener("mouseleave", onReleased, () => window, { passive: true });
1856
+ useEventListener("mouseup", onReleased, () => window, { passive: true });
1888
1857
  useMount(() => {
1889
1858
  const element = getTargetElement(target);
1890
1859
  if (drag) {
@@ -2120,8 +2089,8 @@ function useVirtualList(list = [], options) {
2120
2089
  }
2121
2090
 
2122
2091
  function usePreferredColorScheme(defaultState) {
2123
- const isLight = useMediaQuery("(prefers-color-scheme: light)");
2124
- 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);
2125
2094
  if (!isBrowser && defaultState) {
2126
2095
  return defaultState;
2127
2096
  }
@@ -2129,9 +2098,9 @@ function usePreferredColorScheme(defaultState) {
2129
2098
  }
2130
2099
 
2131
2100
  function usePreferredContrast(defaultState) {
2132
- const isMore = useMediaQuery("(prefers-contrast: more)");
2133
- const isLess = useMediaQuery("(prefers-contrast: less)");
2134
- 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);
2135
2104
  if (!isBrowser && defaultState) {
2136
2105
  return defaultState;
2137
2106
  }
@@ -2143,14 +2112,17 @@ function useActiveElement() {
2143
2112
  const listener = react.useCallback(() => {
2144
2113
  setActive(window == null ? void 0 : window.document.activeElement);
2145
2114
  }, []);
2146
- useEventListener("blur", listener, window, true);
2147
- useEventListener("focus", listener, window, true);
2115
+ useEventListener("blur", listener, () => window, true);
2116
+ useEventListener("focus", listener, () => window, true);
2148
2117
  return active;
2149
2118
  }
2150
2119
 
2151
2120
  function useDraggable(target, options = {}) {
2152
2121
  var _a, _b;
2153
- const draggingElement = getTargetElement(options.draggingElement, window);
2122
+ const draggingElement = getTargetElement(
2123
+ options.draggingElement,
2124
+ defaultWindow
2125
+ );
2154
2126
  const draggingHandle = getTargetElement((_a = options.handle) != null ? _a : target);
2155
2127
  const [position, setPositon] = react.useState(
2156
2128
  (_b = options.initialValue) != null ? _b : { x: 0, y: 0 }
@@ -2312,7 +2284,7 @@ function useElementVisibility(target, options = {}) {
2312
2284
 
2313
2285
  function useWindowsFocus() {
2314
2286
  const [focused, setFocused] = react.useState(() => {
2315
- if (!window) {
2287
+ if (!isBrowser) {
2316
2288
  return false;
2317
2289
  }
2318
2290
  return window.document.hasFocus();
@@ -2362,9 +2334,85 @@ function useWindowScroll() {
2362
2334
  return state;
2363
2335
  }
2364
2336
 
2337
+ var __async = (__this, __arguments, generator) => {
2338
+ return new Promise((resolve, reject) => {
2339
+ var fulfilled = (value) => {
2340
+ try {
2341
+ step(generator.next(value));
2342
+ } catch (e) {
2343
+ reject(e);
2344
+ }
2345
+ };
2346
+ var rejected = (value) => {
2347
+ try {
2348
+ step(generator.throw(value));
2349
+ } catch (e) {
2350
+ reject(e);
2351
+ }
2352
+ };
2353
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
2354
+ step((generator = generator.apply(__this, __arguments)).next());
2355
+ });
2356
+ };
2357
+ function useClipBorad() {
2358
+ const [text, setText] = react.useState("");
2359
+ const updateText = react.useCallback(() => {
2360
+ window.navigator.clipboard.readText().then((value) => {
2361
+ setText(value);
2362
+ });
2363
+ }, []);
2364
+ useEventListener("copy", updateText);
2365
+ useEventListener("cut", updateText);
2366
+ const copy = react.useCallback((txt) => __async(this, null, function* () {
2367
+ setText(txt);
2368
+ yield window.navigator.clipboard.writeText(txt);
2369
+ }), []);
2370
+ return [text, copy];
2371
+ }
2372
+
2373
+ function useClickOutSide(target, handler) {
2374
+ const savedHandler = useLatest(handler);
2375
+ const listener = (event) => {
2376
+ const element = getTargetElement(target);
2377
+ if (!element) {
2378
+ return;
2379
+ }
2380
+ const elements = event.composedPath();
2381
+ if (element === event.target || elements.includes(element)) {
2382
+ return;
2383
+ }
2384
+ savedHandler.current(event);
2385
+ };
2386
+ useEventListener("mousedown", listener, () => window, {
2387
+ passive: true
2388
+ });
2389
+ useEventListener("touchstart", listener, () => window, {
2390
+ passive: true
2391
+ });
2392
+ }
2393
+
2394
+ function useCycleList(list, i = 0) {
2395
+ const [index, setIndex] = react.useState(i);
2396
+ const set = (i2) => {
2397
+ const length = list.length;
2398
+ const nextIndex = ((index + i2) % length + length) % length;
2399
+ setIndex(nextIndex);
2400
+ };
2401
+ const next = (i2 = 1) => {
2402
+ set(i2);
2403
+ };
2404
+ const prev = (i2 = 1) => {
2405
+ set(-i2);
2406
+ };
2407
+ return [list[index], next, prev];
2408
+ }
2409
+
2365
2410
  exports.useActiveElement = useActiveElement;
2411
+ exports.useClickOutside = useClickOutSide;
2412
+ exports.useClipboard = useClipBorad;
2366
2413
  exports.useCounter = useCounter;
2367
2414
  exports.useCustomCompareEffect = useCustomCompareEffect;
2415
+ exports.useCycleList = useCycleList;
2368
2416
  exports.useDarkMode = useDarkMode;
2369
2417
  exports.useDebounce = useDebounce;
2370
2418
  exports.useDebounceFn = useDebounceFn;
@@ -2393,7 +2441,6 @@ exports.useKeyModifier = useKeyModifier;
2393
2441
  exports.useLatest = useLatest;
2394
2442
  exports.useLocalStorage = useLocalStorage;
2395
2443
  exports.useLongPress = useLongPress;
2396
- exports.useMarkdown = useMarkdown;
2397
2444
  exports.useMediaDevices = useMediaDevices$1;
2398
2445
  exports.useMediaQuery = useMediaQuery;
2399
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;
@@ -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;
@@ -702,4 +700,14 @@ interface State {
702
700
  }
703
701
  declare function useWindowScroll(): State;
704
702
 
705
- export { useActiveElement, useCounter, useCustomCompareEffect, 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 };
703
+ declare function useClipBorad(): readonly [
704
+ string,
705
+ (txt: string) => Promise<void>
706
+ ];
707
+
708
+ type EventType = MouseEvent | TouchEvent;
709
+ declare function useClickOutSide(target: BasicTarget, handler: (evt: EventType) => void): void;
710
+
711
+ declare function useCycleList<T>(list: T[], i?: number): readonly [T, (i?: number) => void, (i?: number) => void];
712
+
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 } 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$1 = (__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$1(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));
@@ -236,7 +204,7 @@ const getInitialState = (query, defaultState) => {
236
204
  }
237
205
  if (process.env.NODE_ENV !== "production") {
238
206
  console.warn(
239
- "`useMedia` When server side rendering, defaultState should be defined to prevent a hydration mismatches."
207
+ "`useMediaQuery` When server side rendering, defaultState should be defined to prevent a hydration mismatches."
240
208
  );
241
209
  }
242
210
  return false;
@@ -282,7 +250,7 @@ function useDarkMode(options = {}) {
282
250
  storageKey = "reactuses-color-scheme",
283
251
  storage = () => isBrowser ? localStorage : void 0
284
252
  } = options;
285
- const prefersDarkMode = usePreferredDark();
253
+ const prefersDarkMode = usePreferredDark(false);
286
254
  const value = initialValue ? initialValue : prefersDarkMode ? "dark" : "light";
287
255
  const [dark, setDark] = useStorage(storageKey, value, storage);
288
256
  useEffect(() => {
@@ -502,6 +470,7 @@ function off(obj, ...args) {
502
470
  );
503
471
  }
504
472
  }
473
+ const defaultWindow = isBrowser ? window : void 0;
505
474
 
506
475
  function getTargetElement(target, defaultElement) {
507
476
  if (!isBrowser) {
@@ -1547,15 +1516,15 @@ function usePageLeave() {
1547
1516
  const from = event.relatedTarget || event.toElement;
1548
1517
  setIsLeft(!from);
1549
1518
  };
1550
- useEventListener("mouseout", handler, window, { passive: true });
1551
- useEventListener("mouseleave", handler, document, { passive: true });
1552
- 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 });
1553
1522
  return isLeft;
1554
1523
  }
1555
1524
 
1556
1525
  function useDocumentVisibility() {
1557
1526
  const [visible, setVisible] = useState(() => {
1558
- if (!document) {
1527
+ if (typeof document === "undefined") {
1559
1528
  return "visible";
1560
1529
  } else {
1561
1530
  return document.visibilityState;
@@ -1566,7 +1535,7 @@ function useDocumentVisibility() {
1566
1535
  () => {
1567
1536
  setVisible(document.visibilityState);
1568
1537
  },
1569
- document
1538
+ () => document
1570
1539
  );
1571
1540
  return visible;
1572
1541
  }
@@ -1661,7 +1630,7 @@ function useFileDialog(options = {}) {
1661
1630
  const [files, setFiles] = useState(null);
1662
1631
  const inputRef = useRef();
1663
1632
  const initFn = useCallback(() => {
1664
- if (!document) {
1633
+ if (typeof document === "undefined") {
1665
1634
  return void 0;
1666
1635
  }
1667
1636
  const input = document.createElement("input");
@@ -1783,7 +1752,7 @@ var __spreadValues = (a, b) => {
1783
1752
  return a;
1784
1753
  };
1785
1754
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
1786
- var __async = (__this, __arguments, generator) => {
1755
+ var __async$1 = (__this, __arguments, generator) => {
1787
1756
  return new Promise((resolve, reject) => {
1788
1757
  var fulfilled = (value) => {
1789
1758
  try {
@@ -1814,7 +1783,7 @@ function useInfiniteScroll(target, onLoadMore, options = {}) {
1814
1783
  }));
1815
1784
  const di = state[3][direction];
1816
1785
  useUpdateEffect(() => {
1817
- const fn = () => __async(this, null, function* () {
1786
+ const fn = () => __async$1(this, null, function* () {
1818
1787
  var _a2, _b2;
1819
1788
  const element = getTargetElement(target);
1820
1789
  const previous = {
@@ -1879,8 +1848,8 @@ function useMousePressed(target, options = {}) {
1879
1848
  setSourceType(null);
1880
1849
  }, []);
1881
1850
  useEventListener("mousedown", onPressed("mouse"), target, { passive: true });
1882
- useEventListener("mouseleave", onReleased, window, { passive: true });
1883
- useEventListener("mouseup", onReleased, window, { passive: true });
1851
+ useEventListener("mouseleave", onReleased, () => window, { passive: true });
1852
+ useEventListener("mouseup", onReleased, () => window, { passive: true });
1884
1853
  useMount(() => {
1885
1854
  const element = getTargetElement(target);
1886
1855
  if (drag) {
@@ -2116,8 +2085,8 @@ function useVirtualList(list = [], options) {
2116
2085
  }
2117
2086
 
2118
2087
  function usePreferredColorScheme(defaultState) {
2119
- const isLight = useMediaQuery("(prefers-color-scheme: light)");
2120
- 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);
2121
2090
  if (!isBrowser && defaultState) {
2122
2091
  return defaultState;
2123
2092
  }
@@ -2125,9 +2094,9 @@ function usePreferredColorScheme(defaultState) {
2125
2094
  }
2126
2095
 
2127
2096
  function usePreferredContrast(defaultState) {
2128
- const isMore = useMediaQuery("(prefers-contrast: more)");
2129
- const isLess = useMediaQuery("(prefers-contrast: less)");
2130
- 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);
2131
2100
  if (!isBrowser && defaultState) {
2132
2101
  return defaultState;
2133
2102
  }
@@ -2139,14 +2108,17 @@ function useActiveElement() {
2139
2108
  const listener = useCallback(() => {
2140
2109
  setActive(window == null ? void 0 : window.document.activeElement);
2141
2110
  }, []);
2142
- useEventListener("blur", listener, window, true);
2143
- useEventListener("focus", listener, window, true);
2111
+ useEventListener("blur", listener, () => window, true);
2112
+ useEventListener("focus", listener, () => window, true);
2144
2113
  return active;
2145
2114
  }
2146
2115
 
2147
2116
  function useDraggable(target, options = {}) {
2148
2117
  var _a, _b;
2149
- const draggingElement = getTargetElement(options.draggingElement, window);
2118
+ const draggingElement = getTargetElement(
2119
+ options.draggingElement,
2120
+ defaultWindow
2121
+ );
2150
2122
  const draggingHandle = getTargetElement((_a = options.handle) != null ? _a : target);
2151
2123
  const [position, setPositon] = useState(
2152
2124
  (_b = options.initialValue) != null ? _b : { x: 0, y: 0 }
@@ -2308,7 +2280,7 @@ function useElementVisibility(target, options = {}) {
2308
2280
 
2309
2281
  function useWindowsFocus() {
2310
2282
  const [focused, setFocused] = useState(() => {
2311
- if (!window) {
2283
+ if (!isBrowser) {
2312
2284
  return false;
2313
2285
  }
2314
2286
  return window.document.hasFocus();
@@ -2358,4 +2330,77 @@ function useWindowScroll() {
2358
2330
  return state;
2359
2331
  }
2360
2332
 
2361
- export { useActiveElement, useCounter, useCustomCompareEffect, 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 };
2333
+ var __async = (__this, __arguments, generator) => {
2334
+ return new Promise((resolve, reject) => {
2335
+ var fulfilled = (value) => {
2336
+ try {
2337
+ step(generator.next(value));
2338
+ } catch (e) {
2339
+ reject(e);
2340
+ }
2341
+ };
2342
+ var rejected = (value) => {
2343
+ try {
2344
+ step(generator.throw(value));
2345
+ } catch (e) {
2346
+ reject(e);
2347
+ }
2348
+ };
2349
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
2350
+ step((generator = generator.apply(__this, __arguments)).next());
2351
+ });
2352
+ };
2353
+ function useClipBorad() {
2354
+ const [text, setText] = useState("");
2355
+ const updateText = useCallback(() => {
2356
+ window.navigator.clipboard.readText().then((value) => {
2357
+ setText(value);
2358
+ });
2359
+ }, []);
2360
+ useEventListener("copy", updateText);
2361
+ useEventListener("cut", updateText);
2362
+ const copy = useCallback((txt) => __async(this, null, function* () {
2363
+ setText(txt);
2364
+ yield window.navigator.clipboard.writeText(txt);
2365
+ }), []);
2366
+ return [text, copy];
2367
+ }
2368
+
2369
+ function useClickOutSide(target, handler) {
2370
+ const savedHandler = useLatest(handler);
2371
+ const listener = (event) => {
2372
+ const element = getTargetElement(target);
2373
+ if (!element) {
2374
+ return;
2375
+ }
2376
+ const elements = event.composedPath();
2377
+ if (element === event.target || elements.includes(element)) {
2378
+ return;
2379
+ }
2380
+ savedHandler.current(event);
2381
+ };
2382
+ useEventListener("mousedown", listener, () => window, {
2383
+ passive: true
2384
+ });
2385
+ useEventListener("touchstart", listener, () => window, {
2386
+ passive: true
2387
+ });
2388
+ }
2389
+
2390
+ function useCycleList(list, i = 0) {
2391
+ const [index, setIndex] = useState(i);
2392
+ const set = (i2) => {
2393
+ const length = list.length;
2394
+ const nextIndex = ((index + i2) % length + length) % length;
2395
+ setIndex(nextIndex);
2396
+ };
2397
+ const next = (i2 = 1) => {
2398
+ set(i2);
2399
+ };
2400
+ const prev = (i2 = 1) => {
2401
+ set(-i2);
2402
+ };
2403
+ return [list[index], next, prev];
2404
+ }
2405
+
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.6",
4
- "main": "./index.cjs",
5
- "module": "./index.mjs",
6
- "types": "./index.d.ts",
3
+ "version": "1.1.0",
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",