@siberiacancode/reactuse 0.2.18 → 0.2.20

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 (66) hide show
  1. package/README.md +71 -71
  2. package/dist/cjs/hooks/useAudio/useAudio.cjs +2 -0
  3. package/dist/cjs/hooks/useAudio/useAudio.cjs.map +1 -0
  4. package/dist/cjs/hooks/useCopy/useCopy.cjs +1 -1
  5. package/dist/cjs/hooks/useCopy/useCopy.cjs.map +1 -1
  6. package/dist/cjs/hooks/useCssVar/useCssVar.cjs +1 -1
  7. package/dist/cjs/hooks/useCssVar/useCssVar.cjs.map +1 -1
  8. package/dist/cjs/hooks/useDebounceCallback/useDebounceCallback.cjs +1 -1
  9. package/dist/cjs/hooks/useDebounceCallback/useDebounceCallback.cjs.map +1 -1
  10. package/dist/cjs/hooks/useDeviceMotion/useDeviceMotion.cjs.map +1 -1
  11. package/dist/cjs/hooks/useDoubleClick/useDoubleClick.cjs +1 -1
  12. package/dist/cjs/hooks/useDoubleClick/useDoubleClick.cjs.map +1 -1
  13. package/dist/cjs/hooks/useHash/useHash.cjs +1 -1
  14. package/dist/cjs/hooks/useHash/useHash.cjs.map +1 -1
  15. package/dist/cjs/hooks/useMediaControls/useMediaControls.cjs +2 -0
  16. package/dist/cjs/hooks/useMediaControls/useMediaControls.cjs.map +1 -0
  17. package/dist/cjs/hooks/usePictureInPicture/usePictureInPicture.cjs +2 -0
  18. package/dist/cjs/hooks/usePictureInPicture/usePictureInPicture.cjs.map +1 -0
  19. package/dist/cjs/hooks/useQuery/useQuery.cjs.map +1 -1
  20. package/dist/cjs/hooks/useShallowEffect/useShallowEffect.cjs +2 -0
  21. package/dist/cjs/hooks/useShallowEffect/useShallowEffect.cjs.map +1 -0
  22. package/dist/cjs/hooks/useStorage/useStorage.cjs.map +1 -1
  23. package/dist/cjs/hooks/useThrottleCallback/useThrottleCallback.cjs +1 -1
  24. package/dist/cjs/hooks/useThrottleCallback/useThrottleCallback.cjs.map +1 -1
  25. package/dist/cjs/hooks/useWizard/useWizard.cjs.map +1 -1
  26. package/dist/cjs/index.cjs +1 -1
  27. package/dist/esm/hooks/useAudio/useAudio.mjs +50 -0
  28. package/dist/esm/hooks/useAudio/useAudio.mjs.map +1 -0
  29. package/dist/esm/hooks/useCopy/useCopy.mjs +1 -1
  30. package/dist/esm/hooks/useCopy/useCopy.mjs.map +1 -1
  31. package/dist/esm/hooks/useCssVar/useCssVar.mjs +23 -26
  32. package/dist/esm/hooks/useCssVar/useCssVar.mjs.map +1 -1
  33. package/dist/esm/hooks/useDebounceCallback/useDebounceCallback.mjs +8 -8
  34. package/dist/esm/hooks/useDebounceCallback/useDebounceCallback.mjs.map +1 -1
  35. package/dist/esm/hooks/useDeviceMotion/useDeviceMotion.mjs.map +1 -1
  36. package/dist/esm/hooks/useDoubleClick/useDoubleClick.mjs +1 -0
  37. package/dist/esm/hooks/useDoubleClick/useDoubleClick.mjs.map +1 -1
  38. package/dist/esm/hooks/useHash/useHash.mjs +9 -8
  39. package/dist/esm/hooks/useHash/useHash.mjs.map +1 -1
  40. package/dist/esm/hooks/useMediaControls/useMediaControls.mjs +70 -0
  41. package/dist/esm/hooks/useMediaControls/useMediaControls.mjs.map +1 -0
  42. package/dist/esm/hooks/usePictureInPicture/usePictureInPicture.mjs +26 -0
  43. package/dist/esm/hooks/usePictureInPicture/usePictureInPicture.mjs.map +1 -0
  44. package/dist/esm/hooks/useQuery/useQuery.mjs.map +1 -1
  45. package/dist/esm/hooks/useShallowEffect/useShallowEffect.mjs +23 -0
  46. package/dist/esm/hooks/useShallowEffect/useShallowEffect.mjs.map +1 -0
  47. package/dist/esm/hooks/useStorage/useStorage.mjs +6 -1
  48. package/dist/esm/hooks/useStorage/useStorage.mjs.map +1 -1
  49. package/dist/esm/hooks/useThrottleCallback/useThrottleCallback.mjs +13 -6
  50. package/dist/esm/hooks/useThrottleCallback/useThrottleCallback.mjs.map +1 -1
  51. package/dist/esm/hooks/useWizard/useWizard.mjs.map +1 -1
  52. package/dist/esm/index.mjs +336 -325
  53. package/dist/esm/index.mjs.map +1 -1
  54. package/dist/types/hooks/index.d.ts +4 -0
  55. package/dist/types/hooks/useAudio/useAudio.d.ts +58 -0
  56. package/dist/types/hooks/useCopy/useCopy.d.ts +1 -1
  57. package/dist/types/hooks/useCssVar/useCssVar.d.ts +6 -4
  58. package/dist/types/hooks/useDoubleClick/useDoubleClick.d.ts +4 -0
  59. package/dist/types/hooks/useHash/useHash.d.ts +3 -2
  60. package/dist/types/hooks/useMediaControls/useMediaControls.d.ts +101 -0
  61. package/dist/types/hooks/usePictureInPicture/usePictureInPicture.d.ts +53 -0
  62. package/dist/types/hooks/useShallowEffect/useShallowEffect.d.ts +14 -0
  63. package/dist/types/hooks/useStorage/useStorage.d.ts +1 -5
  64. package/dist/types/hooks/useThrottleCallback/useThrottleCallback.d.ts +4 -1
  65. package/dist/types/hooks/useWizard/useWizard.d.ts +1 -1
  66. package/package.json +3 -3
