react-simplikit 0.0.50 → 0.0.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/dist/components/ImpressionArea/ImpressionArea.cjs +57 -0
  2. package/{esm/components/ImpressionArea/index.d.ts → dist/components/ImpressionArea/ImpressionArea.d.cts} +9 -8
  3. package/dist/components/ImpressionArea/ImpressionArea.d.mts +48 -0
  4. package/dist/components/ImpressionArea/ImpressionArea.mjs +57 -0
  5. package/dist/components/ImpressionArea/index.d.cts +2 -46
  6. package/dist/components/ImpressionArea/index.d.mts +3 -0
  7. package/dist/components/Separated/Separated.cjs +38 -0
  8. package/{esm/components/Separated/index.d.ts → dist/components/Separated/Separated.d.cts} +7 -7
  9. package/dist/components/Separated/Separated.d.mts +38 -0
  10. package/dist/components/Separated/Separated.mjs +38 -0
  11. package/dist/components/Separated/index.d.cts +2 -37
  12. package/dist/components/Separated/index.d.mts +3 -0
  13. package/dist/components/SwitchCase/SwitchCase.cjs +40 -0
  14. package/{esm/components/SwitchCase/index.d.ts → dist/components/SwitchCase/SwitchCase.d.cts} +7 -8
  15. package/dist/components/SwitchCase/SwitchCase.d.mts +45 -0
  16. package/dist/components/SwitchCase/SwitchCase.mjs +40 -0
  17. package/dist/components/SwitchCase/index.d.cts +2 -45
  18. package/dist/components/SwitchCase/index.d.mts +3 -0
  19. package/dist/hooks/useAsyncEffect/index.d.cts +2 -24
  20. package/dist/hooks/useAsyncEffect/index.d.mts +3 -0
  21. package/dist/hooks/useAsyncEffect/useAsyncEffect.cjs +39 -0
  22. package/{esm/hooks/useAsyncEffect/index.d.ts → dist/hooks/useAsyncEffect/useAsyncEffect.d.cts} +4 -3
  23. package/dist/hooks/useAsyncEffect/useAsyncEffect.d.mts +26 -0
  24. package/dist/hooks/useAsyncEffect/useAsyncEffect.mjs +39 -0
  25. package/dist/hooks/useBooleanState/useBooleanState.cjs +36 -0
  26. package/dist/hooks/useBooleanState/{index.d.cts → useBooleanState.d.cts} +4 -2
  27. package/{esm/hooks/useBooleanState/index.d.ts → dist/hooks/useBooleanState/useBooleanState.d.mts} +4 -2
  28. package/dist/hooks/useBooleanState/useBooleanState.mjs +36 -0
  29. package/dist/hooks/useCallbackOncePerRender/index.d.cts +2 -39
  30. package/dist/hooks/useCallbackOncePerRender/index.d.mts +3 -0
  31. package/dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.cjs +52 -0
  32. package/{esm/hooks/useCallbackOncePerRender/index.d.ts → dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.d.cts} +4 -3
  33. package/dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.d.mts +41 -0
  34. package/dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.mjs +52 -0
  35. package/dist/hooks/useConditionalEffect/index.d.cts +2 -42
  36. package/dist/hooks/useConditionalEffect/index.d.mts +3 -0
  37. package/dist/hooks/useConditionalEffect/useConditionalEffect.cjs +57 -0
  38. package/{esm/hooks/useConditionalEffect/index.d.ts → dist/hooks/useConditionalEffect/useConditionalEffect.d.cts} +4 -3
  39. package/dist/hooks/useConditionalEffect/useConditionalEffect.d.mts +44 -0
  40. package/dist/hooks/useConditionalEffect/useConditionalEffect.mjs +57 -0
  41. package/dist/hooks/useControlledState/index.d.cts +2 -50
  42. package/dist/hooks/useControlledState/index.d.mts +3 -0
  43. package/dist/hooks/useControlledState/useControlledState.cjs +60 -0
  44. package/{esm/hooks/useControlledState/index.d.ts → dist/hooks/useControlledState/useControlledState.d.cts} +11 -10
  45. package/dist/hooks/useControlledState/useControlledState.d.mts +52 -0
  46. package/dist/hooks/useControlledState/useControlledState.mjs +60 -0
  47. package/dist/hooks/useCounter/useCounter.cjs +75 -0
  48. package/{esm/hooks/useCounter/index.d.ts → dist/hooks/useCounter/useCounter.d.cts} +12 -10
  49. package/dist/hooks/useCounter/{index.d.cts → useCounter.d.mts} +12 -10
  50. package/dist/hooks/useCounter/useCounter.mjs +75 -0
  51. package/dist/hooks/useDebounce/debounce.cjs +49 -0
  52. package/dist/hooks/useDebounce/debounce.d.cts +8 -0
  53. package/dist/hooks/useDebounce/debounce.d.mts +8 -0
  54. package/dist/hooks/useDebounce/debounce.mjs +49 -0
  55. package/dist/hooks/useDebounce/useDebounce.cjs +66 -0
  56. package/{esm/hooks/useDebounce/index.d.ts → dist/hooks/useDebounce/useDebounce.d.cts} +6 -8
  57. package/dist/hooks/useDebounce/{index.d.cts → useDebounce.d.mts} +6 -8
  58. package/dist/hooks/useDebounce/useDebounce.mjs +66 -0
  59. package/dist/hooks/useDebouncedCallback/useDebouncedCallback.cjs +62 -0
  60. package/{esm/hooks/useDebouncedCallback/index.d.ts → dist/hooks/useDebouncedCallback/useDebouncedCallback.d.cts} +9 -7
  61. package/dist/hooks/useDebouncedCallback/{index.d.cts → useDebouncedCallback.d.mts} +9 -7
  62. package/dist/hooks/useDebouncedCallback/useDebouncedCallback.mjs +62 -0
  63. package/dist/hooks/useDoubleClick/index.d.cts +2 -45
  64. package/dist/hooks/useDoubleClick/index.d.mts +3 -0
  65. package/dist/hooks/useDoubleClick/useDoubleClick.cjs +64 -0
  66. package/{esm/hooks/useDoubleClick/index.d.ts → dist/hooks/useDoubleClick/useDoubleClick.d.cts} +8 -7
  67. package/dist/hooks/useDoubleClick/useDoubleClick.d.mts +47 -0
  68. package/dist/hooks/useDoubleClick/useDoubleClick.mjs +64 -0
  69. package/dist/hooks/useGeolocation/useGeolocation.cjs +210 -0
  70. package/{esm/hooks/useGeolocation/index.d.ts → dist/hooks/useGeolocation/useGeolocation.d.cts} +26 -24
  71. package/dist/hooks/useGeolocation/{index.d.cts → useGeolocation.d.mts} +26 -24
  72. package/dist/hooks/useGeolocation/useGeolocation.mjs +209 -0
  73. package/dist/hooks/useImpressionRef/useImpressionRef.cjs +67 -0
  74. package/{esm/hooks/useImpressionRef/index.d.ts → dist/hooks/useImpressionRef/useImpressionRef.d.cts} +10 -8
  75. package/dist/hooks/useImpressionRef/{index.d.cts → useImpressionRef.d.mts} +10 -8
  76. package/dist/hooks/useImpressionRef/useImpressionRef.mjs +67 -0
  77. package/dist/hooks/useInputState/index.d.cts +2 -22
  78. package/dist/hooks/useInputState/index.d.mts +3 -0
  79. package/dist/hooks/useInputState/useInputState.cjs +32 -0
  80. package/{esm/hooks/useInputState/index.d.ts → dist/hooks/useInputState/useInputState.d.cts} +4 -3
  81. package/dist/hooks/useInputState/useInputState.d.mts +24 -0
  82. package/dist/hooks/useInputState/useInputState.mjs +32 -0
  83. package/dist/hooks/useIntersectionObserver/useIntersectionObserver.cjs +58 -0
  84. package/dist/hooks/useIntersectionObserver/{index.d.cts → useIntersectionObserver.d.cts} +4 -2
  85. package/{esm/hooks/useIntersectionObserver/index.d.ts → dist/hooks/useIntersectionObserver/useIntersectionObserver.d.mts} +4 -2
  86. package/dist/hooks/useIntersectionObserver/useIntersectionObserver.mjs +58 -0
  87. package/dist/hooks/useInterval/useInterval.cjs +65 -0
  88. package/dist/hooks/useInterval/{index.d.cts → useInterval.d.cts} +7 -5
  89. package/{esm/hooks/useInterval/index.d.ts → dist/hooks/useInterval/useInterval.d.mts} +7 -5
  90. package/dist/hooks/useInterval/useInterval.mjs +65 -0
  91. package/dist/hooks/useIsClient/useIsClient.cjs +49 -0
  92. package/dist/hooks/useIsClient/{index.d.cts → useIsClient.d.cts} +4 -2
  93. package/{esm/hooks/useIsClient/index.d.ts → dist/hooks/useIsClient/useIsClient.d.mts} +4 -2
  94. package/dist/hooks/useIsClient/useIsClient.mjs +49 -0
  95. package/dist/hooks/useIsomorphicLayoutEffect/index.d.cts +2 -24
  96. package/dist/hooks/useIsomorphicLayoutEffect/index.d.mts +3 -0
  97. package/dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.cjs +25 -0
  98. package/{esm/hooks/useIsomorphicLayoutEffect/index.d.ts → dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.d.cts} +4 -3
  99. package/dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.d.mts +26 -0
  100. package/dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.mjs +25 -0
  101. package/dist/hooks/useList/useList.cjs +94 -0
  102. package/{esm/hooks/useList/index.d.ts → dist/hooks/useList/useList.d.cts} +10 -8
  103. package/dist/hooks/useList/{index.d.cts → useList.d.mts} +10 -8
  104. package/dist/hooks/useList/useList.mjs +94 -0
  105. package/dist/hooks/useLoading/useLoading.cjs +61 -0
  106. package/dist/hooks/useLoading/{index.d.cts → useLoading.d.cts} +4 -2
  107. package/{esm/hooks/useLoading/index.d.ts → dist/hooks/useLoading/useLoading.d.mts} +4 -2
  108. package/dist/hooks/useLoading/useLoading.mjs +61 -0
  109. package/dist/hooks/useLongPress/index.d.cts +2 -73
  110. package/dist/hooks/useLongPress/index.d.mts +3 -0
  111. package/dist/hooks/useLongPress/useLongPress.cjs +133 -0
  112. package/{esm/hooks/useLongPress/index.d.ts → dist/hooks/useLongPress/useLongPress.d.cts} +18 -17
  113. package/dist/hooks/useLongPress/useLongPress.d.mts +75 -0
  114. package/dist/hooks/useLongPress/useLongPress.mjs +133 -0
  115. package/dist/hooks/useMap/useMap.cjs +64 -0
  116. package/dist/hooks/useMap/{index.d.cts → useMap.d.cts} +12 -10
  117. package/{esm/hooks/useMap/index.d.ts → dist/hooks/useMap/useMap.d.mts} +12 -10
  118. package/dist/hooks/useMap/useMap.mjs +64 -0
  119. package/dist/hooks/useOutsideClickEffect/useOutsideClickEffect.cjs +51 -0
  120. package/{esm/hooks/useOutsideClickEffect/index.d.ts → dist/hooks/useOutsideClickEffect/useOutsideClickEffect.d.cts} +4 -2
  121. package/dist/hooks/useOutsideClickEffect/{index.d.cts → useOutsideClickEffect.d.mts} +4 -2
  122. package/dist/hooks/useOutsideClickEffect/useOutsideClickEffect.mjs +51 -0
  123. package/dist/hooks/usePreservedCallback/usePreservedCallback.cjs +41 -0
  124. package/dist/hooks/usePreservedCallback/{index.d.cts → usePreservedCallback.d.cts} +4 -2
  125. package/{esm/hooks/usePreservedCallback/index.d.ts → dist/hooks/usePreservedCallback/usePreservedCallback.d.mts} +4 -2
  126. package/dist/hooks/usePreservedCallback/usePreservedCallback.mjs +41 -0
  127. package/dist/hooks/usePreservedReference/usePreservedReference.cjs +55 -0
  128. package/dist/hooks/usePreservedReference/{index.d.cts → usePreservedReference.d.cts} +4 -2
  129. package/{esm/hooks/usePreservedReference/index.d.ts → dist/hooks/usePreservedReference/usePreservedReference.d.mts} +4 -2
  130. package/dist/hooks/usePreservedReference/usePreservedReference.mjs +55 -0
  131. package/dist/hooks/usePrevious/usePrevious.cjs +38 -0
  132. package/{esm/hooks/usePrevious/index.d.ts → dist/hooks/usePrevious/usePrevious.d.cts} +4 -2
  133. package/dist/hooks/usePrevious/{index.d.cts → usePrevious.d.mts} +4 -2
  134. package/dist/hooks/usePrevious/usePrevious.mjs +38 -0
  135. package/dist/hooks/useRefEffect/index.d.cts +2 -30
  136. package/dist/hooks/useRefEffect/index.d.mts +3 -0
  137. package/dist/hooks/useRefEffect/useRefEffect.cjs +42 -0
  138. package/{esm/hooks/useRefEffect/index.d.ts → dist/hooks/useRefEffect/useRefEffect.d.cts} +4 -3
  139. package/dist/hooks/useRefEffect/useRefEffect.d.mts +32 -0
  140. package/dist/hooks/useRefEffect/useRefEffect.mjs +42 -0
  141. package/dist/hooks/useSet/useSet.cjs +79 -0
  142. package/dist/hooks/useSet/{index.d.cts → useSet.d.cts} +9 -7
  143. package/{esm/hooks/useSet/index.d.ts → dist/hooks/useSet/useSet.d.mts} +9 -7
  144. package/dist/hooks/useSet/useSet.mjs +79 -0
  145. package/dist/hooks/useStorageState/index.d.cts +2 -60
  146. package/dist/hooks/useStorageState/index.d.mts +3 -0
  147. package/dist/hooks/useStorageState/storage.cjs +85 -0
  148. package/dist/hooks/useStorageState/storage.d.cts +10 -0
  149. package/dist/hooks/useStorageState/storage.d.mts +10 -0
  150. package/dist/hooks/useStorageState/storage.mjs +80 -0
  151. package/dist/hooks/useStorageState/useStorageState.cjs +81 -0
  152. package/{esm/hooks/useStorageState/index.d.ts → dist/hooks/useStorageState/useStorageState.d.cts} +10 -15
  153. package/dist/hooks/useStorageState/useStorageState.d.mts +56 -0
  154. package/dist/hooks/useStorageState/useStorageState.mjs +81 -0
  155. package/dist/hooks/useThrottle/throttle.cjs +19 -0
  156. package/dist/hooks/useThrottle/throttle.d.cts +19 -0
  157. package/dist/hooks/useThrottle/throttle.d.mts +19 -0
  158. package/dist/hooks/useThrottle/throttle.mjs +19 -0
  159. package/dist/hooks/useThrottle/useThrottle.cjs +49 -0
  160. package/dist/hooks/useThrottle/{index.d.cts → useThrottle.d.cts} +6 -19
  161. package/{esm/hooks/useThrottle/index.d.ts → dist/hooks/useThrottle/useThrottle.d.mts} +6 -19
  162. package/dist/hooks/useThrottle/useThrottle.mjs +49 -0
  163. package/dist/hooks/useThrottledCallback/useThrottledCallback.cjs +57 -0
  164. package/{esm/hooks/useThrottledCallback/index.d.ts → dist/hooks/useThrottledCallback/useThrottledCallback.d.cts} +8 -6
  165. package/dist/hooks/useThrottledCallback/{index.d.cts → useThrottledCallback.d.mts} +8 -6
  166. package/dist/hooks/useThrottledCallback/useThrottledCallback.mjs +57 -0
  167. package/dist/hooks/useTimeout/useTimeout.cjs +40 -0
  168. package/dist/hooks/useTimeout/{index.d.cts → useTimeout.d.cts} +4 -2
  169. package/{esm/hooks/useTimeout/index.d.ts → dist/hooks/useTimeout/useTimeout.d.mts} +4 -2
  170. package/dist/hooks/useTimeout/useTimeout.mjs +40 -0
  171. package/dist/hooks/useToggle/useToggle.cjs +34 -0
  172. package/dist/hooks/useToggle/{index.d.cts → useToggle.d.cts} +4 -4
  173. package/{esm/hooks/useToggle/index.d.ts → dist/hooks/useToggle/useToggle.d.mts} +4 -4
  174. package/dist/hooks/useToggle/useToggle.mjs +34 -0
  175. package/dist/hooks/useVisibilityEvent/useVisibilityEvent.cjs +42 -0
  176. package/{esm/hooks/useVisibilityEvent/index.d.ts → dist/hooks/useVisibilityEvent/useVisibilityEvent.d.cts} +5 -3
  177. package/dist/hooks/useVisibilityEvent/{index.d.cts → useVisibilityEvent.d.mts} +5 -3
  178. package/dist/hooks/useVisibilityEvent/useVisibilityEvent.mjs +42 -0
  179. package/dist/index.cjs +77 -1382
  180. package/dist/index.d.cts +56 -40
  181. package/dist/index.d.mts +56 -0
  182. package/dist/index.mjs +40 -0
  183. package/dist/utils/buildContext/buildContext.cjs +50 -0
  184. package/{esm/utils/buildContext/index.d.ts → dist/utils/buildContext/buildContext.d.cts} +7 -7
  185. package/dist/utils/buildContext/buildContext.d.mts +38 -0
  186. package/dist/utils/buildContext/buildContext.mjs +50 -0
  187. package/dist/utils/buildContext/index.d.cts +2 -37
  188. package/dist/utils/buildContext/index.d.mts +3 -0
  189. package/dist/utils/mergeProps/index.d.cts +2 -25
  190. package/dist/utils/mergeProps/index.d.mts +3 -0
  191. package/dist/utils/mergeProps/mergeProps.cjs +53 -0
  192. package/{esm/utils/mergeProps/index.d.ts → dist/utils/mergeProps/mergeProps.d.cts} +7 -8
  193. package/dist/utils/mergeProps/mergeProps.d.mts +25 -0
  194. package/dist/utils/mergeProps/mergeProps.mjs +53 -0
  195. package/dist/utils/mergeRefs/index.d.cts +2 -38
  196. package/dist/utils/mergeRefs/index.d.mts +3 -0
  197. package/dist/utils/mergeRefs/mergeRefs.cjs +50 -0
  198. package/{esm/utils/mergeRefs/index.d.ts → dist/utils/mergeRefs/mergeRefs.d.cts} +4 -3
  199. package/dist/utils/mergeRefs/mergeRefs.d.mts +40 -0
  200. package/dist/utils/mergeRefs/mergeRefs.mjs +50 -0
  201. package/package.json +9 -11
  202. package/dist/components/ImpressionArea/index.cjs +0 -295
  203. package/dist/components/Separated/index.cjs +0 -41
  204. package/dist/components/SwitchCase/index.cjs +0 -36
  205. package/dist/hooks/useAsyncEffect/index.cjs +0 -44
  206. package/dist/hooks/useBooleanState/index.cjs +0 -46
  207. package/dist/hooks/useCallbackOncePerRender/index.cjs +0 -63
  208. package/dist/hooks/useConditionalEffect/index.cjs +0 -51
  209. package/dist/hooks/useControlledState/index.cjs +0 -57
  210. package/dist/hooks/useCounter/index.cjs +0 -70
  211. package/dist/hooks/useDebounce/index.cjs +0 -130
  212. package/dist/hooks/useDebouncedCallback/index.cjs +0 -148
  213. package/dist/hooks/useDoubleClick/index.cjs +0 -79
  214. package/dist/hooks/useGeolocation/index.cjs +0 -154
  215. package/dist/hooks/useImpressionRef/index.cjs +0 -258
  216. package/dist/hooks/useInputState/index.cjs +0 -46
  217. package/dist/hooks/useIntersectionObserver/index.cjs +0 -95
  218. package/dist/hooks/useInterval/index.cjs +0 -74
  219. package/dist/hooks/useIsClient/index.cjs +0 -40
  220. package/dist/hooks/useIsomorphicLayoutEffect/index.cjs +0 -35
  221. package/dist/hooks/useList/index.cjs +0 -104
  222. package/dist/hooks/useLoading/index.cjs +0 -65
  223. package/dist/hooks/useLongPress/index.cjs +0 -127
  224. package/dist/hooks/useMap/index.cjs +0 -78
  225. package/dist/hooks/useOutsideClickEffect/index.cjs +0 -74
  226. package/dist/hooks/usePreservedCallback/index.cjs +0 -45
  227. package/dist/hooks/usePreservedReference/index.cjs +0 -45
  228. package/dist/hooks/usePrevious/index.cjs +0 -48
  229. package/dist/hooks/useRefEffect/index.cjs +0 -72
  230. package/dist/hooks/useSet/index.cjs +0 -105
  231. package/dist/hooks/useStorageState/index.cjs +0 -196
  232. package/dist/hooks/useThrottle/index.cjs +0 -151
  233. package/dist/hooks/useThrottledCallback/index.cjs +0 -172
  234. package/dist/hooks/useTimeout/index.cjs +0 -57
  235. package/dist/hooks/useToggle/index.cjs +0 -37
  236. package/dist/hooks/useVisibilityEvent/index.cjs +0 -47
  237. package/dist/utils/buildContext/index.cjs +0 -56
  238. package/dist/utils/mergeProps/index.cjs +0 -71
  239. package/dist/utils/mergeRefs/index.cjs +0 -46
  240. package/esm/components/ImpressionArea/index.js +0 -269
  241. package/esm/components/Separated/index.js +0 -15
  242. package/esm/components/SwitchCase/index.js +0 -10
  243. package/esm/hooks/useAsyncEffect/index.js +0 -18
  244. package/esm/hooks/useBooleanState/index.js +0 -20
  245. package/esm/hooks/useCallbackOncePerRender/index.js +0 -37
  246. package/esm/hooks/useConditionalEffect/index.js +0 -25
  247. package/esm/hooks/useControlledState/index.js +0 -31
  248. package/esm/hooks/useCounter/index.js +0 -44
  249. package/esm/hooks/useDebounce/index.js +0 -104
  250. package/esm/hooks/useDebouncedCallback/index.js +0 -122
  251. package/esm/hooks/useDoubleClick/index.js +0 -53
  252. package/esm/hooks/useGeolocation/index.js +0 -128
  253. package/esm/hooks/useImpressionRef/index.js +0 -232
  254. package/esm/hooks/useInputState/index.js +0 -20
  255. package/esm/hooks/useIntersectionObserver/index.js +0 -69
  256. package/esm/hooks/useInterval/index.js +0 -48
  257. package/esm/hooks/useIsClient/index.js +0 -14
  258. package/esm/hooks/useIsomorphicLayoutEffect/index.js +0 -9
  259. package/esm/hooks/useList/index.js +0 -78
  260. package/esm/hooks/useLoading/index.js +0 -39
  261. package/esm/hooks/useLongPress/index.js +0 -101
  262. package/esm/hooks/useMap/index.js +0 -52
  263. package/esm/hooks/useOutsideClickEffect/index.js +0 -48
  264. package/esm/hooks/usePreservedCallback/index.js +0 -19
  265. package/esm/hooks/usePreservedReference/index.js +0 -19
  266. package/esm/hooks/usePrevious/index.js +0 -22
  267. package/esm/hooks/useRefEffect/index.js +0 -46
  268. package/esm/hooks/useSet/index.js +0 -79
  269. package/esm/hooks/useStorageState/index.js +0 -170
  270. package/esm/hooks/useThrottle/index.js +0 -125
  271. package/esm/hooks/useThrottledCallback/index.js +0 -146
  272. package/esm/hooks/useTimeout/index.js +0 -31
  273. package/esm/hooks/useToggle/index.js +0 -11
  274. package/esm/hooks/useVisibilityEvent/index.js +0 -21
  275. package/esm/index.d.ts +0 -40
  276. package/esm/index.js +0 -1320
  277. package/esm/utils/buildContext/index.js +0 -30
  278. package/esm/utils/mergeProps/index.js +0 -45
  279. package/esm/utils/mergeRefs/index.js +0 -20
