@siberiacancode/reactuse 0.3.13 → 0.3.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -71
- package/dist/cjs/helpers/createContext/createContext.cjs.map +1 -1
- package/dist/cjs/helpers/createContextHook/createContextHook.cjs +2 -0
- package/dist/cjs/helpers/createContextHook/createContextHook.cjs.map +1 -0
- package/dist/cjs/helpers/createSharedHook/createSharedHook.cjs +2 -0
- package/dist/cjs/helpers/createSharedHook/createSharedHook.cjs.map +1 -0
- package/dist/cjs/hooks/useBatchedCallback/useBatchedCallback.cjs +1 -1
- package/dist/cjs/hooks/useBatchedCallback/useBatchedCallback.cjs.map +1 -1
- package/dist/cjs/hooks/useDropZone/useDropZone.cjs +1 -1
- package/dist/cjs/hooks/useDropZone/useDropZone.cjs.map +1 -1
- package/dist/cjs/hooks/useField/useField.cjs +1 -1
- package/dist/cjs/hooks/useField/useField.cjs.map +1 -1
- package/dist/cjs/hooks/useHotkeys/useHotkeys.cjs.map +1 -1
- package/dist/cjs/hooks/useImage/useImage.cjs.map +1 -1
- package/dist/cjs/hooks/useMediaQuery/useMediaQuery.cjs.map +1 -1
- package/dist/cjs/hooks/useMouse/useMouse.cjs +1 -1
- package/dist/cjs/hooks/useMouse/useMouse.cjs.map +1 -1
- package/dist/cjs/hooks/useMutation/useMutation.cjs +1 -1
- package/dist/cjs/hooks/useMutation/useMutation.cjs.map +1 -1
- package/dist/cjs/hooks/useNetwork/useNetwork.cjs.map +1 -1
- package/dist/cjs/hooks/useOptimistic/useOptimistic.cjs.map +1 -1
- package/dist/cjs/hooks/useOrientation/useOrientation.cjs.map +1 -1
- package/dist/cjs/hooks/useOtpCredential/useOtpCredential.cjs.map +1 -1
- package/dist/cjs/hooks/useParallax/useParallax.cjs.map +1 -1
- package/dist/cjs/hooks/usePostMessage/usePostMessage.cjs.map +1 -1
- package/dist/cjs/hooks/useProgress/useProgress.cjs +1 -1
- package/dist/cjs/hooks/useProgress/useProgress.cjs.map +1 -1
- package/dist/cjs/hooks/useScroll/useScroll.cjs +1 -1
- package/dist/cjs/hooks/useScroll/useScroll.cjs.map +1 -1
- package/dist/cjs/hooks/useSticky/useSticky.cjs.map +1 -1
- package/dist/cjs/hooks/useStorage/useStorage.cjs.map +1 -1
- package/dist/cjs/hooks/useTextDirection/useTextDirection.cjs.map +1 -1
- package/dist/cjs/hooks/useTextareaAutosize/useTextareaAutosize.cjs.map +1 -1
- package/dist/cjs/hooks/useUrlSearchParam/useUrlSearchParam.cjs.map +1 -1
- package/dist/cjs/hooks/useUrlSearchParams/useUrlSearchParams.cjs.map +1 -1
- package/dist/cjs/hooks/useVirtualKeyboard/useVirtualKeyboard.cjs.map +1 -1
- package/dist/cjs/hooks/useVisibility/useVisibility.cjs.map +1 -1
- package/dist/cjs/hooks/useWakeLock/useWakeLock.cjs.map +1 -1
- package/dist/cjs/hooks/useWebSocket/useWebSocket.cjs.map +1 -1
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/utils/helpers/isTarget.cjs.map +1 -1
- package/dist/esm/helpers/createContext/createContext.mjs.map +1 -1
- package/dist/esm/helpers/createContextHook/createContextHook.mjs +13 -0
- package/dist/esm/helpers/createContextHook/createContextHook.mjs.map +1 -0
- package/dist/esm/helpers/createSharedHook/createSharedHook.mjs +42 -0
- package/dist/esm/helpers/createSharedHook/createSharedHook.mjs.map +1 -0
- package/dist/esm/hooks/useBatchedCallback/useBatchedCallback.mjs.map +1 -1
- package/dist/esm/hooks/useDropZone/useDropZone.mjs +27 -27
- package/dist/esm/hooks/useDropZone/useDropZone.mjs.map +1 -1
- package/dist/esm/hooks/useField/useField.mjs +42 -42
- package/dist/esm/hooks/useField/useField.mjs.map +1 -1
- package/dist/esm/hooks/useHotkeys/useHotkeys.mjs.map +1 -1
- package/dist/esm/hooks/useImage/useImage.mjs.map +1 -1
- package/dist/esm/hooks/useMediaQuery/useMediaQuery.mjs.map +1 -1
- package/dist/esm/hooks/useMouse/useMouse.mjs +37 -32
- package/dist/esm/hooks/useMouse/useMouse.mjs.map +1 -1
- package/dist/esm/hooks/useMutation/useMutation.mjs +29 -28
- package/dist/esm/hooks/useMutation/useMutation.mjs.map +1 -1
- package/dist/esm/hooks/useNetwork/useNetwork.mjs.map +1 -1
- package/dist/esm/hooks/useOptimistic/useOptimistic.mjs.map +1 -1
- package/dist/esm/hooks/useOrientation/useOrientation.mjs.map +1 -1
- package/dist/esm/hooks/useOtpCredential/useOtpCredential.mjs.map +1 -1
- package/dist/esm/hooks/useParallax/useParallax.mjs.map +1 -1
- package/dist/esm/hooks/usePostMessage/usePostMessage.mjs.map +1 -1
- package/dist/esm/hooks/useProgress/useProgress.mjs +13 -13
- package/dist/esm/hooks/useProgress/useProgress.mjs.map +1 -1
- package/dist/esm/hooks/useScroll/useScroll.mjs +62 -44
- package/dist/esm/hooks/useScroll/useScroll.mjs.map +1 -1
- package/dist/esm/hooks/useSticky/useSticky.mjs.map +1 -1
- package/dist/esm/hooks/useStorage/useStorage.mjs.map +1 -1
- package/dist/esm/hooks/useTextDirection/useTextDirection.mjs.map +1 -1
- package/dist/esm/hooks/useTextareaAutosize/useTextareaAutosize.mjs.map +1 -1
- package/dist/esm/hooks/useUrlSearchParam/useUrlSearchParam.mjs.map +1 -1
- package/dist/esm/hooks/useUrlSearchParams/useUrlSearchParams.mjs.map +1 -1
- package/dist/esm/hooks/useVirtualKeyboard/useVirtualKeyboard.mjs.map +1 -1
- package/dist/esm/hooks/useVisibility/useVisibility.mjs.map +1 -1
- package/dist/esm/hooks/useWakeLock/useWakeLock.mjs.map +1 -1
- package/dist/esm/hooks/useWebSocket/useWebSocket.mjs.map +1 -1
- package/dist/esm/index.mjs +389 -384
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/utils/helpers/isTarget.mjs.map +1 -1
- package/dist/types/helpers/createContextHook/createContextHook.d.ts +26 -0
- package/dist/types/helpers/createSharedHook/createSharedHook.d.ts +21 -0
- package/dist/types/helpers/index.d.ts +2 -0
- package/dist/types/hooks/useField/useField.d.ts +7 -9
- package/dist/types/hooks/useMouse/useMouse.d.ts +17 -7
- package/dist/types/hooks/useProgress/useProgress.d.ts +4 -2
- package/dist/types/hooks/useScroll/useScroll.d.ts +13 -11
- package/dist/types/hooks/useUrlSearchParams/useUrlSearchParams.d.ts +0 -1
- package/package.json +5 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOtpCredential.mjs","sources":["../../../../src/hooks/useOtpCredential/useOtpCredential.ts"],"sourcesContent":["import { useRef } from 'react';\n\ndeclare global {\n interface OTPOptions {\n readonly transport: string[];\n }\n\n interface CredentialRequestOptions {\n readonly otp: OTPOptions;\n }\n\n interface Credential {\n readonly code: string;\n }\n}\n\n/* The use otp credential callback type */\nexport type UseOtpCredentialCallback = (otp: Credential | null) => void;\n\n/* The use otp credential options type */\nexport interface UseOtpCredentialParams {\n /* The callback function to be invoked on error */\n onError?: (error: any) => void;\n /* The callback function to be invoked on success */\n onSuccess?: (credential: Credential | null) => void;\n}\n\n/* The use otp credential return type */\nexport interface UseOtpCredentialReturn {\n /* The abort function */\n abort: AbortController['abort'];\n /* The supported state of the otp credential */\n supported: boolean;\n /* The get otp credential function */\n get: () => Promise<Credential | null>;\n}\n\nexport interface UseOtpCredential {\n (callback?: UseOtpCredentialCallback): UseOtpCredentialReturn;\n\n (params?: UseOtpCredentialParams): UseOtpCredentialReturn;\n}\n\n/**\n * @name useOtpCredential\n * @description - Hook that creates an otp credential\n * @category Browser\n * @usage low\n *\n * @browserapi navigator.credentials https://developer.mozilla.org/en-US/docs/Web/API/Navigator/credentials\n *\n * @overload\n * @param {UseOtpCredentialCallback} callback The callback function to be invoked\n * @returns {UseOtpCredentialReturn}\n *\n * @example\n * useOtpCredential((credential) => console.log(credential));\n *\n * @overload\n * @param {UseOtpCredentialCallback} params.onSuccess The callback function to be invoked on success\n * @param {UseOtpCredentialCallback} params.onError The callback function to be invoked on error\n * @returns {UseOtpCredentialReturn}\n *\n * @example\n * useOtpCredential({ onSuccess: (credential) => console.log(credential), onError: (error) => console.log(error) });\n */\nexport const useOtpCredential = ((...params: any[]) => {\n const supported =\n typeof navigator !== 'undefined' && 'OTPCredential' in navigator && !!navigator.OTPCredential;\n\n const options =\n typeof params[0] === 'object'\n ? params[0]\n : {\n onSuccess: params[0]\n };\n\n const abortControllerRef = useRef<AbortController>(new AbortController());\n\n const get = async () => {\n if (!supported) return;\n\n abortControllerRef.current = new AbortController();\n try {\n const credential = await navigator.credentials.get({\n otp: { transport: ['sms'] },\n signal: abortControllerRef.current.signal\n });\n options.onSuccess?.(credential);\n\n return credential;\n } catch (error) {\n options.onError?.(error);\n }\n };\n\n const abort = () => {\n abortControllerRef.current.abort();\n abortControllerRef.current = new AbortController();\n };\n\n return { supported, abort, get };\n}) as UseOtpCredential;\n"],"names":["useOtpCredential","params","supported","options","abortControllerRef","useRef","credential","error"],"mappings":";AAkEO,MAAMA,KAAoB,IAAIC,MAAkB;AACrD,QAAMC,IACJ,OAAO,YAAc,OAAe,mBAAmB,aAAa,CAAC,CAAC,UAAU,eAE5EC,IACJ,OAAOF,EAAO,CAAC,KAAM,WACjBA,EAAO,CAAC,IACR;AAAA,IACE,WAAWA,EAAO,CAAC;AAAA,EAAA,GAGrBG,IAAqBC,EAAwB,IAAI,iBAAiB;AAwBxE,SAAO,EAAE,WAAAH,GAAW,OALN,MAAM;AAClB,IAAAE,EAAmB,QAAQ,MAAA,GAC3BA,EAAmB,UAAU,IAAI,gBAAA;AAAA,EAAgB,GAGxB,KAtBf,YAAY;AACtB,QAAKF,GAEL;AAAA,MAAAE,EAAmB,UAAU,IAAI,gBAAA;AACjC,UAAI;AACF,cAAME,IAAa,MAAM,UAAU,YAAY,IAAI;AAAA,UACjD,KAAK,EAAE,WAAW,CAAC,KAAK,EAAA;AAAA,UACxB,QAAQF,EAAmB,QAAQ;AAAA,QAAA,CACpC;AACD,eAAAD,EAAQ,YAAYG,CAAU,GAEvBA;AAAA,MAAA,SACAC,GAAO;AACd,QAAAJ,EAAQ,UAAUI,CAAK;AAAA,MAAA;AAAA;AAAA,EACzB,EAQyB;AAC7B;"}
|
|
1
|
+
{"version":3,"file":"useOtpCredential.mjs","sources":["../../../../src/hooks/useOtpCredential/useOtpCredential.ts"],"sourcesContent":["import { useRef } from 'react';\r\n\r\ndeclare global {\r\n interface OTPOptions {\r\n readonly transport: string[];\r\n }\r\n\r\n interface CredentialRequestOptions {\r\n readonly otp: OTPOptions;\r\n }\r\n\r\n interface Credential {\r\n readonly code: string;\r\n }\r\n}\r\n\r\n/* The use otp credential callback type */\r\nexport type UseOtpCredentialCallback = (otp: Credential | null) => void;\r\n\r\n/* The use otp credential options type */\r\nexport interface UseOtpCredentialParams {\r\n /* The callback function to be invoked on error */\r\n onError?: (error: any) => void;\r\n /* The callback function to be invoked on success */\r\n onSuccess?: (credential: Credential | null) => void;\r\n}\r\n\r\n/* The use otp credential return type */\r\nexport interface UseOtpCredentialReturn {\r\n /* The abort function */\r\n abort: AbortController['abort'];\r\n /* The supported state of the otp credential */\r\n supported: boolean;\r\n /* The get otp credential function */\r\n get: () => Promise<Credential | null>;\r\n}\r\n\r\nexport interface UseOtpCredential {\r\n (callback?: UseOtpCredentialCallback): UseOtpCredentialReturn;\r\n\r\n (params?: UseOtpCredentialParams): UseOtpCredentialReturn;\r\n}\r\n\r\n/**\r\n * @name useOtpCredential\r\n * @description - Hook that creates an otp credential\r\n * @category Browser\r\n * @usage low\r\n *\r\n * @browserapi navigator.credentials https://developer.mozilla.org/en-US/docs/Web/API/Navigator/credentials\r\n *\r\n * @overload\r\n * @param {UseOtpCredentialCallback} callback The callback function to be invoked\r\n * @returns {UseOtpCredentialReturn}\r\n *\r\n * @example\r\n * useOtpCredential((credential) => console.log(credential));\r\n *\r\n * @overload\r\n * @param {UseOtpCredentialCallback} params.onSuccess The callback function to be invoked on success\r\n * @param {UseOtpCredentialCallback} params.onError The callback function to be invoked on error\r\n * @returns {UseOtpCredentialReturn}\r\n *\r\n * @example\r\n * useOtpCredential({ onSuccess: (credential) => console.log(credential), onError: (error) => console.log(error) });\r\n */\r\nexport const useOtpCredential = ((...params: any[]) => {\r\n const supported =\r\n typeof navigator !== 'undefined' && 'OTPCredential' in navigator && !!navigator.OTPCredential;\r\n\r\n const options =\r\n typeof params[0] === 'object'\r\n ? params[0]\r\n : {\r\n onSuccess: params[0]\r\n };\r\n\r\n const abortControllerRef = useRef<AbortController>(new AbortController());\r\n\r\n const get = async () => {\r\n if (!supported) return;\r\n\r\n abortControllerRef.current = new AbortController();\r\n try {\r\n const credential = await navigator.credentials.get({\r\n otp: { transport: ['sms'] },\r\n signal: abortControllerRef.current.signal\r\n });\r\n options.onSuccess?.(credential);\r\n\r\n return credential;\r\n } catch (error) {\r\n options.onError?.(error);\r\n }\r\n };\r\n\r\n const abort = () => {\r\n abortControllerRef.current.abort();\r\n abortControllerRef.current = new AbortController();\r\n };\r\n\r\n return { supported, abort, get };\r\n}) as UseOtpCredential;\r\n"],"names":["useOtpCredential","params","supported","options","abortControllerRef","useRef","credential","error"],"mappings":";AAkEO,MAAMA,KAAoB,IAAIC,MAAkB;AACrD,QAAMC,IACJ,OAAO,YAAc,OAAe,mBAAmB,aAAa,CAAC,CAAC,UAAU,eAE5EC,IACJ,OAAOF,EAAO,CAAC,KAAM,WACjBA,EAAO,CAAC,IACR;AAAA,IACE,WAAWA,EAAO,CAAC;AAAA,EAAA,GAGrBG,IAAqBC,EAAwB,IAAI,iBAAiB;AAwBxE,SAAO,EAAE,WAAAH,GAAW,OALN,MAAM;AAClB,IAAAE,EAAmB,QAAQ,MAAA,GAC3BA,EAAmB,UAAU,IAAI,gBAAA;AAAA,EAAgB,GAGxB,KAtBf,YAAY;AACtB,QAAKF,GAEL;AAAA,MAAAE,EAAmB,UAAU,IAAI,gBAAA;AACjC,UAAI;AACF,cAAME,IAAa,MAAM,UAAU,YAAY,IAAI;AAAA,UACjD,KAAK,EAAE,WAAW,CAAC,KAAK,EAAA;AAAA,UACxB,QAAQF,EAAmB,QAAQ;AAAA,QAAA,CACpC;AACD,eAAAD,EAAQ,YAAYG,CAAU,GAEvBA;AAAA,MAAA,SACAC,GAAO;AACd,QAAAJ,EAAQ,UAAUI,CAAK;AAAA,MAAA;AAAA;AAAA,EACzB,EAQyB;AAC7B;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useParallax.mjs","sources":["../../../../src/hooks/useParallax/useParallax.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useDeviceOrientation } from '../useDeviceOrientation/useDeviceOrientation';\nimport { useOrientation } from '../useOrientation/useOrientation';\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use parallax value type */\nexport interface UseParallaxValue {\n /** Roll value. Scaled to `-0.5 ~ 0.5` */\n roll: number;\n /** Sensor source, can be `mouse` or `deviceOrientation` */\n source: 'deviceOrientation' | 'mouse';\n /** Tilt value. Scaled to `-0.5 ~ 0.5` */\n tilt: number;\n}\n\n/** The use parallax options type */\nexport interface UseParallaxOptions {\n /** Device orientation roll adjust function */\n deviceOrientationRollAdjust?: (value: number) => number;\n /** Device orientation tilt adjust function */\n deviceOrientationTiltAdjust?: (value: number) => number;\n /** Mouse roll adjust function */\n mouseRollAdjust?: (value: number) => number;\n /** Mouse tilt adjust function */\n mouseTiltAdjust?: (value: number) => number;\n}\n\ninterface UseParallaxReturn {\n value: UseParallaxValue;\n}\n\nexport interface UseParallax {\n (target: HookTarget, options?: UseParallaxOptions): UseParallaxReturn;\n\n <Target extends Element>(\n options?: UseParallaxOptions,\n target?: never\n ): UseParallaxReturn & {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name useParallax\n * @description - Hook to help create parallax effect\n * @category Sensors\n * @usage low\n *\n * @overload\n * @param {HookTarget} target The target element for the parallax effect\n * @param {UseParallaxOptions} options The options for the parallax effect\n * @returns {UseParallaxReturn} An object of parallax values\n *\n * @example\n * const { value } = useParallax(ref);\n *\n * @overload\n * @template Target The target element for the parallax effect\n * @param {UseParallaxOptions} options The options for the parallax effect\n * @returns {UseParallaxReturn & { ref: StateRef<Target> }} An object of parallax values\n *\n * @example\n * const { ref, value } = useParallax();\n */\nexport const useParallax = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const options = (params[1] ? params[1] : params[0]) as UseParallaxOptions | undefined;\n\n const internalRef = useRefState<Element>();\n\n const screenOrientation = useOrientation();\n const deviceOrientation = useDeviceOrientation();\n\n const {\n deviceOrientationRollAdjust = (value) => value,\n deviceOrientationTiltAdjust = (value) => value,\n mouseRollAdjust = (value) => value,\n mouseTiltAdjust = (value) => value\n } = (options ?? {}) as UseParallaxOptions;\n\n const [value, setValue] = useState({\n roll: 0,\n tilt: 0,\n source: 'mouse'\n });\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\n if (!element) return;\n\n const onMouseMove = (event: MouseEvent) => {\n const { left, top } = element.getBoundingClientRect();\n const elementPositionX = left + window.scrollX;\n const elementPositionY = top + window.scrollY;\n\n const getSource = () => {\n const isDeviceOrientation =\n deviceOrientation.supported &&\n (deviceOrientation.value.alpha || deviceOrientation.value.gamma);\n\n if (isDeviceOrientation) return 'deviceOrientation';\n return 'mouse';\n };\n\n const getRoll = () => {\n const source = getSource();\n if (source === 'deviceOrientation') {\n let value: number;\n switch (screenOrientation.value.orientationType) {\n case 'landscape-primary':\n value = deviceOrientation.value.gamma! / 90;\n break;\n case 'landscape-secondary':\n value = -deviceOrientation.value.gamma! / 90;\n break;\n case 'portrait-primary':\n value = -deviceOrientation.value.beta! / 90;\n break;\n case 'portrait-secondary':\n value = deviceOrientation.value.beta! / 90;\n break;\n default:\n value = -deviceOrientation.value.beta! / 90;\n }\n return deviceOrientationRollAdjust(value);\n } else {\n const y = event.pageY - elementPositionY;\n const height = element.getBoundingClientRect().height;\n const value = -(y - height / 2) / height;\n return mouseRollAdjust(value);\n }\n };\n\n const getTilt = () => {\n const source = getSource();\n if (source === 'deviceOrientation') {\n let value: number;\n switch (screenOrientation.value.orientationType) {\n case 'landscape-primary':\n value = deviceOrientation.value.beta! / 90;\n break;\n case 'landscape-secondary':\n value = -deviceOrientation.value.beta! / 90;\n break;\n case 'portrait-primary':\n value = deviceOrientation.value.gamma! / 90;\n break;\n case 'portrait-secondary':\n value = -deviceOrientation.value.gamma! / 90;\n break;\n default:\n value = deviceOrientation.value.gamma! / 90;\n }\n return deviceOrientationTiltAdjust(value);\n } else {\n const x = event.pageX - elementPositionX;\n const width = element.getBoundingClientRect().width;\n const value = (x - width / 2) / width;\n return mouseTiltAdjust(value);\n }\n };\n\n const source = getSource();\n const roll = getRoll();\n const tilt = getTilt();\n\n setValue({\n roll,\n source,\n tilt\n });\n };\n\n document.addEventListener('mousemove', onMouseMove);\n return () => {\n document.removeEventListener('mousemove', onMouseMove);\n };\n }, [\n target && isTarget.getRawElement(target),\n internalRef.state,\n screenOrientation.value.angle,\n screenOrientation.value.orientationType,\n deviceOrientation.value.gamma,\n deviceOrientation.value.beta,\n deviceOrientation.value.alpha,\n deviceOrientation.value.absolute\n ]);\n\n if (target) return { value };\n\n return {\n ref: internalRef,\n value\n };\n}) as UseParallax;\n"],"names":["useParallax","params","target","isTarget","options","internalRef","useRefState","screenOrientation","useOrientation","deviceOrientation","useDeviceOrientation","deviceOrientationRollAdjust","value","deviceOrientationTiltAdjust","mouseRollAdjust","mouseTiltAdjust","setValue","useState","useEffect","element","onMouseMove","event","left","top","elementPositionX","elementPositionY","getSource","getRoll","y","height","getTilt","x","width","source","roll","tilt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useParallax.mjs","sources":["../../../../src/hooks/useParallax/useParallax.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\r\n\r\nimport type { HookTarget } from '@/utils/helpers';\r\n\r\nimport { isTarget } from '@/utils/helpers';\r\n\r\nimport type { StateRef } from '../useRefState/useRefState';\r\n\r\nimport { useDeviceOrientation } from '../useDeviceOrientation/useDeviceOrientation';\r\nimport { useOrientation } from '../useOrientation/useOrientation';\r\nimport { useRefState } from '../useRefState/useRefState';\r\n\r\n/** The use parallax value type */\r\nexport interface UseParallaxValue {\r\n /** Roll value. Scaled to `-0.5 ~ 0.5` */\r\n roll: number;\r\n /** Sensor source, can be `mouse` or `deviceOrientation` */\r\n source: 'deviceOrientation' | 'mouse';\r\n /** Tilt value. Scaled to `-0.5 ~ 0.5` */\r\n tilt: number;\r\n}\r\n\r\n/** The use parallax options type */\r\nexport interface UseParallaxOptions {\r\n /** Device orientation roll adjust function */\r\n deviceOrientationRollAdjust?: (value: number) => number;\r\n /** Device orientation tilt adjust function */\r\n deviceOrientationTiltAdjust?: (value: number) => number;\r\n /** Mouse roll adjust function */\r\n mouseRollAdjust?: (value: number) => number;\r\n /** Mouse tilt adjust function */\r\n mouseTiltAdjust?: (value: number) => number;\r\n}\r\n\r\ninterface UseParallaxReturn {\r\n value: UseParallaxValue;\r\n}\r\n\r\nexport interface UseParallax {\r\n (target: HookTarget, options?: UseParallaxOptions): UseParallaxReturn;\r\n\r\n <Target extends Element>(\r\n options?: UseParallaxOptions,\r\n target?: never\r\n ): UseParallaxReturn & {\r\n ref: StateRef<Target>;\r\n };\r\n}\r\n\r\n/**\r\n * @name useParallax\r\n * @description - Hook to help create parallax effect\r\n * @category Sensors\r\n * @usage low\r\n *\r\n * @overload\r\n * @param {HookTarget} target The target element for the parallax effect\r\n * @param {UseParallaxOptions} options The options for the parallax effect\r\n * @returns {UseParallaxReturn} An object of parallax values\r\n *\r\n * @example\r\n * const { value } = useParallax(ref);\r\n *\r\n * @overload\r\n * @template Target The target element for the parallax effect\r\n * @param {UseParallaxOptions} options The options for the parallax effect\r\n * @returns {UseParallaxReturn & { ref: StateRef<Target> }} An object of parallax values\r\n *\r\n * @example\r\n * const { ref, value } = useParallax();\r\n */\r\nexport const useParallax = ((...params: any[]) => {\r\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\r\n const options = (params[1] ? params[1] : params[0]) as UseParallaxOptions | undefined;\r\n\r\n const internalRef = useRefState<Element>();\r\n\r\n const screenOrientation = useOrientation();\r\n const deviceOrientation = useDeviceOrientation();\r\n\r\n const {\r\n deviceOrientationRollAdjust = (value) => value,\r\n deviceOrientationTiltAdjust = (value) => value,\r\n mouseRollAdjust = (value) => value,\r\n mouseTiltAdjust = (value) => value\r\n } = (options ?? {}) as UseParallaxOptions;\r\n\r\n const [value, setValue] = useState({\r\n roll: 0,\r\n tilt: 0,\r\n source: 'mouse'\r\n });\r\n\r\n useEffect(() => {\r\n if (!target && !internalRef.state) return;\r\n\r\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\r\n if (!element) return;\r\n\r\n const onMouseMove = (event: MouseEvent) => {\r\n const { left, top } = element.getBoundingClientRect();\r\n const elementPositionX = left + window.scrollX;\r\n const elementPositionY = top + window.scrollY;\r\n\r\n const getSource = () => {\r\n const isDeviceOrientation =\r\n deviceOrientation.supported &&\r\n (deviceOrientation.value.alpha || deviceOrientation.value.gamma);\r\n\r\n if (isDeviceOrientation) return 'deviceOrientation';\r\n return 'mouse';\r\n };\r\n\r\n const getRoll = () => {\r\n const source = getSource();\r\n if (source === 'deviceOrientation') {\r\n let value: number;\r\n switch (screenOrientation.value.orientationType) {\r\n case 'landscape-primary':\r\n value = deviceOrientation.value.gamma! / 90;\r\n break;\r\n case 'landscape-secondary':\r\n value = -deviceOrientation.value.gamma! / 90;\r\n break;\r\n case 'portrait-primary':\r\n value = -deviceOrientation.value.beta! / 90;\r\n break;\r\n case 'portrait-secondary':\r\n value = deviceOrientation.value.beta! / 90;\r\n break;\r\n default:\r\n value = -deviceOrientation.value.beta! / 90;\r\n }\r\n return deviceOrientationRollAdjust(value);\r\n } else {\r\n const y = event.pageY - elementPositionY;\r\n const height = element.getBoundingClientRect().height;\r\n const value = -(y - height / 2) / height;\r\n return mouseRollAdjust(value);\r\n }\r\n };\r\n\r\n const getTilt = () => {\r\n const source = getSource();\r\n if (source === 'deviceOrientation') {\r\n let value: number;\r\n switch (screenOrientation.value.orientationType) {\r\n case 'landscape-primary':\r\n value = deviceOrientation.value.beta! / 90;\r\n break;\r\n case 'landscape-secondary':\r\n value = -deviceOrientation.value.beta! / 90;\r\n break;\r\n case 'portrait-primary':\r\n value = deviceOrientation.value.gamma! / 90;\r\n break;\r\n case 'portrait-secondary':\r\n value = -deviceOrientation.value.gamma! / 90;\r\n break;\r\n default:\r\n value = deviceOrientation.value.gamma! / 90;\r\n }\r\n return deviceOrientationTiltAdjust(value);\r\n } else {\r\n const x = event.pageX - elementPositionX;\r\n const width = element.getBoundingClientRect().width;\r\n const value = (x - width / 2) / width;\r\n return mouseTiltAdjust(value);\r\n }\r\n };\r\n\r\n const source = getSource();\r\n const roll = getRoll();\r\n const tilt = getTilt();\r\n\r\n setValue({\r\n roll,\r\n source,\r\n tilt\r\n });\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n };\r\n }, [\r\n target && isTarget.getRawElement(target),\r\n internalRef.state,\r\n screenOrientation.value.angle,\r\n screenOrientation.value.orientationType,\r\n deviceOrientation.value.gamma,\r\n deviceOrientation.value.beta,\r\n deviceOrientation.value.alpha,\r\n deviceOrientation.value.absolute\r\n ]);\r\n\r\n if (target) return { value };\r\n\r\n return {\r\n ref: internalRef,\r\n value\r\n };\r\n}) as UseParallax;\r\n"],"names":["useParallax","params","target","isTarget","options","internalRef","useRefState","screenOrientation","useOrientation","deviceOrientation","useDeviceOrientation","deviceOrientationRollAdjust","value","deviceOrientationTiltAdjust","mouseRollAdjust","mouseTiltAdjust","setValue","useState","useEffect","element","onMouseMove","event","left","top","elementPositionX","elementPositionY","getSource","getRoll","y","height","getTilt","x","width","source","roll","tilt"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePostMessage.mjs","sources":["../../../../src/hooks/usePostMessage/usePostMessage.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n/** The origin of the message */\nexport type UsePostMessageOrigin = string | '*' | string[];\n\n/** The return type of the usePostMessage hook */\nexport type UsePostMessageReturn<Message> = (message: Message) => void;\n\n/**\n * @name usePostMessage\n * @description - Hook that allows you to receive messages from other origins\n * @category Browser\n * @usage low\n *\n * @overload\n * @template Message The message data type\n * @param {UsePostMessageOrigin} origin The origin of the message\n * @param {(message: Message) => Message} callback callback to get received message\n * @returns {(message: Message) => void} An object containing the current message\n *\n * @example\n * const postMessage = usePostMessage();\n */\nexport const usePostMessage = <Message>(\n origin: UsePostMessageOrigin,\n callback: (message: Message, event: MessageEvent<Message>) => void\n): UsePostMessageReturn<Message> => {\n const internalCallbackRef = useRef(callback);\n internalCallbackRef.current = callback;\n const internalOriginRef = useRef(origin);\n internalOriginRef.current = origin;\n\n useEffect(() => {\n const onMessage = (event: MessageEvent<Message>) => {\n if (Array.isArray(internalOriginRef.current)) {\n if (!internalOriginRef.current.includes(event.origin)) return;\n } else if (internalOriginRef.current !== '*' && event.origin !== internalOriginRef.current)\n return;\n\n internalCallbackRef.current(event.data as Message, event);\n };\n\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n }, []);\n\n const postMessage = (message: Message) => {\n if (Array.isArray(internalOriginRef.current))\n return internalOriginRef.current.forEach((origin) => window.postMessage(message, origin));\n\n window.postMessage(message, internalOriginRef.current);\n };\n\n return postMessage;\n};\n"],"names":["usePostMessage","origin","callback","internalCallbackRef","useRef","internalOriginRef","useEffect","onMessage","event","message"],"mappings":";AAuBO,MAAMA,IAAiB,CAC5BC,GACAC,MACkC;AAClC,QAAMC,IAAsBC,EAAOF,CAAQ;AAC3C,EAAAC,EAAoB,UAAUD;AAC9B,QAAMG,IAAoBD,EAAOH,CAAM;AACvC,SAAAI,EAAkB,UAAUJ,GAE5BK,EAAU,MAAM;AACd,UAAMC,IAAY,CAACC,MAAiC;AAClD,UAAI,MAAM,QAAQH,EAAkB,OAAO;AACzC,YAAI,CAACA,EAAkB,QAAQ,SAASG,EAAM,MAAM,EAAG;AAAA,iBAC9CH,EAAkB,YAAY,OAAOG,EAAM,WAAWH,EAAkB;AACjF;AAEF,MAAAF,EAAoB,QAAQK,EAAM,MAAiBA,CAAK;AAAA,IAAA;AAG1D,kBAAO,iBAAiB,WAAWD,CAAS,GACrC,MAAM,OAAO,oBAAoB,WAAWA,CAAS;AAAA,EAAA,GAC3D,EAAE,GAEe,CAACE,MAAqB;AACxC,QAAI,MAAM,QAAQJ,EAAkB,OAAO;AACzC,aAAOA,EAAkB,QAAQ,QAAQ,CAACJ,MAAW,OAAO,YAAYQ,GAASR,CAAM,CAAC;AAE1F,WAAO,YAAYQ,GAASJ,EAAkB,OAAO;AAAA,EAAA;AAIzD;"}
|
|
1
|
+
{"version":3,"file":"usePostMessage.mjs","sources":["../../../../src/hooks/usePostMessage/usePostMessage.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\r\n\r\n/** The origin of the message */\r\nexport type UsePostMessageOrigin = string | '*' | string[];\r\n\r\n/** The return type of the usePostMessage hook */\r\nexport type UsePostMessageReturn<Message> = (message: Message) => void;\r\n\r\n/**\r\n * @name usePostMessage\r\n * @description - Hook that allows you to receive messages from other origins\r\n * @category Browser\r\n * @usage low\r\n *\r\n * @overload\r\n * @template Message The message data type\r\n * @param {UsePostMessageOrigin} origin The origin of the message\r\n * @param {(message: Message) => Message} callback callback to get received message\r\n * @returns {(message: Message) => void} An object containing the current message\r\n *\r\n * @example\r\n * const postMessage = usePostMessage();\r\n */\r\nexport const usePostMessage = <Message>(\r\n origin: UsePostMessageOrigin,\r\n callback: (message: Message, event: MessageEvent<Message>) => void\r\n): UsePostMessageReturn<Message> => {\r\n const internalCallbackRef = useRef(callback);\r\n internalCallbackRef.current = callback;\r\n const internalOriginRef = useRef(origin);\r\n internalOriginRef.current = origin;\r\n\r\n useEffect(() => {\r\n const onMessage = (event: MessageEvent<Message>) => {\r\n if (Array.isArray(internalOriginRef.current)) {\r\n if (!internalOriginRef.current.includes(event.origin)) return;\r\n } else if (internalOriginRef.current !== '*' && event.origin !== internalOriginRef.current)\r\n return;\r\n\r\n internalCallbackRef.current(event.data as Message, event);\r\n };\r\n\r\n window.addEventListener('message', onMessage);\r\n return () => window.removeEventListener('message', onMessage);\r\n }, []);\r\n\r\n const postMessage = (message: Message) => {\r\n if (Array.isArray(internalOriginRef.current))\r\n return internalOriginRef.current.forEach((origin) => window.postMessage(message, origin));\r\n\r\n window.postMessage(message, internalOriginRef.current);\r\n };\r\n\r\n return postMessage;\r\n};\r\n"],"names":["usePostMessage","origin","callback","internalCallbackRef","useRef","internalOriginRef","useEffect","onMessage","event","message"],"mappings":";AAuBO,MAAMA,IAAiB,CAC5BC,GACAC,MACkC;AAClC,QAAMC,IAAsBC,EAAOF,CAAQ;AAC3C,EAAAC,EAAoB,UAAUD;AAC9B,QAAMG,IAAoBD,EAAOH,CAAM;AACvC,SAAAI,EAAkB,UAAUJ,GAE5BK,EAAU,MAAM;AACd,UAAMC,IAAY,CAACC,MAAiC;AAClD,UAAI,MAAM,QAAQH,EAAkB,OAAO;AACzC,YAAI,CAACA,EAAkB,QAAQ,SAASG,EAAM,MAAM,EAAG;AAAA,iBAC9CH,EAAkB,YAAY,OAAOG,EAAM,WAAWH,EAAkB;AACjF;AAEF,MAAAF,EAAoB,QAAQK,EAAM,MAAiBA,CAAK;AAAA,IAAA;AAG1D,kBAAO,iBAAiB,WAAWD,CAAS,GACrC,MAAM,OAAO,oBAAoB,WAAWA,CAAS;AAAA,EAAA,GAC3D,EAAE,GAEe,CAACE,MAAqB;AACxC,QAAI,MAAM,QAAQJ,EAAkB,OAAO;AACzC,aAAOA,EAAkB,QAAQ,QAAQ,CAACJ,MAAW,OAAO,YAAYQ,GAASR,CAAM,CAAC;AAE1F,WAAO,YAAYQ,GAASJ,EAAkB,OAAO;AAAA,EAAA;AAIzD;"}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { useState as s, useRef as
|
|
2
|
-
const h = (t, e, n) => Math.min(Math.max(t, e), n),
|
|
3
|
-
const n = Math.max(e.speed ?? 250, 16), u = h(e.rate ?? 0.02, 0, 0.3),
|
|
4
|
-
r(1), c(!1), setTimeout(() => a(!1),
|
|
5
|
-
},
|
|
1
|
+
import { useState as s, useRef as E, useEffect as P } from "react";
|
|
2
|
+
const h = (t, e, n) => Math.min(Math.max(t, e), n), S = (t, e) => t < 0.25 ? 0.12 + e * Math.random() : t < 0.5 ? 0.08 + e * Math.random() : t < 0.8 ? 0.03 + e * Math.random() : t < 0.95 ? 0.01 + e / 2 * Math.random() : t < 0.99 ? 5e-3 * Math.random() : 0, b = (t = 0, e = {}) => {
|
|
3
|
+
const n = Math.max(e.speed ?? 250, 16), u = h(e.rate ?? 0.02, 0, 0.3), i = e.maximum ?? 0.98, M = e.delay ?? 250, [o, r] = s(t), [f, a] = s(!!e.immediately), [d, c] = s(f), v = E(void 0), x = () => {
|
|
4
|
+
r(1), c(!1), setTimeout(() => a(!1), M);
|
|
5
|
+
}, l = (m = S(o, u)) => r((y) => h(y + m, t, i)), I = (m = t) => {
|
|
6
6
|
a(!0), c(!0), r(m);
|
|
7
|
-
},
|
|
7
|
+
}, A = () => {
|
|
8
8
|
a(!1), c(!1), r(0);
|
|
9
9
|
};
|
|
10
|
-
return
|
|
10
|
+
return P(() => {
|
|
11
11
|
if (d)
|
|
12
|
-
return v.current = setInterval(
|
|
12
|
+
return v.current = setInterval(l, n), () => clearInterval(v.current);
|
|
13
13
|
}, [d, n, u]), {
|
|
14
14
|
value: o,
|
|
15
15
|
active: f,
|
|
16
|
-
start:
|
|
17
|
-
done:
|
|
18
|
-
inc:
|
|
19
|
-
remove:
|
|
16
|
+
start: I,
|
|
17
|
+
done: x,
|
|
18
|
+
inc: l,
|
|
19
|
+
remove: A
|
|
20
20
|
};
|
|
21
21
|
};
|
|
22
22
|
export {
|
|
23
|
-
|
|
23
|
+
b as useProgress
|
|
24
24
|
};
|
|
25
25
|
//# sourceMappingURL=useProgress.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useProgress.mjs","sources":["../../../../src/hooks/useProgress/useProgress.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nconst clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max);\n\nconst resolveAutoIncrement = (progress: number, trickleRate: number) => {\n if (progress < 0.25) return 0.12 + trickleRate * Math.random();\n if (progress < 0.5) return 0.08 + trickleRate * Math.random();\n if (progress < 0.8) return 0.03 + trickleRate * Math.random();\n if (progress < 0.95) return 0.01 + (trickleRate / 2) * Math.random();\n if (progress < 0.99) return 0.005 * Math.random();\n return 0;\n};\n\n/** The use progress options type */\nexport interface UseProgressOptions {\n /** Start progress immediately */\n immediately?: boolean;\n /** Maximum progress value */\n maximum?: number;\n /** Additional random amount for each auto increment */\n rate?: number;\n /** Auto-increment frequency in milliseconds */\n speed?: number;\n}\n\n/** The use progress return type */\nexport interface UseProgressReturn {\n /** Whether progress is currently active */\n active: boolean;\n /** Current progress value in range 0..1, null means hidden */\n value: number;\n /** Complete progress to 100% */\n done: (force?: boolean) => number | null;\n /** Increment progress with easing behavior */\n inc: (amount?: number) => number | null;\n /** Remove progress and stop timers */\n remove: () => void;\n /** Start progress and auto incrementing */\n start: (from?: number | null) => number;\n}\n\n/**\n * @name useProgress\n * @description - Hook that creates a lightweight progress bar
|
|
1
|
+
{"version":3,"file":"useProgress.mjs","sources":["../../../../src/hooks/useProgress/useProgress.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nconst clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max);\n\nconst resolveAutoIncrement = (progress: number, trickleRate: number) => {\n if (progress < 0.25) return 0.12 + trickleRate * Math.random();\n if (progress < 0.5) return 0.08 + trickleRate * Math.random();\n if (progress < 0.8) return 0.03 + trickleRate * Math.random();\n if (progress < 0.95) return 0.01 + (trickleRate / 2) * Math.random();\n if (progress < 0.99) return 0.005 * Math.random();\n return 0;\n};\n\n/** The use progress options type */\nexport interface UseProgressOptions {\n /** Delay before reset to null after done */\n delay?: number;\n /** Start progress immediately */\n immediately?: boolean;\n /** Maximum progress value */\n maximum?: number;\n /** Additional random amount for each auto increment */\n rate?: number;\n /** Auto-increment frequency in milliseconds */\n speed?: number;\n}\n\n/** The use progress return type */\nexport interface UseProgressReturn {\n /** Whether progress is currently active */\n active: boolean;\n /** Current progress value in range 0..1, null means hidden */\n value: number;\n /** Complete progress to 100% */\n done: (force?: boolean) => number | null;\n /** Increment progress with easing behavior */\n inc: (amount?: number) => number | null;\n /** Remove progress and stop timers */\n remove: () => void;\n /** Start progress and auto incrementing */\n start: (from?: number | null) => number;\n}\n\n/**\n * @name useProgress\n * @description - Hook that creates a lightweight progress bar\n * @category Time\n * @usage medium\n *\n * @param {number} [initialProgress] Initial progress value in range 0..1\n * @param {boolean} [options.active] Controls progress externally (true -> start, false -> done)\n * @param {number} [options.maximum=0.95] Maximum value when progress starts\n * @param {number} [options.speed=250] Auto increment interval in milliseconds\n * @param {number} [options.rate=0.02] Additional random increment amount on each tick\n * @param {number} [options.delay=250] Delay before reset to null after done\n * @returns {UseProgressReturn} Current progress state and control methods\n *\n * @example\n * const { value, active, start, done, inc, set, remove } = useProgress(0.2);\n */\nexport const useProgress = (initialValue: number = 0, options: UseProgressOptions = {}) => {\n const speed = Math.max(options.speed ?? 250, 16);\n const rate = clamp(options.rate ?? 0.02, 0, 0.3);\n const maximum = options.maximum ?? 0.98;\n const delay = options.delay ?? 250;\n\n const [value, setValue] = useState(initialValue);\n const [active, setActive] = useState(!!options.immediately);\n const [internalActive, setInternalActive] = useState(active);\n\n const intervalIdRef = useRef<ReturnType<typeof setInterval>>(undefined);\n\n const done = () => {\n setValue(1);\n setInternalActive(false);\n setTimeout(() => setActive(false), delay);\n };\n\n const inc = (amount: number = resolveAutoIncrement(value, rate)) =>\n setValue((currentValue) => clamp(currentValue + amount, initialValue, maximum));\n\n const start = (from: number = initialValue) => {\n setActive(true);\n setInternalActive(true);\n setValue(from);\n };\n\n const remove = () => {\n setActive(false);\n setInternalActive(false);\n setValue(0);\n };\n\n useEffect(() => {\n if (!internalActive) return;\n intervalIdRef.current = setInterval(inc, speed);\n return () => clearInterval(intervalIdRef.current);\n }, [internalActive, speed, rate]);\n\n return {\n value,\n active,\n start,\n done,\n inc,\n remove\n };\n};\n"],"names":["clamp","value","min","max","resolveAutoIncrement","progress","trickleRate","useProgress","initialValue","options","speed","rate","maximum","delay","setValue","useState","active","setActive","internalActive","setInternalActive","intervalIdRef","useRef","done","inc","amount","currentValue","start","from","remove","useEffect"],"mappings":";AAEA,MAAMA,IAAQ,CAACC,GAAeC,GAAaC,MAAgB,KAAK,IAAI,KAAK,IAAIF,GAAOC,CAAG,GAAGC,CAAG,GAEvFC,IAAuB,CAACC,GAAkBC,MAC1CD,IAAW,OAAa,OAAOC,IAAc,KAAK,OAAA,IAClDD,IAAW,MAAY,OAAOC,IAAc,KAAK,OAAA,IACjDD,IAAW,MAAY,OAAOC,IAAc,KAAK,OAAA,IACjDD,IAAW,OAAa,OAAQC,IAAc,IAAK,KAAK,OAAA,IACxDD,IAAW,OAAa,OAAQ,KAAK,OAAA,IAClC,GAkDIE,IAAc,CAACC,IAAuB,GAAGC,IAA8B,CAAA,MAAO;AACzF,QAAMC,IAAQ,KAAK,IAAID,EAAQ,SAAS,KAAK,EAAE,GACzCE,IAAOX,EAAMS,EAAQ,QAAQ,MAAM,GAAG,GAAG,GACzCG,IAAUH,EAAQ,WAAW,MAC7BI,IAAQJ,EAAQ,SAAS,KAEzB,CAACR,GAAOa,CAAQ,IAAIC,EAASP,CAAY,GACzC,CAACQ,GAAQC,CAAS,IAAIF,EAAS,CAAC,CAACN,EAAQ,WAAW,GACpD,CAACS,GAAgBC,CAAiB,IAAIJ,EAASC,CAAM,GAErDI,IAAgBC,EAAuC,MAAS,GAEhEC,IAAO,MAAM;AACjB,IAAAR,EAAS,CAAC,GACVK,EAAkB,EAAK,GACvB,WAAW,MAAMF,EAAU,EAAK,GAAGJ,CAAK;AAAA,EAAA,GAGpCU,IAAM,CAACC,IAAiBpB,EAAqBH,GAAOU,CAAI,MAC5DG,EAAS,CAACW,MAAiBzB,EAAMyB,IAAeD,GAAQhB,GAAcI,CAAO,CAAC,GAE1Ec,IAAQ,CAACC,IAAenB,MAAiB;AAC7C,IAAAS,EAAU,EAAI,GACdE,EAAkB,EAAI,GACtBL,EAASa,CAAI;AAAA,EAAA,GAGTC,IAAS,MAAM;AACnB,IAAAX,EAAU,EAAK,GACfE,EAAkB,EAAK,GACvBL,EAAS,CAAC;AAAA,EAAA;AAGZ,SAAAe,EAAU,MAAM;AACd,QAAKX;AACL,aAAAE,EAAc,UAAU,YAAYG,GAAKb,CAAK,GACvC,MAAM,cAAcU,EAAc,OAAO;AAAA,EAAA,GAC/C,CAACF,GAAgBR,GAAOC,CAAI,CAAC,GAEzB;AAAA,IACL,OAAAV;AAAA,IACA,QAAAe;AAAA,IACA,OAAAU;AAAA,IACA,MAAAJ;AAAA,IACA,KAAAC;AAAA,IACA,QAAAK;AAAA,EAAA;AAEJ;"}
|
|
@@ -1,64 +1,82 @@
|
|
|
1
|
-
import { useRef as
|
|
2
|
-
import { useRefState as
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
p
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { useRef as h, useEffect as j } from "react";
|
|
2
|
+
import { useRefState as k } from "../useRefState/useRefState.mjs";
|
|
3
|
+
import { useRerender as C } from "../useRerender/useRerender.mjs";
|
|
4
|
+
import { isTarget as m } from "../../utils/helpers/isTarget.mjs";
|
|
5
|
+
const _ = 1, z = ((...t) => {
|
|
6
|
+
const c = m(t[0]) ? t[0] : void 0, a = c ? typeof t[1] == "function" ? { ...t[2], onScroll: t[1] } : t[1] : typeof t[0] == "object" ? t[0] : typeof t[0] == "function" ? { ...t[1], onScroll: t[0] } : void 0, d = k(), p = h(a), f = h(null), r = h({
|
|
7
|
+
x: 0,
|
|
8
|
+
y: 0,
|
|
9
|
+
directions: {
|
|
10
|
+
left: !1,
|
|
11
|
+
right: !1,
|
|
12
|
+
top: !1,
|
|
13
|
+
bottom: !1
|
|
14
|
+
},
|
|
15
|
+
arrived: {
|
|
16
|
+
left: !0,
|
|
17
|
+
right: !1,
|
|
18
|
+
top: !0,
|
|
19
|
+
bottom: !1
|
|
20
|
+
}
|
|
21
|
+
}), R = h(!1), A = C();
|
|
22
|
+
p.current = a;
|
|
23
|
+
const v = () => (R.current = !0, r.current), O = (e) => {
|
|
24
|
+
r.current = e, R.current && A();
|
|
25
|
+
};
|
|
26
|
+
j(() => {
|
|
9
27
|
if (!c && !d.state) return;
|
|
10
|
-
const e = (c ?
|
|
28
|
+
const e = (c ? m.getElement(c) : d.current) ?? window;
|
|
11
29
|
f.current = e;
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
},
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
y: n,
|
|
30
|
+
const s = (o) => {
|
|
31
|
+
p.current?.onStop?.(o);
|
|
32
|
+
}, i = (o) => {
|
|
33
|
+
const n = o.target === document ? o.target.documentElement : o.target, { display: w, flexDirection: y, direction: W } = n.style, S = W === "rtl" ? -1 : 1, u = n.scrollLeft;
|
|
34
|
+
let l = n.scrollTop;
|
|
35
|
+
n instanceof Document && !l && (l = window.document.body.scrollTop);
|
|
36
|
+
const g = p.current?.offset, x = u * S <= (g?.left ?? 0), T = u * S + n.clientWidth >= n.scrollWidth - (g?.right ?? 0) - _, L = l <= (g?.top ?? 0), V = l + n.clientHeight >= n.scrollHeight - (g?.bottom ?? 0) - _, D = w === "flex" && y === "column-reverse", H = w === "flex" && y === "row-reverse", I = {
|
|
37
|
+
x: u,
|
|
38
|
+
y: l,
|
|
22
39
|
directions: {
|
|
23
|
-
left:
|
|
24
|
-
right:
|
|
25
|
-
top:
|
|
26
|
-
bottom:
|
|
40
|
+
left: u < r.current.x,
|
|
41
|
+
right: u > r.current.x,
|
|
42
|
+
top: l < r.current.y,
|
|
43
|
+
bottom: l > r.current.y
|
|
27
44
|
},
|
|
28
45
|
arrived: {
|
|
29
|
-
left:
|
|
30
|
-
right:
|
|
31
|
-
top:
|
|
32
|
-
bottom:
|
|
46
|
+
left: H ? T : x,
|
|
47
|
+
right: H ? x : T,
|
|
48
|
+
top: D ? V : L,
|
|
49
|
+
bottom: D ? L : V
|
|
33
50
|
}
|
|
34
51
|
};
|
|
35
|
-
|
|
52
|
+
O(I), p.current?.onScroll?.(I, o);
|
|
36
53
|
};
|
|
37
|
-
return e.addEventListener("scroll",
|
|
38
|
-
e.removeEventListener("scroll",
|
|
54
|
+
return e.addEventListener("scroll", i), e.addEventListener("scrollend", s), () => {
|
|
55
|
+
e.removeEventListener("scroll", i), e.removeEventListener("scrollend", s);
|
|
39
56
|
};
|
|
40
|
-
}, [c &&
|
|
41
|
-
const
|
|
57
|
+
}, [c && m.getRawElement(c), d.state]);
|
|
58
|
+
const E = (e) => {
|
|
42
59
|
if (!f.current) return;
|
|
43
|
-
const { behavior:
|
|
60
|
+
const { behavior: s, block: i, inline: o } = e ?? {};
|
|
44
61
|
f.current.scrollIntoView({
|
|
45
|
-
behavior:
|
|
46
|
-
block:
|
|
47
|
-
inline:
|
|
62
|
+
behavior: s,
|
|
63
|
+
block: i,
|
|
64
|
+
inline: o
|
|
48
65
|
});
|
|
49
|
-
},
|
|
66
|
+
}, b = (e) => {
|
|
50
67
|
if (!f.current) return;
|
|
51
|
-
const { x:
|
|
52
|
-
f.current.scrollTo({ left:
|
|
68
|
+
const { x: s, y: i, behavior: o } = e ?? {};
|
|
69
|
+
f.current.scrollTo({ left: s, top: i, behavior: o });
|
|
53
70
|
};
|
|
54
|
-
return c ? { scrollIntoView:
|
|
71
|
+
return c ? { scrollIntoView: E, scrollTo: b, snapshot: r.current, watch: v } : {
|
|
55
72
|
ref: d,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
73
|
+
snapshot: r.current,
|
|
74
|
+
watch: v,
|
|
75
|
+
scrollIntoView: E,
|
|
76
|
+
scrollTo: b
|
|
59
77
|
};
|
|
60
78
|
});
|
|
61
79
|
export {
|
|
62
|
-
|
|
80
|
+
z as useScroll
|
|
63
81
|
};
|
|
64
82
|
//# sourceMappingURL=useScroll.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScroll.mjs","sources":["../../../../src/hooks/useScroll/useScroll.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\n\nexport interface UseScrollOptions {\n /** The on scroll callback */\n onScroll?: (params: UseScrollCallbackParams, event: Event) => void;\n\n /** The on end scroll callback */\n onStop?: (event: Event) => void;\n\n /** Offset arrived states by x pixels. */\n offset?: {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n };\n}\n\nexport interface UseScrollCallbackParams {\n /** The element x position */\n x: number;\n /** The element y position */\n y: number;\n /** State of scroll arrived */\n arrived: {\n left: boolean;\n right: boolean;\n top: boolean;\n bottom: boolean;\n };\n /** State of scroll direction */\n directions: {\n left: boolean;\n right: boolean;\n top: boolean;\n bottom: boolean;\n };\n}\n\n/** The scroll into view params type */\nexport interface ScrollIntoViewParams {\n behavior?: ScrollBehavior;\n block?: ScrollLogicalPosition;\n inline?: ScrollLogicalPosition;\n}\n/** The scroll to params type */\nexport interface ScrollToParams {\n behavior?: ScrollBehavior;\n x: number;\n y: number;\n}\n\n/** The use scroll return type */\nexport interface UseScrollReturn {\n /** The state of scrolling */\n scrolling: boolean;\n /** Function to scroll element into view */\n scrollIntoView: (params?: ScrollIntoViewParams) => void;\n /** Function to scroll element to a specific position */\n scrollTo: (params?: ScrollToParams) => void;\n}\n\nexport interface UseScroll {\n (\n target?: HookTarget,\n callback?: (params: UseScrollCallbackParams, event: Event) => void\n ): UseScrollReturn;\n\n (target?: HookTarget, options?: UseScrollOptions): UseScrollReturn;\n\n <Target extends Element>(\n callback?: (params: UseScrollCallbackParams, event: Event) => void,\n target?: never\n ): UseScrollReturn & { ref: StateRef<Target> };\n\n <Target extends Element>(\n options?: UseScrollOptions,\n target?: never\n ): UseScrollReturn & {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name useScroll\n * @description - Hook that allows you to control scroll a element\n * @category Sensors\n * @usage low\n *\n * @overload\n * @template Target The target element\n * @param {ScrollBehavior} [options.behavior=auto] The behavior of scrolling\n * @param {number} [options.offset.left=0] The left offset for arrived states\n * @param {number} [options.offset.right=0] The right offset for arrived states\n * @param {number} [options.offset.top=0] The top offset for arrived states\n * @param {number} [options.offset.bottom=0] The bottom offset for arrived states\n * @param {(params: UseScrollCallbackParams, event: Event) => void} [options.onScroll] The callback function to be invoked on scroll\n * @param {(event: Event) => void} [options.onStop] The callback function to be invoked on scroll end\n * @returns {UseScrollReturn} The state of scrolling\n *\n * @example\n * const { scrolling, scrollIntoView, scrollTo} = useScroll(ref, options);\n *\n * @overload\n * @template Target The target element\n * @param {(params: UseScrollCallbackParams, event: Event) => void} [callback] The callback function to be invoked on scroll\n * @returns {UseScrollReturn} The state of scrolling\n *\n * @example\n * const { scrolling, scrollIntoView, scrollTo} = useScroll(ref, () => console.log('callback'));\n *\n * @overload\n * @template Target The target element\n * @param {Target} [target=window] The target element to scroll\n * @param {ScrollBehavior} [options.behavior=auto] The behavior of scrolling\n * @param {number} [options.offset.left=0] The left offset for arrived states\n * @param {number} [options.offset.right=0] The right offset for arrived states\n * @param {number} [options.offset.top=0] The top offset for arrived states\n * @param {number} [options.offset.bottom=0] The bottom offset for arrived states\n * @param {(params: UseScrollCallbackParams, event: Event) => void} [options.onScroll] The callback function to be invoked on scroll\n * @param {(event: Event) => void} [options.onStop] The callback function to be invoked on scroll end\n * @returns {UseScrollReturn & { ref: StateRef<Target> }} The state of scrolling\n *\n * @example\n * const { ref, scrolling, scrollIntoView, scrollTo} = useScroll(options);\n *\n * @overload\n * @template Target The target element\n * @param {Target} target The target element to scroll\n * @param {(params: UseScrollCallbackParams, event: Event) => void} [callback] The callback function to be invoked on scroll\n * @returns {UseScrollReturn & { ref: StateRef<Target> }} The state of scrolling\n *\n * @example\n * const { ref, scrolling, scrollIntoView, scrollTo} = useScroll(() => console.log('callback'));\n */\nexport const useScroll = ((...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 : { onScroll: params[1] }\n : typeof params[0] === 'object'\n ? params[0]\n : { onScroll: params[0] }\n ) as UseScrollOptions | undefined;\n\n const internalRef = useRefState<Element>();\n const internalOptionsRef = useRef(options);\n const elementRef = useRef<Element>(null);\n internalOptionsRef.current = options;\n\n const [scrolling, setScrolling] = useState(false);\n const scrollPositionRef = useRef({ x: 0, y: 0 });\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n const element =\n ((target ? isTarget.getElement(target) : internalRef.current) as Element) ?? window;\n\n elementRef.current = element;\n\n const onScrollEnd = (event: Event) => {\n setScrolling(false);\n options?.onStop?.(event);\n };\n\n const onScroll = (event: Event) => {\n setScrolling(true);\n const target = (\n event.target === document ? (event.target as Document).documentElement : event.target\n ) as HTMLElement;\n\n const { display, flexDirection, direction } = target.style;\n const directionMultiplier = direction === 'rtl' ? -1 : 1;\n\n const scrollLeft = target.scrollLeft;\n let scrollTop = target.scrollTop;\n if (target instanceof Document && !scrollTop) scrollTop = window.document.body.scrollTop;\n\n const offset = internalOptionsRef.current?.offset;\n const left = scrollLeft * directionMultiplier <= (offset?.left ?? 0);\n const right =\n scrollLeft * directionMultiplier + target.clientWidth >=\n target.scrollWidth - (offset?.right ?? 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n const top = scrollTop <= (offset?.top ?? 0);\n const bottom =\n scrollTop + target.clientHeight >=\n target.scrollHeight - (offset?.bottom ?? 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n\n const isColumnReverse = display === 'flex' && flexDirection === 'column-reverse';\n const isRowReverse = display === 'flex' && flexDirection === 'column-reverse';\n\n const params = {\n x: scrollLeft,\n y: scrollTop,\n directions: {\n left: scrollLeft < scrollPositionRef.current.x,\n right: scrollLeft > scrollPositionRef.current.x,\n top: scrollTop < scrollPositionRef.current.y,\n bottom: scrollTop > scrollPositionRef.current.y\n },\n arrived: {\n left: isRowReverse ? right : left,\n right: isRowReverse ? left : right,\n top: isColumnReverse ? bottom : top,\n bottom: isColumnReverse ? top : bottom\n }\n };\n\n scrollPositionRef.current = { x: scrollLeft, y: scrollTop };\n internalOptionsRef.current?.onScroll?.(params, event);\n };\n\n element.addEventListener('scroll', onScroll);\n element.addEventListener('scrollend', onScrollEnd);\n\n return () => {\n element.removeEventListener('scroll', onScroll);\n element.removeEventListener('scrollend', onScrollEnd);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state]);\n\n const scrollIntoView = (params?: {\n behavior?: ScrollBehavior;\n block?: ScrollLogicalPosition;\n inline?: ScrollLogicalPosition;\n }) => {\n if (!elementRef.current) return;\n\n const { behavior, block, inline } = params ?? {};\n\n elementRef.current.scrollIntoView({\n behavior,\n block,\n inline\n });\n };\n\n const scrollTo = (params?: { x: number; y: number; behavior?: ScrollBehavior }) => {\n if (!elementRef.current) return;\n\n const { x, y, behavior } = params ?? {};\n\n elementRef.current.scrollTo({ left: x, top: y, behavior });\n };\n\n if (target) return { scrollIntoView, scrollTo, scrolling };\n return {\n ref: internalRef,\n scrolling,\n scrollIntoView,\n scrollTo\n };\n}) as UseScroll;\n"],"names":["ARRIVED_STATE_THRESHOLD_PIXELS","useScroll","params","target","isTarget","options","internalRef","useRefState","internalOptionsRef","useRef","elementRef","scrolling","setScrolling","useState","scrollPositionRef","useEffect","element","onScrollEnd","event","onScroll","display","flexDirection","direction","directionMultiplier","scrollLeft","scrollTop","offset","left","right","top","bottom","isColumnReverse","isRowReverse","scrollIntoView","behavior","block","inline","scrollTo","x","y"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useScroll.mjs","sources":["../../../../src/hooks/useScroll/useScroll.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\nimport { useRerender } from '../useRerender/useRerender';\n\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\n\nexport interface UseScrollOptions {\n /** Offset arrived states by x pixels. */\n offset?: {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n };\n\n /** The on scroll callback */\n onScroll?: (params: UseScrollCallbackParams, event: Event) => void;\n\n /** The on end scroll callback */\n onStop?: (event: Event) => void;\n}\n\nexport interface UseScrollCallbackParams {\n /** State of scroll arrived */\n arrived: {\n left: boolean;\n right: boolean;\n top: boolean;\n bottom: boolean;\n };\n /** State of scroll direction */\n directions: {\n left: boolean;\n right: boolean;\n top: boolean;\n bottom: boolean;\n };\n /** The element x position */\n x: number;\n /** The element y position */\n y: number;\n}\n\n/** The scroll into view params type */\nexport interface ScrollIntoViewParams {\n behavior?: ScrollBehavior;\n block?: ScrollLogicalPosition;\n inline?: ScrollLogicalPosition;\n}\n/** The scroll to params type */\nexport interface ScrollToParams {\n behavior?: ScrollBehavior;\n x: number;\n y: number;\n}\n\n/** The use scroll return type */\nexport interface UseScrollReturn {\n /** The latest scroll value snapshot */\n snapshot: UseScrollCallbackParams;\n /** Function to scroll element into view */\n scrollIntoView: (params?: ScrollIntoViewParams) => void;\n /** Function to scroll element to a specific position */\n scrollTo: (params?: ScrollToParams) => void;\n /** Function to enable subscriptions and rerender on next updates */\n watch: () => UseScrollCallbackParams;\n}\n\nexport interface UseScroll {\n (\n target?: HookTarget,\n callback?: (params: UseScrollCallbackParams, event: Event) => void\n ): UseScrollReturn;\n\n (target: HookTarget, options?: UseScrollOptions): UseScrollReturn;\n\n <Target extends Element>(\n callback?: (params: UseScrollCallbackParams, event: Event) => void,\n target?: never\n ): UseScrollReturn & { ref: StateRef<Target> };\n\n <Target extends Element>(\n options?: UseScrollOptions,\n target?: never\n ): UseScrollReturn & {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name useScroll\n * @description - Hook that allows you to control scroll a element\n * @category Sensors\n * @usage low\n *\n * @overload\n * @template Target The target element\n * @param {ScrollBehavior} [options.behavior=auto] The behavior of scrolling\n * @param {number} [options.offset.left=0] The left offset for arrived states\n * @param {number} [options.offset.right=0] The right offset for arrived states\n * @param {number} [options.offset.top=0] The top offset for arrived states\n * @param {number} [options.offset.bottom=0] The bottom offset for arrived states\n * @param {(params: UseScrollCallbackParams, event: Event) => void} [options.onScroll] The callback function to be invoked on scroll\n * @param {(event: Event) => void} [options.onStop] The callback function to be invoked on scroll end\n * @returns {UseScrollReturn} The state of scrolling\n *\n * @example\n * const { scrolling, scrollIntoView, scrollTo} = useScroll(ref, options);\n *\n * @overload\n * @template Target The target element\n * @param {(params: UseScrollCallbackParams, event: Event) => void} [callback] The callback function to be invoked on scroll\n * @returns {UseScrollReturn} The state of scrolling\n *\n * @example\n * const { scrolling, scrollIntoView, scrollTo} = useScroll(ref, () => console.log('callback'));\n *\n * @overload\n * @template Target The target element\n * @param {Target} [target=window] The target element to scroll\n * @param {ScrollBehavior} [options.behavior=auto] The behavior of scrolling\n * @param {number} [options.offset.left=0] The left offset for arrived states\n * @param {number} [options.offset.right=0] The right offset for arrived states\n * @param {number} [options.offset.top=0] The top offset for arrived states\n * @param {number} [options.offset.bottom=0] The bottom offset for arrived states\n * @param {(params: UseScrollCallbackParams, event: Event) => void} [options.onScroll] The callback function to be invoked on scroll\n * @param {(event: Event) => void} [options.onStop] The callback function to be invoked on scroll end\n * @returns {UseScrollReturn & { ref: StateRef<Target> }} The state of scrolling\n *\n * @example\n * const { ref, scrolling, scrollIntoView, scrollTo} = useScroll(options);\n *\n * @overload\n * @template Target The target element\n * @param {Target} target The target element to scroll\n * @param {(params: UseScrollCallbackParams, event: Event) => void} [callback] The callback function to be invoked on scroll\n * @returns {UseScrollReturn & { ref: StateRef<Target> }} The state of scrolling\n *\n * @example\n * const { ref, scrolling, scrollIntoView, scrollTo} = useScroll(() => console.log('callback'));\n */\nexport const useScroll = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const options = (\n target\n ? typeof params[1] === 'function'\n ? { ...params[2], onScroll: params[1] }\n : params[1]\n : typeof params[0] === 'object'\n ? params[0]\n : typeof params[0] === 'function'\n ? { ...params[1], onScroll: params[0] }\n : undefined\n ) as UseScrollOptions | undefined;\n\n const internalRef = useRefState<Element>();\n const internalOptionsRef = useRef(options);\n const elementRef = useRef<Element>(null);\n const snapshotRef = useRef<UseScrollCallbackParams>({\n x: 0,\n y: 0,\n directions: {\n left: false,\n right: false,\n top: false,\n bottom: false\n },\n arrived: {\n left: true,\n right: false,\n top: true,\n bottom: false\n }\n });\n const watchingRef = useRef(false);\n const rerender = useRerender();\n internalOptionsRef.current = options;\n\n const watch = () => {\n watchingRef.current = true;\n return snapshotRef.current;\n };\n const updateValue = (value: UseScrollCallbackParams) => {\n snapshotRef.current = value;\n if (watchingRef.current) rerender();\n };\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n const element =\n ((target ? isTarget.getElement(target) : internalRef.current) as Element) ?? window;\n\n elementRef.current = element;\n\n const onScrollEnd = (event: Event) => {\n internalOptionsRef.current?.onStop?.(event);\n };\n\n const onScroll = (event: Event) => {\n const target = (\n event.target === document ? (event.target as Document).documentElement : event.target\n ) as HTMLElement;\n\n const { display, flexDirection, direction } = target.style;\n const directionMultiplier = direction === 'rtl' ? -1 : 1;\n\n const scrollLeft = target.scrollLeft;\n let scrollTop = target.scrollTop;\n if (target instanceof Document && !scrollTop) scrollTop = window.document.body.scrollTop;\n\n const offset = internalOptionsRef.current?.offset;\n const left = scrollLeft * directionMultiplier <= (offset?.left ?? 0);\n const right =\n scrollLeft * directionMultiplier + target.clientWidth >=\n target.scrollWidth - (offset?.right ?? 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n const top = scrollTop <= (offset?.top ?? 0);\n const bottom =\n scrollTop + target.clientHeight >=\n target.scrollHeight - (offset?.bottom ?? 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n\n const isColumnReverse = display === 'flex' && flexDirection === 'column-reverse';\n const isRowReverse = display === 'flex' && flexDirection === 'row-reverse';\n\n const updatedValue: UseScrollCallbackParams = {\n x: scrollLeft,\n y: scrollTop,\n directions: {\n left: scrollLeft < snapshotRef.current.x,\n right: scrollLeft > snapshotRef.current.x,\n top: scrollTop < snapshotRef.current.y,\n bottom: scrollTop > snapshotRef.current.y\n },\n arrived: {\n left: isRowReverse ? right : left,\n right: isRowReverse ? left : right,\n top: isColumnReverse ? bottom : top,\n bottom: isColumnReverse ? top : bottom\n }\n };\n\n updateValue(updatedValue);\n internalOptionsRef.current?.onScroll?.(updatedValue, event);\n };\n\n element.addEventListener('scroll', onScroll);\n element.addEventListener('scrollend', onScrollEnd);\n\n return () => {\n element.removeEventListener('scroll', onScroll);\n element.removeEventListener('scrollend', onScrollEnd);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state]);\n\n const scrollIntoView = (params?: {\n behavior?: ScrollBehavior;\n block?: ScrollLogicalPosition;\n inline?: ScrollLogicalPosition;\n }) => {\n if (!elementRef.current) return;\n\n const { behavior, block, inline } = params ?? {};\n\n elementRef.current.scrollIntoView({\n behavior,\n block,\n inline\n });\n };\n\n const scrollTo = (params?: { x: number; y: number; behavior?: ScrollBehavior }) => {\n if (!elementRef.current) return;\n const { x, y, behavior } = params ?? {};\n\n elementRef.current.scrollTo({ left: x, top: y, behavior });\n };\n\n if (target) return { scrollIntoView, scrollTo, snapshot: snapshotRef.current, watch };\n return {\n ref: internalRef,\n snapshot: snapshotRef.current,\n watch,\n scrollIntoView,\n scrollTo\n };\n}) as UseScroll;\n"],"names":["ARRIVED_STATE_THRESHOLD_PIXELS","useScroll","params","target","isTarget","options","internalRef","useRefState","internalOptionsRef","useRef","elementRef","snapshotRef","watchingRef","rerender","useRerender","watch","updateValue","value","useEffect","element","onScrollEnd","event","onScroll","display","flexDirection","direction","directionMultiplier","scrollLeft","scrollTop","offset","left","right","top","bottom","isColumnReverse","isRowReverse","updatedValue","scrollIntoView","behavior","block","inline","scrollTo","x","y"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSticky.mjs","sources":["../../../../src/hooks/useSticky/useSticky.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use sticky return type */\nexport interface UseStickyReturn {\n stuck: boolean;\n}\n\n/** The use sticky axis type */\nexport type UseStickyAxis = 'horizontal' | 'vertical';\n\n/** The use sticky options type */\nexport interface UseStickyOptions {\n axis?: UseStickyAxis;\n root?: HookTarget;\n}\n\nexport interface UseSticky {\n (target: HookTarget, options?: UseStickyOptions): UseStickyReturn;\n\n <Target extends Element>(\n options?: UseStickyOptions,\n target?: never\n ): UseStickyReturn & {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name UseSticky\n * @description - Hook that allows you to detect that your sticky component is stuck\n * @category Elements\n * @usage low\n *\n * @overload\n * @param {HookTarget} target The target sticky element\n * @param {UseStickyAxis} [options.axis='vertical'] The axis of motion of the sticky component\n * @param {UseStickyRoot} [options.root=document] The element that contains your sticky component\n * @returns {UseStickyReturn} The state of the sticky\n *\n * @example\n * const { stuck } = useSticky(ref);\n *\n * @overload\n * @param {UseStickyAxis} [options.axis='vertical'] The axis of motion of the sticky component\n * @param {UseStickyRoot} [options.root=document] The element that contains your sticky component\n * @returns {{ ref: StateRef<Target> } & UseStickyReturn} The state of the sticky\n *\n * @example\n * const { stuck, ref } = useSticky();\n */\nexport const useSticky = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const options = (target ? params[1] : params[0]) as UseStickyOptions;\n const axis = options?.axis ?? 'vertical';\n\n const internalRef = useRefState<Element>();\n const [stuck, setStuck] = useState(false);\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\n
|
|
1
|
+
{"version":3,"file":"useSticky.mjs","sources":["../../../../src/hooks/useSticky/useSticky.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use sticky return type */\nexport interface UseStickyReturn {\n stuck: boolean;\n}\n\n/** The use sticky axis type */\nexport type UseStickyAxis = 'horizontal' | 'vertical';\n\n/** The use sticky options type */\nexport interface UseStickyOptions {\n axis?: UseStickyAxis;\n root?: HookTarget;\n}\n\nexport interface UseSticky {\n (target: HookTarget, options?: UseStickyOptions): UseStickyReturn;\n\n <Target extends Element>(\n options?: UseStickyOptions,\n target?: never\n ): UseStickyReturn & {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name UseSticky\n * @description - Hook that allows you to detect that your sticky component is stuck\n * @category Elements\n * @usage low\n *\n * @overload\n * @param {HookTarget} target The target sticky element\n * @param {UseStickyAxis} [options.axis='vertical'] The axis of motion of the sticky component\n * @param {UseStickyRoot} [options.root=document] The element that contains your sticky component\n * @returns {UseStickyReturn} The state of the sticky\n *\n * @example\n * const { stuck } = useSticky(ref);\n *\n * @overload\n * @param {UseStickyAxis} [options.axis='vertical'] The axis of motion of the sticky component\n * @param {UseStickyRoot} [options.root=document] The element that contains your sticky component\n * @returns {{ ref: StateRef<Target> } & UseStickyReturn} The state of the sticky\n *\n * @example\n * const { stuck, ref } = useSticky();\n */\nexport const useSticky = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const options = (target ? params[1] : params[0]) as UseStickyOptions;\n const axis = options?.axis ?? 'vertical';\n\n const internalRef = useRefState<Element>();\n const [stuck, setStuck] = useState(false);\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\n if (!element) return;\n\n const root = (options?.root ? isTarget.getElement(options.root) : document) as Element;\n const elementOffsetTop =\n element.getBoundingClientRect().top + root.scrollTop - root.getBoundingClientRect().top;\n const elementOffsetLeft =\n element.getBoundingClientRect().left + root.scrollLeft - root.getBoundingClientRect().left;\n\n const onSticky = () => {\n if (axis === 'vertical') {\n const scrollTop = root.scrollTop;\n setStuck(scrollTop >= elementOffsetTop);\n }\n\n if (axis === 'horizontal') {\n const scrollLeft = root.scrollLeft;\n setStuck(scrollLeft >= elementOffsetLeft);\n }\n };\n\n root.addEventListener('scroll', onSticky);\n window.addEventListener('resize', onSticky);\n window.addEventListener('orientationchange', onSticky);\n\n onSticky();\n\n return () => {\n root.removeEventListener('scroll', onSticky);\n window.removeEventListener('resize', onSticky);\n window.removeEventListener('orientationchange', onSticky);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state, axis, options?.root]);\n\n if (target) return { stuck };\n return {\n stuck,\n ref: internalRef\n };\n}) as UseSticky;\n"],"names":["useSticky","params","target","isTarget","options","axis","internalRef","useRefState","stuck","setStuck","useState","useEffect","element","root","elementOffsetTop","elementOffsetLeft","onSticky","scrollTop","scrollLeft"],"mappings":";;;AA0DO,MAAMA,KAAa,IAAIC,MAAkB;AAC9C,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAC5CG,IAAWF,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,GACxCI,IAAOD,GAAS,QAAQ,YAExBE,IAAcC,EAAA,GACd,CAACC,GAAOC,CAAQ,IAAIC,EAAS,EAAK;AAuCxC,SArCAC,EAAU,MAAM;AACd,QAAI,CAACT,KAAU,CAACI,EAAY,MAAO;AAEnC,UAAMM,IAAWV,IAASC,EAAS,WAAWD,CAAM,IAAII,EAAY;AACpE,QAAI,CAACM,EAAS;AAEd,UAAMC,IAAQT,GAAS,OAAOD,EAAS,WAAWC,EAAQ,IAAI,IAAI,UAC5DU,IACJF,EAAQ,wBAAwB,MAAMC,EAAK,YAAYA,EAAK,sBAAA,EAAwB,KAChFE,IACJH,EAAQ,wBAAwB,OAAOC,EAAK,aAAaA,EAAK,sBAAA,EAAwB,MAElFG,IAAW,MAAM;AACrB,UAAIX,MAAS,YAAY;AACvB,cAAMY,IAAYJ,EAAK;AACvB,QAAAJ,EAASQ,KAAaH,CAAgB;AAAA,MAAA;AAGxC,UAAIT,MAAS,cAAc;AACzB,cAAMa,IAAaL,EAAK;AACxB,QAAAJ,EAASS,KAAcH,CAAiB;AAAA,MAAA;AAAA,IAC1C;AAGF,WAAAF,EAAK,iBAAiB,UAAUG,CAAQ,GACxC,OAAO,iBAAiB,UAAUA,CAAQ,GAC1C,OAAO,iBAAiB,qBAAqBA,CAAQ,GAErDA,EAAA,GAEO,MAAM;AACX,MAAAH,EAAK,oBAAoB,UAAUG,CAAQ,GAC3C,OAAO,oBAAoB,UAAUA,CAAQ,GAC7C,OAAO,oBAAoB,qBAAqBA,CAAQ;AAAA,IAAA;AAAA,EAC1D,GACC,CAACd,KAAUC,EAAS,cAAcD,CAAM,GAAGI,EAAY,OAAOD,GAAMD,GAAS,IAAI,CAAC,GAEjFF,IAAe,EAAE,OAAAM,EAAA,IACd;AAAA,IACL,OAAAA;AAAA,IACA,KAAKF;AAAA,EAAA;AAET;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStorage.mjs","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 State\n * @usage high\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 = (event?: StorageEvent) => {\n if (event && event.storageArea !== storage) return;\n if (event && event.key !== key) return;\n\n const storageValue = getStorageItem(storage, key);\n setValue(storageValue ? deserializer(storageValue) : undefined);\n };\n\n window.addEventListener(STORAGE_EVENT, onChange as EventListener);\n window.addEventListener('storage', onChange, { passive: true });\n\n return () => {\n window.removeEventListener(STORAGE_EVENT, onChange as EventListener);\n window.removeEventListener('storage', onChange);\n };\n }, [key, storage]);\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","event"],"mappings":";AAoCO,MAAMA,IAAgB,oBAEhBC,IAAuB,CAACC,MACnC,OAAO,cAAc,IAAI,aAAaF,GAAeE,CAAM,CAAC,GAExDC,IAAiB,CAACC,GAAkBC,GAAaC,MAAkB;AACvE,QAAMC,IAAWH,EAAQ,QAAQC,CAAG;AAEpC,EAAAD,EAAQ,QAAQC,GAAKC,CAAK,GAC1BL,EAAqB;AAAA,IACnB,KAAAI;AAAA,IACA,UAAAE;AAAA,IACA,UAAUD;AAAA,IACV,aAAaF;AAAA,EAAA,CACd;AACH,GAEMI,IAAoB,CAACJ,GAAkBC,MAAgB;AAC3D,QAAME,IAAWH,EAAQ,QAAQC,CAAG;AAEpC,EAAAD,EAAQ,WAAWC,CAAG,GACtBJ,EAAqB,EAAE,KAAAI,GAAK,UAAAE,GAAU,UAAU,MAAM,aAAaH,GAAS;AAC9E,GAEMK,IAAiB,CAACL,GAAkBC,MAAgB;AACxD,QAAMC,IAAQF,EAAQ,QAAQC,CAAG;AACjC,MAAKC;AACL,WAAOA;AACT,GAwBaI,KAAc,CAAQL,GAAaH,MAA0C;AACxF,QAAMS,IACJ,OAAOT,KAAW,YAClBA,MACC,gBAAgBA,KACf,kBAAkBA,KAClB,kBAAkBA,KAClB,aAAaA,KACXA,IACA,QAGAU,IAAgBD,IAAUA,GAAS,eAAeT;AAExD,MAAI,OAAO,SAAW;AAEpB,WAAO;AAAA,MACL,OAFY,OAAOU,KAAiB,aAAcA,MAA+BA;AAAA,MAGjF,KAAK,MAAM;AAAA,MAAA;AAAA,MACX,QAAQ,MAAM;AAAA,MAAA;AAAA,IAAC;AAInB,QAAMC,IAAa,CAACP,MACdK,GAAS,aAAmBA,EAAQ,WAAWL,CAAK,IACpD,OAAOA,KAAU,WAAiBA,IAC/B,KAAK,UAAUA,CAAK,GAGvBF,IAAUO,GAAS,WAAW,QAAQ,cAEtCG,IAAM,CAACR,MAAiBH,EAAeC,GAASC,GAAKQ,EAAWP,CAAK,CAAC,GACtES,IAAS,MAAMP,EAAkBJ,GAASC,CAAG,GAE7CW,IAAe,CAACV,MAAkB;AACtC,QAAIK,GAAS,aAAc,QAAOA,EAAQ,aAAaL,CAAK;AAC5D,QAAIA,MAAU;AAEd,UAAI;AACF,eAAO,KAAK,MAAMA,CAAK;AAAA,MAAA,QACjB;AACN,eAAOA;AAAAA,MAAA;AAAA,EACT,GAGI,CAACA,GAAOW,CAAQ,IAAIC,EAA4B,MAAM;AAC1D,UAAMC,IAAeV,EAAeL,GAASC,CAAG;AAChD,QAAIc,MAAiB,UAAaP,MAAiB,QAAW;AAC5D,YAAMN,IACJ,OAAOM,KAAiB,aAAcA,MAAiCA;AACzE,aAAAT,EAAeC,GAASC,GAAKQ,EAAWP,CAAK,CAAC,GACvCA;AAAAA,IAAA;AAET,WAAOa,IAAeH,EAAaG,CAAY,IAAI;AAAA,EAAA,CACpD;AAED,SAAAC,EAAU,MAAM;AACd,UAAMC,IAAW,CAACC,MAAyB;AAEzC,UADIA,KAASA,EAAM,gBAAgBlB,KAC/BkB,KAASA,EAAM,QAAQjB,EAAK;AAEhC,YAAMc,IAAeV,EAAeL,GAASC,CAAG;AAChD,MAAAY,EAASE,IAAeH,EAAaG,CAAY,IAAI,MAAS;AAAA,IAAA;AAGhE,kBAAO,iBAAiBnB,GAAeqB,CAAyB,GAChE,OAAO,iBAAiB,WAAWA,GAAU,EAAE,SAAS,IAAM,GAEvD,MAAM;AACX,aAAO,oBAAoBrB,GAAeqB,CAAyB,GACnE,OAAO,oBAAoB,WAAWA,CAAQ;AAAA,IAAA;AAAA,EAChD,GACC,CAAChB,GAAKD,CAAO,CAAC,GAEV;AAAA,IACL,OAAAE;AAAA,IACA,KAAAQ;AAAA,IACA,QAAAC;AAAA,EAAA;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"useStorage.mjs","sources":["../../../../src/hooks/useStorage/useStorage.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\r\n\r\n/* The use storage initial value type */\r\nexport type UseStorageInitialValue<Value> = (() => Value) | Value;\r\n\r\n/* The use storage options type */\r\nexport interface UseStorageOptions<Value> {\r\n /* The initial value of the storage */\r\n initialValue?: UseStorageInitialValue<Value>;\r\n /* The storage to be used */\r\n storage?: Storage;\r\n /* The deserializer function to be invoked */\r\n deserializer?: (value: string) => Value;\r\n /* The serializer function to be invoked */\r\n serializer?: (value: Value) => string;\r\n}\r\n\r\n/* The use storage return type */\r\nexport interface UseStorageReturn<Value> {\r\n /* The value of the storage */\r\n value: Value;\r\n /* The error state of the storage */\r\n remove: () => void;\r\n /* The loading state of the storage */\r\n set: (value: Value) => void;\r\n}\r\n\r\nexport interface UseStorage {\r\n <Value>(key: string, options?: UseStorageOptions<Value>): UseStorageReturn<Value | undefined>;\r\n\r\n <Value>(\r\n key: string,\r\n initialValue?: UseStorageInitialValue<Value>\r\n ): UseStorageReturn<Value | undefined>;\r\n}\r\n\r\nexport const STORAGE_EVENT = 'reactuse-storage';\r\n\r\nexport const dispatchStorageEvent = (params: Partial<StorageEvent>) =>\r\n window.dispatchEvent(new StorageEvent(STORAGE_EVENT, params));\r\n\r\nconst setStorageItem = (storage: Storage, key: string, value: string) => {\r\n const oldValue = storage.getItem(key);\r\n\r\n storage.setItem(key, value);\r\n dispatchStorageEvent({\r\n key,\r\n oldValue,\r\n newValue: value,\r\n storageArea: storage\r\n });\r\n};\r\n\r\nconst removeStorageItem = (storage: Storage, key: string) => {\r\n const oldValue = storage.getItem(key);\r\n\r\n storage.removeItem(key);\r\n dispatchStorageEvent({ key, oldValue, newValue: null, storageArea: storage });\r\n};\r\n\r\nconst getStorageItem = (storage: Storage, key: string) => {\r\n const value = storage.getItem(key);\r\n if (!value) return undefined;\r\n return value;\r\n};\r\n\r\n/**\r\n * @name useStorage\r\n * @description - Hook that manages storage value\r\n * @category State\r\n * @usage high\r\n *\r\n * @overload\r\n * @param {string} key The key of the storage\r\n * @param {UseStorageInitialValue<Value>} [initialValue] The initial value of the storage\r\n * @returns {UseStorageReturn<Value>} The value and the set function\r\n *\r\n * @overload\r\n * @param {string} key The key of the storage\r\n * @param {(value: Value) => string} [params.serializer] The serializer function\r\n * @param {(value: string) => Value} [params.deserializer] The deserializer function\r\n * @param {Storage} [params.storage] The storage\r\n * @param {UseStorageInitialValue<Value>} [params.initialValue] The initial value of the storage\r\n * @returns {UseStorageReturn<Value>} The value and the set function\r\n *\r\n * @example\r\n * const { value, set, remove } = useStorage('key', 'value');\r\n */\r\nexport const useStorage = (<Value>(key: string, params?: any): UseStorageReturn<Value> => {\r\n const options = (\r\n typeof params === 'object' &&\r\n params &&\r\n ('serializer' in params ||\r\n 'deserializer' in params ||\r\n 'initialValue' in params ||\r\n 'storage' in params)\r\n ? params\r\n : undefined\r\n ) as UseStorageOptions<Value>;\r\n\r\n const initialValue = (options ? options?.initialValue : params) as UseStorageInitialValue<Value>;\r\n\r\n if (typeof window === 'undefined') {\r\n const value = typeof initialValue === 'function' ? (initialValue as () => any)() : initialValue;\r\n return {\r\n value,\r\n set: () => {},\r\n remove: () => {}\r\n };\r\n }\r\n\r\n const serializer = (value: Value) => {\r\n if (options?.serializer) return options.serializer(value);\r\n if (typeof value === 'string') return value;\r\n return JSON.stringify(value);\r\n };\r\n\r\n const storage = options?.storage ?? window?.localStorage;\r\n\r\n const set = (value: Value) => setStorageItem(storage, key, serializer(value));\r\n const remove = () => removeStorageItem(storage, key);\r\n\r\n const deserializer = (value: string) => {\r\n if (options?.deserializer) return options.deserializer(value);\r\n if (value === 'undefined') return undefined as unknown as Value;\r\n\r\n try {\r\n return JSON.parse(value) as Value;\r\n } catch {\r\n return value as Value;\r\n }\r\n };\r\n\r\n const [value, setValue] = useState<Value | undefined>(() => {\r\n const storageValue = getStorageItem(storage, key);\r\n if (storageValue === undefined && initialValue !== undefined) {\r\n const value =\r\n typeof initialValue === 'function' ? (initialValue as () => Value)() : initialValue;\r\n setStorageItem(storage, key, serializer(value));\r\n return value;\r\n }\r\n return storageValue ? deserializer(storageValue) : undefined;\r\n });\r\n\r\n useEffect(() => {\r\n const onChange = (event?: StorageEvent) => {\r\n if (event && event.storageArea !== storage) return;\r\n if (event && event.key !== key) return;\r\n\r\n const storageValue = getStorageItem(storage, key);\r\n setValue(storageValue ? deserializer(storageValue) : undefined);\r\n };\r\n\r\n window.addEventListener(STORAGE_EVENT, onChange as EventListener);\r\n window.addEventListener('storage', onChange, { passive: true });\r\n\r\n return () => {\r\n window.removeEventListener(STORAGE_EVENT, onChange as EventListener);\r\n window.removeEventListener('storage', onChange);\r\n };\r\n }, [key, storage]);\r\n\r\n return {\r\n value: value as Value,\r\n set,\r\n remove\r\n };\r\n}) as UseStorage;\r\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","event"],"mappings":";AAoCO,MAAMA,IAAgB,oBAEhBC,IAAuB,CAACC,MACnC,OAAO,cAAc,IAAI,aAAaF,GAAeE,CAAM,CAAC,GAExDC,IAAiB,CAACC,GAAkBC,GAAaC,MAAkB;AACvE,QAAMC,IAAWH,EAAQ,QAAQC,CAAG;AAEpC,EAAAD,EAAQ,QAAQC,GAAKC,CAAK,GAC1BL,EAAqB;AAAA,IACnB,KAAAI;AAAA,IACA,UAAAE;AAAA,IACA,UAAUD;AAAA,IACV,aAAaF;AAAA,EAAA,CACd;AACH,GAEMI,IAAoB,CAACJ,GAAkBC,MAAgB;AAC3D,QAAME,IAAWH,EAAQ,QAAQC,CAAG;AAEpC,EAAAD,EAAQ,WAAWC,CAAG,GACtBJ,EAAqB,EAAE,KAAAI,GAAK,UAAAE,GAAU,UAAU,MAAM,aAAaH,GAAS;AAC9E,GAEMK,IAAiB,CAACL,GAAkBC,MAAgB;AACxD,QAAMC,IAAQF,EAAQ,QAAQC,CAAG;AACjC,MAAKC;AACL,WAAOA;AACT,GAwBaI,KAAc,CAAQL,GAAaH,MAA0C;AACxF,QAAMS,IACJ,OAAOT,KAAW,YAClBA,MACC,gBAAgBA,KACf,kBAAkBA,KAClB,kBAAkBA,KAClB,aAAaA,KACXA,IACA,QAGAU,IAAgBD,IAAUA,GAAS,eAAeT;AAExD,MAAI,OAAO,SAAW;AAEpB,WAAO;AAAA,MACL,OAFY,OAAOU,KAAiB,aAAcA,MAA+BA;AAAA,MAGjF,KAAK,MAAM;AAAA,MAAA;AAAA,MACX,QAAQ,MAAM;AAAA,MAAA;AAAA,IAAC;AAInB,QAAMC,IAAa,CAACP,MACdK,GAAS,aAAmBA,EAAQ,WAAWL,CAAK,IACpD,OAAOA,KAAU,WAAiBA,IAC/B,KAAK,UAAUA,CAAK,GAGvBF,IAAUO,GAAS,WAAW,QAAQ,cAEtCG,IAAM,CAACR,MAAiBH,EAAeC,GAASC,GAAKQ,EAAWP,CAAK,CAAC,GACtES,IAAS,MAAMP,EAAkBJ,GAASC,CAAG,GAE7CW,IAAe,CAACV,MAAkB;AACtC,QAAIK,GAAS,aAAc,QAAOA,EAAQ,aAAaL,CAAK;AAC5D,QAAIA,MAAU;AAEd,UAAI;AACF,eAAO,KAAK,MAAMA,CAAK;AAAA,MAAA,QACjB;AACN,eAAOA;AAAAA,MAAA;AAAA,EACT,GAGI,CAACA,GAAOW,CAAQ,IAAIC,EAA4B,MAAM;AAC1D,UAAMC,IAAeV,EAAeL,GAASC,CAAG;AAChD,QAAIc,MAAiB,UAAaP,MAAiB,QAAW;AAC5D,YAAMN,IACJ,OAAOM,KAAiB,aAAcA,MAAiCA;AACzE,aAAAT,EAAeC,GAASC,GAAKQ,EAAWP,CAAK,CAAC,GACvCA;AAAAA,IAAA;AAET,WAAOa,IAAeH,EAAaG,CAAY,IAAI;AAAA,EAAA,CACpD;AAED,SAAAC,EAAU,MAAM;AACd,UAAMC,IAAW,CAACC,MAAyB;AAEzC,UADIA,KAASA,EAAM,gBAAgBlB,KAC/BkB,KAASA,EAAM,QAAQjB,EAAK;AAEhC,YAAMc,IAAeV,EAAeL,GAASC,CAAG;AAChD,MAAAY,EAASE,IAAeH,EAAaG,CAAY,IAAI,MAAS;AAAA,IAAA;AAGhE,kBAAO,iBAAiBnB,GAAeqB,CAAyB,GAChE,OAAO,iBAAiB,WAAWA,GAAU,EAAE,SAAS,IAAM,GAEvD,MAAM;AACX,aAAO,oBAAoBrB,GAAeqB,CAAyB,GACnE,OAAO,oBAAoB,WAAWA,CAAQ;AAAA,IAAA;AAAA,EAChD,GACC,CAAChB,GAAKD,CAAO,CAAC,GAEV;AAAA,IACL,OAAAE;AAAA,IACA,KAAAQ;AAAA,IACA,QAAAC;AAAA,EAAA;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTextDirection.mjs","sources":["../../../../src/hooks/useTextDirection/useTextDirection.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use text direction value type */\nexport type UseTextDirectionValue = 'auto' | 'ltr' | 'rtl';\n\n/** The use text direction return type */\nexport interface UseTextDirectionReturn {\n /** The current direction */\n value: UseTextDirectionValue;\n /*** The function to remove the direction */\n remove: () => void;\n /*** The function to set the direction */\n set: (value: UseTextDirectionValue | null) => void;\n}\n\nexport interface UseTextDirection {\n (target: HookTarget, initialValue?: UseTextDirectionValue): UseTextDirectionReturn;\n\n <Target extends Element>(\n initialValue?: UseTextDirectionValue,\n target?: never\n ): UseTextDirectionReturn & { ref: StateRef<Target> };\n}\n\n/**\n * @name useTextDirection\n * @description - Hook that can get and set the direction of the element\n * @category Elements\n * @usage medium\n *\n * @overload\n * @param {HookTarget} [target=document.querySelector('html')] The target element to observe\n * @param {UseTextDirectionValue} [initialValue = 'ltr'] The initial direction of the element\n * @returns {UseTextDirectionReturn} An object containing the current text direction of the element\n *\n * @example\n * const { value, set, remove } = useTextDirection(ref);\n *\n * @overload\n * @template Target The target element type\n * @param {UseTextDirectionValue} [initialValue = 'ltr'] The initial direction of the element\n * @returns { { ref: StateRef<Target> } & UseTextDirectionReturn } An object containing the current text direction of the element\n *\n * @example\n * const { ref, value, set, remove } = useTextDirection();\n */\nexport const useTextDirection = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const initialValue = ((target ? params[1] : params[0]) as UseTextDirectionValue) ?? 'ltr';\n\n const internalRef = useRefState();\n const elementRef = useRef<Element>(null);\n\n const getDirection = () => {\n if (typeof window === 'undefined') return initialValue;\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\n return (element?.getAttribute('dir') as UseTextDirectionValue) ?? initialValue;\n };\n\n const [value, setValue] = useState<UseTextDirectionValue>(getDirection());\n\n const remove = () => {\n if (!elementRef.current) return;\n\n elementRef.current?.removeAttribute('dir');\n };\n\n const set = (value: UseTextDirectionValue) => {\n if (!elementRef.current) return;\n\n setValue(value);\n elementRef.current.setAttribute('dir', value);\n };\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element =\n ((target ? isTarget.getElement(target) : internalRef.current) as Element) ??\n document.querySelector('html');\n if (!element) return;\n\n elementRef.current = element;\n\n const direction = getDirection();\n element.setAttribute('dir', direction);\n setValue(direction);\n\n const observer = new MutationObserver(() => setValue(getDirection()));\n\n observer.observe(element, { attributes: true });\n\n return () => {\n observer.disconnect();\n };\n }, [internalRef.state, target && isTarget.getRawElement(target)]);\n\n if (target) return { value, set, remove };\n return {\n ref: internalRef,\n value,\n set,\n remove\n };\n}) as UseTextDirection;\n"],"names":["useTextDirection","params","target","isTarget","initialValue","internalRef","useRefState","elementRef","useRef","getDirection","value","setValue","useState","remove","set","useEffect","element","direction","observer"],"mappings":";;;AAsDO,MAAMA,KAAoB,IAAIC,MAAkB;AACrD,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAC5CG,KAAiBF,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,MAAgC,OAE9EI,IAAcC,EAAA,GACdC,IAAaC,EAAgB,IAAI,GAEjCC,IAAe,MACf,OAAO,SAAW,MAAoBL,KACzBF,IAASC,EAAS,WAAWD,CAAM,IAAIG,EAAY,UACnD,aAAa,KAAK,KAA+BD,GAG9D,CAACM,GAAOC,CAAQ,IAAIC,EAAgCH,GAAc,GAElEI,IAAS,MAAM;AACnB,IAAKN,EAAW,WAEhBA,EAAW,SAAS,gBAAgB,KAAK;AAAA,EAAA,GAGrCO,IAAM,CAACJ,MAAiC;AAC5C,IAAKH,EAAW,YAEhBI,EAASD,CAAK,GACdH,EAAW,QAAQ,aAAa,OAAOG,CAAK;AAAA,EAAA;AA0B9C,SAvBAK,EAAU,MAAM;AACd,QAAI,CAACb,KAAU,CAACG,EAAY,MAAO;AAEnC,UAAMW,KACFd,IAASC,EAAS,WAAWD,CAAM,IAAIG,EAAY,YACrD,SAAS,cAAc,MAAM;AAC/B,QAAI,CAACW,EAAS;AAEd,IAAAT,EAAW,UAAUS;AAErB,UAAMC,IAAYR,EAAA;AAClB,IAAAO,EAAQ,aAAa,OAAOC,CAAS,GACrCN,EAASM,CAAS;AAElB,UAAMC,IAAW,IAAI,iBAAiB,MAAMP,EAASF,EAAA,CAAc,CAAC;AAEpE,WAAAS,EAAS,QAAQF,GAAS,EAAE,YAAY,IAAM,GAEvC,MAAM;AACX,MAAAE,EAAS,WAAA;AAAA,IAAW;AAAA,EACtB,GACC,CAACb,EAAY,OAAOH,KAAUC,EAAS,cAAcD,CAAM,CAAC,CAAC,GAE5DA,IAAe,EAAE,OAAAQ,GAAO,KAAAI,GAAK,QAAAD,EAAA,IAC1B;AAAA,IACL,KAAKR;AAAA,IACL,OAAAK;AAAA,IACA,KAAAI;AAAA,IACA,QAAAD;AAAA,EAAA;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"useTextDirection.mjs","sources":["../../../../src/hooks/useTextDirection/useTextDirection.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\r\n\r\nimport type { HookTarget } from '@/utils/helpers';\r\n\r\nimport { isTarget } from '@/utils/helpers';\r\n\r\nimport type { StateRef } from '../useRefState/useRefState';\r\n\r\nimport { useRefState } from '../useRefState/useRefState';\r\n\r\n/** The use text direction value type */\r\nexport type UseTextDirectionValue = 'auto' | 'ltr' | 'rtl';\r\n\r\n/** The use text direction return type */\r\nexport interface UseTextDirectionReturn {\r\n /** The current direction */\r\n value: UseTextDirectionValue;\r\n /*** The function to remove the direction */\r\n remove: () => void;\r\n /*** The function to set the direction */\r\n set: (value: UseTextDirectionValue | null) => void;\r\n}\r\n\r\nexport interface UseTextDirection {\r\n (target: HookTarget, initialValue?: UseTextDirectionValue): UseTextDirectionReturn;\r\n\r\n <Target extends Element>(\r\n initialValue?: UseTextDirectionValue,\r\n target?: never\r\n ): UseTextDirectionReturn & { ref: StateRef<Target> };\r\n}\r\n\r\n/**\r\n * @name useTextDirection\r\n * @description - Hook that can get and set the direction of the element\r\n * @category Elements\r\n * @usage medium\r\n *\r\n * @overload\r\n * @param {HookTarget} [target=document.querySelector('html')] The target element to observe\r\n * @param {UseTextDirectionValue} [initialValue = 'ltr'] The initial direction of the element\r\n * @returns {UseTextDirectionReturn} An object containing the current text direction of the element\r\n *\r\n * @example\r\n * const { value, set, remove } = useTextDirection(ref);\r\n *\r\n * @overload\r\n * @template Target The target element type\r\n * @param {UseTextDirectionValue} [initialValue = 'ltr'] The initial direction of the element\r\n * @returns { { ref: StateRef<Target> } & UseTextDirectionReturn } An object containing the current text direction of the element\r\n *\r\n * @example\r\n * const { ref, value, set, remove } = useTextDirection();\r\n */\r\nexport const useTextDirection = ((...params: any[]) => {\r\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\r\n const initialValue = ((target ? params[1] : params[0]) as UseTextDirectionValue) ?? 'ltr';\r\n\r\n const internalRef = useRefState();\r\n const elementRef = useRef<Element>(null);\r\n\r\n const getDirection = () => {\r\n if (typeof window === 'undefined') return initialValue;\r\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\r\n return (element?.getAttribute('dir') as UseTextDirectionValue) ?? initialValue;\r\n };\r\n\r\n const [value, setValue] = useState<UseTextDirectionValue>(getDirection());\r\n\r\n const remove = () => {\r\n if (!elementRef.current) return;\r\n\r\n elementRef.current?.removeAttribute('dir');\r\n };\r\n\r\n const set = (value: UseTextDirectionValue) => {\r\n if (!elementRef.current) return;\r\n\r\n setValue(value);\r\n elementRef.current.setAttribute('dir', value);\r\n };\r\n\r\n useEffect(() => {\r\n if (!target && !internalRef.state) return;\r\n\r\n const element =\r\n ((target ? isTarget.getElement(target) : internalRef.current) as Element) ??\r\n document.querySelector('html');\r\n if (!element) return;\r\n\r\n elementRef.current = element;\r\n\r\n const direction = getDirection();\r\n element.setAttribute('dir', direction);\r\n setValue(direction);\r\n\r\n const observer = new MutationObserver(() => setValue(getDirection()));\r\n\r\n observer.observe(element, { attributes: true });\r\n\r\n return () => {\r\n observer.disconnect();\r\n };\r\n }, [internalRef.state, target && isTarget.getRawElement(target)]);\r\n\r\n if (target) return { value, set, remove };\r\n return {\r\n ref: internalRef,\r\n value,\r\n set,\r\n remove\r\n };\r\n}) as UseTextDirection;\r\n"],"names":["useTextDirection","params","target","isTarget","initialValue","internalRef","useRefState","elementRef","useRef","getDirection","value","setValue","useState","remove","set","useEffect","element","direction","observer"],"mappings":";;;AAsDO,MAAMA,KAAoB,IAAIC,MAAkB;AACrD,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAC5CG,KAAiBF,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,MAAgC,OAE9EI,IAAcC,EAAA,GACdC,IAAaC,EAAgB,IAAI,GAEjCC,IAAe,MACf,OAAO,SAAW,MAAoBL,KACzBF,IAASC,EAAS,WAAWD,CAAM,IAAIG,EAAY,UACnD,aAAa,KAAK,KAA+BD,GAG9D,CAACM,GAAOC,CAAQ,IAAIC,EAAgCH,GAAc,GAElEI,IAAS,MAAM;AACnB,IAAKN,EAAW,WAEhBA,EAAW,SAAS,gBAAgB,KAAK;AAAA,EAAA,GAGrCO,IAAM,CAACJ,MAAiC;AAC5C,IAAKH,EAAW,YAEhBI,EAASD,CAAK,GACdH,EAAW,QAAQ,aAAa,OAAOG,CAAK;AAAA,EAAA;AA0B9C,SAvBAK,EAAU,MAAM;AACd,QAAI,CAACb,KAAU,CAACG,EAAY,MAAO;AAEnC,UAAMW,KACFd,IAASC,EAAS,WAAWD,CAAM,IAAIG,EAAY,YACrD,SAAS,cAAc,MAAM;AAC/B,QAAI,CAACW,EAAS;AAEd,IAAAT,EAAW,UAAUS;AAErB,UAAMC,IAAYR,EAAA;AAClB,IAAAO,EAAQ,aAAa,OAAOC,CAAS,GACrCN,EAASM,CAAS;AAElB,UAAMC,IAAW,IAAI,iBAAiB,MAAMP,EAASF,EAAA,CAAc,CAAC;AAEpE,WAAAS,EAAS,QAAQF,GAAS,EAAE,YAAY,IAAM,GAEvC,MAAM;AACX,MAAAE,EAAS,WAAA;AAAA,IAAW;AAAA,EACtB,GACC,CAACb,EAAY,OAAOH,KAAUC,EAAS,cAAcD,CAAM,CAAC,CAAC,GAE5DA,IAAe,EAAE,OAAAQ,GAAO,KAAAI,GAAK,QAAAD,EAAA,IAC1B;AAAA,IACL,KAAKR;AAAA,IACL,OAAAK;AAAA,IACA,KAAAI;AAAA,IACA,QAAAD;AAAA,EAAA;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTextareaAutosize.mjs","sources":["../../../../src/hooks/useTextareaAutosize/useTextareaAutosize.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use textarea autosize options */\nexport interface UseTextareaAutosizeOptions {\n /** The initial value for the textarea */\n initialValue?: string;\n /** Callback function called when the textarea size changes */\n onResize?: () => void;\n}\n\n/** The use textarea autosize return type */\nexport interface UseTextareaAutosizeReturn {\n /** The current value of the textarea */\n value: string;\n /** Function to clear the textarea value */\n clear: () => void;\n /** Function to set the textarea value */\n set: (value: string) => void;\n}\n\nexport interface UseTextareaAutosize {\n (target: HookTarget, options?: UseTextareaAutosizeOptions): UseTextareaAutosizeReturn;\n\n (target: HookTarget, initialValue: string): UseTextareaAutosizeReturn;\n\n <Target extends HTMLTextAreaElement = HTMLTextAreaElement>(\n initialValue: string,\n target?: never\n ): UseTextareaAutosizeReturn & {\n ref: StateRef<Target>;\n };\n\n <Target extends HTMLTextAreaElement = HTMLTextAreaElement>(\n options?: UseTextareaAutosizeOptions,\n target?: never\n ): UseTextareaAutosizeReturn & {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name useTextareaAutosize\n * @description - Hook that automatically adjusts textarea height based on content\n * @category Elements\n * @usage medium\n *\n * @overload\n * @param {HookTarget} target The target textarea element\n * @param {string} [options.initialValue] The initial value for the textarea\n * @param {Function} [options.onResize] Callback function called when the textarea size changes\n * @returns {UseTextareaAutosizeReturn} An object containing value, setValue and clear\n *\n * @example\n * const { value, setValue, clear } = useTextareaAutosize(ref);\n *\n * @overload\n * @param {HookTarget} target The target textarea element\n * @param {string} initialValue The initial value for the textarea\n * @returns {UseTextareaAutosizeReturn} An object containing value, setValue and clear\n *\n * @example\n * const { value, setValue, clear } = useTextareaAutosize(ref, 'initial');\n *\n * @overload\n * @template Target The textarea element type\n * @param {string} initialValue The initial value for the textarea\n * @returns {UseTextareaAutosizeReturn & { ref: StateRef<Target> }} An object containing ref, value, setValue and clear\n *\n * @example\n * const { ref, value, setValue, clear } = useTextareaAutosize('initial');\n *\n * @overload\n * @template Target The textarea element type\n * @param {string} [options.initialValue] The initial value for the textarea\n * @param {Function} [options.onResize] Callback function called when the textarea size changes\n * @returns {UseTextareaAutosizeReturn & { ref: StateRef<Target> }} An object containing ref, value, setValue and clear\n *\n * @example\n * const { ref, value, setValue, clear } = useTextareaAutosize();\n */\nexport const useTextareaAutosize = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n\n const options = (\n target\n ? typeof params[1] === 'object'\n ? params[1]\n : { initialValue: params[1] }\n : typeof params[0] === 'object'\n ? params[0]\n : { initialValue: params[0] }\n ) as UseTextareaAutosizeOptions | undefined;\n\n const [value, setValue] = useState(options?.initialValue ?? '');\n const internalRef = useRefState<HTMLTextAreaElement>();\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const scrollHeightRef = useRef(0);\n\n const onTextareaResize = () => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n\n const originalMinHeight = textarea.style.minHeight;\n const originalMaxHeight = textarea.style.maxHeight;\n\n textarea.style.height = 'auto';\n textarea.style.minHeight = 'auto';\n textarea.style.maxHeight = 'none';\n\n const scrollHeight = textarea.scrollHeight;\n\n textarea.style.height = `${scrollHeight}px`;\n textarea.style.minHeight = originalMinHeight;\n textarea.style.maxHeight = originalMaxHeight;\n\n if (scrollHeight !== scrollHeightRef.current) options?.onResize?.();\n scrollHeightRef.current = scrollHeight;\n };\n\n const setTextareaValue = (newValue: string) => {\n setValue(newValue);\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.value = newValue;\n requestAnimationFrame(() => {\n onTextareaResize();\n });\n };\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = (\n target ? isTarget.getElement(target) : internalRef.current\n ) as HTMLTextAreaElement;\n if (!element) return;\n\n textareaRef.current = element;\n if (options?.initialValue) element.value = options.initialValue;\n\n onTextareaResize();\n\n const onInput = (event: InputEvent) => {\n const newValue = (event.target as HTMLTextAreaElement).value;\n setTextareaValue(newValue);\n\n requestAnimationFrame(() => {\n onTextareaResize();\n });\n };\n\n const onResize = () => {\n requestAnimationFrame(() => {\n onTextareaResize();\n });\n };\n\n element.addEventListener('input', onInput as EventListener);\n element.addEventListener('resize', onResize as EventListener);\n\n return () => {\n element.removeEventListener('input', onInput as EventListener);\n element.removeEventListener('resize', onResize as EventListener);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state]);\n\n const clear = () => setValue('');\n\n if (target)\n return {\n value,\n set: setTextareaValue,\n clear\n };\n return {\n ref: internalRef,\n value,\n set: setTextareaValue,\n clear\n };\n}) as UseTextareaAutosize;\n"],"names":["useTextareaAutosize","params","target","isTarget","options","value","setValue","useState","internalRef","useRefState","textareaRef","useRef","scrollHeightRef","onTextareaResize","textarea","originalMinHeight","originalMaxHeight","scrollHeight","setTextareaValue","newValue","useEffect","element","onInput","event","onResize","clear"],"mappings":";;;AAwFO,MAAMA,KAAuB,IAAIC,MAAkB;AACxD,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAE5CG,IACJF,IACI,OAAOD,EAAO,CAAC,KAAM,WACnBA,EAAO,CAAC,IACR,EAAE,cAAcA,EAAO,CAAC,EAAA,IAC1B,OAAOA,EAAO,CAAC,KAAM,WACnBA,EAAO,CAAC,IACR,EAAE,cAAcA,EAAO,CAAC,EAAA,GAG1B,CAACI,GAAOC,CAAQ,IAAIC,EAASH,GAAS,gBAAgB,EAAE,GACxDI,IAAcC,EAAA,GACdC,IAAcC,EAAmC,IAAI,GACrDC,IAAkBD,EAAO,CAAC,GAE1BE,IAAmB,MAAM;AAC7B,UAAMC,IAAWJ,EAAY;AAC7B,QAAI,CAACI,EAAU;AAEf,UAAMC,IAAoBD,EAAS,MAAM,WACnCE,IAAoBF,EAAS,MAAM;AAEzC,IAAAA,EAAS,MAAM,SAAS,QACxBA,EAAS,MAAM,YAAY,QAC3BA,EAAS,MAAM,YAAY;AAE3B,UAAMG,IAAeH,EAAS;AAE9B,IAAAA,EAAS,MAAM,SAAS,GAAGG,CAAY,MACvCH,EAAS,MAAM,YAAYC,GAC3BD,EAAS,MAAM,YAAYE,GAEvBC,MAAiBL,EAAgB,WAASR,GAAS,WAAA,GACvDQ,EAAgB,UAAUK;AAAA,EAAA,GAGtBC,IAAmB,CAACC,MAAqB;AAC7C,IAAAb,EAASa,CAAQ;AACjB,UAAML,IAAWJ,EAAY;AAC7B,IAAKI,MACLA,EAAS,QAAQK,GACjB,sBAAsB,MAAM;AAC1B,MAAAN,EAAA;AAAA,IAAiB,CAClB;AAAA,EAAA;AAGH,EAAAO,EAAU,MAAM;AACd,QAAI,CAAClB,KAAU,CAACM,EAAY,MAAO;AAEnC,UAAMa,IACJnB,IAASC,EAAS,WAAWD,CAAM,IAAIM,EAAY;AAErD,QAAI,CAACa,EAAS;AAEd,IAAAX,EAAY,UAAUW,GAClBjB,GAAS,iBAAciB,EAAQ,QAAQjB,EAAQ,eAEnDS,EAAA;AAEA,UAAMS,IAAU,CAACC,MAAsB;AACrC,YAAMJ,IAAYI,EAAM,OAA+B;AACvD,MAAAL,EAAiBC,CAAQ,GAEzB,sBAAsB,MAAM;AAC1B,QAAAN,EAAA;AAAA,MAAiB,CAClB;AAAA,IAAA,GAGGW,IAAW,MAAM;AACrB,4BAAsB,MAAM;AAC1B,QAAAX,EAAA;AAAA,MAAiB,CAClB;AAAA,IAAA;AAGH,WAAAQ,EAAQ,iBAAiB,SAASC,CAAwB,GAC1DD,EAAQ,iBAAiB,UAAUG,CAAyB,GAErD,MAAM;AACX,MAAAH,EAAQ,oBAAoB,SAASC,CAAwB,GAC7DD,EAAQ,oBAAoB,UAAUG,CAAyB;AAAA,IAAA;AAAA,EACjE,GACC,CAACtB,KAAUC,EAAS,cAAcD,CAAM,GAAGM,EAAY,KAAK,CAAC;AAEhE,QAAMiB,IAAQ,MAAMnB,EAAS,EAAE;AAE/B,SAAIJ,IACK;AAAA,IACL,OAAAG;AAAA,IACA,KAAKa;AAAA,IACL,OAAAO;AAAA,EAAA,IAEG;AAAA,IACL,KAAKjB;AAAA,IACL,OAAAH;AAAA,IACA,KAAKa;AAAA,IACL,OAAAO;AAAA,EAAA;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"useTextareaAutosize.mjs","sources":["../../../../src/hooks/useTextareaAutosize/useTextareaAutosize.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\r\n\r\nimport type { HookTarget } from '@/utils/helpers';\r\n\r\nimport { isTarget } from '@/utils/helpers';\r\n\r\nimport type { StateRef } from '../useRefState/useRefState';\r\n\r\nimport { useRefState } from '../useRefState/useRefState';\r\n\r\n/** The use textarea autosize options */\r\nexport interface UseTextareaAutosizeOptions {\r\n /** The initial value for the textarea */\r\n initialValue?: string;\r\n /** Callback function called when the textarea size changes */\r\n onResize?: () => void;\r\n}\r\n\r\n/** The use textarea autosize return type */\r\nexport interface UseTextareaAutosizeReturn {\r\n /** The current value of the textarea */\r\n value: string;\r\n /** Function to clear the textarea value */\r\n clear: () => void;\r\n /** Function to set the textarea value */\r\n set: (value: string) => void;\r\n}\r\n\r\nexport interface UseTextareaAutosize {\r\n (target: HookTarget, options?: UseTextareaAutosizeOptions): UseTextareaAutosizeReturn;\r\n\r\n (target: HookTarget, initialValue: string): UseTextareaAutosizeReturn;\r\n\r\n <Target extends HTMLTextAreaElement = HTMLTextAreaElement>(\r\n initialValue: string,\r\n target?: never\r\n ): UseTextareaAutosizeReturn & {\r\n ref: StateRef<Target>;\r\n };\r\n\r\n <Target extends HTMLTextAreaElement = HTMLTextAreaElement>(\r\n options?: UseTextareaAutosizeOptions,\r\n target?: never\r\n ): UseTextareaAutosizeReturn & {\r\n ref: StateRef<Target>;\r\n };\r\n}\r\n\r\n/**\r\n * @name useTextareaAutosize\r\n * @description - Hook that automatically adjusts textarea height based on content\r\n * @category Elements\r\n * @usage medium\r\n *\r\n * @overload\r\n * @param {HookTarget} target The target textarea element\r\n * @param {string} [options.initialValue] The initial value for the textarea\r\n * @param {Function} [options.onResize] Callback function called when the textarea size changes\r\n * @returns {UseTextareaAutosizeReturn} An object containing value, setValue and clear\r\n *\r\n * @example\r\n * const { value, setValue, clear } = useTextareaAutosize(ref);\r\n *\r\n * @overload\r\n * @param {HookTarget} target The target textarea element\r\n * @param {string} initialValue The initial value for the textarea\r\n * @returns {UseTextareaAutosizeReturn} An object containing value, setValue and clear\r\n *\r\n * @example\r\n * const { value, setValue, clear } = useTextareaAutosize(ref, 'initial');\r\n *\r\n * @overload\r\n * @template Target The textarea element type\r\n * @param {string} initialValue The initial value for the textarea\r\n * @returns {UseTextareaAutosizeReturn & { ref: StateRef<Target> }} An object containing ref, value, setValue and clear\r\n *\r\n * @example\r\n * const { ref, value, setValue, clear } = useTextareaAutosize('initial');\r\n *\r\n * @overload\r\n * @template Target The textarea element type\r\n * @param {string} [options.initialValue] The initial value for the textarea\r\n * @param {Function} [options.onResize] Callback function called when the textarea size changes\r\n * @returns {UseTextareaAutosizeReturn & { ref: StateRef<Target> }} An object containing ref, value, setValue and clear\r\n *\r\n * @example\r\n * const { ref, value, setValue, clear } = useTextareaAutosize();\r\n */\r\nexport const useTextareaAutosize = ((...params: any[]) => {\r\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\r\n\r\n const options = (\r\n target\r\n ? typeof params[1] === 'object'\r\n ? params[1]\r\n : { initialValue: params[1] }\r\n : typeof params[0] === 'object'\r\n ? params[0]\r\n : { initialValue: params[0] }\r\n ) as UseTextareaAutosizeOptions | undefined;\r\n\r\n const [value, setValue] = useState(options?.initialValue ?? '');\r\n const internalRef = useRefState<HTMLTextAreaElement>();\r\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\r\n const scrollHeightRef = useRef(0);\r\n\r\n const onTextareaResize = () => {\r\n const textarea = textareaRef.current;\r\n if (!textarea) return;\r\n\r\n const originalMinHeight = textarea.style.minHeight;\r\n const originalMaxHeight = textarea.style.maxHeight;\r\n\r\n textarea.style.height = 'auto';\r\n textarea.style.minHeight = 'auto';\r\n textarea.style.maxHeight = 'none';\r\n\r\n const scrollHeight = textarea.scrollHeight;\r\n\r\n textarea.style.height = `${scrollHeight}px`;\r\n textarea.style.minHeight = originalMinHeight;\r\n textarea.style.maxHeight = originalMaxHeight;\r\n\r\n if (scrollHeight !== scrollHeightRef.current) options?.onResize?.();\r\n scrollHeightRef.current = scrollHeight;\r\n };\r\n\r\n const setTextareaValue = (newValue: string) => {\r\n setValue(newValue);\r\n const textarea = textareaRef.current;\r\n if (!textarea) return;\r\n textarea.value = newValue;\r\n requestAnimationFrame(() => {\r\n onTextareaResize();\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (!target && !internalRef.state) return;\r\n\r\n const element = (\r\n target ? isTarget.getElement(target) : internalRef.current\r\n ) as HTMLTextAreaElement;\r\n if (!element) return;\r\n\r\n textareaRef.current = element;\r\n if (options?.initialValue) element.value = options.initialValue;\r\n\r\n onTextareaResize();\r\n\r\n const onInput = (event: InputEvent) => {\r\n const newValue = (event.target as HTMLTextAreaElement).value;\r\n setTextareaValue(newValue);\r\n\r\n requestAnimationFrame(() => {\r\n onTextareaResize();\r\n });\r\n };\r\n\r\n const onResize = () => {\r\n requestAnimationFrame(() => {\r\n onTextareaResize();\r\n });\r\n };\r\n\r\n element.addEventListener('input', onInput as EventListener);\r\n element.addEventListener('resize', onResize as EventListener);\r\n\r\n return () => {\r\n element.removeEventListener('input', onInput as EventListener);\r\n element.removeEventListener('resize', onResize as EventListener);\r\n };\r\n }, [target && isTarget.getRawElement(target), internalRef.state]);\r\n\r\n const clear = () => setValue('');\r\n\r\n if (target)\r\n return {\r\n value,\r\n set: setTextareaValue,\r\n clear\r\n };\r\n return {\r\n ref: internalRef,\r\n value,\r\n set: setTextareaValue,\r\n clear\r\n };\r\n}) as UseTextareaAutosize;\r\n"],"names":["useTextareaAutosize","params","target","isTarget","options","value","setValue","useState","internalRef","useRefState","textareaRef","useRef","scrollHeightRef","onTextareaResize","textarea","originalMinHeight","originalMaxHeight","scrollHeight","setTextareaValue","newValue","useEffect","element","onInput","event","onResize","clear"],"mappings":";;;AAwFO,MAAMA,KAAuB,IAAIC,MAAkB;AACxD,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAE5CG,IACJF,IACI,OAAOD,EAAO,CAAC,KAAM,WACnBA,EAAO,CAAC,IACR,EAAE,cAAcA,EAAO,CAAC,EAAA,IAC1B,OAAOA,EAAO,CAAC,KAAM,WACnBA,EAAO,CAAC,IACR,EAAE,cAAcA,EAAO,CAAC,EAAA,GAG1B,CAACI,GAAOC,CAAQ,IAAIC,EAASH,GAAS,gBAAgB,EAAE,GACxDI,IAAcC,EAAA,GACdC,IAAcC,EAAmC,IAAI,GACrDC,IAAkBD,EAAO,CAAC,GAE1BE,IAAmB,MAAM;AAC7B,UAAMC,IAAWJ,EAAY;AAC7B,QAAI,CAACI,EAAU;AAEf,UAAMC,IAAoBD,EAAS,MAAM,WACnCE,IAAoBF,EAAS,MAAM;AAEzC,IAAAA,EAAS,MAAM,SAAS,QACxBA,EAAS,MAAM,YAAY,QAC3BA,EAAS,MAAM,YAAY;AAE3B,UAAMG,IAAeH,EAAS;AAE9B,IAAAA,EAAS,MAAM,SAAS,GAAGG,CAAY,MACvCH,EAAS,MAAM,YAAYC,GAC3BD,EAAS,MAAM,YAAYE,GAEvBC,MAAiBL,EAAgB,WAASR,GAAS,WAAA,GACvDQ,EAAgB,UAAUK;AAAA,EAAA,GAGtBC,IAAmB,CAACC,MAAqB;AAC7C,IAAAb,EAASa,CAAQ;AACjB,UAAML,IAAWJ,EAAY;AAC7B,IAAKI,MACLA,EAAS,QAAQK,GACjB,sBAAsB,MAAM;AAC1B,MAAAN,EAAA;AAAA,IAAiB,CAClB;AAAA,EAAA;AAGH,EAAAO,EAAU,MAAM;AACd,QAAI,CAAClB,KAAU,CAACM,EAAY,MAAO;AAEnC,UAAMa,IACJnB,IAASC,EAAS,WAAWD,CAAM,IAAIM,EAAY;AAErD,QAAI,CAACa,EAAS;AAEd,IAAAX,EAAY,UAAUW,GAClBjB,GAAS,iBAAciB,EAAQ,QAAQjB,EAAQ,eAEnDS,EAAA;AAEA,UAAMS,IAAU,CAACC,MAAsB;AACrC,YAAMJ,IAAYI,EAAM,OAA+B;AACvD,MAAAL,EAAiBC,CAAQ,GAEzB,sBAAsB,MAAM;AAC1B,QAAAN,EAAA;AAAA,MAAiB,CAClB;AAAA,IAAA,GAGGW,IAAW,MAAM;AACrB,4BAAsB,MAAM;AAC1B,QAAAX,EAAA;AAAA,MAAiB,CAClB;AAAA,IAAA;AAGH,WAAAQ,EAAQ,iBAAiB,SAASC,CAAwB,GAC1DD,EAAQ,iBAAiB,UAAUG,CAAyB,GAErD,MAAM;AACX,MAAAH,EAAQ,oBAAoB,SAASC,CAAwB,GAC7DD,EAAQ,oBAAoB,UAAUG,CAAyB;AAAA,IAAA;AAAA,EACjE,GACC,CAACtB,KAAUC,EAAS,cAAcD,CAAM,GAAGM,EAAY,KAAK,CAAC;AAEhE,QAAMiB,IAAQ,MAAMnB,EAAS,EAAE;AAE/B,SAAIJ,IACK;AAAA,IACL,OAAAG;AAAA,IACA,KAAKa;AAAA,IACL,OAAAO;AAAA,EAAA,IAEG;AAAA,IACL,KAAKjB;AAAA,IACL,OAAAH;AAAA,IACA,KAAKa;AAAA,IACL,OAAAO;AAAA,EAAA;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUrlSearchParam.mjs","sources":["../../../../src/hooks/useUrlSearchParam/useUrlSearchParam.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\n/** The url search params mode type */\nexport type UrlSearchParamMode = 'hash-params' | 'hash' | 'history';\n\n/** The use url search param options type */\nexport interface UseUrlSearchParamOptions<Value> {\n /** The initial value of the search param */\n initialValue?: Value;\n /** The mode to use for writing to the URL */\n mode?: UrlSearchParamMode;\n /** The mode to use for writing to the URL */\n write?: 'push' | 'replace';\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 url search params set options type */\nexport interface UseUrlSearchParamsActionOptions {\n /** The mode to use for writing to the URL */\n write?: 'push' | 'replace';\n}\n\n/** The use url search param return type */\nexport interface UseUrlSearchParamReturn<Value> {\n /** Current search param value */\n value: Value | undefined;\n /** Function to remove the search param */\n remove: (options?: UseUrlSearchParamsActionOptions) => void;\n /** Function to update search param */\n set: (value: Value, options?: UseUrlSearchParamsActionOptions) => void;\n}\n\nexport const URL_SEARCH_PARAMS_EVENT = 'reactuse-url-search-params-event';\n\nexport const getUrlSearchParams = (mode: UrlSearchParamMode = 'history') => {\n const { search, hash } = window.location;\n\n let path = '';\n\n if (mode === 'history') path = search;\n if (mode === 'hash-params') path = hash.replace(/^#/, '');\n if (mode === 'hash') {\n const index = hash.indexOf('?');\n path = ~index ? hash.slice(index) : '';\n }\n\n return new URLSearchParams(path);\n};\n\nexport const createQueryString = (searchParams: URLSearchParams, mode: UrlSearchParamMode) => {\n const searchParamsString = searchParams.toString();\n const { search, hash } = window.location;\n\n if (mode === 'history') return `${searchParamsString ? `?${searchParamsString}` : ''}${hash}`;\n if (mode === 'hash-params')\n return `${search}${searchParamsString ? `#${searchParamsString}` : ''}`;\n if (mode === 'hash') {\n const index = hash.indexOf('?');\n const base = index > -1 ? hash.slice(0, index) : hash;\n return `${search}${base}${searchParamsString ? `?${searchParamsString}` : ''}`;\n }\n\n throw new Error('Invalid mode');\n};\n\nexport const dispatchUrlSearchParamsEvent = () =>\n window.dispatchEvent(new Event(URL_SEARCH_PARAMS_EVENT));\n\nexport interface UseUrlSearchParam {\n <Value>(\n key: string,\n options: UseUrlSearchParamOptions<Value> & { initialValue: Value }\n ): UseUrlSearchParamReturn<Value>;\n\n <Value>(\n key: string,\n options?: UseUrlSearchParamOptions<Value>\n ): UseUrlSearchParamReturn<Value | undefined>;\n\n <Value>(key: string, initialValue: Value): UseUrlSearchParamReturn<Value>;\n\n <Value>(key: string): UseUrlSearchParamReturn<Value | undefined>;\n}\n\n/**\n * @name useUrlSearchParam\n * @description - Hook that provides reactive URLSearchParams for a single key\n * @category State\n * @usage high\n *\n * @overload\n * @template Value The type of the url param values\n * @param {string} key The key of the url param\n * @param {UseUrlSearchParamOptions<Value> & { initialValue: Value }} options The options object with required initialValue\n * @param {Value} options.initialValue The initial value for the url param\n * @param {UrlSearchParamsMode} [options.mode='history'] The mode to use for the URL ('history' | 'hash-params' | 'hash')\n * @param {'push' | 'replace'} [options.write='replace'] The mode to use for writing to the URL\n * @param {(value: Value) => string} [options.serializer] Custom serializer function to convert value to string\n * @param {(value: string) => Value} [options.deserializer] Custom deserializer function to convert string to value\n * @returns {UseUrlSearchParamReturn<Value>} The object with value and function for change value\n *\n * @example\n * const { value, set } = useUrlSearchParam('page', { initialValue: 1 });\n *\n * @overload\n * @template Value The type of the url param values\n * @param {string} key The key of the url param\n * @param {Value} [initialValue] The initial value for the url param\n * @returns {UseUrlSearchParamReturn<Value>} The object with value and function for change value\n *\n * @example\n * const { value, set } = useUrlSearchParam('page', 1);\n */\nexport const useUrlSearchParam = (<Value>(key: string, params?: any) => {\n const options = (\n typeof params === 'object' &&\n params &&\n ('serializer' in params ||\n 'deserializer' in params ||\n 'initialValue' in params ||\n 'mode' in params ||\n 'write' in params)\n ? params\n : undefined\n ) as UseUrlSearchParamOptions<Value>;\n\n const initialValue = (options ? options?.initialValue : params) as Value;\n const { mode = 'history', write: writeMode = 'replace' } = options ?? {};\n\n if (typeof window === 'undefined') {\n return {\n value: initialValue,\n remove: () => {},\n set: () => {}\n } as UseUrlSearchParamReturn<Value>;\n }\n\n const serializer = (value: Value) => {\n if (options?.serializer) return options.serializer(value);\n if (typeof value === 'string') return value;\n\n return JSON.stringify(value);\n };\n\n const deserializer = (value: string) => {\n if (options?.deserializer) return options.deserializer(value);\n if (value === 'undefined' || value === 'null') 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 setUrlSearchParam = (\n key: string,\n value: Value | undefined,\n mode: UrlSearchParamMode,\n write: 'push' | 'replace' = 'replace'\n ) => {\n const urlSearchParams = getUrlSearchParams(mode);\n\n if (value === undefined) {\n urlSearchParams.delete(key);\n } else {\n const serializedValue = serializer ? serializer(value) : String(value);\n urlSearchParams.set(key, serializedValue);\n }\n\n const query = createQueryString(urlSearchParams, mode);\n if (write === 'replace') window.history.replaceState({}, '', query);\n if (write === 'push') window.history.pushState({}, '', query);\n\n dispatchUrlSearchParamsEvent();\n };\n\n const [value, setValue] = useState<Value | undefined>(() => {\n const urlSearchParams = getUrlSearchParams(mode);\n const currentValue = urlSearchParams.get(key);\n\n if (currentValue === null && initialValue !== undefined) {\n setUrlSearchParam(key, initialValue, mode, writeMode);\n return initialValue;\n }\n\n return currentValue ? deserializer(currentValue) : undefined;\n });\n\n const set = (value: Value, options?: UseUrlSearchParamsActionOptions) => {\n setUrlSearchParam(key, value, mode, options?.write ?? writeMode);\n setValue(value);\n };\n\n const remove = (options?: UseUrlSearchParamsActionOptions) => {\n setUrlSearchParam(key, undefined, mode, options?.write ?? writeMode);\n setValue(undefined);\n };\n\n useEffect(() => {\n const onParamsChange = () => {\n const urlSearchParams = getUrlSearchParams(mode);\n const newValue = urlSearchParams.get(key);\n setValue(newValue ? deserializer(newValue) : undefined);\n };\n\n window.addEventListener(URL_SEARCH_PARAMS_EVENT, onParamsChange);\n window.addEventListener('popstate', onParamsChange);\n if (mode !== 'history') {\n window.addEventListener('hashchange', onParamsChange);\n }\n\n return () => {\n window.removeEventListener(URL_SEARCH_PARAMS_EVENT, onParamsChange);\n window.removeEventListener('popstate', onParamsChange);\n if (mode !== 'history') {\n window.removeEventListener('hashchange', onParamsChange);\n }\n };\n }, [key, mode]);\n\n return {\n value,\n remove,\n set\n };\n}) as UseUrlSearchParam;\n"],"names":["URL_SEARCH_PARAMS_EVENT","getUrlSearchParams","mode","search","hash","path","index","createQueryString","searchParams","searchParamsString","base","dispatchUrlSearchParamsEvent","useUrlSearchParam","key","params","options","initialValue","writeMode","serializer","value","deserializer","setUrlSearchParam","write","urlSearchParams","serializedValue","query","setValue","useState","currentValue","set","remove","useEffect","onParamsChange","newValue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useUrlSearchParam.mjs","sources":["../../../../src/hooks/useUrlSearchParam/useUrlSearchParam.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\r\n\r\n/** The url search params mode type */\r\nexport type UrlSearchParamMode = 'hash-params' | 'hash' | 'history';\r\n\r\n/** The use url search param options type */\r\nexport interface UseUrlSearchParamOptions<Value> {\r\n /** The initial value of the search param */\r\n initialValue?: Value;\r\n /** The mode to use for writing to the URL */\r\n mode?: UrlSearchParamMode;\r\n /** The mode to use for writing to the URL */\r\n write?: 'push' | 'replace';\r\n /** The deserializer function to be invoked */\r\n deserializer?: (value: string) => Value;\r\n /** The serializer function to be invoked */\r\n serializer?: (value: Value) => string;\r\n}\r\n\r\n/** The use url search params set options type */\r\nexport interface UseUrlSearchParamsActionOptions {\r\n /** The mode to use for writing to the URL */\r\n write?: 'push' | 'replace';\r\n}\r\n\r\n/** The use url search param return type */\r\nexport interface UseUrlSearchParamReturn<Value> {\r\n /** Current search param value */\r\n value: Value | undefined;\r\n /** Function to remove the search param */\r\n remove: (options?: UseUrlSearchParamsActionOptions) => void;\r\n /** Function to update search param */\r\n set: (value: Value, options?: UseUrlSearchParamsActionOptions) => void;\r\n}\r\n\r\nexport const URL_SEARCH_PARAMS_EVENT = 'reactuse-url-search-params-event';\r\n\r\nexport const getUrlSearchParams = (mode: UrlSearchParamMode = 'history') => {\r\n const { search, hash } = window.location;\r\n\r\n let path = '';\r\n\r\n if (mode === 'history') path = search;\r\n if (mode === 'hash-params') path = hash.replace(/^#/, '');\r\n if (mode === 'hash') {\r\n const index = hash.indexOf('?');\r\n path = ~index ? hash.slice(index) : '';\r\n }\r\n\r\n return new URLSearchParams(path);\r\n};\r\n\r\nexport const createQueryString = (searchParams: URLSearchParams, mode: UrlSearchParamMode) => {\r\n const searchParamsString = searchParams.toString();\r\n const { search, hash } = window.location;\r\n\r\n if (mode === 'history') return `${searchParamsString ? `?${searchParamsString}` : ''}${hash}`;\r\n if (mode === 'hash-params')\r\n return `${search}${searchParamsString ? `#${searchParamsString}` : ''}`;\r\n if (mode === 'hash') {\r\n const index = hash.indexOf('?');\r\n const base = index > -1 ? hash.slice(0, index) : hash;\r\n return `${search}${base}${searchParamsString ? `?${searchParamsString}` : ''}`;\r\n }\r\n\r\n throw new Error('Invalid mode');\r\n};\r\n\r\nexport const dispatchUrlSearchParamsEvent = () =>\r\n window.dispatchEvent(new Event(URL_SEARCH_PARAMS_EVENT));\r\n\r\nexport interface UseUrlSearchParam {\r\n <Value>(\r\n key: string,\r\n options: UseUrlSearchParamOptions<Value> & { initialValue: Value }\r\n ): UseUrlSearchParamReturn<Value>;\r\n\r\n <Value>(\r\n key: string,\r\n options?: UseUrlSearchParamOptions<Value>\r\n ): UseUrlSearchParamReturn<Value | undefined>;\r\n\r\n <Value>(key: string, initialValue: Value): UseUrlSearchParamReturn<Value>;\r\n\r\n <Value>(key: string): UseUrlSearchParamReturn<Value | undefined>;\r\n}\r\n\r\n/**\r\n * @name useUrlSearchParam\r\n * @description - Hook that provides reactive URLSearchParams for a single key\r\n * @category State\r\n * @usage high\r\n *\r\n * @overload\r\n * @template Value The type of the url param values\r\n * @param {string} key The key of the url param\r\n * @param {UseUrlSearchParamOptions<Value> & { initialValue: Value }} options The options object with required initialValue\r\n * @param {Value} options.initialValue The initial value for the url param\r\n * @param {UrlSearchParamsMode} [options.mode='history'] The mode to use for the URL ('history' | 'hash-params' | 'hash')\r\n * @param {'push' | 'replace'} [options.write='replace'] The mode to use for writing to the URL\r\n * @param {(value: Value) => string} [options.serializer] Custom serializer function to convert value to string\r\n * @param {(value: string) => Value} [options.deserializer] Custom deserializer function to convert string to value\r\n * @returns {UseUrlSearchParamReturn<Value>} The object with value and function for change value\r\n *\r\n * @example\r\n * const { value, set } = useUrlSearchParam('page', { initialValue: 1 });\r\n *\r\n * @overload\r\n * @template Value The type of the url param values\r\n * @param {string} key The key of the url param\r\n * @param {Value} [initialValue] The initial value for the url param\r\n * @returns {UseUrlSearchParamReturn<Value>} The object with value and function for change value\r\n *\r\n * @example\r\n * const { value, set } = useUrlSearchParam('page', 1);\r\n */\r\nexport const useUrlSearchParam = (<Value>(key: string, params?: any) => {\r\n const options = (\r\n typeof params === 'object' &&\r\n params &&\r\n ('serializer' in params ||\r\n 'deserializer' in params ||\r\n 'initialValue' in params ||\r\n 'mode' in params ||\r\n 'write' in params)\r\n ? params\r\n : undefined\r\n ) as UseUrlSearchParamOptions<Value>;\r\n\r\n const initialValue = (options ? options?.initialValue : params) as Value;\r\n const { mode = 'history', write: writeMode = 'replace' } = options ?? {};\r\n\r\n if (typeof window === 'undefined') {\r\n return {\r\n value: initialValue,\r\n remove: () => {},\r\n set: () => {}\r\n } as UseUrlSearchParamReturn<Value>;\r\n }\r\n\r\n const serializer = (value: Value) => {\r\n if (options?.serializer) return options.serializer(value);\r\n if (typeof value === 'string') return value;\r\n\r\n return JSON.stringify(value);\r\n };\r\n\r\n const deserializer = (value: string) => {\r\n if (options?.deserializer) return options.deserializer(value);\r\n if (value === 'undefined' || value === 'null') return undefined as unknown as Value;\r\n\r\n try {\r\n return JSON.parse(value) as Value;\r\n } catch {\r\n return value as Value;\r\n }\r\n };\r\n\r\n const setUrlSearchParam = (\r\n key: string,\r\n value: Value | undefined,\r\n mode: UrlSearchParamMode,\r\n write: 'push' | 'replace' = 'replace'\r\n ) => {\r\n const urlSearchParams = getUrlSearchParams(mode);\r\n\r\n if (value === undefined) {\r\n urlSearchParams.delete(key);\r\n } else {\r\n const serializedValue = serializer ? serializer(value) : String(value);\r\n urlSearchParams.set(key, serializedValue);\r\n }\r\n\r\n const query = createQueryString(urlSearchParams, mode);\r\n if (write === 'replace') window.history.replaceState({}, '', query);\r\n if (write === 'push') window.history.pushState({}, '', query);\r\n\r\n dispatchUrlSearchParamsEvent();\r\n };\r\n\r\n const [value, setValue] = useState<Value | undefined>(() => {\r\n const urlSearchParams = getUrlSearchParams(mode);\r\n const currentValue = urlSearchParams.get(key);\r\n\r\n if (currentValue === null && initialValue !== undefined) {\r\n setUrlSearchParam(key, initialValue, mode, writeMode);\r\n return initialValue;\r\n }\r\n\r\n return currentValue ? deserializer(currentValue) : undefined;\r\n });\r\n\r\n const set = (value: Value, options?: UseUrlSearchParamsActionOptions) => {\r\n setUrlSearchParam(key, value, mode, options?.write ?? writeMode);\r\n setValue(value);\r\n };\r\n\r\n const remove = (options?: UseUrlSearchParamsActionOptions) => {\r\n setUrlSearchParam(key, undefined, mode, options?.write ?? writeMode);\r\n setValue(undefined);\r\n };\r\n\r\n useEffect(() => {\r\n const onParamsChange = () => {\r\n const urlSearchParams = getUrlSearchParams(mode);\r\n const newValue = urlSearchParams.get(key);\r\n setValue(newValue ? deserializer(newValue) : undefined);\r\n };\r\n\r\n window.addEventListener(URL_SEARCH_PARAMS_EVENT, onParamsChange);\r\n window.addEventListener('popstate', onParamsChange);\r\n if (mode !== 'history') {\r\n window.addEventListener('hashchange', onParamsChange);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener(URL_SEARCH_PARAMS_EVENT, onParamsChange);\r\n window.removeEventListener('popstate', onParamsChange);\r\n if (mode !== 'history') {\r\n window.removeEventListener('hashchange', onParamsChange);\r\n }\r\n };\r\n }, [key, mode]);\r\n\r\n return {\r\n value,\r\n remove,\r\n set\r\n };\r\n}) as UseUrlSearchParam;\r\n"],"names":["URL_SEARCH_PARAMS_EVENT","getUrlSearchParams","mode","search","hash","path","index","createQueryString","searchParams","searchParamsString","base","dispatchUrlSearchParamsEvent","useUrlSearchParam","key","params","options","initialValue","writeMode","serializer","value","deserializer","setUrlSearchParam","write","urlSearchParams","serializedValue","query","setValue","useState","currentValue","set","remove","useEffect","onParamsChange","newValue"],"mappings":"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"}
|