package/README.md CHANGED
@@ -1,71 +1,71 @@
1
- <div align="center">
2
- <a href="https://reactuse.dev">
3
- <picture>
4
- <img alt="React Use logo" src="https://siberiacancode.github.io/reactuse/logo.svg" height="128">
5
- </picture>
6
- </a>
7
- <h1>React Use</h1>
8
-
9
- <a href="https://www.npmjs.com/package/@siberiacancode/reactuse"><img alt="NPM version" src="https://img.shields.io/npm/v/@siberiacancode/reactuse.svg?style=for-the-badge&labelColor=000000"></a>
10
- <a href="https://github.com/siberiacancode/reactuse/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/npm/l/@siberiacancode/reactuse.svg?style=for-the-badge&labelColor=000000"></a>
11
- <a href="https://github.com/siberiacancode/reactuse/discussions"><img alt="Join the community on GitHub" src="https://img.shields.io/badge/Join%20the%20community-blueviolet.svg?style=for-the-badge&logo=React&labelColor=000000&logoWidth=20"></a>
12
-
13
- </div>
14
-
15
- React Use delivers **production-ready hooks** that solve real-world problems. Built with **TypeScript-first** approach, **SSR compatibility**, and **tree-shaking optimization** - everything you need to build modern React applications. Improve your react applications with our library 📦 designed for comfort and speed.
16
-
17
- ## Documentation
18
-
19
- Visit https://siberiacancode.github.io/reactuse to view the full documentation.
20
-
21
- ## Getting Started
22
-
23
- ```bash
24
- npm install @siberiacancode/reactuse
25
- ```
26
-
27
- ```tsx
28
- import { useCounter } from "@siberiacancode/reactuse";
29
-
30
- function App() {
31
- const counter = useCounter(0);
32
-
33
- return (
34
- <div>
35
- <h1>Count: {counter.value}</h1>
36
- <button onClick={() => counter.inc()}>+1</button>
37
- <button onClick={() => counter.dec()}>-1</button>
38
- </div>
39
- );
40
- }
41
- ```
42
-
43
- ## CLI installation
44
-
45
- Use the CLI to add hooks to your project with [useverse](https://www.npmjs.com/package/useverse).
46
-
47
- ```bash
48
- npx useverse@latest init
49
- ```
50
-
51
- ```bash
52
- npx useverse@latest add [hook]
53
- ```
54
-
55
- You will be presented with a list of hooks to choose from:
56
-
57
- ```bash
58
- Which hooks would you like to add? › Space to select. A to toggle all.
59
- Enter to submit.
60
-
61
- ◯ useActiveElement
62
- ◯ useAsync
63
- ◯ useBattery
64
- ◯ useBluetooth
65
- ◯ useBoolean
66
- ◯ useBreakpoints
67
- ◯ useBrowserLanguage
68
- ◯ useClickOutside
69
- ◯ useClipboard
70
- ◯ useConst
71
- ```
1
+ <div align="center">
2
+ <a href="https://reactuse.dev">
3
+ <picture>
4
+ <img alt="React Use logo" src="https://siberiacancode.github.io/reactuse/logo.svg" height="128">
5
+ </picture>
6
+ </a>
7
+ <h1>React Use</h1>
8
+
9
+ <a href="https://www.npmjs.com/package/@siberiacancode/reactuse"><img alt="NPM version" src="https://img.shields.io/npm/v/@siberiacancode/reactuse.svg?style=for-the-badge&labelColor=000000"></a>
10
+ <a href="https://github.com/siberiacancode/reactuse/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/npm/l/@siberiacancode/reactuse.svg?style=for-the-badge&labelColor=000000"></a>
11
+ <a href="https://github.com/siberiacancode/reactuse/discussions"><img alt="Join the community on GitHub" src="https://img.shields.io/badge/Join%20the%20community-blueviolet.svg?style=for-the-badge&logo=React&labelColor=000000&logoWidth=20"></a>
12
+
13
+ </div>
14
+
15
+ React Use delivers **production-ready hooks** that solve real-world problems. Built with **TypeScript-first** approach, **SSR compatibility**, and **tree-shaking optimization** - everything you need to build modern React applications. Improve your react applications with our library 📦 designed for comfort and speed.
16
+
17
+ ## Documentation
18
+
19
+ Visit https://siberiacancode.github.io/reactuse to view the full documentation.
20
+
21
+ ## Getting Started
22
+
23
+ ```bash
24
+ npm install @siberiacancode/reactuse
25
+ ```
26
+
27
+ ```tsx
28
+ import { useCounter } from '@siberiacancode/reactuse';
29
+
30
+ const App = () => {
31
+ const counter = useCounter(0);
32
+
33
+ return (
34
+ <div>
35
+ <h1>Count: {counter.value}</h1>
36
+ <button onClick={() => counter.inc()}>+1</button>
37
+ <button onClick={() => counter.dec()}>-1</button>
38
+ </div>
39
+ );
40
+ };
41
+ ```
42
+
43
+ ## CLI installation
44
+
45
+ Use the CLI to add hooks to your project with [useverse](https://www.npmjs.com/package/useverse).
46
+
47
+ ```bash
48
+ npx useverse@latest init
49
+ ```
50
+
51
+ ```bash
52
+ npx useverse@latest add [hook]
53
+ ```
54
+
55
+ You will be presented with a list of hooks to choose from:
56
+
57
+ ```bash
58
+ Which hooks would you like to add? › Space to select. A to toggle all.
59
+ Enter to submit.
60
+
61
+ ◯ useActiveElement
62
+ ◯ useAsync
63
+ ◯ useBattery
64
+ ◯ useBluetooth
65
+ ◯ useBoolean
66
+ ◯ useBreakpoints
67
+ ◯ useBrowserLanguage
68
+ ◯ useClickOutside
69
+ ◯ useClipboard
70
+ ◯ useConst
71
+ ```
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react"),h=(i,r={})=>{const[l,s]=u.useState(!1),[m,d]=u.useState(r.volume??1),[v,y]=u.useState(r.playbackRate??1),t=u.useRef(null);u.useEffect(()=>{const e=new Audio(i);e.volume=m,e.playbackRate=v,t.current=e,r.immediately&&e.play();const n=()=>s(!0),c=()=>s(!1),a=()=>s(!1),p=()=>{},f=()=>d(e.volume),E=()=>y(e.playbackRate);return e.addEventListener("play",n),e.addEventListener("pause",c),e.addEventListener("ended",a),e.addEventListener("timeupdate",p),e.addEventListener("volumechange",f),e.addEventListener("ratechange",E),()=>{e.removeEventListener("play",n),e.removeEventListener("pause",c),e.removeEventListener("ended",a),e.removeEventListener("timeupdate",p),e.removeEventListener("volumechange",f),e.removeEventListener("ratechange",E),e.pause(),e.remove()}},[i]);const o=()=>{t.current&&(t.current.pause(),t.current.currentTime=0)};return{play:async e=>{if(!t.current)return;if(r.interrupt&&o(),!e||!r.sprite?.[e]){await t.current.play();return}const[n,c]=r.sprite[e];t.current.currentTime=n,await t.current.play();const a=()=>{t.current&&(t.current.currentTime>=c&&o(),l&&requestAnimationFrame(a))};requestAnimationFrame(a)},pause:()=>t.current?.pause(),stop:o,playing:l,setVolume:e=>{if(!t.current)return;const n=Math.max(0,Math.min(1,e));t.current.volume=n,d(n)},volume:m,changePlaybackRate:e=>{if(!t.current)return;const n=Math.max(.5,Math.min(2,e));t.current.playbackRate=n,y(n)},playbackRate:v}};exports.useAudio=h;
2
+ //# sourceMappingURL=useAudio.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAudio.cjs","sources":["../../../../src/hooks/useAudio/useAudio.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\n/** Type sprite map */\nexport interface SpriteMap {\n /** [start time in seconds, end time in seconds] */\n [key: string]: [number, number];\n}\n\n/** Type use audio options */\nexport interface UseAudioOptions {\n /** Whether audio playback is initially enabled */\n immediately?: boolean;\n /** Whether to stop current playback when starting a new one */\n interrupt?: boolean;\n /** Initial playback speed (0.5 to 2) */\n playbackRate?: number;\n /** Map of named audio segments for sprite-based playback */\n sprite?: SpriteMap;\n /** Initial volume level (0 to 1) */\n volume?: number;\n}\n\n/** Type use audio return type */\nexport interface UseAudioReturn {\n /** Current playback speed (0.5 to 2) */\n playbackRate: number;\n /** Whether audio is currently playing */\n playing: boolean;\n /** Current volume level (0 to 1) */\n volume: number;\n /** Set playback speed (0.5 to 2) */\n changePlaybackRate: (value: number) => void;\n /** Pause audio playback at current position */\n pause: () => void;\n /** Start audio playback from the beginning or specified sprite segment */\n play: (sprite?: string) => Promise<void>;\n /** Set audio volume level (0 to 1) */\n setVolume: (value: number) => void;\n /** Stop audio playback and reset position to start */\n stop: () => void;\n}\n\n/**\n * @name useAudio\n * @description - Hook that manages audio playback with sprite support\n * @category Browser\n *\n * @browserapi Audio https://developer.mozilla.org/en-US/docs/Web/API/Audio\n *\n * @template Value The type of the value\n * @param {string} url The URL of the audio file to play\n * @param {UseAudioOptions} [options] Audio configuration options\n * @param {number} [options.volume=1] Initial volume level (0 to 1)\n * @param {number} [options.playbackRate=1] Initial playback speed (0.5 to 2)\n * @param {boolean} [options.interrupt=false] Whether to stop current playback when starting a new one\n * @param {boolean} [options.soundEnabled=true] Whether audio playback is initially enabled\n * @param {SpriteMap} [options.sprite] Map of named audio segments for sprite-based playback\n * @returns {UseAudioReturn} An object containing audio controls and state\n *\n * @example\n * const audio = useAudio(\"/path/to/sound.mp3\");\n */\nexport const useAudio = (\n src: string,\n options: UseAudioOptions = {}\n): UseAudioReturn => {\n const [playing, setPlaying] = useState(false);\n const [volume, setCurrentVolume] = useState(options.volume ?? 1);\n const [playbackRate, setPlaybackRate] = useState(options.playbackRate ?? 1);\n\n const audioRef = useRef<HTMLAudioElement | null>(null);\n\n useEffect(() => {\n const audio = new Audio(src);\n\n audio.volume = volume;\n audio.playbackRate = playbackRate;\n audioRef.current = audio;\n\n if (options.immediately) audio.play();\n\n const onPlay = () => setPlaying(true);\n const onPause = () => setPlaying(false);\n const onEnded = () => setPlaying(false);\n const onTimeUpdate = () => {};\n const onVolumeChange = () => setCurrentVolume(audio.volume);\n const onRateChange = () => setPlaybackRate(audio.playbackRate);\n\n audio.addEventListener(\"play\", onPlay);\n audio.addEventListener(\"pause\", onPause);\n audio.addEventListener(\"ended\", onEnded);\n audio.addEventListener(\"timeupdate\", onTimeUpdate);\n audio.addEventListener(\"volumechange\", onVolumeChange);\n audio.addEventListener(\"ratechange\", onRateChange);\n\n return () => {\n audio.removeEventListener(\"play\", onPlay);\n audio.removeEventListener(\"pause\", onPause);\n audio.removeEventListener(\"ended\", onEnded);\n audio.removeEventListener(\"timeupdate\", onTimeUpdate);\n audio.removeEventListener(\"volumechange\", onVolumeChange);\n audio.removeEventListener(\"ratechange\", onRateChange);\n\n audio.pause();\n audio.remove();\n };\n }, [src]);\n\n const stop = () => {\n if (!audioRef.current) return;\n audioRef.current.pause();\n audioRef.current.currentTime = 0;\n };\n\n const play = async (spriteName?: string) => {\n if (!audioRef.current) return;\n if (options.interrupt) stop();\n\n if (!spriteName || !options.sprite?.[spriteName]) {\n await audioRef.current.play();\n return;\n }\n\n const [start, end] = options.sprite[spriteName];\n audioRef.current.currentTime = start;\n await audioRef.current.play();\n\n const checkTime = () => {\n if (!audioRef.current) return;\n if (audioRef.current.currentTime >= end) {\n stop();\n }\n\n if (!playing) return;\n\n requestAnimationFrame(checkTime);\n };\n\n requestAnimationFrame(checkTime);\n };\n\n const pause = () => audioRef.current?.pause();\n\n const setVolume = (value: number) => {\n if (!audioRef.current) return;\n const newVolume = Math.max(0, Math.min(1, value));\n audioRef.current.volume = newVolume;\n setCurrentVolume(newVolume);\n };\n\n const changePlaybackRate = (value: number) => {\n if (!audioRef.current) return;\n const newRate = Math.max(0.5, Math.min(2, value));\n audioRef.current.playbackRate = newRate;\n setPlaybackRate(newRate);\n };\n\n return {\n play,\n pause,\n stop,\n playing,\n setVolume,\n volume,\n changePlaybackRate,\n playbackRate,\n };\n};\n"],"names":["useAudio","src","options","playing","setPlaying","useState","volume","setCurrentVolume","playbackRate","setPlaybackRate","audioRef","useRef","useEffect","audio","onPlay","onPause","onEnded","onTimeUpdate","onVolumeChange","onRateChange","stop","spriteName","start","end","checkTime","value","newVolume","newRate"],"mappings":"yGA8DaA,EAAW,CACtBC,EACAC,EAA2B,KACR,CACnB,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtC,CAACC,EAAQC,CAAgB,EAAIF,EAAAA,SAASH,EAAQ,QAAU,CAAC,EACzD,CAACM,EAAcC,CAAe,EAAIJ,EAAAA,SAASH,EAAQ,cAAgB,CAAC,EAEpEQ,EAAWC,EAAAA,OAAgC,IAAI,EAErDC,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAQ,IAAI,MAAMZ,CAAG,EAE3BY,EAAM,OAASP,EACfO,EAAM,aAAeL,EACrBE,EAAS,QAAUG,EAEfX,EAAQ,aAAaW,EAAM,KAAA,EAE/B,MAAMC,EAAS,IAAMV,EAAW,EAAI,EAC9BW,EAAU,IAAMX,EAAW,EAAK,EAChCY,EAAU,IAAMZ,EAAW,EAAK,EAChCa,EAAe,IAAM,CAAA,EACrBC,EAAiB,IAAMX,EAAiBM,EAAM,MAAM,EACpDM,EAAe,IAAMV,EAAgBI,EAAM,YAAY,EAE7D,OAAAA,EAAM,iBAAiB,OAAQC,CAAM,EACrCD,EAAM,iBAAiB,QAASE,CAAO,EACvCF,EAAM,iBAAiB,QAASG,CAAO,EACvCH,EAAM,iBAAiB,aAAcI,CAAY,EACjDJ,EAAM,iBAAiB,eAAgBK,CAAc,EACrDL,EAAM,iBAAiB,aAAcM,CAAY,EAE1C,IAAM,CACXN,EAAM,oBAAoB,OAAQC,CAAM,EACxCD,EAAM,oBAAoB,QAASE,CAAO,EAC1CF,EAAM,oBAAoB,QAASG,CAAO,EAC1CH,EAAM,oBAAoB,aAAcI,CAAY,EACpDJ,EAAM,oBAAoB,eAAgBK,CAAc,EACxDL,EAAM,oBAAoB,aAAcM,CAAY,EAEpDN,EAAM,MAAA,EACNA,EAAM,OAAA,CAAO,CACf,EACC,CAACZ,CAAG,CAAC,EAER,MAAMmB,EAAO,IAAM,CACZV,EAAS,UACdA,EAAS,QAAQ,MAAA,EACjBA,EAAS,QAAQ,YAAc,EAAA,EA8CjC,MAAO,CACL,KA5CW,MAAOW,GAAwB,CAC1C,GAAI,CAACX,EAAS,QAAS,OAGvB,GAFIR,EAAQ,WAAWkB,EAAA,EAEnB,CAACC,GAAc,CAACnB,EAAQ,SAASmB,CAAU,EAAG,CAChD,MAAMX,EAAS,QAAQ,KAAA,EACvB,MAAA,CAGF,KAAM,CAACY,EAAOC,CAAG,EAAIrB,EAAQ,OAAOmB,CAAU,EAC9CX,EAAS,QAAQ,YAAcY,EAC/B,MAAMZ,EAAS,QAAQ,KAAA,EAEvB,MAAMc,EAAY,IAAM,CACjBd,EAAS,UACVA,EAAS,QAAQ,aAAea,GAClCH,EAAA,EAGGjB,GAEL,sBAAsBqB,CAAS,EAAA,EAGjC,sBAAsBA,CAAS,CAAA,EAqB/B,MAlBY,IAAMd,EAAS,SAAS,MAAA,EAmBpC,KAAAU,EACA,QAAAjB,EACA,UAnBiBsB,GAAkB,CACnC,GAAI,CAACf,EAAS,QAAS,OACvB,MAAMgB,EAAY,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGD,CAAK,CAAC,EAChDf,EAAS,QAAQ,OAASgB,EAC1BnB,EAAiBmB,CAAS,CAAA,EAgB1B,OAAApB,EACA,mBAd0BmB,GAAkB,CAC5C,GAAI,CAACf,EAAS,QAAS,OACvB,MAAMiB,EAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAGF,CAAK,CAAC,EAChDf,EAAS,QAAQ,aAAeiB,EAChClB,EAAgBkB,CAAO,CAAA,EAWvB,aAAAnB,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),r=require("../../utils/helpers/copy.cjs"),p=(s=1e3)=>{const[c,u]=t.useState(null),[a,e]=t.useState(!1);return{value:c,copied:a,copy:async o=>{await r.copy(o),u(o),e(!0),setTimeout(()=>e(!1),s)}}};exports.useCopy=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),u=require("../../utils/helpers/copy.cjs"),p=(s=1e3)=>{const[c,a]=t.useState(),[r,e]=t.useState(!1);return{value:c,copied:r,copy:async o=>{await u.copy(o),a(o),e(!0),setTimeout(()=>e(!1),s)}}};exports.useCopy=p;
2
2
  //# sourceMappingURL=useCopy.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCopy.cjs","sources":["../../../../src/hooks/useCopy/useCopy.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { copy } from '@/utils/helpers';\n\n/** The use copy return type */\nexport interface UseCopyReturn {\n /** Whether copy is in progress */\n copied: boolean;\n /** The copied value */\n value: string | null;\n /** Function to copy text */\n copy: (value: string) => Promise<void>;\n}\n\n/** The use copy params type */\nexport interface UseCopyParams {\n /** Reset delay in milliseconds */\n resetDelay?: number;\n}\n\n/**\n * @name useCopy\n * @description - Hook that manages copying text with status reset\n * @category Browser\n *\n * @browserapi navigator.clipboard https://developer.mozilla.org/en-US/docs/Web/API/Navigator/clipboard\n *\n * @param {number} [delay=1000] Delay in ms before resetting copied status\n * @returns {UseCopyReturn} An object containing the copied value, status and copy function\n *\n * @example\n * const { copied, value, copy } = useCopy();\n */\nexport const useCopy = (delay: number = 1000): UseCopyReturn => {\n const [value, setValue] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n\n const copyToClipboard = async (text: string) => {\n await copy(text);\n setValue(text);\n setCopied(true);\n setTimeout(() => setCopied(false), delay);\n };\n\n return { value, copied, copy: copyToClipboard };\n};\n"],"names":["useCopy","delay","value","setValue","useState","copied","setCopied","text","copy"],"mappings":"mJAiCaA,EAAU,CAACC,EAAgB,MAAwB,CAC9D,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAwB,IAAI,EAChD,CAACC,EAAQC,CAAS,EAAIF,EAAAA,SAAS,EAAK,EAS1C,MAAO,CAAE,MAAAF,EAAO,OAAAG,EAAQ,KAPA,MAAOE,GAAiB,CAC9C,MAAMC,EAAAA,KAAKD,CAAI,EACfJ,EAASI,CAAI,EACbD,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAGL,CAAK,CAAA,CAGZ,CAChC"}
1
+ {"version":3,"file":"useCopy.cjs","sources":["../../../../src/hooks/useCopy/useCopy.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { copy } from '@/utils/helpers';\n\n/** The use copy return type */\nexport interface UseCopyReturn {\n /** Whether copy is in progress */\n copied: boolean;\n /** The copied value */\n value?: string;\n /** Function to copy text */\n copy: (value: string) => Promise<void>;\n}\n\n/** The use copy params type */\nexport interface UseCopyParams {\n /** Reset delay in milliseconds */\n resetDelay?: number;\n}\n\n/**\n * @name useCopy\n * @description - Hook that manages copying text with status reset\n * @category Browser\n *\n * @browserapi navigator.clipboard https://developer.mozilla.org/en-US/docs/Web/API/Navigator/clipboard\n *\n * @param {number} [delay=1000] Delay in ms before resetting copied status\n * @returns {UseCopyReturn} An object containing the copied value, status and copy function\n *\n * @example\n * const { copied, value, copy } = useCopy();\n */\nexport const useCopy = (delay: number = 1000): UseCopyReturn => {\n const [value, setValue] = useState<string | undefined>();\n const [copied, setCopied] = useState(false);\n\n const copyToClipboard = async (text: string) => {\n await copy(text);\n setValue(text);\n setCopied(true);\n setTimeout(() => setCopied(false), delay);\n };\n\n return { value, copied, copy: copyToClipboard };\n};\n"],"names":["useCopy","delay","value","setValue","useState","copied","setCopied","text","copy"],"mappings":"mJAiCaA,EAAU,CAACC,EAAgB,MAAwB,CAC9D,KAAM,CAACC,EAAOC,CAAQ,EAAIC,WAAA,EACpB,CAACC,EAAQC,CAAS,EAAIF,EAAAA,SAAS,EAAK,EAS1C,MAAO,CAAE,MAAAF,EAAO,OAAAG,EAAQ,KAPA,MAAOE,GAAiB,CAC9C,MAAMC,EAAAA,KAAKD,CAAI,EACfJ,EAASI,CAAI,EACbD,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAGL,CAAK,CAAA,CAGZ,CAChC"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react"),d=require("../useRefState/useRefState.cjs"),m=require("../../utils/helpers/isTarget.cjs"),g=require("../../utils/helpers/getElement.cjs"),b=(...r)=>{const e=m.isTarget(r[0])?r[0]:void 0,u=e?r[1]:r[0],o=e?r[2]:r[1],[f,c]=l.useState(o??""),s=d.useRefState(window.document.documentElement),i=t=>{const n=e?g.getElement(e):s.current;if(n&&n.style){if(!t){n.style.removeProperty(u),c(t);return}n.style.setProperty(u,t),c(t)}};return l.useEffect(()=>{o&&i(o)},[]),l.useEffect(()=>{if(!e&&!s.state)return;const t=e?g.getElement(e):s.current;if(!t)return;const n=()=>{const y=window.getComputedStyle(t).getPropertyValue(u)?.trim();c(y??o)},a=new MutationObserver(n);return a.observe(t,{attributeFilter:["style","class"]}),()=>{a.disconnect()}},[e,s.state]),e?{value:f,set:i}:{ref:s,value:f,set:i}};exports.useCssVar=b;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react"),d=require("../useRefState/useRefState.cjs"),v=require("../../utils/helpers/isTarget.cjs"),f=require("../../utils/helpers/getElement.cjs"),E=(...n)=>{const e=v.isTarget(n[0])?n[0]:void 0,u=e?n[1]:n[0],o=e?n[2]:n[1],[a,c]=l.useState(o??""),r=d.useRefState(window.document.documentElement),i=t=>{const s=e?f.getElement(e):r.current;!s||!s.style||(s.style.setProperty(u,t),c(t))},g=()=>{const t=e?f.getElement(e):r.current;!t||!t.style||(t.style.removeProperty(u),c(""))};return l.useEffect(()=>{o&&i(o)},[]),l.useEffect(()=>{if(!e&&!r.state)return;const t=e?f.getElement(e):r.current;if(!t)return;const s=()=>{const m=window.getComputedStyle(t).getPropertyValue(u)?.trim();c(m??o)},y=new MutationObserver(s);return y.observe(t,{attributeFilter:["style","class"]}),()=>{y.disconnect()}},[e,r.state]),e?{value:a,set:i,remove:g}:{ref:r,value:a,set:i,remove:g}};exports.useCssVar=E;
2
2
  //# sourceMappingURL=useCssVar.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCssVar.cjs","sources":["../../../../src/hooks/useCssVar/useCssVar.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { getElement, isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The css variable return type */\nexport interface UseCssVarReturn {\n /** The value of the CSS variable */\n value: string;\n /** Set the value of the CSS variable */\n set: (value: string) => void;\n}\n\nexport interface UseCssVar {\n (key: string, initialValue?: string): UseCssVarReturn & { ref: StateRef<Element> };\n\n (target: HookTarget, key: string, initialValue?: string): UseCssVarReturn;\n}\n\n/**\n * @name useCssVar\n * @description - Hook that returns the value of a css variable\n * @category Utilities\n *\n * @overload\n * @param {string} key The CSS variable key\n * @param {string} initialValue The initial value of the CSS variable\n * @returns {UseCssVarReturn & { ref: StateRef<Element> }} The object containing the value of the CSS variable and ref\n *\n * @example\n * const { ref, value, set } = useCssVar('--color', 'red');\n *\n * @overload\n * @param {HookTarget} target The target element\n * @param {string} key The CSS variable key\n * @param {string} initialValue The initial value of the CSS variable\n * @returns {UseCssVarReturn} The object containing the value of the CSS variable\n *\n * @example\n * const { value, set } = useCssVar(ref, '--color', 'red');\n */\nexport const useCssVar = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const key = (target ? params[1] : params[0]) as string;\n const initialValue = (target ? params[2] : params[1]) as string | undefined;\n\n const [value, setValue] = useState(initialValue ?? '');\n const internalRef = useRefState<Element>(window.document.documentElement);\n\n const set = (value: string) => {\n const element = (target ? getElement(target) : internalRef.current) as HTMLElement;\n if (!element) return;\n\n if (element.style) {\n if (!value) {\n element.style.removeProperty(key);\n setValue(value);\n return;\n }\n\n element.style.setProperty(key, value);\n setValue(value);\n }\n };\n\n useEffect(() => {\n if (initialValue) set(initialValue);\n }, []);\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = (target ? getElement(target) : internalRef.current) as Element;\n if (!element) return;\n\n const onChange = () => {\n const value = window\n .getComputedStyle(element as Element)\n .getPropertyValue(key)\n ?.trim();\n\n setValue(value ?? initialValue);\n };\n\n const observer = new MutationObserver(onChange);\n\n observer.observe(element, { attributeFilter: ['style', 'class'] });\n\n return () => {\n observer.disconnect();\n };\n }, [target, internalRef.state]);\n\n if (target) return { value, set };\n return { ref: internalRef, value, set };\n}) as UseCssVar;\n"],"names":["useCssVar","params","target","isTarget","key","initialValue","value","setValue","useState","internalRef","useRefState","set","element","getElement","useEffect","onChange","observer"],"mappings":"mPA8CaA,EAAa,IAAIC,IAAkB,CAC9C,MAAMC,EAAUC,EAAAA,SAASF,EAAO,CAAC,CAAC,EAAIA,EAAO,CAAC,EAAI,OAC5CG,EAAOF,EAASD,EAAO,CAAC,EAAIA,EAAO,CAAC,EACpCI,EAAgBH,EAASD,EAAO,CAAC,EAAIA,EAAO,CAAC,EAE7C,CAACK,EAAOC,CAAQ,EAAIC,EAAAA,SAASH,GAAgB,EAAE,EAC/CI,EAAcC,EAAAA,YAAqB,OAAO,SAAS,eAAe,EAElEC,EAAOL,GAAkB,CAC7B,MAAMM,EAAWV,EAASW,EAAAA,WAAWX,CAAM,EAAIO,EAAY,QAC3D,GAAKG,GAEDA,EAAQ,MAAO,CACjB,GAAI,CAACN,EAAO,CACVM,EAAQ,MAAM,eAAeR,CAAG,EAChCG,EAASD,CAAK,EACd,MAAA,CAGFM,EAAQ,MAAM,YAAYR,EAAKE,CAAK,EACpCC,EAASD,CAAK,CAAA,CAChB,EA+BF,OA5BAQ,EAAAA,UAAU,IAAM,CACVT,KAAkBA,CAAY,CAAA,EACjC,EAAE,EAELS,EAAAA,UAAU,IAAM,CACd,GAAI,CAACZ,GAAU,CAACO,EAAY,MAAO,OAEnC,MAAMG,EAAWV,EAASW,EAAAA,WAAWX,CAAM,EAAIO,EAAY,QAC3D,GAAI,CAACG,EAAS,OAEd,MAAMG,EAAW,IAAM,CACrB,MAAMT,EAAQ,OACX,iBAAiBM,CAAkB,EACnC,iBAAiBR,CAAG,GACnB,KAAA,EAEJG,EAASD,GAASD,CAAY,CAAA,EAG1BW,EAAW,IAAI,iBAAiBD,CAAQ,EAE9C,OAAAC,EAAS,QAAQJ,EAAS,CAAE,gBAAiB,CAAC,QAAS,OAAO,EAAG,EAE1D,IAAM,CACXI,EAAS,WAAA,CAAW,CACtB,EACC,CAACd,EAAQO,EAAY,KAAK,CAAC,EAE1BP,EAAe,CAAE,MAAAI,EAAO,IAAAK,CAAA,EACrB,CAAE,IAAKF,EAAa,MAAAH,EAAO,IAAAK,CAAA,CACpC"}
1
+ {"version":3,"file":"useCssVar.cjs","sources":["../../../../src/hooks/useCssVar/useCssVar.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { getElement, isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The css variable return type */\nexport interface UseCssVarReturn {\n /** The value of the CSS variable */\n value: string;\n /** Remove the value of the CSS variable */\n remove: () => void;\n /** Set the value of the CSS variable */\n set: (value: string) => void;\n}\n\nexport interface UseCssVar {\n <Target extends HTMLElement>(\n key: string,\n initialValue?: string\n ): UseCssVarReturn & {\n ref: StateRef<Target>;\n };\n\n (target: HookTarget, key: string, initialValue?: string): UseCssVarReturn;\n}\n\n/**\n * @name useCssVar\n * @description - Hook that returns the value of a css variable\n * @category Utilities\n *\n * @overload\n * @param {string} key The CSS variable key\n * @param {string} initialValue The initial value of the CSS variable\n * @returns {UseCssVarReturn & { ref: StateRef<Element> }} The object containing the value of the CSS variable and ref\n *\n * @example\n * const { ref, value, set, remove } = useCssVar('--color', 'red');\n *\n * @overload\n * @param {HookTarget} target The target element\n * @param {string} key The CSS variable key\n * @param {string} initialValue The initial value of the CSS variable\n * @returns {UseCssVarReturn} The object containing the value of the CSS variable\n *\n * @example\n * const { value, set, remove } = useCssVar(ref, '--color', 'red');\n */\nexport const useCssVar = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const key = (target ? params[1] : params[0]) as string;\n const initialValue = (target ? params[2] : params[1]) as string | undefined;\n\n const [value, setValue] = useState(initialValue ?? '');\n const internalRef = useRefState<HTMLElement>(window.document.documentElement);\n\n const set = (value: string) => {\n const element = (target ? getElement(target) : internalRef.current) as HTMLElement;\n\n if (!element || !element.style) return;\n\n element.style.setProperty(key, value);\n setValue(value);\n };\n\n const remove = () => {\n const element = (target ? getElement(target) : internalRef.current) as HTMLElement;\n\n if (!element || !element.style) return;\n\n element.style.removeProperty(key);\n setValue('');\n };\n\n useEffect(() => {\n if (initialValue) set(initialValue);\n }, []);\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = (target ? getElement(target) : internalRef.current) as HTMLElement;\n\n if (!element) return;\n\n const onChange = () => {\n const value = window.getComputedStyle(element).getPropertyValue(key)?.trim();\n\n setValue(value ?? initialValue);\n };\n\n const observer = new MutationObserver(onChange);\n\n observer.observe(element, { attributeFilter: ['style', 'class'] });\n\n return () => {\n observer.disconnect();\n };\n }, [target, internalRef.state]);\n\n if (target) return { value, set, remove };\n return { ref: internalRef, value, set, remove };\n}) as UseCssVar;\n"],"names":["useCssVar","params","target","isTarget","key","initialValue","value","setValue","useState","internalRef","useRefState","set","element","getElement","remove","useEffect","onChange","observer"],"mappings":"mPAqDaA,EAAa,IAAIC,IAAkB,CAC9C,MAAMC,EAAUC,EAAAA,SAASF,EAAO,CAAC,CAAC,EAAIA,EAAO,CAAC,EAAI,OAC5CG,EAAOF,EAASD,EAAO,CAAC,EAAIA,EAAO,CAAC,EACpCI,EAAgBH,EAASD,EAAO,CAAC,EAAIA,EAAO,CAAC,EAE7C,CAACK,EAAOC,CAAQ,EAAIC,EAAAA,SAASH,GAAgB,EAAE,EAC/CI,EAAcC,EAAAA,YAAyB,OAAO,SAAS,eAAe,EAEtEC,EAAOL,GAAkB,CAC7B,MAAMM,EAAWV,EAASW,EAAAA,WAAWX,CAAM,EAAIO,EAAY,QAEvD,CAACG,GAAW,CAACA,EAAQ,QAEzBA,EAAQ,MAAM,YAAYR,EAAKE,CAAK,EACpCC,EAASD,CAAK,EAAA,EAGVQ,EAAS,IAAM,CACnB,MAAMF,EAAWV,EAASW,EAAAA,WAAWX,CAAM,EAAIO,EAAY,QAEvD,CAACG,GAAW,CAACA,EAAQ,QAEzBA,EAAQ,MAAM,eAAeR,CAAG,EAChCG,EAAS,EAAE,EAAA,EA6Bb,OA1BAQ,EAAAA,UAAU,IAAM,CACVV,KAAkBA,CAAY,CAAA,EACjC,EAAE,EAELU,EAAAA,UAAU,IAAM,CACd,GAAI,CAACb,GAAU,CAACO,EAAY,MAAO,OAEnC,MAAMG,EAAWV,EAASW,EAAAA,WAAWX,CAAM,EAAIO,EAAY,QAE3D,GAAI,CAACG,EAAS,OAEd,MAAMI,EAAW,IAAM,CACrB,MAAMV,EAAQ,OAAO,iBAAiBM,CAAO,EAAE,iBAAiBR,CAAG,GAAG,KAAA,EAEtEG,EAASD,GAASD,CAAY,CAAA,EAG1BY,EAAW,IAAI,iBAAiBD,CAAQ,EAE9C,OAAAC,EAAS,QAAQL,EAAS,CAAE,gBAAiB,CAAC,QAAS,OAAO,EAAG,EAE1D,IAAM,CACXK,EAAS,WAAA,CAAW,CACtB,EACC,CAACf,EAAQO,EAAY,KAAK,CAAC,EAE1BP,EAAe,CAAE,MAAAI,EAAO,IAAAK,EAAK,OAAAG,CAAA,EAC1B,CAAE,IAAKL,EAAa,MAAAH,EAAO,IAAAK,EAAK,OAAAG,CAAA,CACzC"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),a=(n,t)=>{const r=c.useRef(n),e=c.useRef(null),u=c.useRef(t);return r.current=n,u.current=t,c.useMemo(()=>{const o=()=>{e.current&&(clearTimeout(e.current),e.current=void 0)},s=function(...l){o(),e.current=setTimeout(()=>{r.current.apply(this,l)},u.current)};return s.cancel=o,s},[])};exports.useDebounceCallback=a;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react"),a=(t,c)=>{const r=n.useRef(t),e=n.useRef(null),u=n.useRef(c);return r.current=t,u.current=c,n.useMemo(()=>{const o=()=>{e.current&&(clearTimeout(e.current),e.current=null)},l=function(...s){o(),e.current=setTimeout(()=>{r.current.apply(this,s)},u.current)};return l.cancel=o,l},[])};exports.useDebounceCallback=a;
2
2
  //# sourceMappingURL=useDebounceCallback.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDebounceCallback.cjs","sources":["../../../../src/hooks/useDebounceCallback/useDebounceCallback.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\n\nexport type DebouncedCallback<Params extends unknown[]> = ((...args: Params) => void) & {\n cancel: () => void;\n};\n\n/**\n * @name useDebounceCallback\n * @description - Hook that creates a debounced callback\n * @category Utilities\n *\n * @template Params The type of the params\n * @template Return The type of the return\n * @param {(...args: Params) => Return} callback The callback function\n * @param {number} delay The delay in milliseconds\n * @returns {(...args: Params) => Return} The callback with debounce\n *\n * @example\n * const debouncedCallback = useDebounceCallback(() => console.log('callback'), 500);\n */\nexport const useDebounceCallback = <Params extends unknown[], Return>(\n callback: (...args: Params) => Return,\n delay: number\n): DebouncedCallback<Params> => {\n const internalCallbackRef = useRef(callback);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const delayRef = useRef(delay);\n\n internalCallbackRef.current = callback;\n delayRef.current = delay;\n\n const debounced = useMemo(() => {\n const cancel = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined as any;\n }\n };\n\n const debouncedCallback = function (this: any, ...args: Params) {\n cancel();\n timerRef.current = setTimeout(() => {\n internalCallbackRef.current.apply(this, args);\n }, delayRef.current);\n };\n\n debouncedCallback.cancel = cancel;\n\n return debouncedCallback;\n }, []);\n\n return debounced;\n};\n"],"names":["useDebounceCallback","callback","delay","internalCallbackRef","useRef","timerRef","delayRef","useMemo","cancel","debouncedCallback","args"],"mappings":"yGAoBaA,EAAsB,CACjCC,EACAC,IAC8B,CAC9B,MAAMC,EAAsBC,EAAAA,OAAOH,CAAQ,EACrCI,EAAWD,EAAAA,OAA6C,IAAI,EAC5DE,EAAWF,EAAAA,OAAOF,CAAK,EAE7B,OAAAC,EAAoB,QAAUF,EAC9BK,EAAS,QAAUJ,EAEDK,EAAAA,QAAQ,IAAM,CAC9B,MAAMC,EAAS,IAAM,CACfH,EAAS,UACX,aAAaA,EAAS,OAAO,EAC7BA,EAAS,QAAU,OACrB,EAGII,EAAoB,YAAwBC,EAAc,CAC9DF,EAAA,EACAH,EAAS,QAAU,WAAW,IAAM,CAClCF,EAAoB,QAAQ,MAAM,KAAMO,CAAI,CAAA,EAC3CJ,EAAS,OAAO,CAAA,EAGrB,OAAAG,EAAkB,OAASD,EAEpBC,CAAA,EACN,EAAE,CAGP"}
1
+ {"version":3,"file":"useDebounceCallback.cjs","sources":["../../../../src/hooks/useDebounceCallback/useDebounceCallback.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\n\nexport type DebouncedCallback<Params extends unknown[]> = ((...args: Params) => void) & {\n cancel: () => void;\n};\n\n/**\n * @name useDebounceCallback\n * @description - Hook that creates a debounced callback\n * @category Utilities\n *\n * @template Params The type of the params\n * @template Return The type of the return\n * @param {(...args: Params) => Return} callback The callback function\n * @param {number} delay The delay in milliseconds\n * @returns {(...args: Params) => Return} The callback with debounce\n *\n * @example\n * const debouncedCallback = useDebounceCallback(() => console.log('callback'), 500);\n */\nexport const useDebounceCallback = <Params extends unknown[], Return>(\n callback: (...args: Params) => Return,\n delay: number\n): DebouncedCallback<Params> => {\n const internalCallbackRef = useRef(callback);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const delayRef = useRef(delay);\n\n internalCallbackRef.current = callback;\n delayRef.current = delay;\n\n const debounced = useMemo(() => {\n const cancel = () => {\n if (!timerRef.current) return;\n clearTimeout(timerRef.current);\n timerRef.current = null;\n };\n\n const debouncedCallback = function (this: any, ...args: Params) {\n cancel();\n timerRef.current = setTimeout(() => {\n internalCallbackRef.current.apply(this, args);\n }, delayRef.current);\n };\n\n debouncedCallback.cancel = cancel;\n\n return debouncedCallback;\n }, []);\n\n return debounced;\n};\n"],"names":["useDebounceCallback","callback","delay","internalCallbackRef","useRef","timerRef","delayRef","useMemo","cancel","debouncedCallback","args"],"mappings":"yGAoBaA,EAAsB,CACjCC,EACAC,IAC8B,CAC9B,MAAMC,EAAsBC,EAAAA,OAAOH,CAAQ,EACrCI,EAAWD,EAAAA,OAA6C,IAAI,EAC5DE,EAAWF,EAAAA,OAAOF,CAAK,EAE7B,OAAAC,EAAoB,QAAUF,EAC9BK,EAAS,QAAUJ,EAEDK,EAAAA,QAAQ,IAAM,CAC9B,MAAMC,EAAS,IAAM,CACdH,EAAS,UACd,aAAaA,EAAS,OAAO,EAC7BA,EAAS,QAAU,KAAA,EAGfI,EAAoB,YAAwBC,EAAc,CAC9DF,EAAA,EACAH,EAAS,QAAU,WAAW,IAAM,CAClCF,EAAoB,QAAQ,MAAM,KAAMO,CAAI,CAAA,EAC3CJ,EAAS,OAAO,CAAA,EAGrB,OAAAG,EAAkB,OAASD,EAEpBC,CAAA,EACN,EAAE,CAGP"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDeviceMotion.cjs","sources":["../../../../src/hooks/useDeviceMotion/useDeviceMotion.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport { throttle } from '@/utils/helpers';\n\nexport interface UseDeviceMotionReturn {\n acceleration: DeviceMotionEventAcceleration;\n accelerationIncludingGravity: DeviceMotionEventAcceleration;\n interval: DeviceMotionEvent['interval'];\n rotationRate: DeviceMotionEventRotationRate;\n}\n\nexport interface UseDeviceMotionParams {\n /** The delay in milliseconds */\n delay?: number;\n /** Whether to enable the hook */\n enabled?: boolean;\n /** The callback function to be invoked */\n callback?: (event: DeviceMotionEvent) => void;\n}\n\n/**\n * @name useDeviceMotion\n * @description - Hook that work with device motion\n * @category Utilities\n *\n * @browserapi DeviceMotionEvent https://developer.mozilla.org/en-US/docs/Web/API/Window/DeviceMotionEvent\n *\n * @param {number} [delay=1000] The delay in milliseconds\n * @param {(event: DeviceMotionEvent) => void} [callback] The callback function to be invoked\n * @param {boolean} [enabled=true] Whether to enable the hook\n * @returns {UseDeviceMotionReturn} The device motion data and interval\n *\n * @example\n * const { interval, rotationRate, acceleration, accelerationIncludingGravity } = useDeviceMotion();\n */\nexport const useDeviceMotion = (params?: UseDeviceMotionParams) => {\n const enabled = params?.enabled ?? true;\n const delay = params?.delay ?? 1000;\n const [value, setValue] = useState<UseDeviceMotionReturn>({\n interval: 0,\n rotationRate: { alpha: null, beta: null, gamma: null },\n acceleration: { x: null, y: null, z: null },\n accelerationIncludingGravity: { x: null, y: null, z: null }\n });\n const internalCallbackRef = useRef(params?.callback);\n internalCallbackRef.current = params?.callback;\n\n useEffect(() => {\n if (!enabled) return;\n\n const onDeviceMotion = throttle<[DeviceMotionEvent]>((event) => {\n internalCallbackRef.current?.(event);\n setValue({\n interval: event.interval,\n rotationRate: {\n ...value.rotationRate,\n ...event.rotationRate\n },\n acceleration: {\n ...value.acceleration,\n ...event.acceleration\n },\n accelerationIncludingGravity: {\n ...value.accelerationIncludingGravity,\n ...event.accelerationIncludingGravity\n }\n });\n }, delay);\n\n window.addEventListener('devicemotion', onDeviceMotion);\n\n return () => {\n window.removeEventListener('devicemotion', onDeviceMotion);\n };\n }, [delay, enabled]);\n\n return value;\n};\n"],"names":["useDeviceMotion","params","enabled","delay","value","setValue","useState","internalCallbackRef","useRef","useEffect","onDeviceMotion","throttle","event"],"mappings":"uJAmCaA,EAAmBC,GAAmC,CACjE,MAAMC,EAAUD,GAAQ,SAAW,GAC7BE,EAAQF,GAAQ,OAAS,IACzB,CAACG,EAAOC,CAAQ,EAAIC,WAAgC,CACxD,SAAU,EACV,aAAc,CAAE,MAAO,KAAM,KAAM,KAAM,MAAO,IAAA,EAChD,aAAc,CAAE,EAAG,KAAM,EAAG,KAAM,EAAG,IAAA,EACrC,6BAA8B,CAAE,EAAG,KAAM,EAAG,KAAM,EAAG,IAAA,CAAK,CAC3D,EACKC,EAAsBC,EAAAA,OAAOP,GAAQ,QAAQ,EACnD,OAAAM,EAAoB,QAAUN,GAAQ,SAEtCQ,EAAAA,UAAU,IAAM,CACd,GAAI,CAACP,EAAS,OAEd,MAAMQ,EAAiBC,WAA+BC,GAAU,CAC9DL,EAAoB,UAAUK,CAAK,EACnCP,EAAS,CACP,SAAUO,EAAM,SAChB,aAAc,CACZ,GAAGR,EAAM,aACT,GAAGQ,EAAM,YAAA,EAEX,aAAc,CACZ,GAAGR,EAAM,aACT,GAAGQ,EAAM,YAAA,EAEX,6BAA8B,CAC5B,GAAGR,EAAM,6BACT,GAAGQ,EAAM,4BAAA,CACX,CACD,CAAA,EACAT,CAAK,EAER,cAAO,iBAAiB,eAAgBO,CAAc,EAE/C,IAAM,CACX,OAAO,oBAAoB,eAAgBA,CAAc,CAAA,CAC3D,EACC,CAACP,EAAOD,CAAO,CAAC,EAEZE,CACT"}
1
+ {"version":3,"file":"useDeviceMotion.cjs","sources":["../../../../src/hooks/useDeviceMotion/useDeviceMotion.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport { throttle } from '@/utils/helpers';\n\nexport interface UseDeviceMotionReturn {\n acceleration: DeviceMotionEventAcceleration;\n accelerationIncludingGravity: DeviceMotionEventAcceleration;\n interval: DeviceMotionEvent['interval'];\n rotationRate: DeviceMotionEventRotationRate;\n}\n\nexport interface UseDeviceMotionParams {\n /** The delay in milliseconds */\n delay?: number;\n /** Whether to enable the hook */\n enabled?: boolean;\n /** The callback function to be invoked */\n callback?: (event: DeviceMotionEvent) => void;\n}\n\n/**\n * @name useDeviceMotion\n * @description - Hook that work with device motion\n * @category Utilities\n *\n * @browserapi DeviceMotionEvent https://developer.mozilla.org/en-US/docs/Web/API/Window/DeviceMotionEvent\n *\n * @param {number} [delay=1000] The delay in milliseconds\n * @param {(event: DeviceMotionEvent) => void} [callback] The callback function to be invoked\n * @param {boolean} [enabled=true] Whether to enable the hook\n * @returns {UseDeviceMotionReturn} The device motion data and interval\n *\n * @example\n * const { interval, rotationRate, acceleration, accelerationIncludingGravity } = useDeviceMotion();\n */\nexport const useDeviceMotion = (params?: UseDeviceMotionParams) => {\n const enabled = params?.enabled ?? true;\n const delay = params?.delay ?? 1000;\n const [value, setValue] = useState<UseDeviceMotionReturn>({\n interval: 0,\n rotationRate: { alpha: null, beta: null, gamma: null },\n acceleration: { x: null, y: null, z: null },\n accelerationIncludingGravity: { x: null, y: null, z: null }\n });\n const internalCallbackRef = useRef(params?.callback);\n internalCallbackRef.current = params?.callback;\n\n useEffect(() => {\n if (!enabled) return;\n\n const onDeviceMotion = throttle<[DeviceMotionEvent]>((event) => {\n internalCallbackRef.current?.(event);\n\n setValue({\n interval: event.interval,\n rotationRate: {\n ...value.rotationRate,\n ...event.rotationRate\n },\n acceleration: {\n ...value.acceleration,\n ...event.acceleration\n },\n accelerationIncludingGravity: {\n ...value.accelerationIncludingGravity,\n ...event.accelerationIncludingGravity\n }\n });\n }, delay);\n\n window.addEventListener('devicemotion', onDeviceMotion);\n\n return () => {\n window.removeEventListener('devicemotion', onDeviceMotion);\n };\n }, [delay, enabled]);\n\n return value;\n};\n"],"names":["useDeviceMotion","params","enabled","delay","value","setValue","useState","internalCallbackRef","useRef","useEffect","onDeviceMotion","throttle","event"],"mappings":"uJAmCaA,EAAmBC,GAAmC,CACjE,MAAMC,EAAUD,GAAQ,SAAW,GAC7BE,EAAQF,GAAQ,OAAS,IACzB,CAACG,EAAOC,CAAQ,EAAIC,WAAgC,CACxD,SAAU,EACV,aAAc,CAAE,MAAO,KAAM,KAAM,KAAM,MAAO,IAAA,EAChD,aAAc,CAAE,EAAG,KAAM,EAAG,KAAM,EAAG,IAAA,EACrC,6BAA8B,CAAE,EAAG,KAAM,EAAG,KAAM,EAAG,IAAA,CAAK,CAC3D,EACKC,EAAsBC,EAAAA,OAAOP,GAAQ,QAAQ,EACnD,OAAAM,EAAoB,QAAUN,GAAQ,SAEtCQ,EAAAA,UAAU,IAAM,CACd,GAAI,CAACP,EAAS,OAEd,MAAMQ,EAAiBC,WAA+BC,GAAU,CAC9DL,EAAoB,UAAUK,CAAK,EAEnCP,EAAS,CACP,SAAUO,EAAM,SAChB,aAAc,CACZ,GAAGR,EAAM,aACT,GAAGQ,EAAM,YAAA,EAEX,aAAc,CACZ,GAAGR,EAAM,aACT,GAAGQ,EAAM,YAAA,EAEX,6BAA8B,CAC5B,GAAGR,EAAM,6BACT,GAAGQ,EAAM,4BAAA,CACX,CACD,CAAA,EACAT,CAAK,EAER,cAAO,iBAAiB,eAAgBO,CAAc,EAE/C,IAAM,CACX,OAAO,oBAAoB,eAAgBA,CAAc,CAAA,CAC3D,EACC,CAACP,EAAOD,CAAO,CAAC,EAEZE,CACT"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),R=require("../useRefState/useRefState.cjs"),E=require("../../utils/helpers/isTarget.cjs"),g=require("../../utils/helpers/getElement.cjs"),T=300,k=(...t)=>{const e=E.isTarget(t[0])?t[0]:void 0,l=e?t[1]:t[0],f=e?t[2]:t[1],u=c.useRef(void 0),r=c.useRef(0),o=R.useRefState(),a=c.useRef(l);a.current=l;const i=c.useRef(f);if(i.current=f,c.useEffect(()=>{if(!e&&!o.state)return;const n=e?g.getElement(e):o.current;if(!n)return;const s=d=>{r.current+=1,r.current===1&&(u.current=setTimeout(()=>{i.current?.onSingleClick&&i.current.onSingleClick(d),r.current=0},i.current?.threshold??T)),r.current===2&&(clearTimeout(u.current),a.current(d),r.current=0)};return n.addEventListener("mousedown",s),n.addEventListener("touchstart",s),()=>{n.removeEventListener("mousedown",s),n.removeEventListener("touchstart",s),u.current&&clearTimeout(u.current)}},[e,o.state]),!e)return o};exports.useDoubleClick=k;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),d=require("../useRefState/useRefState.cjs"),T=require("../../utils/helpers/isTarget.cjs"),g=require("../../utils/helpers/getElement.cjs"),R=300,k=(...t)=>{const e=T.isTarget(t[0])?t[0]:void 0,l=e?t[1]:t[0],f=e?t[2]:t[1],u=c.useRef(void 0),r=c.useRef(0),o=d.useRefState(),a=c.useRef(l);a.current=l;const i=c.useRef(f);if(i.current=f,c.useEffect(()=>{if(!e&&!o.state)return;const n=e?g.getElement(e):o.current;if(!n)return;const s=E=>{r.current+=1,r.current===1&&(u.current=setTimeout(()=>{i.current?.onSingleClick&&i.current.onSingleClick(E),r.current=0},i.current?.threshold??R)),r.current===2&&(clearTimeout(u.current),a.current(E),r.current=0)};return n.addEventListener("mousedown",s),n.addEventListener("touchstart",s),()=>{n.removeEventListener("mousedown",s),n.removeEventListener("touchstart",s),u.current&&clearTimeout(u.current)}},[e,o.state]),!e)return o};exports.DEFAULT_THRESHOLD_TIME=R;exports.useDoubleClick=k;
2
2
  //# sourceMappingURL=useDoubleClick.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDoubleClick.cjs","sources":["../../../../src/hooks/useDoubleClick/useDoubleClick.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { getElement, isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\nexport type DoubleClickEvents = MouseEvent | TouchEvent;\n\n// * The use double click options type */\nexport interface UseDoubleClickOptions {\n // * The threshold time in milliseconds between clicks\n threshold?: number;\n // * The callback function to be invoked on single click\n onSingleClick?: (event: DoubleClickEvents) => void;\n}\n\nexport interface UseDoubleClick {\n (\n target: HookTarget,\n callback: (event: DoubleClickEvents) => void,\n options?: UseDoubleClickOptions\n ): boolean;\n\n <Target extends Element>(\n callback: (event: DoubleClickEvents) => void,\n options?: UseDoubleClickOptions,\n target?: never\n ): StateRef<Target>;\n}\n\nconst DEFAULT_THRESHOLD_TIME = 300;\n\n/**\n * @name useDoubleClick\n * @description - Hook that defines the logic when double clicking an element\n * @category Sensors\n *\n * @overload\n * @param {HookTarget} target The target element to be double clicked\n * @param {(event: DoubleClickEvents) => void} callback The callback function to be invoked on double click\n * @param {UseDoubleClickOptions} [options] The options for the double click\n * @returns {boolean} The double clicking state\n *\n * @example\n * useDoubleClick(ref, () => console.log('double clicked'));\n *\n * @overload\n * @template Target The target element\n * @param {(event: DoubleClickEvents) => void} callback The callback function to be invoked on double click\n * @param {UseDoubleClickOptions} [options] The options for the double click\n * @returns {boolean} The double clicking state\n *\n * @example\n * const ref = useDoubleClick(() => console.log('double clicked'));\n *\n * @see {@link https://siberiacancode.github.io/reactuse/functions/hooks/useDoubleClick.html}\n */\nexport const useDoubleClick = ((...params: any[]): any => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const callback = (target ? params[1] : params[0]) as (event: DoubleClickEvents) => void;\n const options = (target ? params[2] : params[1]) as UseDoubleClickOptions | undefined;\n\n const timeoutIdRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const clickCountRef = useRef(0);\n const internalRef = useRefState<Element>();\n\n const internalCallbackRef = useRef(callback);\n internalCallbackRef.current = callback;\n const internalOptionsRef = useRef(options);\n internalOptionsRef.current = options;\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = target ? getElement(target) : internalRef.current;\n if (!element) return;\n\n const onClick = (event: DoubleClickEvents) => {\n clickCountRef.current += 1;\n\n if (clickCountRef.current === 1) {\n timeoutIdRef.current = setTimeout(() => {\n if (internalOptionsRef.current?.onSingleClick)\n internalOptionsRef.current.onSingleClick(event);\n clickCountRef.current = 0;\n }, internalOptionsRef.current?.threshold ?? DEFAULT_THRESHOLD_TIME);\n }\n\n if (clickCountRef.current === 2) {\n clearTimeout(timeoutIdRef.current);\n internalCallbackRef.current(event);\n clickCountRef.current = 0;\n }\n };\n\n element.addEventListener('mousedown', onClick as EventListener);\n element.addEventListener('touchstart', onClick as EventListener);\n\n return () => {\n element.removeEventListener('mousedown', onClick as EventListener);\n element.removeEventListener('touchstart', onClick as EventListener);\n if (timeoutIdRef.current) clearTimeout(timeoutIdRef.current);\n };\n }, [target, internalRef.state]);\n\n if (target) return;\n return internalRef;\n}) as UseDoubleClick;\n"],"names":["DEFAULT_THRESHOLD_TIME","useDoubleClick","params","target","isTarget","callback","options","timeoutIdRef","useRef","clickCountRef","internalRef","useRefState","internalCallbackRef","internalOptionsRef","useEffect","element","getElement","onClick","event"],"mappings":"mPAkCMA,EAAyB,IA2BlBC,EAAkB,IAAIC,IAAuB,CACxD,MAAMC,EAAUC,EAAAA,SAASF,EAAO,CAAC,CAAC,EAAIA,EAAO,CAAC,EAAI,OAC5CG,EAAYF,EAASD,EAAO,CAAC,EAAIA,EAAO,CAAC,EACzCI,EAAWH,EAASD,EAAO,CAAC,EAAIA,EAAO,CAAC,EAExCK,EAAeC,EAAAA,OAAsC,MAAS,EAC9DC,EAAgBD,EAAAA,OAAO,CAAC,EACxBE,EAAcC,EAAAA,YAAA,EAEdC,EAAsBJ,EAAAA,OAAOH,CAAQ,EAC3CO,EAAoB,QAAUP,EAC9B,MAAMQ,EAAqBL,EAAAA,OAAOF,CAAO,EAqCzC,GApCAO,EAAmB,QAAUP,EAE7BQ,EAAAA,UAAU,IAAM,CACd,GAAI,CAACX,GAAU,CAACO,EAAY,MAAO,OAEnC,MAAMK,EAAUZ,EAASa,EAAAA,WAAWb,CAAM,EAAIO,EAAY,QAC1D,GAAI,CAACK,EAAS,OAEd,MAAME,EAAWC,GAA6B,CAC5CT,EAAc,SAAW,EAErBA,EAAc,UAAY,IAC5BF,EAAa,QAAU,WAAW,IAAM,CAClCM,EAAmB,SAAS,eAC9BA,EAAmB,QAAQ,cAAcK,CAAK,EAChDT,EAAc,QAAU,CAAA,EACvBI,EAAmB,SAAS,WAAab,CAAsB,GAGhES,EAAc,UAAY,IAC5B,aAAaF,EAAa,OAAO,EACjCK,EAAoB,QAAQM,CAAK,EACjCT,EAAc,QAAU,EAC1B,EAGF,OAAAM,EAAQ,iBAAiB,YAAaE,CAAwB,EAC9DF,EAAQ,iBAAiB,aAAcE,CAAwB,EAExD,IAAM,CACXF,EAAQ,oBAAoB,YAAaE,CAAwB,EACjEF,EAAQ,oBAAoB,aAAcE,CAAwB,EAC9DV,EAAa,SAAS,aAAaA,EAAa,OAAO,CAAA,CAC7D,EACC,CAACJ,EAAQO,EAAY,KAAK,CAAC,EAE1B,CAAAP,EACJ,OAAOO,CACT"}
1
+ {"version":3,"file":"useDoubleClick.cjs","sources":["../../../../src/hooks/useDoubleClick/useDoubleClick.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { getElement, isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\nexport type DoubleClickEvents = MouseEvent | TouchEvent;\n\n/** The use double click options type */\nexport interface UseDoubleClickOptions {\n /** The threshold time in milliseconds between clicks */\n threshold?: number;\n /** The callback function to be invoked on single click */\n onSingleClick?: (event: DoubleClickEvents) => void;\n}\n\nexport interface UseDoubleClick {\n (\n target: HookTarget,\n callback: (event: DoubleClickEvents) => void,\n options?: UseDoubleClickOptions\n ): boolean;\n\n <Target extends Element>(\n callback: (event: DoubleClickEvents) => void,\n options?: UseDoubleClickOptions,\n target?: never\n ): StateRef<Target>;\n}\n\nexport const DEFAULT_THRESHOLD_TIME = 300;\n\n/**\n * @name useDoubleClick\n * @description - Hook that defines the logic when double clicking an element\n * @category Sensors\n *\n * @overload\n * @param {HookTarget} target The target element to be double clicked\n * @param {(event: DoubleClickEvents) => void} callback The callback function to be invoked on double click\n * @param {UseDoubleClickOptions} [options] The options for the double click\n * @returns {boolean} The double clicking state\n *\n * @example\n * useDoubleClick(ref, () => console.log('double clicked'));\n *\n * @overload\n * @template Target The target element\n * @param {(event: DoubleClickEvents) => void} callback The callback function to be invoked on double click\n * @param {UseDoubleClickOptions} [options] The options for the double click\n * @returns {boolean} The double clicking state\n *\n * @example\n * const ref = useDoubleClick(() => console.log('double clicked'));\n *\n * @see {@link https://siberiacancode.github.io/reactuse/functions/hooks/useDoubleClick.html}\n */\nexport const useDoubleClick = ((...params: any[]): any => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const callback = (target ? params[1] : params[0]) as (event: DoubleClickEvents) => void;\n const options = (target ? params[2] : params[1]) as UseDoubleClickOptions | undefined;\n\n const timeoutIdRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const clickCountRef = useRef(0);\n const internalRef = useRefState<Element>();\n\n const internalCallbackRef = useRef(callback);\n internalCallbackRef.current = callback;\n const internalOptionsRef = useRef(options);\n internalOptionsRef.current = options;\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = target ? getElement(target) : internalRef.current;\n if (!element) return;\n\n const onClick = (event: DoubleClickEvents) => {\n clickCountRef.current += 1;\n\n if (clickCountRef.current === 1) {\n timeoutIdRef.current = setTimeout(() => {\n if (internalOptionsRef.current?.onSingleClick)\n internalOptionsRef.current.onSingleClick(event);\n clickCountRef.current = 0;\n }, internalOptionsRef.current?.threshold ?? DEFAULT_THRESHOLD_TIME);\n }\n\n if (clickCountRef.current === 2) {\n clearTimeout(timeoutIdRef.current);\n internalCallbackRef.current(event);\n clickCountRef.current = 0;\n }\n };\n\n element.addEventListener('mousedown', onClick as EventListener);\n element.addEventListener('touchstart', onClick as EventListener);\n\n return () => {\n element.removeEventListener('mousedown', onClick as EventListener);\n element.removeEventListener('touchstart', onClick as EventListener);\n if (timeoutIdRef.current) clearTimeout(timeoutIdRef.current);\n };\n }, [target, internalRef.state]);\n\n if (target) return;\n return internalRef;\n}) as UseDoubleClick;\n"],"names":["DEFAULT_THRESHOLD_TIME","useDoubleClick","params","target","isTarget","callback","options","timeoutIdRef","useRef","clickCountRef","internalRef","useRefState","internalCallbackRef","internalOptionsRef","useEffect","element","getElement","onClick","event"],"mappings":"mPAkCaA,EAAyB,IA2BzBC,EAAkB,IAAIC,IAAuB,CACxD,MAAMC,EAAUC,EAAAA,SAASF,EAAO,CAAC,CAAC,EAAIA,EAAO,CAAC,EAAI,OAC5CG,EAAYF,EAASD,EAAO,CAAC,EAAIA,EAAO,CAAC,EACzCI,EAAWH,EAASD,EAAO,CAAC,EAAIA,EAAO,CAAC,EAExCK,EAAeC,EAAAA,OAAsC,MAAS,EAC9DC,EAAgBD,EAAAA,OAAO,CAAC,EACxBE,EAAcC,EAAAA,YAAA,EAEdC,EAAsBJ,EAAAA,OAAOH,CAAQ,EAC3CO,EAAoB,QAAUP,EAC9B,MAAMQ,EAAqBL,EAAAA,OAAOF,CAAO,EAqCzC,GApCAO,EAAmB,QAAUP,EAE7BQ,EAAAA,UAAU,IAAM,CACd,GAAI,CAACX,GAAU,CAACO,EAAY,MAAO,OAEnC,MAAMK,EAAUZ,EAASa,EAAAA,WAAWb,CAAM,EAAIO,EAAY,QAC1D,GAAI,CAACK,EAAS,OAEd,MAAME,EAAWC,GAA6B,CAC5CT,EAAc,SAAW,EAErBA,EAAc,UAAY,IAC5BF,EAAa,QAAU,WAAW,IAAM,CAClCM,EAAmB,SAAS,eAC9BA,EAAmB,QAAQ,cAAcK,CAAK,EAChDT,EAAc,QAAU,CAAA,EACvBI,EAAmB,SAAS,WAAab,CAAsB,GAGhES,EAAc,UAAY,IAC5B,aAAaF,EAAa,OAAO,EACjCK,EAAoB,QAAQM,CAAK,EACjCT,EAAc,QAAU,EAC1B,EAGF,OAAAM,EAAQ,iBAAiB,YAAaE,CAAwB,EAC9DF,EAAQ,iBAAiB,aAAcE,CAAwB,EAExD,IAAM,CACXF,EAAQ,oBAAoB,YAAaE,CAAwB,EACjEF,EAAQ,oBAAoB,aAAcE,CAAwB,EAC9DV,EAAa,SAAS,aAAaA,EAAa,OAAO,CAAA,CAC7D,EACC,CAACJ,EAAQO,EAAY,KAAK,CAAC,EAE1B,CAAAP,EACJ,OAAOO,CACT"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react"),s=()=>decodeURIComponent(window.location.hash.replace("#","")),h=()=>{const[o,t]=n.useState(window?s():""),a=e=>{window.location.hash=e,t(e)};return n.useEffect(()=>{const e=()=>t(s());return window.addEventListener("hashchange",e),()=>{window.removeEventListener("hashchange",e)}}),[o,a]};exports.useHash=h;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react"),a=()=>decodeURIComponent(window.location.hash.replace("#","")),c=(n="",r="replace")=>{const[t,o]=s.useState(()=>typeof window>"u"?n:a()||n),h=e=>{window.location.hash=e,o(e)};return s.useEffect(()=>{r==="replace"&&(window.location.hash=t);const e=()=>o(a());return window.addEventListener("hashchange",e),()=>{window.removeEventListener("hashchange",e)}},[]),[t,h]};exports.useHash=c;
2
2
  //# sourceMappingURL=useHash.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useHash.cjs","sources":["../../../../src/hooks/useHash/useHash.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nconst getHash = () => decodeURIComponent(window.location.hash.replace('#', ''));\n\n/** The use hash return type */\ntype UseHashReturn = [string, (value: string) => void];\n\n/**\n * @name useHash\n * @description - Hook that manages the hash value\n * @category Browser\n *\n * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value\n *\n * @example\n * const [hash, setHash] = useHash();\n */\nexport const useHash = (): UseHashReturn => {\n const [hash, setHash] = useState(window ? getHash() : '');\n\n const set = (value: string) => {\n window.location.hash = value;\n setHash(value);\n };\n\n useEffect(() => {\n const onHashChange = () => setHash(getHash());\n window.addEventListener('hashchange', onHashChange);\n return () => {\n window.removeEventListener('hashchange', onHashChange);\n };\n });\n\n return [hash, set] as const;\n};\n"],"names":["getHash","useHash","hash","setHash","useState","set","value","useEffect","onHashChange"],"mappings":"yGAEMA,EAAU,IAAM,mBAAmB,OAAO,SAAS,KAAK,QAAQ,IAAK,EAAE,CAAC,EAejEC,EAAU,IAAqB,CAC1C,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAS,OAASJ,EAAA,EAAY,EAAE,EAElDK,EAAOC,GAAkB,CAC7B,OAAO,SAAS,KAAOA,EACvBH,EAAQG,CAAK,CAAA,EAGfC,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAe,IAAML,EAAQH,GAAS,EAC5C,cAAO,iBAAiB,aAAcQ,CAAY,EAC3C,IAAM,CACX,OAAO,oBAAoB,aAAcA,CAAY,CAAA,CACvD,CACD,EAEM,CAACN,EAAMG,CAAG,CACnB"}
1
+ {"version":3,"file":"useHash.cjs","sources":["../../../../src/hooks/useHash/useHash.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nconst getHash = () => decodeURIComponent(window.location.hash.replace('#', ''));\n\n/** The use hash return type */\ntype UseHashReturn = [string, (value: string) => void];\n\n/**\n * @name useHash\n * @description - Hook that manages the hash value\n * @category Browser\n *\n * @param {string} [initialValue] The initial hash value if no hash exists\n * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value\n *\n * @example\n * const [hash, setHash] = useHash(\"initial\");\n */\nexport const useHash = (\n initialValue = '',\n mode: 'initial' | 'replace' = 'replace'\n): UseHashReturn => {\n const [hash, setHash] = useState(() => {\n if (typeof window === 'undefined') return initialValue;\n return getHash() || initialValue;\n });\n\n const set = (value: string) => {\n window.location.hash = value;\n setHash(value);\n };\n\n useEffect(() => {\n if (mode === 'replace') window.location.hash = hash;\n\n const onHashChange = () => setHash(getHash());\n window.addEventListener('hashchange', onHashChange);\n return () => {\n window.removeEventListener('hashchange', onHashChange);\n };\n }, []);\n\n return [hash, set] as const;\n};\n"],"names":["getHash","useHash","initialValue","mode","hash","setHash","useState","set","value","useEffect","onHashChange"],"mappings":"yGAEMA,EAAU,IAAM,mBAAmB,OAAO,SAAS,KAAK,QAAQ,IAAK,EAAE,CAAC,EAgBjEC,EAAU,CACrBC,EAAe,GACfC,EAA8B,YACZ,CAClB,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAS,IAC3B,OAAO,OAAW,IAAoBJ,EACnCF,KAAaE,CACrB,EAEKK,EAAOC,GAAkB,CAC7B,OAAO,SAAS,KAAOA,EACvBH,EAAQG,CAAK,CAAA,EAGfC,OAAAA,EAAAA,UAAU,IAAM,CACVN,IAAS,YAAW,OAAO,SAAS,KAAOC,GAE/C,MAAMM,EAAe,IAAML,EAAQL,GAAS,EAC5C,cAAO,iBAAiB,aAAcU,CAAY,EAC3C,IAAM,CACX,OAAO,oBAAoB,aAAcA,CAAY,CAAA,CACvD,EACC,EAAE,EAEE,CAACN,EAAMG,CAAG,CACnB"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react"),I=require("../useRefState/useRefState.cjs"),J=require("../../utils/helpers/isTarget.cjs"),K=require("../../utils/helpers/getElement.cjs"),V=r=>{let a=[];for(let s=0;s<r.length;++s)a=[...a,[r.start(s),r.end(s)]];return a},N=(...r)=>{const a=J.isTarget(r[0])?r[0]:void 0,s=a?typeof r[1]=="object"?r[1]:{src:r[1]}:typeof r[0]=="object"?r[0]:{src:r[0]},u=I.useRefState(),t=n.useRef(null),[c,o]=n.useState(!1),[i,d]=n.useState(0),[j,l]=n.useState(0),[x,m]=n.useState(!1),[D,W]=n.useState(!1),[B,O]=n.useState([]),[U,v]=n.useState(!1),[z,g]=n.useState(!1),[F,f]=n.useState(1),[G,E]=n.useState(!1),[H,y]=n.useState(1);n.useEffect(()=>{const e=a?K.getElement(a):u.current;if(!e)return;t.current=e,e.src=s.src,s.type&&e.setAttribute("type",s.type),s.media&&e.setAttribute("media",s.media),d(e.duration),l(e.currentTime),o(!1),g(e.ended),E(e.muted),y(e.volume),f(e.playbackRate);const p=()=>{o(!0),v(!1)},k=()=>o(!1),h=()=>W(!0),b=()=>v(!0),R=()=>m(!0),T=()=>m(!1),M=()=>{o(!1),g(!0)},P=()=>d(e.duration),q=()=>l(e.currentTime),w=()=>{E(e.muted),y(e.volume)},A=()=>f(e.playbackRate),C=()=>O(V(e.buffered));return e.addEventListener("playing",p),e.addEventListener("pause",k),e.addEventListener("waiting",h),e.addEventListener("progress",C),e.addEventListener("stalled",b),e.addEventListener("seeking",R),e.addEventListener("seeked",T),e.addEventListener("ended",M),e.addEventListener("loadedmetadata",P),e.addEventListener("timeupdate",q),e.addEventListener("volumechange",w),e.addEventListener("ratechange",A),()=>{e.removeEventListener("playing",p),e.removeEventListener("pause",k),e.removeEventListener("waiting",h),e.removeEventListener("progress",C),e.removeEventListener("stalled",b),e.removeEventListener("seeking",R),e.removeEventListener("seeked",T),e.removeEventListener("ended",M),e.removeEventListener("loadedmetadata",P),e.removeEventListener("timeupdate",q),e.removeEventListener("volumechange",w),e.removeEventListener("ratechange",A)}},[a,u.state]);const L=async()=>{const e=t.current;e&&await e.play()},S=()=>{t.current&&t.current.pause()};return{playing:c,duration:i,currentTime:j,seeking:x,waiting:D,buffered:B,stalled:U,ended:z,playbackRate:F,muted:G,volume:H,play:L,pause:S,toggle:async()=>c?S():L(),seek:e=>{t.current&&(t.current.currentTime=Math.min(Math.max(e,0),i))},changeVolume:e=>{t.current&&(t.current.volume=Math.min(Math.max(e,0),1))},mute:()=>{t.current&&(t.current.muted=!0)},unmute:()=>{t.current&&(t.current.muted=!1)},changePlaybackRate:e=>{t.current&&(t.current.playbackRate=e)},...!a&&{ref:u}}};exports.timeRangeToArray=V;exports.useMediaControls=N;
2
+ //# sourceMappingURL=useMediaControls.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaControls.cjs","sources":["../../../../src/hooks/useMediaControls/useMediaControls.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { getElement, isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\nexport const timeRangeToArray = (timeRanges: TimeRanges) => {\n let ranges: [number, number][] = [];\n\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n\n return ranges;\n};\n\n/** The media source configuration type */\nexport interface UseMediaSource {\n /** The media attribute of the media */\n media?: string;\n /** The source URL of the media */\n src: string;\n /** The MIME type of the media */\n type?: string;\n}\n\n/** The media controls return type */\nexport interface UseMediaControlsReturn {\n /** Whether the media is currently buffering */\n buffered: [number, number][];\n /** The current playback position in seconds */\n currentTime: number;\n /** The total duration of the media in seconds */\n duration: number;\n /** Whether the media has ended */\n ended: boolean;\n /** Whether the media is currently muted */\n muted: boolean;\n /** The current playback rate (1.0 is normal speed) */\n playbackRate: number;\n /** Whether the media is currently playing */\n playing: boolean;\n /** Whether the media is currently seeking */\n seeking: boolean;\n /** Whether the media is currently stalled */\n stalled: boolean;\n /** The current volume level (0.0 to 1.0) */\n volume: number;\n /** Whether the media is currently waiting */\n waiting: boolean;\n\n /** Set the playback rate */\n changePlaybackRate: (rate: number) => void;\n /** Set the volume level (0.0 to 1.0) */\n changeVolume: (volume: number) => void;\n /** Set the muted state */\n mute: () => void;\n /** Pause the media */\n pause: () => void;\n /** Start playing the media */\n play: () => Promise<void>;\n /** Seek to a specific time in seconds */\n seek: (time: number) => void;\n /** Toggle between play and pause */\n toggle: () => Promise<void>;\n /** Set the unmuted state */\n unmute: () => void;\n}\n\nexport interface UseMediaControls {\n (target: HookTarget, src: string): UseMediaControlsReturn;\n\n (target: HookTarget, options: UseMediaSource): UseMediaControlsReturn;\n\n <Target extends HTMLMediaElement>(\n src: string\n ): UseMediaControlsReturn & {\n ref: StateRef<Target>;\n };\n\n <Target extends HTMLMediaElement>(\n options: UseMediaSource\n ): UseMediaControlsReturn & { ref: StateRef<Target> };\n}\n\n/**\n * @name useMediaControls\n * @description Hook that provides controls for HTML media elements (audio/video)\n * @category Browser\n *\n * @overload\n * @param {HookTarget} target The target media element\n * @param {string} src The source URL of the media\n * @returns {UseMediaControlsReturn} An object containing media controls and state\n *\n * @example\n * const { playing, play, pause } = useMediaControls(videoRef, 'video.mp4');\n *\n * @overload\n * @param {HookTarget} target The target media element\n * @param {UseMediaSource} options The media source configuration\n * @returns {UseMediaControlsReturn} An object containing media controls and state\n *\n * @example\n * const { playing, play, pause } = useMediaControls(audioRef, { src: 'audio.mp3', type: 'audio/mp3' });\n *\n * @overload\n * @template Target The target media element type\n * @param {string} src The source URL of the media\n * @returns {UseMediaControlsReturn & { ref: StateRef<Target> }} An object containing media controls, state and ref\n *\n * @example\n * const { ref, playing, play, pause } = useMediaControls<HTMLVideoElement>('video.mp4');\n *\n * @overload\n * @template Target The target media element type\n * @param {UseMediaSource} options The media source configuration\n * @returns {UseMediaControlsReturn & { ref: StateRef<Target> }} An object containing media controls, state and ref\n *\n * @example\n * const { ref, playing, play, pause } = useMediaControls<HTMLVideoElement>({ src: 'video.mp4', type: 'video/mp4' });\n */\nexport const useMediaControls = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const options = (\n target\n ? typeof params[1] === 'object'\n ? params[1]\n : { src: params[1] }\n : typeof params[0] === 'object'\n ? params[0]\n : { src: params[0] }\n ) as UseMediaSource;\n\n const internalRef = useRefState<HTMLMediaElement>();\n const elementRef = useRef<HTMLMediaElement | null>(null);\n\n const [playing, setPlaying] = useState(false);\n const [duration, setDuration] = useState(0);\n const [currentTime, setCurrentTime] = useState(0);\n const [seeking, setSeeking] = useState(false);\n const [waiting, setWaiting] = useState(false);\n const [buffered, setBuffered] = useState<[number, number][]>([]);\n const [stalled, setStalled] = useState(false);\n const [ended, setEnded] = useState(false);\n const [playbackRate, setPlaybackRateState] = useState(1);\n\n const [muted, setMutedState] = useState(false);\n const [volume, setVolumeState] = useState(1);\n\n useEffect(() => {\n const element = (target ? getElement(target) : internalRef.current) as HTMLMediaElement;\n\n if (!element) return;\n\n elementRef.current = element;\n element.src = options.src;\n\n if (options.type) element.setAttribute('type', options.type);\n if (options.media) element.setAttribute('media', options.media);\n\n setDuration(element.duration);\n setCurrentTime(element.currentTime);\n setPlaying(false);\n setEnded(element.ended);\n setMutedState(element.muted);\n setVolumeState(element.volume);\n setPlaybackRateState(element.playbackRate);\n\n const onPlaying = () => {\n setPlaying(true);\n setStalled(false);\n };\n const onPause = () => setPlaying(false);\n const onWaiting = () => setWaiting(true);\n const onStalled = () => setStalled(true);\n const onSeeking = () => setSeeking(true);\n const onSeeked = () => setSeeking(false);\n const onEnded = () => {\n setPlaying(false);\n setEnded(true);\n };\n const onDurationChange = () => setDuration(element.duration);\n const onTimeUpdate = () => setCurrentTime(element.currentTime);\n const onVolumechange = () => {\n setMutedState(element.muted);\n setVolumeState(element.volume);\n };\n const onRatechange = () => setPlaybackRateState(element.playbackRate);\n const onProgress = () => setBuffered(timeRangeToArray(element.buffered));\n\n element.addEventListener('playing', onPlaying);\n element.addEventListener('pause', onPause);\n element.addEventListener('waiting', onWaiting);\n element.addEventListener('progress', onProgress);\n element.addEventListener('stalled', onStalled);\n element.addEventListener('seeking', onSeeking);\n element.addEventListener('seeked', onSeeked);\n element.addEventListener('ended', onEnded);\n element.addEventListener('loadedmetadata', onDurationChange);\n element.addEventListener('timeupdate', onTimeUpdate);\n element.addEventListener('volumechange', onVolumechange);\n element.addEventListener('ratechange', onRatechange);\n\n return () => {\n element.removeEventListener('playing', onPlaying);\n element.removeEventListener('pause', onPause);\n element.removeEventListener('waiting', onWaiting);\n element.removeEventListener('progress', onProgress);\n element.removeEventListener('stalled', onStalled);\n element.removeEventListener('seeking', onSeeking);\n element.removeEventListener('seeked', onSeeked);\n element.removeEventListener('ended', onEnded);\n element.removeEventListener('loadedmetadata', onDurationChange);\n element.removeEventListener('timeupdate', onTimeUpdate);\n element.removeEventListener('volumechange', onVolumechange);\n element.removeEventListener('ratechange', onRatechange);\n };\n }, [target, internalRef.state]);\n\n const play = async () => {\n const element = elementRef.current;\n if (!element) return;\n\n await element.play();\n };\n\n const pause = () => {\n if (!elementRef.current) return;\n elementRef.current.pause();\n };\n\n const toggle = async () => {\n if (playing) return pause();\n return play();\n };\n\n const seek = (time: number) => {\n if (!elementRef.current) return;\n elementRef.current.currentTime = Math.min(Math.max(time, 0), duration);\n };\n\n const changeVolume = (value: number) => {\n if (!elementRef.current) return;\n elementRef.current.volume = Math.min(Math.max(value, 0), 1);\n };\n\n const mute = () => {\n if (!elementRef.current) return;\n elementRef.current.muted = true;\n };\n\n const unmute = () => {\n if (!elementRef.current) return;\n elementRef.current.muted = false;\n };\n\n const changePlaybackRate = (value: number) => {\n if (!elementRef.current) return;\n elementRef.current.playbackRate = value;\n };\n\n return {\n playing,\n duration,\n currentTime,\n seeking,\n waiting,\n buffered,\n stalled,\n ended,\n playbackRate,\n muted,\n volume,\n\n play,\n pause,\n toggle,\n seek,\n changeVolume,\n mute,\n unmute,\n changePlaybackRate,\n\n ...(!target && { ref: internalRef })\n };\n}) as UseMediaControls;\n"],"names":["timeRangeToArray","timeRanges","ranges","i","useMediaControls","params","target","isTarget","options","internalRef","useRefState","elementRef","useRef","playing","setPlaying","useState","duration","setDuration","currentTime","setCurrentTime","seeking","setSeeking","waiting","setWaiting","buffered","setBuffered","stalled","setStalled","ended","setEnded","playbackRate","setPlaybackRateState","muted","setMutedState","volume","setVolumeState","useEffect","element","getElement","onPlaying","onPause","onWaiting","onStalled","onSeeking","onSeeked","onEnded","onDurationChange","onTimeUpdate","onVolumechange","onRatechange","onProgress","play","pause","time","value"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react"),g=require("../useRefState/useRefState.cjs"),d=require("../../utils/helpers/isTarget.cjs"),P=require("../../utils/helpers/getElement.cjs"),y=(...e)=>{const t=d.isTarget(e[0])?e[0]:void 0,r=(t?e[1]:e[0])??{},[i,u]=l.useState(!1),c=g.useRefState(),n=typeof document<"u"&&"pictureInPictureEnabled"in document,o=async()=>{if(!n)return;const f=t?P.getElement(t):c.current;f&&(await f.requestPictureInPicture(),u(!0),r.onEnter?.())},s=async()=>{n&&(await document.exitPictureInPicture(),u(!1),r.onExit?.())},a={open:i,supported:n,enter:o,exit:s,toggle:async()=>{i?await s():await o()}};return t?a:{...a,ref:c}};exports.usePictureInPicture=y;
2
+ //# sourceMappingURL=usePictureInPicture.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePictureInPicture.cjs","sources":["../../../../src/hooks/usePictureInPicture/usePictureInPicture.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { getElement, isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use picture in picture options type */\nexport interface UsePictureInPictureOptions {\n /** The callback when Picture-in-Picture mode is entered */\n onEnter?: () => void;\n /** The callback when Picture-in-Picture mode is exited */\n onExit?: () => void;\n}\n\n/** The use picture in picture return type */\nexport interface UsePictureInPictureReturn {\n /** Whether Picture-in-Picture mode is currently active */\n open: boolean;\n /** Whether Picture-in-Picture mode is supported by the browser */\n supported: boolean;\n /** Request to enter Picture-in-Picture mode */\n enter: () => Promise<void>;\n /** Request to exit Picture-in-Picture mode */\n exit: () => Promise<void>;\n /** Toggle Picture-in-Picture mode */\n toggle: () => Promise<void>;\n}\n\nexport interface UsePictureInPicture {\n (target: HookTarget, options?: UsePictureInPictureOptions): UsePictureInPictureReturn;\n\n (options?: UsePictureInPictureOptions): UsePictureInPictureReturn & {\n ref: StateRef<HTMLVideoElement>;\n };\n}\n\n/**\n * @name usePictureInPicture\n * @description - Hook that provides Picture-in-Picture functionality for video elements\n * @category Browser\n *\n * @browserapi window.PictureInPicture https://developer.mozilla.org/en-US/docs/Web/API/Picture-in-Picture_API\n *\n * @overload\n * @param {HookTarget} target The target video element\n * @param {() => void} [options.onEnter] Callback when Picture-in-Picture mode is entered\n * @param {() => void} [options.onExit] Callback when Picture-in-Picture mode is exited\n * @returns {UsePictureInPictureReturn} An object containing Picture-in-Picture state and controls\n *\n * @example\n * const { open, supported, enter, exit, toggle } = usePictureInPicture(videoRef);\n *\n * @overload\n * @param {() => void} [options.onEnter] Callback when Picture-in-Picture mode is entered\n * @param {() => void} [options.onExit] Callback when Picture-in-Picture mode is exited\n * @returns {UsePictureInPictureReturn & { ref: StateRef<HTMLVideoElement> }} An object containing Picture-in-Picture state, controls and ref\n *\n * @example\n * const { ref, open, supported, enter, exit, toggle } = usePictureInPicture();\n */\nexport const usePictureInPicture = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const options = ((target ? params[1] : params[0]) as UsePictureInPictureOptions) ?? {};\n\n const [open, setOpen] = useState(false);\n\n const internalRef = useRefState<HTMLVideoElement>();\n\n const supported = typeof document !== 'undefined' && 'pictureInPictureEnabled' in document;\n\n const enter = async () => {\n if (!supported) return;\n\n const element = target ? (getElement(target) as HTMLVideoElement) : internalRef.current;\n\n if (!element) return;\n\n await element.requestPictureInPicture();\n setOpen(true);\n\n options.onEnter?.();\n };\n\n const exit = async () => {\n if (!supported) return;\n\n await document.exitPictureInPicture();\n setOpen(false);\n options.onExit?.();\n };\n\n const toggle = async () => {\n if (open) await exit();\n else await enter();\n };\n\n const value = {\n open,\n supported,\n enter,\n exit,\n toggle\n };\n\n if (target) return value;\n return { ...value, ref: internalRef };\n}) as UsePictureInPicture;\n"],"names":["usePictureInPicture","params","target","isTarget","options","open","setOpen","useState","internalRef","useRefState","supported","enter","element","getElement","exit","value"],"mappings":"mPAgEaA,EAAuB,IAAIC,IAAkB,CACxD,MAAMC,EAAUC,EAAAA,SAASF,EAAO,CAAC,CAAC,EAAIA,EAAO,CAAC,EAAI,OAC5CG,GAAYF,EAASD,EAAO,CAAC,EAAIA,EAAO,CAAC,IAAqC,CAAA,EAE9E,CAACI,EAAMC,CAAO,EAAIC,EAAAA,SAAS,EAAK,EAEhCC,EAAcC,EAAAA,YAAA,EAEdC,EAAY,OAAO,SAAa,KAAe,4BAA6B,SAE5EC,EAAQ,SAAY,CACxB,GAAI,CAACD,EAAW,OAEhB,MAAME,EAAUV,EAAUW,EAAAA,WAAWX,CAAM,EAAyBM,EAAY,QAE3EI,IAEL,MAAMA,EAAQ,wBAAA,EACdN,EAAQ,EAAI,EAEZF,EAAQ,UAAA,EAAU,EAGdU,EAAO,SAAY,CAClBJ,IAEL,MAAM,SAAS,qBAAA,EACfJ,EAAQ,EAAK,EACbF,EAAQ,SAAA,EAAS,EAQbW,EAAQ,CACZ,KAAAV,EACA,UAAAK,EACA,MAAAC,EACA,KAAAG,EACA,OAVa,SAAY,CACrBT,QAAYS,EAAA,QACLH,EAAA,CAAM,CAQjB,EAGF,OAAIT,EAAea,EACZ,CAAE,GAAGA,EAAO,IAAKP,CAAA,CAC1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"useQuery.cjs","sources":["../../../../src/hooks/useQuery/useQuery.ts"],"sourcesContent":["import type { DependencyList } from 'react';\r\n\r\nimport { useEffect, useRef, useState } from 'react';\r\n\r\nimport { getRetry } from '@/utils/helpers';\r\n\r\nimport { useDidUpdate } from '../useDidUpdate/useDidUpdate';\r\nimport { useMount } from '../useMount/useMount';\r\n\r\n/* The use query return type */\r\nexport interface UseQueryOptions<QueryData, Data> {\r\n /* The enabled state of the query */\r\n enabled?: boolean;\r\n /* The depends for the hook */\r\n keys?: DependencyList;\r\n /* The placeholder data for the hook */\r\n placeholderData?: (() => Data) | Data;\r\n /* The refetch interval */\r\n refetchInterval?: number;\r\n /* The retry count of requests */\r\n retry?: boolean | number;\r\n /* The retry delay of requests */\r\n retryDelay?: ((retry: number, error: Error) => number) | number;\r\n /* The callback function to be invoked on error */\r\n onError?: (error: Error) => void;\r\n /* The callback function to be invoked on success */\r\n onSuccess?: (data: Data) => void;\r\n /* The select function to be invoked */\r\n select?: (data: QueryData) => Data;\r\n}\r\n\r\ninterface UseQueryCallbackParams {\r\n /* The depends for the hook */\r\n keys: DependencyList;\r\n /* The abort signal */\r\n signal: AbortSignal;\r\n}\r\n\r\n/* The use query return type */\r\nexport interface UseQueryReturn<Data> {\r\n /* The abort function */\r\n abort: AbortController['abort'];\r\n /* The state of the query */\r\n data?: Data;\r\n /* The success state of the query */\r\n error?: Error;\r\n /* The error state of the query */\r\n isError: boolean;\r\n /* The fetching state of the query */\r\n isFetching: boolean;\r\n /* The loading state of the query */\r\n isLoading: boolean;\r\n /* The refetching state of the query */\r\n isRefetching: boolean;\r\n /* The success state of the query */\r\n isSuccess: boolean;\r\n /* The refetch function */\r\n refetch: () => void;\r\n}\r\n\r\n/**\r\n * @name useQuery\r\n * @description - Hook that defines the logic when query data\r\n * @category Utilities\r\n *\r\n * @template Data The type of the data\r\n * @param {() => Promise<Data>} callback The callback function to be invoked\r\n * @param {DependencyList} [options.keys] The dependencies for the hook\r\n * @param {(data: Data) => void} [options.onSuccess] The callback function to be invoked on success\r\n * @param {(error: Error) => void} [options.onError] The callback function to be invoked on error\r\n * @param {UseQueryOptionsSelect<Data>} [options.select] The select function to be invoked\r\n * @param {Data | (() => Data)} [options.initialData] The initial data for the hook\r\n * @param {Data | (() => Data)} [options.placeholderData] The placeholder data for the hook\r\n * @param {number} [options.refetchInterval] The refetch interval\r\n * @param {boolean | number} [options.retry] The retry count of requests\r\n * @returns {UseQueryReturn<Data>} An object with the state of the query\r\n *\r\n * @example\r\n * const { data, isFetching, isLoading, isError, isSuccess, error, refetch, isRefetching, abort, aborted } = useQuery(() => fetch('url'));\r\n */\r\nexport const useQuery = <QueryData, Data = QueryData>(\r\n callback: (params: UseQueryCallbackParams) => Promise<QueryData>,\r\n options?: UseQueryOptions<QueryData, Data>\r\n): UseQueryReturn<Data> => {\r\n const enabled = options?.enabled ?? true;\r\n const retryCountRef = useRef(options?.retry ? getRetry(options.retry) : 0);\r\n const alreadyRequested = useRef(false);\r\n\r\n const [isFetching, setIsFetching] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [isError, setIsError] = useState(false);\r\n const [isRefetching, setIsRefetching] = useState(false);\r\n const [isSuccess, setIsSuccess] = useState(!!options?.placeholderData);\r\n\r\n const [error, setError] = useState<Error | undefined>(undefined);\r\n const [data, setData] = useState<Data | undefined>(options?.placeholderData);\r\n\r\n const abortControllerRef = useRef<AbortController>(new AbortController());\r\n const intervalIdRef = useRef<ReturnType<typeof setInterval>>(undefined);\r\n\r\n const keys = options?.keys ?? [];\r\n\r\n const abort = () => {\r\n abortControllerRef.current.abort();\r\n abortControllerRef.current = new AbortController();\r\n };\r\n\r\n const request = (action: 'init' | 'refetch') => {\r\n abort();\r\n\r\n setIsFetching(true);\r\n if (action === 'init') {\r\n alreadyRequested.current = true;\r\n setIsLoading(true);\r\n }\r\n if (action === 'refetch') setIsRefetching(true);\r\n callback({ signal: abortControllerRef.current.signal, keys })\r\n .then((response) => {\r\n const data = options?.select ? options?.select(response) : response;\r\n options?.onSuccess?.(data as Data);\r\n setData(data as Data);\r\n setIsSuccess(true);\r\n setError(undefined);\r\n setIsError(false);\r\n setIsFetching(false);\r\n if (action === 'init') setIsLoading(false);\r\n if (action === 'refetch') setIsRefetching(false);\r\n })\r\n .catch((error: Error) => {\r\n if (retryCountRef.current > 0) {\r\n retryCountRef.current -= 1;\r\n const retryDelay =\r\n typeof options?.retryDelay === 'function'\r\n ? options?.retryDelay(retryCountRef.current, error)\r\n : options?.retryDelay;\r\n\r\n if (retryDelay) {\r\n setTimeout(() => request(action), retryDelay);\r\n return;\r\n }\r\n\r\n return request(action);\r\n }\r\n options?.onError?.(error);\r\n setData(undefined);\r\n setIsSuccess(false);\r\n setError(error);\r\n setIsError(true);\r\n setIsFetching(false);\r\n if (action === 'init') setIsLoading(false);\r\n if (action === 'refetch') setIsRefetching(false);\r\n retryCountRef.current = options?.retry ? getRetry(options.retry) : 0;\r\n })\r\n .finally(() => {\r\n if (options?.refetchInterval) {\r\n const interval = setInterval(() => {\r\n clearInterval(interval);\r\n request('refetch');\r\n }, options?.refetchInterval);\r\n intervalIdRef.current = interval;\r\n }\r\n });\r\n };\r\n\r\n useMount(() => {\r\n if (!enabled) return;\r\n request('init');\r\n });\r\n\r\n useDidUpdate(() => {\r\n if (!enabled) return;\r\n request(alreadyRequested.current ? 'refetch' : 'init');\r\n }, [enabled, ...keys]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n clearInterval(intervalIdRef.current);\r\n };\r\n }, [enabled, options?.refetchInterval, options?.retry, ...keys]);\r\n\r\n const refetch = () => request('refetch');\r\n\r\n return {\r\n abort,\r\n data,\r\n error,\r\n refetch,\r\n isFetching,\r\n isLoading,\r\n isError,\r\n isSuccess,\r\n isRefetching\r\n };\r\n};\r\n"],"names":["useQuery","callback","options","enabled","retryCountRef","useRef","getRetry","alreadyRequested","isFetching","setIsFetching","useState","isLoading","setIsLoading","isError","setIsError","isRefetching","setIsRefetching","isSuccess","setIsSuccess","error","setError","data","setData","abortControllerRef","intervalIdRef","keys","abort","request","action","response","retryDelay","interval","useMount","useDidUpdate","useEffect"],"mappings":"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"}
1
+ {"version":3,"file":"useQuery.cjs","sources":["../../../../src/hooks/useQuery/useQuery.ts"],"sourcesContent":["import type { DependencyList } from 'react';\n\nimport { useEffect, useRef, useState } from 'react';\n\nimport { getRetry } from '@/utils/helpers';\n\nimport { useDidUpdate } from '../useDidUpdate/useDidUpdate';\nimport { useMount } from '../useMount/useMount';\n\n/* The use query return type */\nexport interface UseQueryOptions<QueryData, Data> {\n /* The enabled state of the query */\n enabled?: boolean;\n /* The depends for the hook */\n keys?: DependencyList;\n /* The placeholder data for the hook */\n placeholderData?: (() => Data) | Data;\n /* The refetch interval */\n refetchInterval?: number;\n /* The retry count of requests */\n retry?: boolean | number;\n /* The retry delay of requests */\n retryDelay?: ((retry: number, error: Error) => number) | number;\n /* The callback function to be invoked on error */\n onError?: (error: Error) => void;\n /* The callback function to be invoked on success */\n onSuccess?: (data: Data) => void;\n /* The select function to be invoked */\n select?: (data: QueryData) => Data;\n}\n\ninterface UseQueryCallbackParams {\n /* The depends for the hook */\n keys: DependencyList;\n /* The abort signal */\n signal: AbortSignal;\n}\n\n/* The use query return type */\nexport interface UseQueryReturn<Data> {\n /* The abort function */\n abort: AbortController['abort'];\n /* The state of the query */\n data?: Data;\n /* The success state of the query */\n error?: Error;\n /* The error state of the query */\n isError: boolean;\n /* The fetching state of the query */\n isFetching: boolean;\n /* The loading state of the query */\n isLoading: boolean;\n /* The refetching state of the query */\n isRefetching: boolean;\n /* The success state of the query */\n isSuccess: boolean;\n /* The refetch function */\n refetch: () => void;\n}\n\n/**\n * @name useQuery\n * @description - Hook that defines the logic when query data\n * @category Utilities\n *\n * @template Data The type of the data\n * @param {() => Promise<Data>} callback The callback function to be invoked\n * @param {DependencyList} [options.keys] The dependencies for the hook\n * @param {(data: Data) => void} [options.onSuccess] The callback function to be invoked on success\n * @param {(error: Error) => void} [options.onError] The callback function to be invoked on error\n * @param {UseQueryOptionsSelect<Data>} [options.select] The select function to be invoked\n * @param {Data | (() => Data)} [options.initialData] The initial data for the hook\n * @param {Data | (() => Data)} [options.placeholderData] The placeholder data for the hook\n * @param {number} [options.refetchInterval] The refetch interval\n * @param {boolean | number} [options.retry] The retry count of requests\n * @returns {UseQueryReturn<Data>} An object with the state of the query\n *\n * @example\n * const { data, isFetching, isLoading, isError, isSuccess, error, refetch, isRefetching, abort, aborted } = useQuery(() => fetch('url'));\n */\nexport const useQuery = <QueryData, Data = QueryData>(\n callback: (params: UseQueryCallbackParams) => Promise<QueryData>,\n options?: UseQueryOptions<QueryData, Data>\n): UseQueryReturn<Data> => {\n const enabled = options?.enabled ?? true;\n const retryCountRef = useRef(options?.retry ? getRetry(options.retry) : 0);\n const alreadyRequested = useRef(false);\n\n const [isFetching, setIsFetching] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [isRefetching, setIsRefetching] = useState(false);\n const [isSuccess, setIsSuccess] = useState(!!options?.placeholderData);\n\n const [error, setError] = useState<Error | undefined>(undefined);\n const [data, setData] = useState<Data | undefined>(options?.placeholderData);\n\n const abortControllerRef = useRef<AbortController>(new AbortController());\n const intervalIdRef = useRef<ReturnType<typeof setInterval>>(undefined);\n\n const keys = options?.keys ?? [];\n\n const abort = () => {\n abortControllerRef.current.abort();\n abortControllerRef.current = new AbortController();\n };\n\n const request = (action: 'init' | 'refetch') => {\n abort();\n\n setIsFetching(true);\n if (action === 'init') {\n alreadyRequested.current = true;\n setIsLoading(true);\n }\n if (action === 'refetch') setIsRefetching(true);\n callback({ signal: abortControllerRef.current.signal, keys })\n .then((response) => {\n const data = options?.select ? options?.select(response) : response;\n options?.onSuccess?.(data as Data);\n setData(data as Data);\n setIsSuccess(true);\n setError(undefined);\n setIsError(false);\n setIsFetching(false);\n if (action === 'init') setIsLoading(false);\n if (action === 'refetch') setIsRefetching(false);\n })\n .catch((error: Error) => {\n if (retryCountRef.current > 0) {\n retryCountRef.current -= 1;\n const retryDelay =\n typeof options?.retryDelay === 'function'\n ? options?.retryDelay(retryCountRef.current, error)\n : options?.retryDelay;\n\n if (retryDelay) {\n setTimeout(() => request(action), retryDelay);\n return;\n }\n\n return request(action);\n }\n options?.onError?.(error);\n setData(undefined);\n setIsSuccess(false);\n setError(error);\n setIsError(true);\n setIsFetching(false);\n if (action === 'init') setIsLoading(false);\n if (action === 'refetch') setIsRefetching(false);\n retryCountRef.current = options?.retry ? getRetry(options.retry) : 0;\n })\n .finally(() => {\n if (options?.refetchInterval) {\n const interval = setInterval(() => {\n clearInterval(interval);\n request('refetch');\n }, options?.refetchInterval);\n intervalIdRef.current = interval;\n }\n });\n };\n\n useMount(() => {\n if (!enabled) return;\n request('init');\n });\n\n useDidUpdate(() => {\n if (!enabled) return;\n request(alreadyRequested.current ? 'refetch' : 'init');\n }, [enabled, ...keys]);\n\n useEffect(() => {\n return () => {\n clearInterval(intervalIdRef.current);\n };\n }, [enabled, options?.refetchInterval, options?.retry, ...keys]);\n\n const refetch = () => request('refetch');\n\n return {\n abort,\n data,\n error,\n refetch,\n isFetching,\n isLoading,\n isError,\n isSuccess,\n isRefetching\n };\n};\n"],"names":["useQuery","callback","options","enabled","retryCountRef","useRef","getRetry","alreadyRequested","isFetching","setIsFetching","useState","isLoading","setIsLoading","isError","setIsError","isRefetching","setIsRefetching","isSuccess","setIsSuccess","error","setError","data","setData","abortControllerRef","intervalIdRef","keys","abort","request","action","response","retryDelay","interval","useMount","useDidUpdate","useEffect"],"mappings":"2OAgFaA,EAAW,CACtBC,EACAC,IACyB,CACzB,MAAMC,EAAUD,GAAS,SAAW,GAC9BE,EAAgBC,EAAAA,OAAOH,GAAS,MAAQI,EAAAA,SAASJ,EAAQ,KAAK,EAAI,CAAC,EACnEK,EAAmBF,EAAAA,OAAO,EAAK,EAE/B,CAACG,EAAYC,CAAa,EAAIC,EAAAA,SAAS,EAAK,EAC5C,CAACC,EAAWC,CAAY,EAAIF,EAAAA,SAAS,EAAK,EAC1C,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAAS,EAAK,EACtC,CAACK,EAAcC,CAAe,EAAIN,EAAAA,SAAS,EAAK,EAChD,CAACO,EAAWC,CAAY,EAAIR,EAAAA,SAAS,CAAC,CAACR,GAAS,eAAe,EAE/D,CAACiB,EAAOC,CAAQ,EAAIV,EAAAA,SAA4B,MAAS,EACzD,CAACW,EAAMC,CAAO,EAAIZ,EAAAA,SAA2BR,GAAS,eAAe,EAErEqB,EAAqBlB,EAAAA,OAAwB,IAAI,eAAiB,EAClEmB,EAAgBnB,EAAAA,OAAuC,MAAS,EAEhEoB,EAAOvB,GAAS,MAAQ,CAAA,EAExBwB,EAAQ,IAAM,CAClBH,EAAmB,QAAQ,MAAA,EAC3BA,EAAmB,QAAU,IAAI,eAAgB,EAG7CI,EAAWC,GAA+B,CAC9CF,EAAA,EAEAjB,EAAc,EAAI,EACdmB,IAAW,SACbrB,EAAiB,QAAU,GAC3BK,EAAa,EAAI,GAEfgB,IAAW,WAAWZ,EAAgB,EAAI,EAC9Cf,EAAS,CAAE,OAAQsB,EAAmB,QAAQ,OAAQ,KAAAE,EAAM,EACzD,KAAMI,GAAa,CAClB,MAAMR,EAAOnB,GAAS,OAASA,GAAS,OAAO2B,CAAQ,EAAIA,EAC3D3B,GAAS,YAAYmB,CAAY,EACjCC,EAAQD,CAAY,EACpBH,EAAa,EAAI,EACjBE,EAAS,MAAS,EAClBN,EAAW,EAAK,EAChBL,EAAc,EAAK,EACfmB,IAAW,QAAQhB,EAAa,EAAK,EACrCgB,IAAW,WAAWZ,EAAgB,EAAK,CAAA,CAChD,EACA,MAAOG,GAAiB,CACvB,GAAIf,EAAc,QAAU,EAAG,CAC7BA,EAAc,SAAW,EACzB,MAAM0B,EACJ,OAAO5B,GAAS,YAAe,WAC3BA,GAAS,WAAWE,EAAc,QAASe,CAAK,EAChDjB,GAAS,WAEf,GAAI4B,EAAY,CACd,WAAW,IAAMH,EAAQC,CAAM,EAAGE,CAAU,EAC5C,MAAA,CAGF,OAAOH,EAAQC,CAAM,CAAA,CAEvB1B,GAAS,UAAUiB,CAAK,EACxBG,EAAQ,MAAS,EACjBJ,EAAa,EAAK,EAClBE,EAASD,CAAK,EACdL,EAAW,EAAI,EACfL,EAAc,EAAK,EACfmB,IAAW,QAAQhB,EAAa,EAAK,EACrCgB,IAAW,WAAWZ,EAAgB,EAAK,EAC/CZ,EAAc,QAAUF,GAAS,MAAQI,EAAAA,SAASJ,EAAQ,KAAK,EAAI,CAAA,CACpE,EACA,QAAQ,IAAM,CACb,GAAIA,GAAS,gBAAiB,CAC5B,MAAM6B,EAAW,YAAY,IAAM,CACjC,cAAcA,CAAQ,EACtBJ,EAAQ,SAAS,CAAA,EAChBzB,GAAS,eAAe,EAC3BsB,EAAc,QAAUO,CAAA,CAC1B,CACD,CAAA,EAGLC,OAAAA,EAAAA,SAAS,IAAM,CACR7B,GACLwB,EAAQ,MAAM,CAAA,CACf,EAEDM,EAAAA,aAAa,IAAM,CACZ9B,GACLwB,EAAQpB,EAAiB,QAAU,UAAY,MAAM,CAAA,EACpD,CAACJ,EAAS,GAAGsB,CAAI,CAAC,EAErBS,EAAAA,UAAU,IACD,IAAM,CACX,cAAcV,EAAc,OAAO,CAAA,EAEpC,CAACrB,EAASD,GAAS,gBAAiBA,GAAS,MAAO,GAAGuB,CAAI,CAAC,EAIxD,CACL,MAAAC,EACA,KAAAL,EACA,MAAAF,EACA,QANc,IAAMQ,EAAQ,SAAS,EAOrC,WAAAnB,EACA,UAAAG,EACA,QAAAE,EACA,UAAAI,EACA,aAAAF,CAAA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react"),f=(e,r)=>{if(e===r)return!0;if(e==null||r==null)return e===r;if(typeof e!=typeof r)return!1;if(typeof e!="object")return e===r;if(Array.isArray(e)!==Array.isArray(r))return!1;if(Array.isArray(e))return e.length===r.length&&e.every((n,l)=>f(n,r[l]));const t=Object.keys(e),u=Object.keys(r);if(t.length!==u.length)return!1;for(const n of t)if(!u.includes(n)||!f(e[n],r[n]))return!1;return!0},c=(e,r)=>{const t=s.useRef(r);(!t.current||!f(r,t.current))&&(t.current=r),s.useEffect(e,t.current)};exports.deepEqual=f;exports.useShallowEffect=c;
2
+ //# sourceMappingURL=useShallowEffect.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useShallowEffect.cjs","sources":["../../../../src/hooks/useShallowEffect/useShallowEffect.ts"],"sourcesContent":["import type { DependencyList, EffectCallback } from 'react';\n\nimport { useEffect, useRef } from 'react';\n\nexport const deepEqual = (a: any, b: any): boolean => {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object') return a === b;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n if (Array.isArray(a))\n return a.length === b.length && a.every((value, index) => deepEqual(value, b[index]));\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!deepEqual(a[key], b[key])) return false;\n }\n\n return true;\n};\n\n/**\n * @name useShallowEffect\n * @description - Hook that executes an effect only when dependencies change shallowly or deeply.\n * @category Lifecycle\n *\n * @param {EffectCallback} effect The effect callback\n * @param {DependencyList} [deps] The dependencies list for the effect\n *\n * @example\n * useShallowEffect(() => console.log(\"effect\"), [user]);\n */\nexport const useShallowEffect = (effect: EffectCallback, deps?: DependencyList) => {\n const depsRef = useRef<DependencyList>(deps);\n\n if (!depsRef.current || !deepEqual(deps, depsRef.current)) {\n depsRef.current = deps;\n }\n\n useEffect(effect, depsRef.current);\n};\n"],"names":["deepEqual","a","b","value","index","keysA","keysB","key","useShallowEffect","effect","deps","depsRef","useRef","useEffect"],"mappings":"yGAIaA,EAAY,CAACC,EAAQC,IAAoB,CACpD,GAAID,IAAMC,EAAG,MAAO,GACpB,GAAID,GAAK,MAAQC,GAAK,YAAaD,IAAMC,EACzC,GAAI,OAAOD,GAAM,OAAOC,EAAG,MAAO,GAClC,GAAI,OAAOD,GAAM,SAAU,OAAOA,IAAMC,EACxC,GAAI,MAAM,QAAQD,CAAC,IAAM,MAAM,QAAQC,CAAC,EAAG,MAAO,GAElD,GAAI,MAAM,QAAQD,CAAC,EACjB,OAAOA,EAAE,SAAWC,EAAE,QAAUD,EAAE,MAAM,CAACE,EAAOC,IAAUJ,EAAUG,EAAOD,EAAEE,CAAK,CAAC,CAAC,EAEtF,MAAMC,EAAQ,OAAO,KAAKJ,CAAC,EACrBK,EAAQ,OAAO,KAAKJ,CAAC,EAE3B,GAAIG,EAAM,SAAWC,EAAM,OAAQ,MAAO,GAE1C,UAAWC,KAAOF,EAEhB,GADI,CAACC,EAAM,SAASC,CAAG,GACnB,CAACP,EAAUC,EAAEM,CAAG,EAAGL,EAAEK,CAAG,CAAC,EAAG,MAAO,GAGzC,MAAO,EACT,EAaaC,EAAmB,CAACC,EAAwBC,IAA0B,CACjF,MAAMC,EAAUC,EAAAA,OAAuBF,CAAI,GAEvC,CAACC,EAAQ,SAAW,CAACX,EAAUU,EAAMC,EAAQ,OAAO,KACtDA,EAAQ,QAAUD,GAGpBG,YAAUJ,EAAQE,EAAQ,OAAO,CACnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useStorage.cjs","sources":["../../../../src/hooks/useStorage/useStorage.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\n/* The use storage initial value type */\nexport type UseStorageInitialValue<Value> = (() => Value) | Value;\n\n/* The use storage options type */\nexport interface UseStorageOptions<Value> {\n /* The initial value of the storage */\n initialValue?: UseStorageInitialValue<Value>;\n /* The storage to be used */\n storage?: Storage;\n /* The deserializer function to be invoked */\n deserializer?: (value: string) => Value;\n /* The serializer function to be invoked */\n serializer?: (value: Value) => string;\n}\n\n/* The use storage return type */\nexport interface UseStorageReturn<Value> {\n /* The value of the storage */\n value: Value;\n /* The error state of the storage */\n remove: () => void;\n /* The loading state of the storage */\n set: (value: Value) => void;\n}\n\nexport interface UseStorage {\n <Value>(\n key: string,\n options: UseStorageOptions<Value> & { initialValue: UseStorageInitialValue<Value> }\n ): UseStorageReturn<Value>;\n\n <Value>(key: string, options?: UseStorageOptions<Value>): UseStorageReturn<Value | undefined>;\n\n <Value>(key: string, initialValue: UseStorageInitialValue<Value>): UseStorageReturn<Value>;\n\n <Value>(key: string): UseStorageReturn<Value | undefined>;\n}\n\nexport const STORAGE_EVENT = 'reactuse-storage';\n\nexport const dispatchStorageEvent = (params: Partial<StorageEvent>) =>\n window.dispatchEvent(new StorageEvent(STORAGE_EVENT, params));\n\nconst setStorageItem = (storage: Storage, key: string, value: string) => {\n const oldValue = storage.getItem(key);\n\n storage.setItem(key, value);\n dispatchStorageEvent({ key, oldValue, newValue: value, storageArea: storage });\n};\n\nconst removeStorageItem = (storage: Storage, key: string) => {\n const oldValue = storage.getItem(key);\n\n storage.removeItem(key);\n dispatchStorageEvent({ key, oldValue, newValue: null, storageArea: storage });\n};\n\nconst getStorageItem = (storage: Storage, key: string) => {\n const value = storage.getItem(key);\n if (!value) return undefined;\n return value;\n};\n\n/**\n * @name useStorage\n * @description - Hook that manages storage value\n * @category Browser\n *\n * @overload\n * @param {string} key The key of the storage\n * @param {UseStorageInitialValue<Value>} [initialValue] The initial value of the storage\n * @returns {UseStorageReturn<Value>} The value and the set function\n *\n * @overload\n * @param {string} key The key of the storage\n * @param {(value: Value) => string} [params.serializer] The serializer function\n * @param {(value: string) => Value} [params.deserializer] The deserializer function\n * @param {Storage} [params.storage] The storage\n * @param {UseStorageInitialValue<Value>} [params.initialValue] The initial value of the storage\n * @returns {UseStorageReturn<Value>} The value and the set function\n *\n * @example\n * const { value, set, remove } = useStorage('key', 'value');\n */\nexport const useStorage = (<Value>(key: string, params?: any): UseStorageReturn<Value> => {\n const options = (\n typeof params === 'object' &&\n params &&\n ('serializer' in params ||\n 'deserializer' in params ||\n 'initialValue' in params ||\n 'storage' in params)\n ? params\n : undefined\n ) as UseStorageOptions<Value>;\n\n const initialValue = (options ? options?.initialValue : params) as UseStorageInitialValue<Value>;\n\n if (typeof window === 'undefined') {\n const value = typeof initialValue === 'function' ? (initialValue as () => any)() : initialValue;\n return {\n value,\n set: () => {},\n remove: () => {}\n };\n }\n\n const serializer = (value: Value) => {\n if (options?.serializer) return options.serializer(value);\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n };\n\n const storage = options?.storage ?? window?.localStorage;\n\n const set = (value: Value) => setStorageItem(storage, key, serializer(value));\n const remove = () => removeStorageItem(storage, key);\n\n const deserializer = (value: string) => {\n if (options?.deserializer) return options.deserializer(value);\n if (value === 'undefined') return undefined as unknown as Value;\n\n try {\n return JSON.parse(value) as Value;\n } catch {\n return value as Value;\n }\n };\n\n const [value, setValue] = useState<Value | undefined>(() => {\n const storageValue = getStorageItem(storage, key);\n if (storageValue === undefined && initialValue !== undefined) {\n const value =\n typeof initialValue === 'function' ? (initialValue as () => Value)() : initialValue;\n setStorageItem(storage, key, serializer(value));\n return value;\n }\n return storageValue ? deserializer(storageValue) : undefined;\n });\n\n useEffect(() => {\n const onChange = () => {\n const storageValue = getStorageItem(storage, key);\n setValue(storageValue ? deserializer(storageValue) : undefined);\n };\n window.addEventListener(STORAGE_EVENT, onChange);\n return () => window.removeEventListener(STORAGE_EVENT, onChange);\n }, [key]);\n\n return {\n value: value as Value,\n set,\n remove\n };\n}) as UseStorage;\n"],"names":["STORAGE_EVENT","dispatchStorageEvent","params","setStorageItem","storage","key","value","oldValue","removeStorageItem","getStorageItem","useStorage","options","initialValue","serializer","set","remove","deserializer","setValue","useState","storageValue","useEffect","onChange"],"mappings":"yGAwCaA,EAAgB,mBAEhBC,EAAwBC,GACnC,OAAO,cAAc,IAAI,aAAaF,EAAeE,CAAM,CAAC,EAExDC,EAAiB,CAACC,EAAkBC,EAAaC,IAAkB,CACvE,MAAMC,EAAWH,EAAQ,QAAQC,CAAG,EAEpCD,EAAQ,QAAQC,EAAKC,CAAK,EAC1BL,EAAqB,CAAE,IAAAI,EAAK,SAAAE,EAAU,SAAUD,EAAO,YAAaF,EAAS,CAC/E,EAEMI,EAAoB,CAACJ,EAAkBC,IAAgB,CAC3D,MAAME,EAAWH,EAAQ,QAAQC,CAAG,EAEpCD,EAAQ,WAAWC,CAAG,EACtBJ,EAAqB,CAAE,IAAAI,EAAK,SAAAE,EAAU,SAAU,KAAM,YAAaH,EAAS,CAC9E,EAEMK,EAAiB,CAACL,EAAkBC,IAAgB,CACxD,MAAMC,EAAQF,EAAQ,QAAQC,CAAG,EACjC,GAAKC,EACL,OAAOA,CACT,EAuBaI,EAAc,CAAQL,EAAaH,IAA0C,CACxF,MAAMS,EACJ,OAAOT,GAAW,UAClBA,IACC,eAAgBA,GACf,iBAAkBA,GAClB,iBAAkBA,GAClB,YAAaA,GACXA,EACA,OAGAU,EAAgBD,EAAUA,GAAS,aAAeT,EAExD,GAAI,OAAO,OAAW,IAEpB,MAAO,CACL,MAFY,OAAOU,GAAiB,WAAcA,IAA+BA,EAGjF,IAAK,IAAM,CAAA,EACX,OAAQ,IAAM,CAAA,CAAC,EAInB,MAAMC,EAAcP,GACdK,GAAS,WAAmBA,EAAQ,WAAWL,CAAK,EACpD,OAAOA,GAAU,SAAiBA,EAC/B,KAAK,UAAUA,CAAK,EAGvBF,EAAUO,GAAS,SAAW,QAAQ,aAEtCG,EAAOR,GAAiBH,EAAeC,EAASC,EAAKQ,EAAWP,CAAK,CAAC,EACtES,EAAS,IAAMP,EAAkBJ,EAASC,CAAG,EAE7CW,EAAgBV,GAAkB,CACtC,GAAIK,GAAS,aAAc,OAAOA,EAAQ,aAAaL,CAAK,EAC5D,GAAIA,IAAU,YAEd,GAAI,CACF,OAAO,KAAK,MAAMA,CAAK,CAAA,MACjB,CACN,OAAOA,CAAA,CACT,EAGI,CAACA,EAAOW,CAAQ,EAAIC,EAAAA,SAA4B,IAAM,CAC1D,MAAMC,EAAeV,EAAeL,EAASC,CAAG,EAChD,GAAIc,IAAiB,QAAaP,IAAiB,OAAW,CAC5D,MAAMN,EACJ,OAAOM,GAAiB,WAAcA,IAAiCA,EACzE,OAAAT,EAAeC,EAASC,EAAKQ,EAAWP,CAAK,CAAC,EACvCA,CAAA,CAET,OAAOa,EAAeH,EAAaG,CAAY,EAAI,MAAA,CACpD,EAEDC,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,IAAM,CACrB,MAAMF,EAAeV,EAAeL,EAASC,CAAG,EAChDY,EAASE,EAAeH,EAAaG,CAAY,EAAI,MAAS,CAAA,EAEhE,cAAO,iBAAiBnB,EAAeqB,CAAQ,EACxC,IAAM,OAAO,oBAAoBrB,EAAeqB,CAAQ,CAAA,EAC9D,CAAChB,CAAG,CAAC,EAED,CACL,MAAAC,EACA,IAAAQ,EACA,OAAAC,CAAA,CAEJ"}
1
+ {"version":3,"file":"useStorage.cjs","sources":["../../../../src/hooks/useStorage/useStorage.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\n/* The use storage initial value type */\nexport type UseStorageInitialValue<Value> = (() => Value) | Value;\n\n/* The use storage options type */\nexport interface UseStorageOptions<Value> {\n /* The initial value of the storage */\n initialValue?: UseStorageInitialValue<Value>;\n /* The storage to be used */\n storage?: Storage;\n /* The deserializer function to be invoked */\n deserializer?: (value: string) => Value;\n /* The serializer function to be invoked */\n serializer?: (value: Value) => string;\n}\n\n/* The use storage return type */\nexport interface UseStorageReturn<Value> {\n /* The value of the storage */\n value: Value;\n /* The error state of the storage */\n remove: () => void;\n /* The loading state of the storage */\n set: (value: Value) => void;\n}\n\nexport interface UseStorage {\n <Value>(key: string, options?: UseStorageOptions<Value>): UseStorageReturn<Value | undefined>;\n\n <Value>(\n key: string,\n initialValue?: UseStorageInitialValue<Value>\n ): UseStorageReturn<Value | undefined>;\n}\n\nexport const STORAGE_EVENT = 'reactuse-storage';\n\nexport const dispatchStorageEvent = (params: Partial<StorageEvent>) =>\n window.dispatchEvent(new StorageEvent(STORAGE_EVENT, params));\n\nconst setStorageItem = (storage: Storage, key: string, value: string) => {\n const oldValue = storage.getItem(key);\n\n storage.setItem(key, value);\n dispatchStorageEvent({\n key,\n oldValue,\n newValue: value,\n storageArea: storage\n });\n};\n\nconst removeStorageItem = (storage: Storage, key: string) => {\n const oldValue = storage.getItem(key);\n\n storage.removeItem(key);\n dispatchStorageEvent({ key, oldValue, newValue: null, storageArea: storage });\n};\n\nconst getStorageItem = (storage: Storage, key: string) => {\n const value = storage.getItem(key);\n if (!value) return undefined;\n return value;\n};\n\n/**\n * @name useStorage\n * @description - Hook that manages storage value\n * @category Browser\n *\n * @overload\n * @param {string} key The key of the storage\n * @param {UseStorageInitialValue<Value>} [initialValue] The initial value of the storage\n * @returns {UseStorageReturn<Value>} The value and the set function\n *\n * @overload\n * @param {string} key The key of the storage\n * @param {(value: Value) => string} [params.serializer] The serializer function\n * @param {(value: string) => Value} [params.deserializer] The deserializer function\n * @param {Storage} [params.storage] The storage\n * @param {UseStorageInitialValue<Value>} [params.initialValue] The initial value of the storage\n * @returns {UseStorageReturn<Value>} The value and the set function\n *\n * @example\n * const { value, set, remove } = useStorage('key', 'value');\n */\nexport const useStorage = (<Value>(key: string, params?: any): UseStorageReturn<Value> => {\n const options = (\n typeof params === 'object' &&\n params &&\n ('serializer' in params ||\n 'deserializer' in params ||\n 'initialValue' in params ||\n 'storage' in params)\n ? params\n : undefined\n ) as UseStorageOptions<Value>;\n\n const initialValue = (options ? options?.initialValue : params) as UseStorageInitialValue<Value>;\n\n if (typeof window === 'undefined') {\n const value = typeof initialValue === 'function' ? (initialValue as () => any)() : initialValue;\n return {\n value,\n set: () => {},\n remove: () => {}\n };\n }\n\n const serializer = (value: Value) => {\n if (options?.serializer) return options.serializer(value);\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n };\n\n const storage = options?.storage ?? window?.localStorage;\n\n const set = (value: Value) => setStorageItem(storage, key, serializer(value));\n const remove = () => removeStorageItem(storage, key);\n\n const deserializer = (value: string) => {\n if (options?.deserializer) return options.deserializer(value);\n if (value === 'undefined') return undefined as unknown as Value;\n\n try {\n return JSON.parse(value) as Value;\n } catch {\n return value as Value;\n }\n };\n\n const [value, setValue] = useState<Value | undefined>(() => {\n const storageValue = getStorageItem(storage, key);\n if (storageValue === undefined && initialValue !== undefined) {\n const value =\n typeof initialValue === 'function' ? (initialValue as () => Value)() : initialValue;\n setStorageItem(storage, key, serializer(value));\n return value;\n }\n return storageValue ? deserializer(storageValue) : undefined;\n });\n\n useEffect(() => {\n const onChange = () => {\n const storageValue = getStorageItem(storage, key);\n setValue(storageValue ? deserializer(storageValue) : undefined);\n };\n window.addEventListener(STORAGE_EVENT, onChange);\n return () => window.removeEventListener(STORAGE_EVENT, onChange);\n }, [key]);\n\n return {\n value: value as Value,\n set,\n remove\n };\n}) as UseStorage;\n"],"names":["STORAGE_EVENT","dispatchStorageEvent","params","setStorageItem","storage","key","value","oldValue","removeStorageItem","getStorageItem","useStorage","options","initialValue","serializer","set","remove","deserializer","setValue","useState","storageValue","useEffect","onChange"],"mappings":"yGAoCaA,EAAgB,mBAEhBC,EAAwBC,GACnC,OAAO,cAAc,IAAI,aAAaF,EAAeE,CAAM,CAAC,EAExDC,EAAiB,CAACC,EAAkBC,EAAaC,IAAkB,CACvE,MAAMC,EAAWH,EAAQ,QAAQC,CAAG,EAEpCD,EAAQ,QAAQC,EAAKC,CAAK,EAC1BL,EAAqB,CACnB,IAAAI,EACA,SAAAE,EACA,SAAUD,EACV,YAAaF,CAAA,CACd,CACH,EAEMI,EAAoB,CAACJ,EAAkBC,IAAgB,CAC3D,MAAME,EAAWH,EAAQ,QAAQC,CAAG,EAEpCD,EAAQ,WAAWC,CAAG,EACtBJ,EAAqB,CAAE,IAAAI,EAAK,SAAAE,EAAU,SAAU,KAAM,YAAaH,EAAS,CAC9E,EAEMK,EAAiB,CAACL,EAAkBC,IAAgB,CACxD,MAAMC,EAAQF,EAAQ,QAAQC,CAAG,EACjC,GAAKC,EACL,OAAOA,CACT,EAuBaI,EAAc,CAAQL,EAAaH,IAA0C,CACxF,MAAMS,EACJ,OAAOT,GAAW,UAClBA,IACC,eAAgBA,GACf,iBAAkBA,GAClB,iBAAkBA,GAClB,YAAaA,GACXA,EACA,OAGAU,EAAgBD,EAAUA,GAAS,aAAeT,EAExD,GAAI,OAAO,OAAW,IAEpB,MAAO,CACL,MAFY,OAAOU,GAAiB,WAAcA,IAA+BA,EAGjF,IAAK,IAAM,CAAA,EACX,OAAQ,IAAM,CAAA,CAAC,EAInB,MAAMC,EAAcP,GACdK,GAAS,WAAmBA,EAAQ,WAAWL,CAAK,EACpD,OAAOA,GAAU,SAAiBA,EAC/B,KAAK,UAAUA,CAAK,EAGvBF,EAAUO,GAAS,SAAW,QAAQ,aAEtCG,EAAOR,GAAiBH,EAAeC,EAASC,EAAKQ,EAAWP,CAAK,CAAC,EACtES,EAAS,IAAMP,EAAkBJ,EAASC,CAAG,EAE7CW,EAAgBV,GAAkB,CACtC,GAAIK,GAAS,aAAc,OAAOA,EAAQ,aAAaL,CAAK,EAC5D,GAAIA,IAAU,YAEd,GAAI,CACF,OAAO,KAAK,MAAMA,CAAK,CAAA,MACjB,CACN,OAAOA,CAAA,CACT,EAGI,CAACA,EAAOW,CAAQ,EAAIC,EAAAA,SAA4B,IAAM,CAC1D,MAAMC,EAAeV,EAAeL,EAASC,CAAG,EAChD,GAAIc,IAAiB,QAAaP,IAAiB,OAAW,CAC5D,MAAMN,EACJ,OAAOM,GAAiB,WAAcA,IAAiCA,EACzE,OAAAT,EAAeC,EAASC,EAAKQ,EAAWP,CAAK,CAAC,EACvCA,CAAA,CAET,OAAOa,EAAeH,EAAaG,CAAY,EAAI,MAAA,CACpD,EAEDC,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,IAAM,CACrB,MAAMF,EAAeV,EAAeL,EAASC,CAAG,EAChDY,EAASE,EAAeH,EAAaG,CAAY,EAAI,MAAS,CAAA,EAEhE,cAAO,iBAAiBnB,EAAeqB,CAAQ,EACxC,IAAM,OAAO,oBAAoBrB,EAAeqB,CAAQ,CAAA,EAC9D,CAAChB,CAAG,CAAC,EAED,CACL,MAAAC,EACA,IAAAQ,EACA,OAAAC,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react"),l=require("../useEvent/useEvent.cjs"),n=require("../../utils/helpers/throttle.cjs"),s=(e,t)=>{const r=l.useEvent(e);return o.useMemo(()=>n.throttle(r,t),[t])};exports.useThrottleCallback=s;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react"),R=(o,u)=>{const c=e.useRef(o),t=e.useRef(null),r=e.useRef(!1),l=e.useRef(u),n=e.useRef(null);return c.current=o,l.current=u,e.useMemo(()=>{const s=()=>{r.current=!1,n.current&&(c.current.apply(void 0,n.current),n.current=null,setTimeout(s,l.current))},a=()=>{t.current&&(clearTimeout(t.current),t.current=null,r.current=!1)},f=function(...i){n.current=i,!r.current&&(c.current.apply(this,i),r.current=!0,t.current=setTimeout(s,l.current))};return f.cancel=a,console.log("cancel",t.current),a(),f},[u])};exports.useThrottleCallback=R;
2
2
  //# sourceMappingURL=useThrottleCallback.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useThrottleCallback.cjs","sources":["../../../../src/hooks/useThrottleCallback/useThrottleCallback.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { throttle } from '@/utils/helpers';\n\nimport { useEvent } from '../useEvent/useEvent';\n\n/**\n * @name useThrottleCallback\n * @description - Hook that creates a throttled callback\n * @category Utilities\n *\n * @template Params The type of the params\n * @template Return The type of the return\n * @param {(...args: Params) => Return} callback The callback function\n * @param {number} delay The delay in milliseconds\n * @returns {(...args: Params) => Return} The callback with throttle\n *\n * @example\n * const throttled = useThrottleCallback(() => console.log('callback'), 500);\n */\nexport const useThrottleCallback = <Params extends unknown[], Return>(\n callback: (...args: Params) => Return,\n delay: number\n) => {\n const internalCallback = useEvent(callback);\n const throttled = useMemo(() => throttle(internalCallback, delay), [delay]);\n\n return throttled;\n};\n"],"names":["useThrottleCallback","callback","delay","internalCallback","useEvent","useMemo","throttle"],"mappings":"6LAoBaA,EAAsB,CACjCC,EACAC,IACG,CACH,MAAMC,EAAmBC,EAAAA,SAASH,CAAQ,EAG1C,OAFkBI,EAAAA,QAAQ,IAAMC,EAAAA,SAASH,EAAkBD,CAAK,EAAG,CAACA,CAAK,CAAC,CAG5E"}
1
+ {"version":3,"file":"useThrottleCallback.cjs","sources":["../../../../src/hooks/useThrottleCallback/useThrottleCallback.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\n\nexport type ThrottledCallback<Params extends unknown[]> = ((...args: Params) => void) & {\n cancel: () => void;\n};\n\n/**\n * @name useThrottleCallback\n * @description - Hook that creates a throttled callback\n * @category Utilities\n *\n * @template Params The type of the params\n * @template Return The type of the return\n * @param {(...args: Params) => Return} callback The callback function\n * @param {number} delay The delay in milliseconds\n * @returns {(...args: Params) => Return} The callback with throttle\n *\n * @example\n * const throttled = useThrottleCallback(() => console.log('callback'), 500);\n */\nexport const useThrottleCallback = <Params extends unknown[], Return>(\n callback: (...args: Params) => Return,\n delay: number\n): ThrottledCallback<Params> => {\n const internalCallbackRef = useRef(callback);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isCalledRef = useRef(false);\n const delayRef = useRef(delay);\n const lastArgsRef = useRef<Params | null>(null);\n\n internalCallbackRef.current = callback;\n delayRef.current = delay;\n\n const throttled = useMemo(() => {\n const timer = () => {\n isCalledRef.current = false;\n\n if (!lastArgsRef.current) return;\n internalCallbackRef.current.apply(this, lastArgsRef.current);\n lastArgsRef.current = null;\n setTimeout(timer, delayRef.current);\n };\n\n const cancel = () => {\n if (!timeoutRef.current) return;\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n isCalledRef.current = false;\n };\n\n const throttledCallback = function (this: any, ...args: Params) {\n lastArgsRef.current = args;\n if (isCalledRef.current) return;\n\n internalCallbackRef.current.apply(this, args);\n isCalledRef.current = true;\n timeoutRef.current = setTimeout(timer, delayRef.current);\n };\n\n throttledCallback.cancel = cancel;\n\n console.log('cancel', timeoutRef.current);\n cancel();\n return throttledCallback;\n }, [delay]);\n\n return throttled;\n};\n"],"names":["useThrottleCallback","callback","delay","internalCallbackRef","useRef","timeoutRef","isCalledRef","delayRef","lastArgsRef","useMemo","timer","cancel","throttledCallback","args"],"mappings":"yGAoBaA,EAAsB,CACjCC,EACAC,IAC8B,CAC9B,MAAMC,EAAsBC,EAAAA,OAAOH,CAAQ,EACrCI,EAAaD,EAAAA,OAA6C,IAAI,EAC9DE,EAAcF,EAAAA,OAAO,EAAK,EAC1BG,EAAWH,EAAAA,OAAOF,CAAK,EACvBM,EAAcJ,EAAAA,OAAsB,IAAI,EAE9C,OAAAD,EAAoB,QAAUF,EAC9BM,EAAS,QAAUL,EAEDO,EAAAA,QAAQ,IAAM,CAC9B,MAAMC,EAAQ,IAAM,CAClBJ,EAAY,QAAU,GAEjBE,EAAY,UACjBL,EAAoB,QAAQ,MAAM,OAAMK,EAAY,OAAO,EAC3DA,EAAY,QAAU,KACtB,WAAWE,EAAOH,EAAS,OAAO,EAAA,EAG9BI,EAAS,IAAM,CACdN,EAAW,UAChB,aAAaA,EAAW,OAAO,EAC/BA,EAAW,QAAU,KACrBC,EAAY,QAAU,GAAA,EAGlBM,EAAoB,YAAwBC,EAAc,CAC9DL,EAAY,QAAUK,EAClB,CAAAP,EAAY,UAEhBH,EAAoB,QAAQ,MAAM,KAAMU,CAAI,EAC5CP,EAAY,QAAU,GACtBD,EAAW,QAAU,WAAWK,EAAOH,EAAS,OAAO,EAAA,EAGzD,OAAAK,EAAkB,OAASD,EAE3B,QAAQ,IAAI,SAAUN,EAAW,OAAO,EACxCM,EAAA,EACOC,CAAA,EACN,CAACV,CAAK,CAAC,CAGZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"useWizard.cjs","sources":["../../../../src/hooks/useWizard/useWizard.ts"],"sourcesContent":["import { useState } from 'react';\n\nexport interface WizardItem<WizardStepId> {\n id: WizardStepId;\n nodes?: WizardStepId[];\n}\n\n/**\n * @name useWizard\n * @description - Hook that manages a wizard\n * @category Utilities\n *\n * @param {WizardItem<WizardStepId>[]} map The map of the wizard\n * @param {WizardStepId} [initialStepId] The initial step id\n * @returns {UseWizardReturn<WizardStepId>} An object containing the current step id and functions to interact with the wizard\n *\n * @example\n * const { currentStepId, set, reset, back, history } = useWizard([\n * { id: 'step1', nodes: ['step2', 'step3'] },\n * { id: 'step2', nodes: ['step3'] },\n * { id: 'step3', nodes: [] },\n * ])\n */\nexport const useWizard = <WizardStepId extends string>(\n map: WizardItem<WizardStepId>[],\n initialStepId?: WizardStepId\n) => {\n const initialId = initialStepId ?? map[0].id;\n const wizardMap = new Map(map.map((wizardItem) => [wizardItem.id, wizardItem]));\n const [currentStepId, setCurrentStepId] = useState(initialId);\n const [history, setHistory] = useState<WizardStepId[]>([initialId]);\n\n const set = (id: WizardStepId) => {\n if (!wizardMap.get(currentStepId)?.nodes?.includes(id))\n throw new Error(`Can't go to ${id} from ${currentStepId}`);\n\n setHistory([...history, id]);\n setCurrentStepId(id);\n };\n\n const back = () => {\n if (history.length === 1) return;\n\n const previousStepId = history[history.length - 2];\n if (!wizardMap.get(currentStepId)?.nodes?.includes(previousStepId))\n throw new Error(`Can't go to ${previousStepId} from ${currentStepId}`);\n\n setHistory(history.slice(0, -1));\n setCurrentStepId(history[history.length - 2]);\n };\n\n const reset = () => {\n setCurrentStepId(initialId);\n setHistory([initialId]);\n };\n\n return { currentStepId, set, reset, back, history };\n};\n"],"names":["useWizard","map","initialStepId","initialId","wizardMap","wizardItem","currentStepId","setCurrentStepId","useState","history","setHistory","id","previousStepId"],"mappings":"yGAuBaA,EAAY,CACvBC,EACAC,IACG,CACH,MAAMC,EAAYD,GAAiBD,EAAI,CAAC,EAAE,GACpCG,EAAY,IAAI,IAAIH,EAAI,IAAKI,GAAe,CAACA,EAAW,GAAIA,CAAU,CAAC,CAAC,EACxE,CAACC,EAAeC,CAAgB,EAAIC,EAAAA,SAASL,CAAS,EACtD,CAACM,EAASC,CAAU,EAAIF,EAAAA,SAAyB,CAACL,CAAS,CAAC,EA0BlE,MAAO,CAAE,cAAAG,EAAe,IAxBXK,GAAqB,CAChC,GAAI,CAACP,EAAU,IAAIE,CAAa,GAAG,OAAO,SAASK,CAAE,EACnD,MAAM,IAAI,MAAM,eAAeA,CAAE,SAASL,CAAa,EAAE,EAE3DI,EAAW,CAAC,GAAGD,EAASE,CAAE,CAAC,EAC3BJ,EAAiBI,CAAE,CAAA,EAmBQ,MALf,IAAM,CAClBJ,EAAiBJ,CAAS,EAC1BO,EAAW,CAACP,CAAS,CAAC,CAAA,EAGY,KAhBvB,IAAM,CACjB,GAAIM,EAAQ,SAAW,EAAG,OAE1B,MAAMG,EAAiBH,EAAQA,EAAQ,OAAS,CAAC,EACjD,GAAI,CAACL,EAAU,IAAIE,CAAa,GAAG,OAAO,SAASM,CAAc,EAC/D,MAAM,IAAI,MAAM,eAAeA,CAAc,SAASN,CAAa,EAAE,EAEvEI,EAAWD,EAAQ,MAAM,EAAG,EAAE,CAAC,EAC/BF,EAAiBE,EAAQA,EAAQ,OAAS,CAAC,CAAC,CAAA,EAQJ,QAAAA,CAAA,CAC5C"}
1
+ {"version":3,"file":"useWizard.cjs","sources":["../../../../src/hooks/useWizard/useWizard.ts"],"sourcesContent":["import { useState } from 'react';\n\nexport interface WizardItem<WizardStepId> {\n id: WizardStepId;\n nodes?: WizardStepId[];\n}\n\n/**\n * @name useWizard\n * @description - Hook that manages a wizard\n * @category Utilities\n *\n * @param {WizardItem<WizardStepId>[]} map The map of the wizard\n * @param {WizardStepId} [initialStepId] The initial step id\n * @returns {UseWizardReturn<WizardStepId>} An object containing the current step id and functions to interact with the wizard\n *\n * @example\n * const { currentStepId, set, reset, back, next, history } = useWizard([\n * { id: 'step1', nodes: ['step2', 'step3'] },\n * { id: 'step2', nodes: ['step3'] },\n * { id: 'step3', nodes: [] },\n * ])\n */\nexport const useWizard = <WizardStepId extends string>(\n map: WizardItem<WizardStepId>[],\n initialStepId?: WizardStepId\n) => {\n const initialId = initialStepId ?? map[0].id;\n const wizardMap = new Map(map.map((wizardItem) => [wizardItem.id, wizardItem]));\n const [currentStepId, setCurrentStepId] = useState(initialId);\n const [history, setHistory] = useState<WizardStepId[]>([initialId]);\n\n const set = (id: WizardStepId) => {\n if (!wizardMap.get(currentStepId)?.nodes?.includes(id))\n throw new Error(`Can't go to ${id} from ${currentStepId}`);\n\n setHistory([...history, id]);\n setCurrentStepId(id);\n };\n\n const back = () => {\n if (history.length === 1) return;\n\n const previousStepId = history[history.length - 2];\n if (!wizardMap.get(currentStepId)?.nodes?.includes(previousStepId))\n throw new Error(`Can't go to ${previousStepId} from ${currentStepId}`);\n\n setHistory(history.slice(0, -1));\n setCurrentStepId(history[history.length - 2]);\n };\n\n const reset = () => {\n setCurrentStepId(initialId);\n setHistory([initialId]);\n };\n\n return { currentStepId, set, reset, back, history };\n};\n"],"names":["useWizard","map","initialStepId","initialId","wizardMap","wizardItem","currentStepId","setCurrentStepId","useState","history","setHistory","id","previousStepId"],"mappings":"yGAuBaA,EAAY,CACvBC,EACAC,IACG,CACH,MAAMC,EAAYD,GAAiBD,EAAI,CAAC,EAAE,GACpCG,EAAY,IAAI,IAAIH,EAAI,IAAKI,GAAe,CAACA,EAAW,GAAIA,CAAU,CAAC,CAAC,EACxE,CAACC,EAAeC,CAAgB,EAAIC,EAAAA,SAASL,CAAS,EACtD,CAACM,EAASC,CAAU,EAAIF,EAAAA,SAAyB,CAACL,CAAS,CAAC,EA0BlE,MAAO,CAAE,cAAAG,EAAe,IAxBXK,GAAqB,CAChC,GAAI,CAACP,EAAU,IAAIE,CAAa,GAAG,OAAO,SAASK,CAAE,EACnD,MAAM,IAAI,MAAM,eAAeA,CAAE,SAASL,CAAa,EAAE,EAE3DI,EAAW,CAAC,GAAGD,EAASE,CAAE,CAAC,EAC3BJ,EAAiBI,CAAE,CAAA,EAmBQ,MALf,IAAM,CAClBJ,EAAiBJ,CAAS,EAC1BO,EAAW,CAACP,CAAS,CAAC,CAAA,EAGY,KAhBvB,IAAM,CACjB,GAAIM,EAAQ,SAAW,EAAG,OAE1B,MAAMG,EAAiBH,EAAQA,EAAQ,OAAS,CAAC,EACjD,GAAI,CAACL,EAAU,IAAIE,CAAa,GAAG,OAAO,SAASM,CAAc,EAC/D,MAAM,IAAI,MAAM,eAAeA,CAAc,SAASN,CAAa,EAAE,EAEvEI,EAAWD,EAAQ,MAAM,EAAG,EAAE,CAAC,EAC/BF,EAAiBE,EAAQA,EAAQ,OAAS,CAAC,CAAC,CAAA,EAQJ,QAAAA,CAAA,CAC5C"}