@@ -1,10 +1,12 @@
1
+
2
+ //#region src/hooks/useSet/useSet.d.ts
1
3
  type SetOrValues<T> = Set<T> | T[];
2
4
  type SetActions<T> = {
3
- add: (value: T) => void;
4
- remove: (value: T) => void;
5
- toggle: (value: T) => void;
6
- setAll: (values: SetOrValues<T>) => void;
7
- reset: () => void;
5
+ add: (value: T) => void;
6
+ remove: (value: T) => void;
7
+ toggle: (value: T) => void;
8
+ setAll: (values: SetOrValues<T>) => void;
9
+ reset: () => void;
8
10
  };
9
11
  type UseSetReturn<T> = [Omit<Set<T>, 'add' | 'clear' | 'delete'>, SetActions<T>];
10
12
  /**
@@ -35,5 +37,5 @@ type UseSetReturn<T> = [Omit<Set<T>, 'add' | 'clear' | 'delete'>, SetActions<T>]
35
37
  * ```
36
38
  */
37
39
  declare function useSet<T>(initialState?: SetOrValues<T>): UseSetReturn<T>;
38
-
39
- export { useSet };
40
+ //#endregion
41
+ export { useSet };
@@ -1,10 +1,12 @@
1
+
2
+ //#region src/hooks/useSet/useSet.d.ts
1
3
  type SetOrValues<T> = Set<T> | T[];
