react-kanca 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,41 +11,56 @@ yarn add react-kanca
11
11
  ```
12
12
 
13
13
  ```bash
14
- npm install --save react-kanca
14
+ npm install react-kanca
15
+ ```
16
+
17
+ ```bash
18
+ pnpm i react-kanca
15
19
  ```
16
20
 
17
21
  ![React Kanca](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*nl2InXMi1tuDmnrv.png)
18
22
 
19
23
  ## Usage
20
24
 
25
+ Storybook Demo:
26
+ [![React Kanca Storybook](https://raw.githubusercontent.com/storybookjs/brand/37c5e9bde5c56b69a8c4312de7d60fb3a9d7de9d/icon/icon-storybook-default.svg)](https://react-kanca-storybook.vercel.app/)
27
+
21
28
  ```jsx
22
29
  import {
23
- useWindowSize,
24
- usePageVisible,
25
- useDebounce,
26
- usePrevious,
27
- useHover,
28
- useScrolling,
30
+ useBatteryInfo,
29
31
  useBeforeUnload,
30
- useThrottle,
31
- useLocalStorage,
32
- useEqualObject,
32
+ useClickOutside,
33
+ useColorScheme,
34
+ useConnection,
33
35
  useCookie,
36
+ useCopyToClipboard,
37
+ useDebounce,
38
+ useEqualObject,
39
+ useForceUpdate,
40
+ useFullScreen,
34
41
  useGeolocation,
42
+ useHover,
43
+ useIntersectionObserver,
44
+ useInterval,
35
45
  useIsFirstRender,
36
- useConnection,
37
- useBatteryInfo,
38
- useCopyToClipboard,
46
+ useLocalStorage,
39
47
  useMedia,
40
- useClickOutside,
41
- useColorScheme,
42
- useFullScreen,
43
- useSessionStorage,
44
- useScrollLock,
45
- usePreferredLanguage,
48
+ useMobileLandscape,
46
49
  useMousePageLeave,
50
+ useMultiStateValidator,
51
+ useOnlineStatus,
47
52
  usePageLeave,
48
- useForceUpdate
53
+ usePageVisible,
54
+ usePreferredLanguage,
55
+ usePrevious,
56
+ useScrolling,
57
+ useScrollLock,
58
+ useScrollToElement,
59
+ useSessionStorage,
60
+ useStateValidator,
61
+ useThrottle,
62
+ useWindowScroll,
63
+ useWindowSize,
49
64
  } from 'react-kanca'
50
65
 
51
66
  // import 'react-kanca/dist/index.css'
