@reactuses/core 4.0.7 → 4.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -32,7 +32,7 @@ Collection of essential React Hooks Utilities.
32
32
  ```tsx harmony
33
33
  import { useToggle } from "@reactuses/core";
34
34
 
35
- const Demo = () => {
35
+ function Demo() {
36
36
  const [on, toggle] = useToggle(true);
37
37
 
38
38
  return (
@@ -43,7 +43,7 @@ const Demo = () => {
43
43
  <button onClick={() => toggle(false)}>set OFF</button>
44
44
  </div>
45
45
  );
46
- };
46
+ }
47
47
  ```
48
48
 
49
49
  Refer to [documentations](https://reactuse.com/) for more details.
@@ -56,6 +56,12 @@ Refer to [documentations](https://reactuse.com/) for more details.
56
56
 
57
57
  <hr/>
58
58
 
59
+ ## Feedback
60
+
61
+ You can submit an [issue](https://github.com/childrentime/reactuse/issues) or provide feedback on [Discord](https://discord.gg/WzDtCCFF).
62
+
63
+ <hr/>
64
+
59
65
  ## Contribute
60
66
 
61
67
  See the [**Contributing Guide**](CONTRIBUTING.md)
package/dist/index.cjs CHANGED
@@ -3306,6 +3306,7 @@ function useScriptTag(src, onLoaded = noop, options = defaultOptions$1) {
3306
3306
  function usePermission(permissionDesc) {
3307
3307
  const [state, setState] = React.useState("");
3308
3308
  React.useEffect(() => {
3309
+ var _a;
3309
3310
  const desc = typeof permissionDesc === "string" ? { name: permissionDesc } : permissionDesc;
3310
3311
  let mounted = true;
3311
3312
  let permissionStatus = null;
@@ -3314,11 +3315,11 @@ function usePermission(permissionDesc) {
3314
3315
  return;
3315
3316
  }
3316
3317
  setState(() => {
3317
- var _a;
3318
- return (_a = permissionStatus == null ? void 0 : permissionStatus.state) != null ? _a : "";
3318
+ var _a2;
3319
+ return (_a2 = permissionStatus == null ? void 0 : permissionStatus.state) != null ? _a2 : "";
3319
3320
  });
3320
3321
  };
3321
- navigator.permissions.query(desc).then((status) => {
3322
+ (_a = navigator.permissions) == null ? void 0 : _a.query(desc).then((status) => {
3322
3323
  permissionStatus = status;
3323
3324
  on(permissionStatus, "change", onChange);
3324
3325
  onChange();
@@ -3444,7 +3445,7 @@ function useSupported(callback, sync = false) {
3444
3445
  return supported;
3445
3446
  }
3446
3447
 
3447
- var __async$4 = (__this, __arguments, generator) => {
3448
+ var __async$5 = (__this, __arguments, generator) => {
3448
3449
  return new Promise((resolve, reject) => {
3449
3450
  var fulfilled = (value) => {
3450
3451
  try {
@@ -3489,7 +3490,7 @@ function useMediaDevices(options = {}) {
3489
3490
  });
3490
3491
  }).catch(noop);
3491
3492
  }, []);
3492
- const ensurePermissions = React.useCallback(() => __async$4(this, null, function* () {
3493
+ const ensurePermissions = React.useCallback(() => __async$5(this, null, function* () {
3493
3494
  if (!isSupported) {
3494
3495
  return false;
3495
3496
  }
@@ -4295,7 +4296,7 @@ var __spreadValues$1 = (a, b) => {
4295
4296
  return a;
4296
4297
  };
4297
4298
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
4298
- var __async$3 = (__this, __arguments, generator) => {
4299
+ var __async$4 = (__this, __arguments, generator) => {
4299
4300
  return new Promise((resolve, reject) => {
4300
4301
  var fulfilled = (value) => {
4301
4302
  try {
@@ -4327,7 +4328,7 @@ function useInfiniteScroll(target, onLoadMore, options = defaultOptions$1) {
4327
4328
  const element = useLatestElement(target);
4328
4329
  const di = state[3][direction];
4329
4330
  useUpdateEffect(() => {
4330
- const fn = () => __async$3(this, null, function* () {
4331
+ const fn = () => __async$4(this, null, function* () {
4331
4332
  var _a2, _b2;
4332
4333
  const previous = {
4333
4334
  height: (_a2 = element == null ? void 0 : element.scrollHeight) != null ? _a2 : 0,
@@ -4861,7 +4862,7 @@ function useWindowScroll() {
4861
4862
  return state;
4862
4863
  }
4863
4864
 
4864
- var __async$2 = (__this, __arguments, generator) => {
4865
+ var __async$3 = (__this, __arguments, generator) => {
4865
4866
  return new Promise((resolve, reject) => {
4866
4867
  var fulfilled = (value) => {
4867
4868
  try {
@@ -4890,7 +4891,7 @@ function useClipBorad() {
4890
4891
  }, []);
4891
4892
  useEventListener("copy", updateText);
4892
4893
  useEventListener("cut", updateText);
4893
- const copy = React.useCallback((txt) => __async$2(this, null, function* () {
4894
+ const copy = React.useCallback((txt) => __async$3(this, null, function* () {
4894
4895
  setText(txt);
4895
4896
  yield window.navigator.clipboard.writeText(txt);
4896
4897
  }), []);
@@ -5229,7 +5230,7 @@ const useSticky = (targetElement, { axis = "y", nav = 0 }, scrollElement) => {
5229
5230
  return [isSticky, setSticky];
5230
5231
  };
5231
5232
 
5232
- var __async$1 = (__this, __arguments, generator) => {
5233
+ var __async$2 = (__this, __arguments, generator) => {
5233
5234
  return new Promise((resolve, reject) => {
5234
5235
  var fulfilled = (value) => {
5235
5236
  try {
@@ -5252,7 +5253,7 @@ var __async$1 = (__this, __arguments, generator) => {
5252
5253
  function useAsyncEffect(effect, cleanup = noop, deps) {
5253
5254
  const mounted = useMountedState();
5254
5255
  React.useEffect(() => {
5255
- const execute = () => __async$1(this, null, function* () {
5256
+ const execute = () => __async$2(this, null, function* () {
5256
5257
  if (!mounted()) {
5257
5258
  return;
5258
5259
  }
@@ -5313,7 +5314,7 @@ function useTextSelection() {
5313
5314
  return selection;
5314
5315
  }
5315
5316
 
5316
- var __async = (__this, __arguments, generator) => {
5317
+ var __async$1 = (__this, __arguments, generator) => {
5317
5318
  return new Promise((resolve, reject) => {
5318
5319
  var fulfilled = (value) => {
5319
5320
  try {
@@ -5339,7 +5340,7 @@ function useEyeDropper() {
5339
5340
  true
5340
5341
  );
5341
5342
  const open = React.useCallback(
5342
- (..._0) => __async(this, [..._0], function* (options = {}) {
5343
+ (..._0) => __async$1(this, [..._0], function* (options = {}) {
5343
5344
  if (!isSupported) {
5344
5345
  return {
5345
5346
  sRGBHex: ""
@@ -5740,6 +5741,71 @@ function getValue(position) {
5740
5741
  return getComputedStyle(document.documentElement).getPropertyValue(position);
5741
5742
  }
5742
5743
 
5744
+ var __async = (__this, __arguments, generator) => {
5745
+ return new Promise((resolve, reject) => {
5746
+ var fulfilled = (value) => {
5747
+ try {
5748
+ step(generator.next(value));
5749
+ } catch (e) {
5750
+ reject(e);
5751
+ }
5752
+ };
5753
+ var rejected = (value) => {
5754
+ try {
5755
+ step(generator.throw(value));
5756
+ } catch (e) {
5757
+ reject(e);
5758
+ }
5759
+ };
5760
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
5761
+ step((generator = generator.apply(__this, __arguments)).next());
5762
+ });
5763
+ };
5764
+ function useWebNotification(requestPermissions = false) {
5765
+ const isSupported = useSupported(() => !!window && "Notification" in window);
5766
+ const permissionGranted = React.useRef(false);
5767
+ const notificationRef = React.useRef(null);
5768
+ const show = (title, options = defaultOptions$1) => {
5769
+ if (!isSupported && !permissionGranted.current) {
5770
+ return;
5771
+ }
5772
+ notificationRef.current = new Notification(title || "", options);
5773
+ return notificationRef.current;
5774
+ };
5775
+ const close = React.useCallback(() => {
5776
+ if (notificationRef.current) {
5777
+ notificationRef.current.close();
5778
+ }
5779
+ notificationRef.current = null;
5780
+ }, []);
5781
+ React.useEffect(() => {
5782
+ permissionGranted.current = isSupported && "permission" in Notification && Notification.permission === "granted";
5783
+ }, [isSupported]);
5784
+ const ensurePermissions = React.useCallback(() => __async(this, null, function* () {
5785
+ if (!isSupported)
5786
+ return;
5787
+ if (!permissionGranted.current && Notification.permission !== "denied") {
5788
+ const result = yield Notification.requestPermission();
5789
+ if (result === "granted")
5790
+ permissionGranted.current = true;
5791
+ }
5792
+ return permissionGranted.current;
5793
+ }), [isSupported]);
5794
+ React.useEffect(() => {
5795
+ if (requestPermissions) {
5796
+ ensurePermissions();
5797
+ }
5798
+ }, [requestPermissions, ensurePermissions]);
5799
+ useUnmount(close);
5800
+ return {
5801
+ isSupported,
5802
+ show,
5803
+ close,
5804
+ ensurePermissions,
5805
+ permissionGranted
5806
+ };
5807
+ }
5808
+
5743
5809
  exports.getHMSTime = getHMSTime;
5744
5810
  exports.useActiveElement = useActiveElement;
5745
5811
  exports.useAsyncEffect = useAsyncEffect;
@@ -5830,6 +5896,7 @@ exports.useUpdate = useUpdate;
5830
5896
  exports.useUpdateEffect = useUpdateEffect;
5831
5897
  exports.useUpdateLayoutEffect = index$3;
5832
5898
  exports.useVirtualList = useVirtualList;
5899
+ exports.useWebNotification = useWebNotification;
5833
5900
  exports.useWindowScroll = useWindowScroll;
5834
5901
  exports.useWindowSize = useWindowSize;
5835
5902
  exports.useWindowsFocus = useWindowsFocus;
package/dist/index.d.ts CHANGED
@@ -865,4 +865,12 @@ interface UseCssVarOptions {
865
865
  }
866
866
  declare function useCssVar<T extends HTMLElement = HTMLElement>(prop: string, target: BasicTarget<T>, defaultValue?: string, options?: UseCssVarOptions): readonly [string, (v: string) => void];
867
867
 
868
- export { ColorScheme, Contrast, CursorState, EyeDropperOpenReturnType, GeneralPermissionDescriptor, IDisposable, IEvent, IEventOnce, IListener, INetworkInformation, IState, IUseNetworkState, KeyModifier, MousePressedOptions, MouseSourceType, OrientationState, RafLoopReturns, ScrollIntoViewAnimation, ScrollIntoViewParams, Status, Target, UseCookieState, UseCssVarOptions, UseDarkOptions, UseDraggableOptions, UseElementBoundingOptions, UseEventEmitterReturn, UseEyeDropperReturn, UseFileDialogOptions, UseFpsOptions, UseFullScreenOptions, UseInfiniteScrollOptions, UseLongPressOptions, UseMeasureRect, UseMediaDeviceOptions, UseModifierOptions, UseScriptTagOptions, UseScrollOptions, UseStickyParams, UseTextDirectionOptions, UseTextDirectionValue, UseTimeoutFnOptions, UseVirtualListItem, UseVirtualListOptions, UseVirtualListReturn, UseWindowScrollState, WindowSize, getHMSTime, useActiveElement, useAsyncEffect, useClickOutside, useClipBorad as useClipboard, useControlled, useCookie, useCountDown, useCounter, useCssVar, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDoubleClick, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useEyeDropper, useFavicon, useFileDialog, useFirstMountState, useFocus, _default$2 as useFps, useFullscreen, useGeolocation, useHover, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMeasure, useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, _default$1 as useOnceEffect, _default as useOnceLayoutEffect, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useReducedMotion, useResizeObserver, useScreenSafeArea, useScriptTag, useScroll, useScrollIntoView, useScrollLock, useSessionStorage, useSetState, useSticky, useSupported, useTextDirection, useTextSelection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, _default$4 as useUpdateEffect, _default$3 as useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
868
+ declare function useWebNotification(requestPermissions?: boolean): {
869
+ readonly isSupported: boolean;
870
+ readonly show: (title: string, options?: NotificationOptions) => Notification | undefined;
871
+ readonly close: () => void;
872
+ readonly ensurePermissions: () => Promise<boolean | undefined>;
873
+ readonly permissionGranted: react.MutableRefObject<boolean>;
874
+ };
875
+
876
+ export { ColorScheme, Contrast, CursorState, EyeDropperOpenReturnType, GeneralPermissionDescriptor, IDisposable, IEvent, IEventOnce, IListener, INetworkInformation, IState, IUseNetworkState, KeyModifier, MousePressedOptions, MouseSourceType, OrientationState, RafLoopReturns, ScrollIntoViewAnimation, ScrollIntoViewParams, Status, Target, UseCookieState, UseCssVarOptions, UseDarkOptions, UseDraggableOptions, UseElementBoundingOptions, UseEventEmitterReturn, UseEyeDropperReturn, UseFileDialogOptions, UseFpsOptions, UseFullScreenOptions, UseInfiniteScrollOptions, UseLongPressOptions, UseMeasureRect, UseMediaDeviceOptions, UseModifierOptions, UseScriptTagOptions, UseScrollOptions, UseStickyParams, UseTextDirectionOptions, UseTextDirectionValue, UseTimeoutFnOptions, UseVirtualListItem, UseVirtualListOptions, UseVirtualListReturn, UseWindowScrollState, WindowSize, getHMSTime, useActiveElement, useAsyncEffect, useClickOutside, useClipBorad as useClipboard, useControlled, useCookie, useCountDown, useCounter, useCssVar, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDoubleClick, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useEyeDropper, useFavicon, useFileDialog, useFirstMountState, useFocus, _default$2 as useFps, useFullscreen, useGeolocation, useHover, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMeasure, useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, _default$1 as useOnceEffect, _default as useOnceLayoutEffect, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useReducedMotion, useResizeObserver, useScreenSafeArea, useScriptTag, useScroll, useScrollIntoView, useScrollLock, useSessionStorage, useSetState, useSticky, useSupported, useTextDirection, useTextSelection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, _default$4 as useUpdateEffect, _default$3 as useUpdateLayoutEffect, useVirtualList, useWebNotification, useWindowScroll, useWindowSize, useWindowsFocus };
package/dist/index.mjs CHANGED
@@ -3298,6 +3298,7 @@ function useScriptTag(src, onLoaded = noop, options = defaultOptions$1) {
3298
3298
  function usePermission(permissionDesc) {
3299
3299
  const [state, setState] = useState("");
3300
3300
  useEffect(() => {
3301
+ var _a;
3301
3302
  const desc = typeof permissionDesc === "string" ? { name: permissionDesc } : permissionDesc;
3302
3303
  let mounted = true;
3303
3304
  let permissionStatus = null;
@@ -3306,11 +3307,11 @@ function usePermission(permissionDesc) {
3306
3307
  return;
3307
3308
  }
3308
3309
  setState(() => {
3309
- var _a;
3310
- return (_a = permissionStatus == null ? void 0 : permissionStatus.state) != null ? _a : "";
3310
+ var _a2;
3311
+ return (_a2 = permissionStatus == null ? void 0 : permissionStatus.state) != null ? _a2 : "";
3311
3312
  });
3312
3313
  };
3313
- navigator.permissions.query(desc).then((status) => {
3314
+ (_a = navigator.permissions) == null ? void 0 : _a.query(desc).then((status) => {
3314
3315
  permissionStatus = status;
3315
3316
  on(permissionStatus, "change", onChange);
3316
3317
  onChange();
@@ -3436,7 +3437,7 @@ function useSupported(callback, sync = false) {
3436
3437
  return supported;
3437
3438
  }
3438
3439
 
3439
- var __async$4 = (__this, __arguments, generator) => {
3440
+ var __async$5 = (__this, __arguments, generator) => {
3440
3441
  return new Promise((resolve, reject) => {
3441
3442
  var fulfilled = (value) => {
3442
3443
  try {
@@ -3481,7 +3482,7 @@ function useMediaDevices(options = {}) {
3481
3482
  });
3482
3483
  }).catch(noop);
3483
3484
  }, []);
3484
- const ensurePermissions = useCallback(() => __async$4(this, null, function* () {
3485
+ const ensurePermissions = useCallback(() => __async$5(this, null, function* () {
3485
3486
  if (!isSupported) {
3486
3487
  return false;
3487
3488
  }
@@ -4287,7 +4288,7 @@ var __spreadValues$1 = (a, b) => {
4287
4288
  return a;
4288
4289
  };
4289
4290
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
4290
- var __async$3 = (__this, __arguments, generator) => {
4291
+ var __async$4 = (__this, __arguments, generator) => {
4291
4292
  return new Promise((resolve, reject) => {
4292
4293
  var fulfilled = (value) => {
4293
4294
  try {
@@ -4319,7 +4320,7 @@ function useInfiniteScroll(target, onLoadMore, options = defaultOptions$1) {
4319
4320
  const element = useLatestElement(target);
4320
4321
  const di = state[3][direction];
4321
4322
  useUpdateEffect(() => {
4322
- const fn = () => __async$3(this, null, function* () {
4323
+ const fn = () => __async$4(this, null, function* () {
4323
4324
  var _a2, _b2;
4324
4325
  const previous = {
4325
4326
  height: (_a2 = element == null ? void 0 : element.scrollHeight) != null ? _a2 : 0,
@@ -4853,7 +4854,7 @@ function useWindowScroll() {
4853
4854
  return state;
4854
4855
  }
4855
4856
 
4856
- var __async$2 = (__this, __arguments, generator) => {
4857
+ var __async$3 = (__this, __arguments, generator) => {
4857
4858
  return new Promise((resolve, reject) => {
4858
4859
  var fulfilled = (value) => {
4859
4860
  try {
@@ -4882,7 +4883,7 @@ function useClipBorad() {
4882
4883
  }, []);
4883
4884
  useEventListener("copy", updateText);
4884
4885
  useEventListener("cut", updateText);
4885
- const copy = useCallback((txt) => __async$2(this, null, function* () {
4886
+ const copy = useCallback((txt) => __async$3(this, null, function* () {
4886
4887
  setText(txt);
4887
4888
  yield window.navigator.clipboard.writeText(txt);
4888
4889
  }), []);
@@ -5221,7 +5222,7 @@ const useSticky = (targetElement, { axis = "y", nav = 0 }, scrollElement) => {
5221
5222
  return [isSticky, setSticky];
5222
5223
  };
5223
5224
 
5224
- var __async$1 = (__this, __arguments, generator) => {
5225
+ var __async$2 = (__this, __arguments, generator) => {
5225
5226
  return new Promise((resolve, reject) => {
5226
5227
  var fulfilled = (value) => {
5227
5228
  try {
@@ -5244,7 +5245,7 @@ var __async$1 = (__this, __arguments, generator) => {
5244
5245
  function useAsyncEffect(effect, cleanup = noop, deps) {
5245
5246
  const mounted = useMountedState();
5246
5247
  useEffect(() => {
5247
- const execute = () => __async$1(this, null, function* () {
5248
+ const execute = () => __async$2(this, null, function* () {
5248
5249
  if (!mounted()) {
5249
5250
  return;
5250
5251
  }
@@ -5305,7 +5306,7 @@ function useTextSelection() {
5305
5306
  return selection;
5306
5307
  }
5307
5308
 
5308
- var __async = (__this, __arguments, generator) => {
5309
+ var __async$1 = (__this, __arguments, generator) => {
5309
5310
  return new Promise((resolve, reject) => {
5310
5311
  var fulfilled = (value) => {
5311
5312
  try {
@@ -5331,7 +5332,7 @@ function useEyeDropper() {
5331
5332
  true
5332
5333
  );
5333
5334
  const open = useCallback(
5334
- (..._0) => __async(this, [..._0], function* (options = {}) {
5335
+ (..._0) => __async$1(this, [..._0], function* (options = {}) {
5335
5336
  if (!isSupported) {
5336
5337
  return {
5337
5338
  sRGBHex: ""
@@ -5732,4 +5733,69 @@ function getValue(position) {
5732
5733
  return getComputedStyle(document.documentElement).getPropertyValue(position);
5733
5734
  }
5734
5735
 
5735
- export { getHMSTime, useActiveElement, useAsyncEffect, useClickOutside, useClipBorad as useClipboard, useControlled, useCookie, useCountDown, useCounter, useCssVar, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDoubleClick, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useEyeDropper, useFavicon, useFileDialog, useFirstMountState, useFocus, index$2 as useFps, useFullscreen, useGeolocation, useHover, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMeasure, useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, index$1 as useOnceEffect, index as useOnceLayoutEffect, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useReducedMotion, useResizeObserver, useScreenSafeArea, useScriptTag, useScroll, useScrollIntoView, useScrollLock, useSessionStorage, useSetState, useSticky, useSupported, useTextDirection, useTextSelection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, useUpdateEffect, index$3 as useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
5736
+ var __async = (__this, __arguments, generator) => {
5737
+ return new Promise((resolve, reject) => {
5738
+ var fulfilled = (value) => {
5739
+ try {
5740
+ step(generator.next(value));
5741
+ } catch (e) {
5742
+ reject(e);
5743
+ }
5744
+ };
5745
+ var rejected = (value) => {
5746
+ try {
5747
+ step(generator.throw(value));
5748
+ } catch (e) {
5749
+ reject(e);
5750
+ }
5751
+ };
5752
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
5753
+ step((generator = generator.apply(__this, __arguments)).next());
5754
+ });
5755
+ };
5756
+ function useWebNotification(requestPermissions = false) {
5757
+ const isSupported = useSupported(() => !!window && "Notification" in window);
5758
+ const permissionGranted = useRef(false);
5759
+ const notificationRef = useRef(null);
5760
+ const show = (title, options = defaultOptions$1) => {
5761
+ if (!isSupported && !permissionGranted.current) {
5762
+ return;
5763
+ }
5764
+ notificationRef.current = new Notification(title || "", options);
5765
+ return notificationRef.current;
5766
+ };
5767
+ const close = useCallback(() => {
5768
+ if (notificationRef.current) {
5769
+ notificationRef.current.close();
5770
+ }
5771
+ notificationRef.current = null;
5772
+ }, []);
5773
+ useEffect(() => {
5774
+ permissionGranted.current = isSupported && "permission" in Notification && Notification.permission === "granted";
5775
+ }, [isSupported]);
5776
+ const ensurePermissions = useCallback(() => __async(this, null, function* () {
5777
+ if (!isSupported)
5778
+ return;
5779
+ if (!permissionGranted.current && Notification.permission !== "denied") {
5780
+ const result = yield Notification.requestPermission();
5781
+ if (result === "granted")
5782
+ permissionGranted.current = true;
5783
+ }
5784
+ return permissionGranted.current;
5785
+ }), [isSupported]);
5786
+ useEffect(() => {
5787
+ if (requestPermissions) {
5788
+ ensurePermissions();
5789
+ }
5790
+ }, [requestPermissions, ensurePermissions]);
5791
+ useUnmount(close);
5792
+ return {
5793
+ isSupported,
5794
+ show,
5795
+ close,
5796
+ ensurePermissions,
5797
+ permissionGranted
5798
+ };
5799
+ }
5800
+
5801
+ export { getHMSTime, useActiveElement, useAsyncEffect, useClickOutside, useClipBorad as useClipboard, useControlled, useCookie, useCountDown, useCounter, useCssVar, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDoubleClick, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useEyeDropper, useFavicon, useFileDialog, useFirstMountState, useFocus, index$2 as useFps, useFullscreen, useGeolocation, useHover, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMeasure, useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, index$1 as useOnceEffect, index as useOnceLayoutEffect, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useReducedMotion, useResizeObserver, useScreenSafeArea, useScriptTag, useScroll, useScrollIntoView, useScrollLock, useSessionStorage, useSetState, useSticky, useSupported, useTextDirection, useTextSelection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, useUpdateEffect, index$3 as useUpdateLayoutEffect, useVirtualList, useWebNotification, useWindowScroll, useWindowSize, useWindowsFocus };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reactuses/core",
3
- "version": "4.0.7",
3
+ "version": "4.0.9",
4
4
  "license": "Unlicense",
5
5
  "homepage": "https://www.reactuse.com/",
6
6
  "repository": {
@@ -24,8 +24,8 @@
24
24
  "./package.json": "./package.json",
25
25
  ".": {
26
26
  "types": "./dist/index.d.ts",
27
- "require": "./dist/index.cjs",
28
- "import": "./dist/index.mjs"
27
+ "import": "./dist/index.mjs",
28
+ "require": "./dist/index.cjs"
29
29
  }
30
30
  },
31
31
  "main": "./dist/index.cjs",
@@ -64,6 +64,9 @@
64
64
  "@rollup/plugin-replace": "^4.0.0",
65
65
  "@testing-library/react": "^13.4.0",
66
66
  "@types/jest": "^27.5.2",
67
+ "@types/js-cookie": "^3.0.3",
68
+ "@types/lodash": "^4.14.184",
69
+ "@types/lodash-es": "^4.17.7",
67
70
  "babel-jest": "^29.0.2",
68
71
  "consola": "^2.15.3",
69
72
  "esbuild": "^0.17.15",