2
4
  type SetActions<T> = {
3
- add: (value: T) => void;
4
- remove: (value: T) => void;
5
- toggle: (value: T) => void;
6
- setAll: (values: SetOrValues<T>) => void;
7
- reset: () => void;
5
+ add: (value: T) => void;
6
+ remove: (value: T) => void;
7
+ toggle: (value: T) => void;
8
+ setAll: (values: SetOrValues<T>) => void;
9
+ reset: () => void;
8
10
  };
9
11
  type UseSetReturn<T> = [Omit<Set<T>, 'add' | 'clear' | 'delete'>, SetActions<T>];
10
12
  /**
@@ -35,5 +37,5 @@ type UseSetReturn<T> = [Omit<Set<T>, 'add' | 'clear' | 'delete'>, SetActions<T>]
35
37
  * ```
36
38
  */
37
39
  declare function useSet<T>(initialState?: SetOrValues<T>): UseSetReturn<T>;
38
-
39
- export { useSet };
40
+ //#endregion
41
+ export { useSet };
@@ -0,0 +1,79 @@
1
+ "use client";
2
+ import { usePreservedCallback } from "../usePreservedCallback/usePreservedCallback.mjs";
3
+ import { usePreservedReference } from "../usePreservedReference/usePreservedReference.mjs";
4
+ import { useMemo, useState } from "react";
5
+ //#region src/hooks/useSet/useSet.ts
6
+ /**
7
+ * @description
8
+ * A React hook that manages a Set as state.
9
+ * Provides efficient state management and stable action functions.
10
+ *
11
+ * @param {SetOrValues<T>} initialState - Initial Set state (Set object or array of values)
12
+ * @returns {UseSetReturn<T>} A tuple containing the Set state and actions to manipulate it
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * import { useSet } from 'react-simplikit';
17
+ *
18
+ * function TagSelector() {
19
+ * const [selectedTags, { add, remove, toggle }] = useSet<string>(['react']);
20
+ *
21
+ * return (
22
+ * <div>
23
+ * {['react', 'vue', 'svelte'].map(tag => (
24
+ * <button key={tag} onClick={() => toggle(tag)}>
25
+ * {selectedTags.has(tag) ? '✓' : ''} {tag}
26
+ * </button>
27
+ * ))}
28
+ * </div>
29
+ * );
30
+ * }
31
+ * ```
32
+ */
33
+ function useSet(initialState = /* @__PURE__ */ new Set()) {
34
+ const [set, setSet] = useState(() => new Set(initialState));
35
+ const preservedInitialState = usePreservedReference(initialState);
36
+ const add = usePreservedCallback((value) => {
37
+ setSet((prev) => {
38
+ const nextSet = new Set(prev);
39
+ nextSet.add(value);
40
+ return nextSet;
41
+ });
42
+ });
43
+ const remove = usePreservedCallback((value) => {
44
+ setSet((prev) => {
45
+ const nextSet = new Set(prev);
46
+ nextSet.delete(value);
47
+ return nextSet;
48
+ });
49
+ });
50
+ const toggle = usePreservedCallback((value) => {
51
+ setSet((prev) => {
52
+ const nextSet = new Set(prev);
53
+ if (nextSet.has(value)) nextSet.delete(value);
54
+ else nextSet.add(value);
55
+ return nextSet;
56
+ });
57
+ });
58
+ const setAll = usePreservedCallback((values) => {
59
+ setSet(() => new Set(values));
60
+ });
61
+ const reset = usePreservedCallback(() => {
62
+ setSet(() => new Set(preservedInitialState));
63
+ });
64
+ return [set, useMemo(() => ({
65
+ add,
66
+ remove,
67
+ toggle,
68
+ setAll,
69
+ reset
70
+ }), [
71
+ add,
72
+ remove,
73
+ toggle,
74
+ setAll,
75
+ reset
76
+ ])];
77
+ }
78
+ //#endregion
79
+ export { useSet };
@@ -1,61 +1,3 @@
1
- import { SetStateAction } from 'react';
2
1
 