@@ -53,7 +68,6 @@ import {
53
68
  const App = () => {
54
69
  const { width, height } = useWindowSize()
55
70
  const isVisible = usePageVisible()
56
- const debounce = useDebounce('React Kanca', 5000)
57
71
 
58
72
  .
59
73
  .
package/dist/index.js CHANGED
@@ -42,19 +42,23 @@ var useWindowSize = function useWindowSize() {
42
42
  return size;
43
43
  };
44
44
 
45
- var useDebounce = function useDebounce(value, delay) {
46
- var _useState = react.useState(''),
47
- debounce = _useState[0],
48
- setDebounce = _useState[1];
49
- react.useEffect(function () {
45
+ var useDebounce = function useDebounce() {
46
+ var _useState = react.useState(null),
47
+ debouncedValue = _useState[0],
48
+ setDebouncedValue = _useState[1];
49
+ var debounce = function debounce(value, delay) {
50
50
  var handler = setTimeout(function () {
51
- setDebounce(value);
51
+ if (typeof value === 'function') {
52
+ value();
53
+ } else {
54
+ setDebouncedValue(value);
55
+ }
52
56
  }, delay);
53
57
  return function () {
54
58
  clearTimeout(handler);
55
59
  };
56
- }, [value, delay]);
57
- return debounce;
60
+ };
61
+ return [debouncedValue, debounce];
58
62
  };
59
63
 
60
64
  var usePrevious = function usePrevious(value) {
@@ -188,16 +192,16 @@ var useThrottle = function useThrottle(value, ms) {
188
192
  react.useEffect(function () {
189
193
  if (!timeout.current) {
190
194
  setState(value);
191
- var timeoutCallback = function timeoutCallback() {
195
+ var _timeoutCallback = function timeoutCallback() {
192
196
  if (hasNextValue.current) {
193
197
  hasNextValue.current = false;
194
198
  setState(nextValue.current);
195
- timeout.current = setTimeout(timeoutCallback, ms);
199
+ timeout.current = setTimeout(_timeoutCallback, ms);
196
200
  } else {
197
201
  timeout.current = undefined;
198
202
  }
199
203
  };
200
- timeout.current = setTimeout(timeoutCallback, ms);
204
+ timeout.current = setTimeout(_timeoutCallback, ms);
201
205
  } else {
202
206
  nextValue.current = value;
203
207
  hasNextValue.current = true;
@@ -264,7 +268,7 @@ var useLocalStorage = function useLocalStorage(key, initialValue, options) {
264
268
  return [state, set, remove];
265
269
  };
266
270
 
267
- var useEqualObject = function useEqualObject(obj1, obj2) {
271
+ var _useEqualObject = function useEqualObject(obj1, obj2) {
268
272
  if (obj1 === obj2) return true;
269
273
  if (typeof obj1 !== 'object' || typeof obj2 !== 'object' || obj1 === null || obj2 === null) return false;
270
274
  var keys1 = Object.keys(obj1);
@@ -272,7 +276,7 @@ var useEqualObject = function useEqualObject(obj1, obj2) {
272
276
  if (keys1.length !== keys2.length) return false;
273
277
  for (var _i = 0, _keys = keys1; _i < _keys.length; _i++) {
274
278
  var key = _keys[_i];
275
- if (!keys2.includes(key) || !useEqualObject(obj1[key], obj2[key])) return false;
279
+ if (!keys2.includes(key) || !_useEqualObject(obj1[key], obj2[key])) return false;
276
280
  }
277
281
  return true;
278
282
  };
@@ -295,18 +299,13 @@ var useCookie = function useCookie(cookieName) {
295
299
  };
296
300
 
297
301
  function _extends() {
298
- _extends = Object.assign ? Object.assign.bind() : function (target) {
299
- for (var i = 1; i < arguments.length; i++) {
300
- var source = arguments[i];
301
- for (var key in source) {
302
- if (Object.prototype.hasOwnProperty.call(source, key)) {
303
- target[key] = source[key];
304
- }
305
- }
302
+ return _extends = Object.assign ? Object.assign.bind() : function (n) {
303
+ for (var e = 1; e < arguments.length; e++) {
304
+ var t = arguments[e];
305
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
306
306
  }
307
- return target;
308
- };
309
- return _extends.apply(this, arguments);
307
+ return n;
308
+ }, _extends.apply(null, arguments);
310
309
  }
311
310
 
312
311
  var useGeolocation = function useGeolocation(options) {
@@ -417,11 +416,8 @@ var useBatteryInfo = function useBatteryInfo() {
417
416
  isCharging = _useState2[0],
418
417
  setIsCharging = _useState2[1];
419
418
  var _useState3 = react.useState(null),
420
- chargingTime = _useState3[0],
421
- setChargingTime = _useState3[1];
422
- var _useState4 = react.useState(null),
423
- dischargingTime = _useState4[0],
424
- setDischargingTime = _useState4[1];
419
+ dischargingTime = _useState3[0],
420
+ setDischargingTime = _useState3[1];
425
421
  react.useEffect(function () {
426
422
  var getBatteryInfo = function getBatteryInfo() {
427
423
  try {
@@ -430,7 +426,6 @@ var useBatteryInfo = function useBatteryInfo() {
430
426
  var updateBatteryInfo = function updateBatteryInfo() {
431
427
  setBatteryLevel(Math.round(battery.level * 100));
432
428
  setIsCharging(battery.charging);
433
- setChargingTime(battery.chargingTime);
434
429
  setDischargingTime(battery.dischargingTime);
435
430
  };
436
431
  updateBatteryInfo();
@@ -458,7 +453,6 @@ var useBatteryInfo = function useBatteryInfo() {
458
453
  return {
459
454
  batteryLevel: batteryLevel,
460
455
  isCharging: isCharging,
461
- chargingTime: chargingTime,
462
456
  dischargingTime: dischargingTime
463
457
  };
464
458
  };
@@ -656,6 +650,201 @@ var useForceUpdate = function useForceUpdate() {
656
650
  return update;
657
651
  };
658
652
 
653
+ var useInterval = function useInterval(callback, delay) {
654
+ var savedCallback = react.useRef(function () {});
655
+ react.useEffect(function () {
656
+ savedCallback.current = callback;
657
+ });
658
+ react.useEffect(function () {
659
+ if (delay !== null) {
660
+ var interval = setInterval(function () {
661
+ return savedCallback.current();
662
+ }, delay || 0);
663
+ return function () {
664
+ return clearInterval(interval);
665
+ };
666
+ }
667
+ return undefined;
668
+ }, [delay]);
669
+ };
670
+
671
+ var useIntersectionObserver = function useIntersectionObserver(targetRef, options) {
672
+ var _useState = react.useState(false),
673
+ isIntersecting = _useState[0],
674
+ setIsIntersecting = _useState[1];
675
+ react.useEffect(function () {
676
+ var observer = new IntersectionObserver(function (_ref) {
677
+ var entry = _ref[0];
678
+ setIsIntersecting(entry.isIntersecting);
679
+ }, options);
680
+ if (targetRef.current) {
681
+ observer.observe(targetRef.current);
682
+ }
683
+ return function () {
684
+ if (targetRef.current) {
685
+ observer.unobserve(targetRef.current);
686
+ }
687
+ };
688
+ }, [targetRef, options]);
689
+ return isIntersecting;
690
+ };
691
+
692
+ var useMobileLandscape = function useMobileLandscape() {
693
+ var _useState = react.useState(false),
694
+ isLandscape = _useState[0],
695
+ setIsLandscape = _useState[1];
696
+ var _useState2 = react.useState(false),
697
+ isMobile = _useState2[0],
698
+ setIsMobile = _useState2[1];
699
+ var _useState3 = react.useState(false),
700
+ isMobileLandscape = _useState3[0],
701
+ setIsMobileLandscape = _useState3[1];
702
+ var handleResize = function handleResize() {
703
+ var landscape = window.innerWidth > window.innerHeight;
704
+ var mobile = window.innerWidth <= 996;
705
+ setIsLandscape(landscape);
706
+ setIsMobile(mobile);
707
+ setIsMobileLandscape(landscape && mobile);
708
+ };
709
+ react.useEffect(function () {
710
+ handleResize();
711
+ window.addEventListener('resize', handleResize);
712
+ return function () {
713
+ window.removeEventListener('resize', handleResize);
714
+ };
715
+ }, []);
716
+ return {
717
+ isMobileLandscape: isMobileLandscape,
718
+ isLandscape: isLandscape,
719
+ isMobile: isMobile
720
+ };
721
+ };
722
+
723
+ var useOnlineStatus = function useOnlineStatus() {
724
+ var _useState = react.useState(navigator.onLine),
725
+ isOnline = _useState[0],
726
+ setIsOnline = _useState[1];
727
+ react.useEffect(function () {
728
+ var handleOnline = function handleOnline() {
729
+ return setIsOnline(true);
730
+ };
731
+ var handleOffline = function handleOffline() {
732
+ return setIsOnline(false);
733
+ };
734
+ window.addEventListener('online', handleOnline);
735
+ window.addEventListener('offline', handleOffline);
736
+ return function () {
737
+ window.removeEventListener('online', handleOnline);
738
+ window.removeEventListener('offline', handleOffline);
739
+ };
740
+ }, []);
741
+ return isOnline;
742
+ };
743
+
744
+ var useScrollToElement = function useScrollToElement() {
745
+ var scrollToElement = react.useCallback(function (selectorOrRef, options) {
746
+ if (options === void 0) {
747
+ options = {};
748
+ }
749
+ var element;
750
+ if (typeof selectorOrRef === 'string') {
751
+ element = document.querySelector(selectorOrRef);
752
+ } else if (selectorOrRef.current) {
753
+ element = selectorOrRef.current;
754
+ }
755
+ if (element) {
756
+ element.scrollIntoView(_extends({
757
+ behavior: 'smooth'
758
+ }, options));
759
+ }
760
+ }, []);
761
+ return scrollToElement;
762
+ };
763
+
764
+ var useStateValidator = function useStateValidator(state, validator, initialState) {
765
+ if (initialState === void 0) {
766
+ initialState = [undefined];
767
+ }
768
+ var validatorInner = react.useRef(validator);
769
+ var stateInner = react.useRef(state);
770
+ validatorInner.current = validator;
771
+ stateInner.current = state;
772
+ var _useState = react.useState(initialState),
773
+ validity = _useState[0],
774
+ setValidity = _useState[1];
775
+ var validate = react.useCallback(function () {
776
+ if (validatorInner.current.length >= 2) {
777
+ validatorInner.current(stateInner.current, setValidity);
778
+ } else {
779
+ setValidity(validatorInner.current(stateInner.current));
780
+ }
781
+ }, [setValidity]);
782
+ react.useEffect(function () {
783
+ validate();
784
+ }, [state]);
785
+ return [validity, validate];
786
+ };
787
+
788
+ var useMultiStateValidator = function useMultiStateValidator(states, validator, initialValidity) {
789
+ if (initialValidity === void 0) {
790
+ initialValidity = [undefined];
791
+ }
792
+ if (typeof states !== 'object') {
793
+ throw new Error("state'in bir nesne ya da dizi olması beklenirken -> " + typeof states);
794
+ }
795
+ var validatorInner = react.useRef(validator);
796
+ var statesInner = react.useRef(states);
797
+ validatorInner.current = validator;
798
+ statesInner.current = states;
799
+ var _useState = react.useState(initialValidity),
800
+ validity = _useState[0],
801
+ setValidity = _useState[1];
802
+ var validate = react.useCallback(function () {
803
+ if (validatorInner.current.length >= 2) {
804
+ validatorInner.current(statesInner.current, setValidity);
805
+ } else {
806
+ setValidity(validatorInner.current(statesInner.current));
807
+ }
808
+ }, [setValidity]);
809
+ react.useEffect(function () {
810
+ validate();
811
+ }, Object.values(states));
812
+ return [validity, validate];
813
+ };
814
+
815
+ var useWindowScroll = function useWindowScroll() {
816
+ var _useState = react.useState(function () {
817
+ return {
818
+ x: isBrowser ? window.pageXOffset : 0,
819
+ y: isBrowser ? window.pageYOffset : 0
820
+ };
821
+ }),
822
+ state = _useState[0],
823
+ setState = _useState[1];
824
+ react.useEffect(function () {
825
+ var handler = function handler() {
826
+ setState(function (state) {
827
+ var _window = window,
828
+ pageXOffset = _window.pageXOffset,
829
+ pageYOffset = _window.pageYOffset;
830
+ return state.x !== pageXOffset || state.y !== pageYOffset ? {
831
+ x: pageXOffset,
832
+ y: pageYOffset
833
+ } : state;
834
+ });
835
+ };
836
+ handler();
837
+ on(window, 'scroll', handler, {
838
+ capture: false,
839
+ passive: true
840
+ });
841
+ return function () {
842
+ off(window, 'scroll', handler);
843
+ };
844
+ }, []);
845
+ return state;
846
+ };
847
+
659
848
  exports.useBatteryInfo = useBatteryInfo;
660
849
  exports.useBeforeUnload = useBeforeUnload;
661
850
  exports.useClickOutside = useClickOutside;
@@ -664,22 +853,30 @@ exports.useConnection = useConnection;
664
853
  exports.useCookie = useCookie;
665
854
  exports.useCopyToClipboard = useCopyToClipboard;
666
855
  exports.useDebounce = useDebounce;
667
- exports.useEqualObject = useEqualObject;
856
+ exports.useEqualObject = _useEqualObject;
668
857
  exports.useForceUpdate = useForceUpdate;
669
858
  exports.useFullScreen = useFullScreen;
670
859
  exports.useGeolocation = useGeolocation;
671
860
  exports.useHover = useHover;
861
+ exports.useIntersectionObserver = useIntersectionObserver;
862
+ exports.useInterval = useInterval;
672
863
  exports.useIsFirstRender = useIsFirstRender;
673
864
  exports.useLocalStorage = useLocalStorage;
674
865
  exports.useMedia = useMedia;
866
+ exports.useMobileLandscape = useMobileLandscape;
675
867
  exports.useMousePageLeave = useMousePageLeave;
868
+ exports.useMultiStateValidator = useMultiStateValidator;
869
+ exports.useOnlineStatus = useOnlineStatus;
676
870
  exports.usePageLeave = usePageLeave;
677
871
  exports.usePageVisible = usePageVisible;
678
872
  exports.usePreferredLanguage = usePreferredLanguage;
679
873
  exports.usePrevious = usePrevious;
680
874
  exports.useScrollLock = useScrollLock;
875
+ exports.useScrollToElement = useScrollToElement;
681
876
  exports.useScrolling = useScrolling;
682
877
  exports.useSessionStorage = useSessionStorage;
878
+ exports.useStateValidator = useStateValidator;
683
879
  exports.useThrottle = useThrottle;
880
+ exports.useWindowScroll = useWindowScroll;
684
881
  exports.useWindowSize = useWindowSize;
685
882
  //# sourceMappingURL=index.js.map