@reactuses/core 1.0.6-beta.1 → 1.0.7

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.
Files changed (4) hide show
  1. package/index.cjs +101 -43
  2. package/index.d.ts +12 -2
  3. package/index.mjs +100 -45
  4. package/package.json +1 -1
package/index.cjs CHANGED
@@ -13,7 +13,7 @@ function usePrevious(state) {
13
13
  return ref.current;
14
14
  }
15
15
 
16
- var __async$1 = (__this, __arguments, generator) => {
16
+ var __async$2 = (__this, __arguments, generator) => {
17
17
  return new Promise((resolve, reject) => {
18
18
  var fulfilled = (value) => {
19
19
  try {
@@ -36,7 +36,7 @@ var __async$1 = (__this, __arguments, generator) => {
36
36
  function useMarkdown(filepath) {
37
37
  const [content, setContent] = react.useState("");
38
38
  react.useEffect(() => {
39
- const getContent = () => __async$1(this, null, function* () {
39
+ const getContent = () => __async$2(this, null, function* () {
40
40
  const data = yield (yield fetch(filepath)).text();
41
41
  setContent(data);
42
42
  });
@@ -231,47 +231,29 @@ function useInterval(callback, delay, options) {
231
231
  }, [delay, immediate]);
232
232
  }
233
233
 
234
- const getInitialState = (query, defaultState) => {
235
- if (isBrowser) {
236
- return window.matchMedia(query).matches;
237
- }
238
- if (defaultState !== void 0) {
239
- return defaultState;
240
- }
241
- if (process.env.NODE_ENV !== "production") {
242
- console.warn(
243
- "`useMedia` When server side rendering, defaultState should be defined to prevent a hydration mismatches."
244
- );
245
- }
246
- return false;
247
- };
248
- function useMediaQuery(query, defaultState) {
249
- const [state, setState] = react.useState(getInitialState(query, defaultState));
250
- react.useEffect(() => {
251
- let mounted = true;
252
- const mql = window.matchMedia(query);
253
- const onChange = () => {
254
- if (!mounted) {
255
- return;
256
- }
257
- setState(!!mql.matches);
258
- };
259
- if ("addEventListener" in mql) {
260
- mql.addEventListener("change", onChange);
261
- } else {
262
- mql.addListener(onChange);
263
- }
264
- setState(mql.matches);
265
- return () => {
266
- mounted = false;
267
- if ("removeEventListener" in mql) {
268
- mql.removeEventListener("change", onChange);
269
- } else {
270
- mql.removeListener(onChange);
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
+ };
271
253
  }
272
- };
254
+ ];
273
255
  }, [query]);
274
- return state;
256
+ return react.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
275
257
  }
276
258
 
277
259
  function usePreferredDark(defaultState) {
@@ -1787,7 +1769,7 @@ var __spreadValues = (a, b) => {
1787
1769
  return a;
1788
1770
  };
1789
1771
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
1790
- var __async = (__this, __arguments, generator) => {
1772
+ var __async$1 = (__this, __arguments, generator) => {
1791
1773
  return new Promise((resolve, reject) => {
1792
1774
  var fulfilled = (value) => {
1793
1775
  try {
@@ -1818,7 +1800,7 @@ function useInfiniteScroll(target, onLoadMore, options = {}) {
1818
1800
  }));
1819
1801
  const di = state[3][direction];
1820
1802
  useUpdateEffect(() => {
1821
- const fn = () => __async(this, null, function* () {
1803
+ const fn = () => __async$1(this, null, function* () {
1822
1804
  var _a2, _b2;
1823
1805
  const element = getTargetElement(target);
1824
1806
  const previous = {
@@ -2362,9 +2344,85 @@ function useWindowScroll() {
2362
2344
  return state;
2363
2345
  }
2364
2346
 
2347
+ var __async = (__this, __arguments, generator) => {
2348
+ return new Promise((resolve, reject) => {
2349
+ var fulfilled = (value) => {
2350
+ try {
2351
+ step(generator.next(value));
2352
+ } catch (e) {
2353
+ reject(e);
2354
+ }
2355
+ };
2356
+ var rejected = (value) => {
2357
+ try {
2358
+ step(generator.throw(value));
2359
+ } catch (e) {
2360
+ reject(e);
2361
+ }
2362
+ };
2363
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
2364
+ step((generator = generator.apply(__this, __arguments)).next());
2365
+ });
2366
+ };
2367
+ function useClipBorad() {
2368
+ const [text, setText] = react.useState("");
2369
+ const updateText = react.useCallback(() => {
2370
+ window.navigator.clipboard.readText().then((value) => {
2371
+ setText(value);
2372
+ });
2373
+ }, []);
2374
+ useEventListener("copy", updateText);
2375
+ useEventListener("cut", updateText);
2376
+ const copy = react.useCallback((txt) => __async(this, null, function* () {
2377
+ setText(txt);
2378
+ yield window.navigator.clipboard.writeText(txt);
2379
+ }), []);
2380
+ return [text, copy];
2381
+ }
2382
+
2383
+ function useClickOutSide(target, handler) {
2384
+ const savedHandler = useLatest(handler);
2385
+ const listener = (event) => {
2386
+ const element = getTargetElement(target);
2387
+ if (!element) {
2388
+ return;
2389
+ }
2390
+ const elements = event.composedPath();
2391
+ if (element === event.target || elements.includes(element)) {
2392
+ return;
2393
+ }
2394
+ savedHandler.current(event);
2395
+ };
2396
+ useEventListener("mousedown", listener, window, {
2397
+ passive: true
2398
+ });
2399
+ useEventListener("touchstart", listener, window, {
2400
+ passive: true
2401
+ });
2402
+ }
2403
+
2404
+ function useCycleList(list, i = 0) {
2405
+ const [index, setIndex] = react.useState(i);
2406
+ const set = (i2) => {
2407
+ const length = list.length;
2408
+ const nextIndex = ((index + i2) % length + length) % length;
2409
+ setIndex(nextIndex);
2410
+ };
2411
+ const next = (i2 = 1) => {
2412
+ set(i2);
2413
+ };
2414
+ const prev = (i2 = 1) => {
2415
+ set(-i2);
2416
+ };
2417
+ return [list[index], next, prev];
2418
+ }
2419
+
2365
2420
  exports.useActiveElement = useActiveElement;
2421
+ exports.useClickOutside = useClickOutSide;
2422
+ exports.useClipboard = useClipBorad;
2366
2423
  exports.useCounter = useCounter;
2367
2424
  exports.useCustomCompareEffect = useCustomCompareEffect;
2425
+ exports.useCycleList = useCycleList;
2368
2426
  exports.useDarkMode = useDarkMode;
2369
2427
  exports.useDebounce = useDebounce;
2370
2428
  exports.useDebounceFn = useDebounceFn;
package/index.d.ts CHANGED
@@ -92,7 +92,7 @@ interface UseDarkOptions<T> {
92
92
  }
93
93
  declare function useDarkMode<T extends string | "light" | "dark">(options?: UseDarkOptions<T>): readonly [T | null, react.Dispatch<react.SetStateAction<T | null>>];
94
94
 
95
- declare function useMediaQuery(query: string, defaultState?: boolean): boolean;
95
+ declare function useMediaQuery(query: string, serverFallback?: boolean): boolean;
96
96
 
97
97
  declare function usePreferredDark(defaultState?: boolean): boolean;
98
98
 
@@ -702,4 +702,14 @@ interface State {
702
702
  }
703
703
  declare function useWindowScroll(): State;
704
704
 
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 };
705
+ declare function useClipBorad(): readonly [
706
+ string,
707
+ (txt: string) => Promise<void>
708
+ ];
709
+
710
+ declare type EventType = MouseEvent | TouchEvent;
711
+ declare function useClickOutSide(target: BasicTarget, handler: (evt: EventType) => void): void;
712
+
713
+ declare function useCycleList<T>(list: T[], i?: number): readonly [T, (i?: number) => void, (i?: number) => void];
714
+
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 };
package/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { useRef, useEffect, useState, useLayoutEffect, useCallback, useReducer, useMemo } from 'react';
1
+ import { useRef, useEffect, useState, useLayoutEffect, useCallback, useReducer, useMemo, useSyncExternalStore } from 'react';
2
2
  import { throttle, debounce, isEqual } from 'lodash';
3
3
 
4
4
  function usePrevious(state) {
@@ -9,7 +9,7 @@ function usePrevious(state) {
9
9
  return ref.current;
10
10
  }
11
11
 
12
- var __async$1 = (__this, __arguments, generator) => {
12
+ var __async$2 = (__this, __arguments, generator) => {
13
13
  return new Promise((resolve, reject) => {
14
14
  var fulfilled = (value) => {
15
15
  try {
@@ -32,7 +32,7 @@ var __async$1 = (__this, __arguments, generator) => {
32
32
  function useMarkdown(filepath) {
33
33
  const [content, setContent] = useState("");
34
34
  useEffect(() => {
35
- const getContent = () => __async$1(this, null, function* () {
35
+ const getContent = () => __async$2(this, null, function* () {
36
36
  const data = yield (yield fetch(filepath)).text();
37
37
  setContent(data);
38
38
  });
@@ -227,47 +227,29 @@ function useInterval(callback, delay, options) {
227
227
  }, [delay, immediate]);
228
228
  }
229
229
 
230
- const getInitialState = (query, defaultState) => {
231
- if (isBrowser) {
232
- return window.matchMedia(query).matches;
233
- }
234
- if (defaultState !== void 0) {
235
- return defaultState;
236
- }
237
- if (process.env.NODE_ENV !== "production") {
238
- console.warn(
239
- "`useMedia` When server side rendering, defaultState should be defined to prevent a hydration mismatches."
240
- );
241
- }
242
- return false;
243
- };
244
- function useMediaQuery(query, defaultState) {
245
- const [state, setState] = useState(getInitialState(query, defaultState));
246
- useEffect(() => {
247
- let mounted = true;
248
- const mql = window.matchMedia(query);
249
- const onChange = () => {
250
- if (!mounted) {
251
- return;
252
- }
253
- setState(!!mql.matches);
254
- };
255
- if ("addEventListener" in mql) {
256
- mql.addEventListener("change", onChange);
257
- } else {
258
- mql.addListener(onChange);
259
- }
260
- setState(mql.matches);
261
- return () => {
262
- mounted = false;
263
- if ("removeEventListener" in mql) {
264
- mql.removeEventListener("change", onChange);
265
- } else {
266
- mql.removeListener(onChange);
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
+ };
267
249
  }
268
- };
250
+ ];
269
251
  }, [query]);
270
- return state;
252
+ return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
271
253
  }
272
254
 
273
255
  function usePreferredDark(defaultState) {
@@ -1783,7 +1765,7 @@ var __spreadValues = (a, b) => {
1783
1765
  return a;
1784
1766
  };
1785
1767
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
1786
- var __async = (__this, __arguments, generator) => {
1768
+ var __async$1 = (__this, __arguments, generator) => {
1787
1769
  return new Promise((resolve, reject) => {
1788
1770
  var fulfilled = (value) => {
1789
1771
  try {
@@ -1814,7 +1796,7 @@ function useInfiniteScroll(target, onLoadMore, options = {}) {
1814
1796
  }));
1815
1797
  const di = state[3][direction];
1816
1798
  useUpdateEffect(() => {
1817
- const fn = () => __async(this, null, function* () {
1799
+ const fn = () => __async$1(this, null, function* () {
1818
1800
  var _a2, _b2;
1819
1801
  const element = getTargetElement(target);
1820
1802
  const previous = {
@@ -2358,4 +2340,77 @@ function useWindowScroll() {
2358
2340
  return state;
2359
2341
  }
2360
2342
 
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 };
2343
+ var __async = (__this, __arguments, generator) => {
2344
+ return new Promise((resolve, reject) => {
2345
+ var fulfilled = (value) => {
2346
+ try {
2347
+ step(generator.next(value));
2348
+ } catch (e) {
2349
+ reject(e);
2350
+ }
2351
+ };
2352
+ var rejected = (value) => {
2353
+ try {
2354
+ step(generator.throw(value));
2355
+ } catch (e) {
2356
+ reject(e);
2357
+ }
2358
+ };
2359
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
2360
+ step((generator = generator.apply(__this, __arguments)).next());
2361
+ });
2362
+ };
2363
+ function useClipBorad() {
2364
+ const [text, setText] = useState("");
2365
+ const updateText = useCallback(() => {
2366
+ window.navigator.clipboard.readText().then((value) => {
2367
+ setText(value);
2368
+ });
2369
+ }, []);
2370
+ useEventListener("copy", updateText);
2371
+ useEventListener("cut", updateText);
2372
+ const copy = useCallback((txt) => __async(this, null, function* () {
2373
+ setText(txt);
2374
+ yield window.navigator.clipboard.writeText(txt);
2375
+ }), []);
2376
+ return [text, copy];
2377
+ }
2378
+
2379
+ function useClickOutSide(target, handler) {
2380
+ const savedHandler = useLatest(handler);
2381
+ const listener = (event) => {
2382
+ const element = getTargetElement(target);
2383
+ if (!element) {
2384
+ return;
2385
+ }
2386
+ const elements = event.composedPath();
2387
+ if (element === event.target || elements.includes(element)) {
2388
+ return;
2389
+ }
2390
+ savedHandler.current(event);
2391
+ };
2392
+ useEventListener("mousedown", listener, window, {
2393
+ passive: true
2394
+ });
2395
+ useEventListener("touchstart", listener, window, {
2396
+ passive: true
2397
+ });
2398
+ }
2399
+
2400
+ function useCycleList(list, i = 0) {
2401
+ const [index, setIndex] = useState(i);
2402
+ const set = (i2) => {
2403
+ const length = list.length;
2404
+ const nextIndex = ((index + i2) % length + length) % length;
2405
+ setIndex(nextIndex);
2406
+ };
2407
+ const next = (i2 = 1) => {
2408
+ set(i2);
2409
+ };
2410
+ const prev = (i2 = 1) => {
2411
+ set(-i2);
2412
+ };
2413
+ return [list[index], next, prev];
2414
+ }
2415
+
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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reactuses/core",
3
- "version": "1.0.6-beta.1",
3
+ "version": "1.0.7",
4
4
  "main": "./index.cjs",
5
5
  "module": "./index.mjs",
6
6
  "types": "./index.d.ts",