3
- type Storage = {
4
- get(key: string): string | null;
5
- set(key: string, value: string): void;
6
- remove(key: string): void;
7
- clear(): void;
8
- };
9
-
10
- type ToObject<T> = T extends unknown[] | Record<string, unknown> ? T : never;
11
- type Serializable<T> = T extends string | number | boolean ? T : ToObject<T>;
12
- type StorageStateOptions<T> = {
13
- storage?: Storage;
14
- defaultValue?: T;
15
- };
16
- type StorageStateOptionsWithDefaultValue<T> = StorageStateOptions<T> & {
17
- defaultValue: T;
18
- };
19
- type StorageStateOptionsWithSerializer<T> = StorageStateOptions<T> & {
20
- serializer: (value: Serializable<T>) => string;
21
- deserializer: (value: string) => Serializable<T>;
22
- };
23
- type SerializableGuard<T extends readonly any[]> = T[0] extends any ? T : T[0] extends never ? 'Received a non-serializable value' : T;
24
- /**
25
- * @deprecated This hook is deprecated as it depends on browser-specific APIs (localStorage/sessionStorage).
26
- * react-simplikit is now focused on platform-independent, pure state/logic hooks.
27
- * This hook will be removed in a future major version.
28
- *
29
- * @description
30
- * `useStorageState` is a React that functions like `useState` but persists the state value in browser storage.
31
- * The value is retained across page reloads and can be shared between tabs when using `localStorage`.
32
- *
33
- * @param {string} key - The key used to store the value in storage.
34
- * @param {Object} [options] - Configuration options for storage behavior.
35
- * @param {Storage} [options.storage=localStorage] - The storage type (`localStorage` or `sessionStorage`). Defaults to `localStorage`.
36
- * @param {T} [options.defaultValue] - The initial value if no existing value is found.
37
- * @param {Function} [options.serializer] - A function to serialize the state value to a string.
38
- * @param {Function} [options.deserializer] - A function to deserialize the state value from a string.
39
- *
40
- * @returns {readonly [state: Serializable<T> | undefined, setState: (value: SetStateAction<Serializable<T> | undefined>) => void, refreshState: () => void]} A tuple:
41
- * - state `Serializable<T> | undefined` - The current state value retrieved from storage;
42
- * - setState `(value: SetStateAction<Serializable<T> | undefined>) => void` - A function to update and persist the state;
43
- * - refreshState `() => void` - A function to refresh the state from storage;
44
- * @example
45
- * // Counter with persistent state
46
- * import { useStorageState } from 'react-simplikit';
47
- *
48
- * function Counter() {
49
- * const [count, setCount] = useStorageState<number>('counter', {
50
- * defaultValue: 0,
51
- * });
52
- *
53
- * return <button onClick={() => setCount(prev => prev + 1)}>Count: {count}</button>;
54
- * }
55
- */
56
- declare function useStorageState<T>(key: string): SerializableGuard<readonly [Serializable<T> | undefined, (value: SetStateAction<Serializable<T> | undefined>) => void, () => void]>;
57
- declare function useStorageState<T>(key: string, options: StorageStateOptionsWithDefaultValue<T>): SerializableGuard<readonly [Serializable<T>, (value: SetStateAction<Serializable<T>>) => void, () => void]>;
58
- declare function useStorageState<T>(key: string, options: StorageStateOptions<T>): SerializableGuard<readonly [Serializable<T> | undefined, (value: SetStateAction<Serializable<T> | undefined>) => void, () => void]>;
59
- declare function useStorageState<T>(key: string, options: StorageStateOptionsWithSerializer<T>): SerializableGuard<readonly [Serializable<T> | undefined, (value: SetStateAction<Serializable<T> | undefined>) => void, () => void]>;
60
-
61
- export { type Serializable, useStorageState };
2
+ import { Serializable, useStorageState } from "./useStorageState.cjs";
3
+ export { useStorageState };
@@ -0,0 +1,3 @@
1
+
2
+ import { Serializable, useStorageState } from "./useStorageState.mjs";
3
+ export { useStorageState };
@@ -0,0 +1,85 @@
1
+ "use client";
2
+ //#region src/hooks/useStorageState/storage.ts
3
+ var MemoStorage = class {
4
+ storage = /* @__PURE__ */ new Map();
5
+ get(key) {
6
+ return this.storage.get(key) ?? null;
7
+ }
8
+ set(key, value) {
9
+ this.storage.set(key, value);
10
+ }
11
+ remove(key) {
12
+ this.storage.delete(key);
13
+ }
14
+ clear() {
15
+ this.storage.clear();
16
+ }
17
+ };
18
+ var LocalStorage = class {
19
+ static canUse() {
20
+ const TEST_KEY = generateTestKey();
21
+ try {
22
+ localStorage.setItem(TEST_KEY, "test");
23
+ localStorage.removeItem(TEST_KEY);
24
+ return true;
25
+ } catch {
26
+ return false;
27
+ }
28
+ }
29
+ get(key) {
30
+ return localStorage.getItem(key);
31
+ }
32
+ set(key, value) {
33
+ localStorage.setItem(key, value);
34
+ }
35
+ remove(key) {
36
+ localStorage.removeItem(key);
37
+ }
38
+ clear() {
39
+ localStorage.clear();
40
+ }
41
+ };
42
+ var SessionStorage = class {
43
+ static canUse() {
44
+ const TEST_KEY = generateTestKey();
45
+ try {
46
+ sessionStorage.setItem(TEST_KEY, "test");
47
+ sessionStorage.removeItem(TEST_KEY);
48
+ return true;
49
+ } catch {
50
+ return false;
51
+ }
52
+ }
53
+ get(key) {
54
+ return sessionStorage.getItem(key);
55
+ }
56
+ set(key, value) {
57
+ sessionStorage.setItem(key, value);
58
+ }
59
+ remove(key) {
60
+ sessionStorage.removeItem(key);
61
+ }
62
+ clear() {
63
+ sessionStorage.clear();
64
+ }
65
+ };
66
+ function generateTestKey() {
67
+ return new Array(4).fill(null).map(() => Math.random().toString(36).slice(2)).join("");
68
+ }
69
+ function generateStorage() {
70
+ if (LocalStorage.canUse()) return new LocalStorage();
71
+ return new MemoStorage();
72
+ }
73
+ function generateSessionStorage() {
74
+ if (SessionStorage.canUse()) return new SessionStorage();
75
+ return new MemoStorage();
76
+ }
77
+ const safeLocalStorage = generateStorage();
78
+ generateSessionStorage();
79
+ //#endregion
80
+ exports.LocalStorage = LocalStorage;
81
+ exports.MemoStorage = MemoStorage;
82
+ exports.SessionStorage = SessionStorage;
83
+ exports.generateSessionStorage = generateSessionStorage;
84
+ exports.generateStorage = generateStorage;
85
+ exports.safeLocalStorage = safeLocalStorage;
@@ -0,0 +1,10 @@
1
+
2
+ //#region src/hooks/useStorageState/storage.d.ts
3
+ type Storage = {
4
+ get(key: string): string | null;
5
+ set(key: string, value: string): void;
6
+ remove(key: string): void;
7
+ clear(): void;
8
+ };
9
+ //#endregion
10
+ export { Storage };
@@ -0,0 +1,10 @@
1
+
2
+ //#region src/hooks/useStorageState/storage.d.ts
3
+ type Storage = {
4
+ get(key: string): string | null;
5
+ set(key: string, value: string): void;
6
+ remove(key: string): void;
7
+ clear(): void;
8
+ };
9
+ //#endregion
10
+ export { Storage };
@@ -0,0 +1,80 @@
1
+ "use client";
2
+ //#region src/hooks/useStorageState/storage.ts
3
+ var MemoStorage = class {
4
+ storage = /* @__PURE__ */ new Map();
5
+ get(key) {
6
+ return this.storage.get(key) ?? null;
7
+ }
8
+ set(key, value) {
9
+ this.storage.set(key, value);
10
+ }
11
+ remove(key) {
12
+ this.storage.delete(key);
13
+ }
14
+ clear() {
15
+ this.storage.clear();
16
+ }
17
+ };
18
+ var LocalStorage = class {
19
+ static canUse() {
20
+ const TEST_KEY = generateTestKey();
21
+ try {
22
+ localStorage.setItem(TEST_KEY, "test");
23
+ localStorage.removeItem(TEST_KEY);
24
+ return true;
25
+ } catch {
26
+ return false;
27
+ }
28
+ }
29
+ get(key) {
30
+ return localStorage.getItem(key);
31
+ }
32
+ set(key, value) {
33
+ localStorage.setItem(key, value);
34
+ }
35
+ remove(key) {
36
+ localStorage.removeItem(key);
37
+ }
38
+ clear() {
39
+ localStorage.clear();
40
+ }
41
+ };
42
+ var SessionStorage = class {
43
+ static canUse() {
44
+ const TEST_KEY = generateTestKey();
45
+ try {
46
+ sessionStorage.setItem(TEST_KEY, "test");
47
+ sessionStorage.removeItem(TEST_KEY);
48
+ return true;
49
+ } catch {
50
+ return false;
51
+ }
52
+ }
53
+ get(key) {
54
+ return sessionStorage.getItem(key);
55
+ }
56
+ set(key, value) {
57
+ sessionStorage.setItem(key, value);
58
+ }
59
+ remove(key) {
60
+ sessionStorage.removeItem(key);
61
+ }
62
+ clear() {
63
+ sessionStorage.clear();
64
+ }
65
+ };
66
+ function generateTestKey() {
67
+ return new Array(4).fill(null).map(() => Math.random().toString(36).slice(2)).join("");
68
+ }
69
+ function generateStorage() {
70
+ if (LocalStorage.canUse()) return new LocalStorage();
71
+ return new MemoStorage();
72
+ }
73
+ function generateSessionStorage() {
74
+ if (SessionStorage.canUse()) return new SessionStorage();
75
+ return new MemoStorage();
76
+ }
77
+ const safeLocalStorage = generateStorage();
78
+ generateSessionStorage();
79
+ //#endregion
80
+ export { LocalStorage, MemoStorage, SessionStorage, generateSessionStorage, generateStorage, safeLocalStorage };
@@ -0,0 +1,81 @@
1
+ "use client";
2
+ const require_storage = require("./storage.cjs");
3
+ let react = require("react");
4
+ //#region src/hooks/useStorageState/useStorageState.ts
5
+ const listeners = /* @__PURE__ */ new Set();
6
+ const emitListeners = () => {
7
+ listeners.forEach((listener) => listener());
8
+ };
9
+ function isPlainObject(value) {
10
+ if (typeof value !== "object") return false;
11
+ if (!(Object.getPrototypeOf(value) === Object.prototype)) return false;
12
+ return Object.prototype.toString.call(value) === "[object Object]";
13
+ }
14
+ const ensureSerializable = (value) => {
15
+ if (value[0] != null && ![
16
+ "string",
17
+ "number",
18
+ "boolean"
19
+ ].includes(typeof value[0]) && !(isPlainObject(value[0]) || Array.isArray(value[0]))) throw new Error("Received a non-serializable value");
20
+ return value;
21
+ };
22
+ function useStorageState(key, { storage = require_storage.safeLocalStorage, defaultValue, ...options } = {}) {
23
+ const serializedDefaultValue = defaultValue;
24
+ const cache = (0, react.useRef)({
25
+ data: null,
26
+ parsed: serializedDefaultValue
27
+ });
28
+ const getSnapshot = (0, react.useCallback)(() => {
29
+ const deserializer = "deserializer" in options ? options.deserializer : JSON.parse;
30
+ const data = storage.get(key);
31
+ if (data !== cache.current.data) {
32
+ try {
33
+ cache.current.parsed = data != null ? deserializer(data) : defaultValue;
34
+ } catch {
35
+ cache.current.parsed = serializedDefaultValue;
36
+ }
37
+ cache.current.data = data;
38
+ }
39
+ return cache.current.parsed;
40
+ }, [
41
+ defaultValue,
42
+ key,
43
+ storage
44
+ ]);
45
+ const storageState = (0, react.useSyncExternalStore)((onStoreChange) => {
46
+ listeners.add(onStoreChange);
47
+ const handler = (event) => {
48
+ if (event.key === key) onStoreChange();
49
+ };
50
+ window.addEventListener("storage", handler);
51
+ return () => {
52
+ listeners.delete(onStoreChange);
53
+ window.removeEventListener("storage", handler);
54
+ };
55
+ }, () => getSnapshot(), () => serializedDefaultValue);
56
+ const setStorageState = (0, react.useCallback)((value) => {
57
+ const serializer = "serializer" in options ? options.serializer : JSON.stringify;
58
+ const nextValue = typeof value === "function" ? value(getSnapshot()) : value;
59
+ if (nextValue == null) storage.remove(key);
60
+ else storage.set(key, serializer(nextValue));
61
+ emitListeners();
62
+ }, [
63
+ getSnapshot,
64
+ key,
65
+ storage
66
+ ]);
67
+ const refreshStorageState = (0, react.useCallback)(() => {
68
+ setStorageState(getSnapshot());
69
+ }, [
70
+ storage,
71
+ getSnapshot,
72
+ setStorageState
73
+ ]);
74
+ return ensureSerializable([
75
+ storageState,
76
+ setStorageState,
77
+ refreshStorageState
78
+ ]);
79
+ }
80
+ //#endregion
81
+ exports.useStorageState = useStorageState;
@@ -1,24 +1,19 @@
1
- import { SetStateAction } from 'react';
2
-
3
- type Storage = {
4
- get(key: string): string | null;
5
- set(key: string, value: string): void;
6
- remove(key: string): void;
7
- clear(): void;
8
- };
9
1
 
2
+ import { Storage } from "./storage.cjs";
3
+ import { SetStateAction } from "react";
4
+ //#region src/hooks/useStorageState/useStorageState.d.ts
10
5
  type ToObject<T> = T extends unknown[] | Record<string, unknown> ? T : never;
11
6
  type Serializable<T> = T extends string | number | boolean ? T : ToObject<T>;
12
7
  type StorageStateOptions<T> = {
13
- storage?: Storage;
14
- defaultValue?: T;
8
+ storage?: Storage;
9
+ defaultValue?: T;
15
10
  };
16
11
  type StorageStateOptionsWithDefaultValue<T> = StorageStateOptions<T> & {
17
- defaultValue: T;
12
+ defaultValue: T;
18
13
  };
19
14
  type StorageStateOptionsWithSerializer<T> = StorageStateOptions<T> & {
20
- serializer: (value: Serializable<T>) => string;
21
- deserializer: (value: string) => Serializable<T>;
15
+ serializer: (value: Serializable<T>) => string;
16
+ deserializer: (value: string) => Serializable<T>;
22
17
  };
23
18
  type SerializableGuard<T extends readonly any[]> = T[0] extends any ? T : T[0] extends never ? 'Received a non-serializable value' : T;
24
19
  /**
@@ -57,5 +52,5 @@ declare function useStorageState<T>(key: string): SerializableGuard<readonly [Se
57
52
  declare function useStorageState<T>(key: string, options: StorageStateOptionsWithDefaultValue<T>): SerializableGuard<readonly [Serializable<T>, (value: SetStateAction<Serializable<T>>) => void, () => void]>;
58
53
  declare function useStorageState<T>(key: string, options: StorageStateOptions<T>): SerializableGuard<readonly [Serializable<T> | undefined, (value: SetStateAction<Serializable<T> | undefined>) => void, () => void]>;
59
54
  declare function useStorageState<T>(key: string, options: StorageStateOptionsWithSerializer<T>): SerializableGuard<readonly [Serializable<T> | undefined, (value: SetStateAction<Serializable<T> | undefined>) => void, () => void]>;
60
-
61
- export { type Serializable, useStorageState };
55
+ //#endregion
56
+ export { Serializable, useStorageState };
@@ -0,0 +1,56 @@
1
+
2
+ import { Storage } from "./storage.mjs";
3
+ import { SetStateAction } from "react";
4
+ //#region src/hooks/useStorageState/useStorageState.d.ts
5
+ type ToObject<T> = T extends unknown[] | Record<string, unknown> ? T : never;
6
+ type Serializable<T> = T extends string | number | boolean ? T : ToObject<T>;
7
+ type StorageStateOptions<T> = {
8
+ storage?: Storage;
9
+ defaultValue?: T;
10
+ };
11
+ type StorageStateOptionsWithDefaultValue<T> = StorageStateOptions<T> & {
12
+ defaultValue: T;
13
+ };
14
+ type StorageStateOptionsWithSerializer<T> = StorageStateOptions<T> & {
15
+ serializer: (value: Serializable<T>) => string;
16
+ deserializer: (value: string) => Serializable<T>;
17
+ };
18
+ type SerializableGuard<T extends readonly any[]> = T[0] extends any ? T : T[0] extends never ? 'Received a non-serializable value' : T;
19
+ /**
20
+ * @deprecated This hook is deprecated as it depends on browser-specific APIs (localStorage/sessionStorage).
21
+ * react-simplikit is now focused on platform-independent, pure state/logic hooks.
22
+ * This hook will be removed in a future major version.
23
+ *
24
+ * @description
25
+ * `useStorageState` is a React that functions like `useState` but persists the state value in browser storage.
26
+ * The value is retained across page reloads and can be shared between tabs when using `localStorage`.
27
+ *
28
+ * @param {string} key - The key used to store the value in storage.
29
+ * @param {Object} [options] - Configuration options for storage behavior.
30
+ * @param {Storage} [options.storage=localStorage] - The storage type (`localStorage` or `sessionStorage`). Defaults to `localStorage`.
31
+ * @param {T} [options.defaultValue] - The initial value if no existing value is found.
32
+ * @param {Function} [options.serializer] - A function to serialize the state value to a string.
33
+ * @param {Function} [options.deserializer] - A function to deserialize the state value from a string.
34
+ *
35
+ * @returns {readonly [state: Serializable<T> | undefined, setState: (value: SetStateAction<Serializable<T> | undefined>) => void, refreshState: () => void]} A tuple:
36
+ * - state `Serializable<T> | undefined` - The current state value retrieved from storage;
37
+ * - setState `(value: SetStateAction<Serializable<T> | undefined>) => void` - A function to update and persist the state;
38
+ * - refreshState `() => void` - A function to refresh the state from storage;
39
+ * @example
40
+ * // Counter with persistent state
41
+ * import { useStorageState } from 'react-simplikit';
42
+ *
43
+ * function Counter() {
44
+ * const [count, setCount] = useStorageState<number>('counter', {
45
+ * defaultValue: 0,
46
+ * });
47
+ *
48
+ * return <button onClick={() => setCount(prev => prev + 1)}>Count: {count}</button>;
49
+ * }
50
+ */
51
+ declare function useStorageState<T>(key: string): SerializableGuard<readonly [Serializable<T> | undefined, (value: SetStateAction<Serializable<T> | undefined>) => void, () => void]>;
52
+ declare function useStorageState<T>(key: string, options: StorageStateOptionsWithDefaultValue<T>): SerializableGuard<readonly [Serializable<T>, (value: SetStateAction<Serializable<T>>) => void, () => void]>;
53
+ declare function useStorageState<T>(key: string, options: StorageStateOptions<T>): SerializableGuard<readonly [Serializable<T> | undefined, (value: SetStateAction<Serializable<T> | undefined>) => void, () => void]>;
54
+ declare function useStorageState<T>(key: string, options: StorageStateOptionsWithSerializer<T>): SerializableGuard<readonly [Serializable<T> | undefined, (value: SetStateAction<Serializable<T> | undefined>) => void, () => void]>;
55
+ //#endregion
56
+ export { Serializable, useStorageState };
@@ -0,0 +1,81 @@
1
+ "use client";
2
+ import { safeLocalStorage } from "./storage.mjs";
3
+ import { useCallback, useRef, useSyncExternalStore } from "react";
4
+ //#region src/hooks/useStorageState/useStorageState.ts
5
+ const listeners = /* @__PURE__ */ new Set();
6
+ const emitListeners = () => {
7
+ listeners.forEach((listener) => listener());
8
+ };
9
+ function isPlainObject(value) {
10
+ if (typeof value !== "object") return false;
11
+ if (!(Object.getPrototypeOf(value) === Object.prototype)) return false;
12
+ return Object.prototype.toString.call(value) === "[object Object]";
13
+ }
14
+ const ensureSerializable = (value) => {
15
+ if (value[0] != null && ![
16
+ "string",
17
+ "number",
18
+ "boolean"
19
+ ].includes(typeof value[0]) && !(isPlainObject(value[0]) || Array.isArray(value[0]))) throw new Error("Received a non-serializable value");
20
+ return value;
21
+ };
22
+ function useStorageState(key, { storage = safeLocalStorage, defaultValue, ...options } = {}) {
23
+ const serializedDefaultValue = defaultValue;
24
+ const cache = useRef({
25
+ data: null,
26
+ parsed: serializedDefaultValue
27
+ });
28
+ const getSnapshot = useCallback(() => {
29
+ const deserializer = "deserializer" in options ? options.deserializer : JSON.parse;
30
+ const data = storage.get(key);
31
+ if (data !== cache.current.data) {
32
+ try {
33
+ cache.current.parsed = data != null ? deserializer(data) : defaultValue;
34
+ } catch {
35
+ cache.current.parsed = serializedDefaultValue;
36
+ }
37
+ cache.current.data = data;
38
+ }
39
+ return cache.current.parsed;
40
+ }, [
41
+ defaultValue,
42
+ key,
43
+ storage
44
+ ]);
45
+ const storageState = useSyncExternalStore((onStoreChange) => {
46
+ listeners.add(onStoreChange);
47
+ const handler = (event) => {
48
+ if (event.key === key) onStoreChange();
49
+ };
50
+ window.addEventListener("storage", handler);
51
+ return () => {
52
+ listeners.delete(onStoreChange);
53
+ window.removeEventListener("storage", handler);
54
+ };
55
+ }, () => getSnapshot(), () => serializedDefaultValue);
56
+ const setStorageState = useCallback((value) => {
57
+ const serializer = "serializer" in options ? options.serializer : JSON.stringify;
58
+ const nextValue = typeof value === "function" ? value(getSnapshot()) : value;
59
+ if (nextValue == null) storage.remove(key);
60
+ else storage.set(key, serializer(nextValue));
61
+ emitListeners();
62
+ }, [
63
+ getSnapshot,
64
+ key,
65
+ storage
66
+ ]);
67
+ const refreshStorageState = useCallback(() => {
68
+ setStorageState(getSnapshot());
69
+ }, [
70
+ storage,
71
+ getSnapshot,
72
+ setStorageState
73
+ ]);
74
+ return ensureSerializable([
75
+ storageState,
76
+ setStorageState,
77
+ refreshStorageState
78
+ ]);
79
+ }
80
+ //#endregion
81
+ export { useStorageState };
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ const require_debounce = require("../useDebounce/debounce.cjs");
3
+ //#region src/hooks/useThrottle/throttle.ts
4
+ function throttle(func, throttleMs, { edges = ["leading", "trailing"] } = {}) {
5
+ let pendingAt = null;
6
+ const debounced = require_debounce.debounce(func, throttleMs, { edges });
7
+ const throttled = function(...args) {
8
+ if (pendingAt == null) pendingAt = Date.now();
9
+ else if (Date.now() - pendingAt >= throttleMs) {
10
+ pendingAt = Date.now();
11
+ debounced.cancel();
12
+ }
13
+ debounced(...args);
14
+ };
15
+ throttled.cancel = debounced.cancel;
16
+ return throttled;
17
+ }
18
+ //#endregion
19
+ exports.throttle = throttle;