react-atom-trigger 1.0.10 → 1.0.16

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
@@ -1,6 +1,6 @@
1
1
  # react-atom-trigger
2
2
 
3
- Helps solve the problem of executing code when some element "scrolls into (or out of) view". A pretty simple "[react-waypoint](https://www.npmjs.com/package/react-waypoint)" alternative written in Typescript.
3
+ AtomTrigger helps solve the problem of executing code when some element "scrolls into (or out of) view". A pretty simple "[react-waypoint](https://www.npmjs.com/package/react-waypoint)" alternative written in Typescript.
4
4
 
5
5
  ## Basic features
6
6
 
@@ -10,7 +10,7 @@ Exposes `<AtomTrigger {...props} />` component, where `props` are:
10
10
  ```
11
11
  interface IAtomTriggerProps {
12
12
  scrollEvent: ScrollEvent;
13
- dimensions: Dimensions | null;
13
+ dimensions: Dimensions;
14
14
  behavior?: 'default' | 'enter' | 'leave';
15
15
  callback: () => unknown;
16
16
  getDebugInfo?: (data: DebugInfo) => void;
@@ -1,28 +1,4 @@
1
1
  import React from 'react';
2
- export type ScrollEvent = {
3
- scrollX: number;
4
- scrollY: number;
5
- };
6
- export type Dimensions = {
7
- width: number;
8
- height: number;
9
- };
10
- export type DebugInfo = {
11
- timesTriggered: {
12
- leftViewport: number;
13
- enteredViewport: number;
14
- };
15
- trigger: 'entered' | 'left';
16
- };
17
- export interface IAtomTriggerProps {
18
- scrollEvent: ScrollEvent;
19
- behavior?: 'default' | 'enter' | 'leave';
20
- callback: () => unknown;
21
- getDebugInfo?: (data: DebugInfo) => void;
22
- triggerOnce?: boolean;
23
- className?: string;
24
- dimensions: Dimensions | null;
25
- offset?: [number, number, number, number];
26
- }
2
+ import { IAtomTriggerProps } from './AtomTrigger.types';
27
3
  declare const AtomTrigger: React.FC<IAtomTriggerProps>;
28
4
  export default AtomTrigger;
@@ -0,0 +1,25 @@
1
+ export type ScrollEvent = {
2
+ scrollX: number;
3
+ scrollY: number;
4
+ };
5
+ export type Dimensions = {
6
+ width: number;
7
+ height: number;
8
+ };
9
+ export type DebugInfo = {
10
+ timesTriggered: {
11
+ leftViewport: number;
12
+ enteredViewport: number;
13
+ };
14
+ trigger: 'entered' | 'left';
15
+ };
16
+ export interface IAtomTriggerProps {
17
+ scrollEvent: ScrollEvent;
18
+ behavior?: 'default' | 'enter' | 'leave';
19
+ callback: () => unknown;
20
+ getDebugInfo?: (data: DebugInfo) => void;
21
+ triggerOnce?: boolean;
22
+ className?: string;
23
+ dimensions: Dimensions;
24
+ offset?: [number, number, number, number];
25
+ }
package/lib/index.es.js CHANGED
@@ -1 +1 @@
1
- import e from"react";const t=({scrollEvent:t,callback:r,getDebugInfo:n,triggerOnce:o=!1,className:s,behavior:i="default",dimensions:c,offset:u=[0,0,0,0]})=>{const l=e.useRef(null),[f,a]=e.useState(),d=e.useRef(),[p,v]=e.useState({leftViewport:0,enteredViewport:0});return e.useLayoutEffect((()=>{if(l.current&&c){const e=l.current.getBoundingClientRect(),[t,r,n,o]=u;e.top>t&&e.bottom<c.height-n&&e.left>o&&e.right<c.width-r?a("inViewport"):e.top>c.height-n?a("bottom"):a("top")}}),[l,t,c,u]),e.useLayoutEffect((()=>{if(void 0===d.current&&void 0!==f&&(d.current=f),"inViewport"===f&&("bottom"===d.current||"top"===d.current)){if("enter"===i&&(!o||o&&p.enteredViewport)||"default"===i&&(!o||o&&(p.enteredViewport<1||p.leftViewport<1))){r&&r();const e={...p,enteredViewport:p.enteredViewport+1};n&&n({timesTriggered:e,trigger:"entered"}),v(e)}d.current=f}if(("top"===f||"bottom"===f)&&"inViewport"===d.current&&(d.current=f,"leave"===i&&(!o||o&&0===p.leftViewport)||"default"===i&&(!o||o&&(p.leftViewport<1||p.enteredViewport<1)))){r&&r();const e={...p,leftViewport:p.leftViewport+1};n&&n({timesTriggered:e,trigger:"left"}),v(e)}}),[f,r,o,i,n]),e.createElement("div",{ref:l,style:{display:"table"},className:s})};function r(e,t){"development"===process.env.NODE_ENV&&(t=t?`background: ${t}; color: #fff`:"background: #007700; color: #fff",console.group("%c log: "+e,t),console.groupEnd())}function n(){const{scrollX:e,scrollY:t}=window;return{scrollX:e,scrollY:t}}function o(){const{innerWidth:e,innerHeight:t}=window;return{width:e,height:t}}function s(t){const[r,n]=e.useState(null),s=e.useRef(null),i=e.useRef(!1),c=t?.eventListenerTimeoutMs||15;return e.useEffect((()=>{const e=o();function r(){s.current&&clearTimeout(s.current),s.current=setTimeout((()=>n(o())),c)}return n(e),window.addEventListener("resize",r,{passive:t?.passiveEventListener}),i.current=!0,()=>{i&&window.removeEventListener("resize",r)}}),[]),r}function i({containerRef:t,options:r}){const[o,s]=e.useState(n()),i=e.useRef(null),c=e.useRef(!1);return e.useEffect((()=>{const e=e=>{i.current&&clearTimeout(i.current),i.current=setTimeout((()=>{s({scrollX:e.target.scrollLeft,scrollY:e.target.scrollTop})}),r?.eventListenerTimeoutMs||15)},n=t?.current;return n&&(n&&!1===c.current&&n.addEventListener("scroll",e,{passive:r?.passiveEventListener}),c.current=!0),()=>{c&&n&&n.removeEventListener("scroll",e)}}),[t]),o}function c(t){const[r,o]=e.useState(n()),s=e.useRef(null),i=e.useRef(!1);return e.useEffect((()=>{const e=()=>{s.current&&clearTimeout(s.current),s.current=setTimeout((()=>{const{scrollX:e,scrollY:t}=n();o({scrollX:e,scrollY:t})}),t?.eventListenerTimeoutMs||20)};return window.addEventListener("scroll",e,{passive:t?.passiveEventListener}),i.current=!0,()=>{i&&window.removeEventListener("scroll",e)}}),[]),r}export{t as AtomTrigger,r as log,i as useContainerScroll,s as useWindowDimensions,c as useWindowScroll};
1
+ import e from"react";const t=({scrollEvent:t,callback:r,getDebugInfo:n,triggerOnce:o=!1,className:s,behavior:i="default",dimensions:c,offset:u=[0,0,0,0]})=>{const l=e.useRef(null),[f,d]=e.useState(void 0),a=e.useRef(void 0),[p,v]=e.useState({leftViewport:0,enteredViewport:0});return e.useLayoutEffect((()=>{if(l.current){const e=l.current.getBoundingClientRect(),[t,r,n,o]=u;e.top>t&&e.bottom<c.height-n&&e.left>o&&e.right<c.width-r?d("inViewport"):e.top>c.height-n?d("bottom"):d("top")}}),[l,t,c,u]),e.useLayoutEffect((()=>{if(void 0===a.current&&void 0!==f&&(a.current=f),"inViewport"===f&&("bottom"===a.current||"top"===a.current)){if("enter"===i&&(!o||o&&p.enteredViewport)||"default"===i&&(!o||o&&(p.enteredViewport<1||p.leftViewport<1))){r&&r();const e={...p,enteredViewport:p.enteredViewport+1};n&&n({timesTriggered:e,trigger:"entered"}),v(e)}a.current=f}if(("top"===f||"bottom"===f)&&"inViewport"===a.current&&(a.current=f,"leave"===i&&(!o||o&&0===p.leftViewport)||"default"===i&&(!o||o&&(p.leftViewport<1||p.enteredViewport<1)))){r&&r();const e={...p,leftViewport:p.leftViewport+1};n&&n({timesTriggered:e,trigger:"left"}),v(e)}}),[f,r,o,i,n]),e.createElement("div",{ref:l,style:{display:"table"},className:s})};function r(e,t){"development"===process.env.NODE_ENV&&(t=t?`background: ${t}; color: #fff`:"background: #007700; color: #fff",console.group("%c log: "+e,t),console.groupEnd())}function n(){const{scrollX:e,scrollY:t}=window;return{scrollX:e,scrollY:t}}function o(){const{innerWidth:e,innerHeight:t}=window;return{width:e,height:t}}function s(t){const[r,n]=e.useState(o()),s=e.useRef(null),i=e.useRef(!1),c=t?.eventListenerTimeoutMs||15;return e.useEffect((()=>{const e=o();function r(){s.current&&clearTimeout(s.current),s.current=setTimeout((()=>n(o())),c)}return n(e),window.addEventListener("resize",r,{passive:t?.passiveEventListener}),i.current=!0,()=>{i&&window.removeEventListener("resize",r)}}),[]),r}function i({containerRef:t,options:r}){const[o,s]=e.useState(n()),i=e.useRef(null),c=e.useRef(!1);return e.useEffect((()=>{const e=e=>{const t=e.target;i.current&&clearTimeout(i.current),i.current=setTimeout((()=>{s({scrollX:t.scrollLeft,scrollY:t.scrollTop})}),r?.eventListenerTimeoutMs||15)},n=t?.current;return n&&(n&&!1===c.current&&n.addEventListener("scroll",e,{passive:r?.passiveEventListener}),c.current=!0),()=>{c&&n&&n.removeEventListener("scroll",e)}}),[t]),o}function c(t){const[r,o]=e.useState(n()),s=e.useRef(null),i=e.useRef(!1);return e.useEffect((()=>{const e=()=>{s.current&&clearTimeout(s.current),s.current=setTimeout((()=>{const{scrollX:e,scrollY:t}=n();o({scrollX:e,scrollY:t})}),t?.eventListenerTimeoutMs||20)};return window.addEventListener("scroll",e,{passive:t?.passiveEventListener}),i.current=!0,()=>{i&&window.removeEventListener("scroll",e)}}),[]),r}export{t as AtomTrigger,r as log,i as useContainerScroll,s as useWindowDimensions,c as useWindowScroll};
package/lib/index.js CHANGED
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["react-atom-trigger"]={},e.React)}(this,(function(e,t){"use strict";function r(){const{scrollX:e,scrollY:t}=window;return{scrollX:e,scrollY:t}}function n(){const{innerWidth:e,innerHeight:t}=window;return{width:e,height:t}}e.AtomTrigger=({scrollEvent:e,callback:r,getDebugInfo:n,triggerOnce:o=!1,className:i,behavior:s="default",dimensions:c,offset:u=[0,0,0,0]})=>{const l=t.useRef(null),[f,d]=t.useState(),a=t.useRef(),[p,g]=t.useState({leftViewport:0,enteredViewport:0});return t.useLayoutEffect((()=>{if(l.current&&c){const e=l.current.getBoundingClientRect(),[t,r,n,o]=u;e.top>t&&e.bottom<c.height-n&&e.left>o&&e.right<c.width-r?d("inViewport"):e.top>c.height-n?d("bottom"):d("top")}}),[l,e,c,u]),t.useLayoutEffect((()=>{if(void 0===a.current&&void 0!==f&&(a.current=f),"inViewport"===f&&("bottom"===a.current||"top"===a.current)){if("enter"===s&&(!o||o&&p.enteredViewport)||"default"===s&&(!o||o&&(p.enteredViewport<1||p.leftViewport<1))){r&&r();const e={...p,enteredViewport:p.enteredViewport+1};n&&n({timesTriggered:e,trigger:"entered"}),g(e)}a.current=f}if(("top"===f||"bottom"===f)&&"inViewport"===a.current&&(a.current=f,"leave"===s&&(!o||o&&0===p.leftViewport)||"default"===s&&(!o||o&&(p.leftViewport<1||p.enteredViewport<1)))){r&&r();const e={...p,leftViewport:p.leftViewport+1};n&&n({timesTriggered:e,trigger:"left"}),g(e)}}),[f,r,o,s,n]),t.createElement("div",{ref:l,style:{display:"table"},className:i})},e.log=function(e,t){"development"===process.env.NODE_ENV&&(t=t?`background: ${t}; color: #fff`:"background: #007700; color: #fff",console.group("%c log: "+e,t),console.groupEnd())},e.useContainerScroll=function({containerRef:e,options:n}){const[o,i]=t.useState(r()),s=t.useRef(null),c=t.useRef(!1);return t.useEffect((()=>{const t=e=>{s.current&&clearTimeout(s.current),s.current=setTimeout((()=>{i({scrollX:e.target.scrollLeft,scrollY:e.target.scrollTop})}),n?.eventListenerTimeoutMs||15)},r=e?.current;return r&&(r&&!1===c.current&&r.addEventListener("scroll",t,{passive:n?.passiveEventListener}),c.current=!0),()=>{c&&r&&r.removeEventListener("scroll",t)}}),[e]),o},e.useWindowDimensions=function(e){const[r,o]=t.useState(null),i=t.useRef(null),s=t.useRef(!1),c=e?.eventListenerTimeoutMs||15;return t.useEffect((()=>{const t=n();function r(){i.current&&clearTimeout(i.current),i.current=setTimeout((()=>o(n())),c)}return o(t),window.addEventListener("resize",r,{passive:e?.passiveEventListener}),s.current=!0,()=>{s&&window.removeEventListener("resize",r)}}),[]),r},e.useWindowScroll=function(e){const[n,o]=t.useState(r()),i=t.useRef(null),s=t.useRef(!1);return t.useEffect((()=>{const t=()=>{i.current&&clearTimeout(i.current),i.current=setTimeout((()=>{const{scrollX:e,scrollY:t}=r();o({scrollX:e,scrollY:t})}),e?.eventListenerTimeoutMs||20)};return window.addEventListener("scroll",t,{passive:e?.passiveEventListener}),s.current=!0,()=>{s&&window.removeEventListener("scroll",t)}}),[]),n}}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["react-atom-trigger"]={},e.React)}(this,(function(e,t){"use strict";function r(){const{scrollX:e,scrollY:t}=window;return{scrollX:e,scrollY:t}}function n(){const{innerWidth:e,innerHeight:t}=window;return{width:e,height:t}}e.AtomTrigger=({scrollEvent:e,callback:r,getDebugInfo:n,triggerOnce:o=!1,className:i,behavior:s="default",dimensions:c,offset:u=[0,0,0,0]})=>{const l=t.useRef(null),[f,d]=t.useState(void 0),a=t.useRef(void 0),[p,g]=t.useState({leftViewport:0,enteredViewport:0});return t.useLayoutEffect((()=>{if(l.current){const e=l.current.getBoundingClientRect(),[t,r,n,o]=u;e.top>t&&e.bottom<c.height-n&&e.left>o&&e.right<c.width-r?d("inViewport"):e.top>c.height-n?d("bottom"):d("top")}}),[l,e,c,u]),t.useLayoutEffect((()=>{if(void 0===a.current&&void 0!==f&&(a.current=f),"inViewport"===f&&("bottom"===a.current||"top"===a.current)){if("enter"===s&&(!o||o&&p.enteredViewport)||"default"===s&&(!o||o&&(p.enteredViewport<1||p.leftViewport<1))){r&&r();const e={...p,enteredViewport:p.enteredViewport+1};n&&n({timesTriggered:e,trigger:"entered"}),g(e)}a.current=f}if(("top"===f||"bottom"===f)&&"inViewport"===a.current&&(a.current=f,"leave"===s&&(!o||o&&0===p.leftViewport)||"default"===s&&(!o||o&&(p.leftViewport<1||p.enteredViewport<1)))){r&&r();const e={...p,leftViewport:p.leftViewport+1};n&&n({timesTriggered:e,trigger:"left"}),g(e)}}),[f,r,o,s,n]),t.createElement("div",{ref:l,style:{display:"table"},className:i})},e.log=function(e,t){"development"===process.env.NODE_ENV&&(t=t?`background: ${t}; color: #fff`:"background: #007700; color: #fff",console.group("%c log: "+e,t),console.groupEnd())},e.useContainerScroll=function({containerRef:e,options:n}){const[o,i]=t.useState(r()),s=t.useRef(null),c=t.useRef(!1);return t.useEffect((()=>{const t=e=>{const t=e.target;s.current&&clearTimeout(s.current),s.current=setTimeout((()=>{i({scrollX:t.scrollLeft,scrollY:t.scrollTop})}),n?.eventListenerTimeoutMs||15)},r=e?.current;return r&&(r&&!1===c.current&&r.addEventListener("scroll",t,{passive:n?.passiveEventListener}),c.current=!0),()=>{c&&r&&r.removeEventListener("scroll",t)}}),[e]),o},e.useWindowDimensions=function(e){const[r,o]=t.useState(n()),i=t.useRef(null),s=t.useRef(!1),c=e?.eventListenerTimeoutMs||15;return t.useEffect((()=>{const t=n();function r(){i.current&&clearTimeout(i.current),i.current=setTimeout((()=>o(n())),c)}return o(t),window.addEventListener("resize",r,{passive:e?.passiveEventListener}),s.current=!0,()=>{s&&window.removeEventListener("resize",r)}}),[]),r},e.useWindowScroll=function(e){const[n,o]=t.useState(r()),i=t.useRef(null),s=t.useRef(!1);return t.useEffect((()=>{const t=()=>{i.current&&clearTimeout(i.current),i.current=setTimeout((()=>{const{scrollX:e,scrollY:t}=r();o({scrollX:e,scrollY:t})}),e?.eventListenerTimeoutMs||20)};return window.addEventListener("scroll",t,{passive:e?.passiveEventListener}),s.current=!0,()=>{s&&window.removeEventListener("scroll",t)}}),[]),n}}));
package/lib/utils.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import React from 'react';
2
- import { Dimensions, ScrollEvent } from './AtomTrigger';
2
+ import { Dimensions, ScrollEvent } from './AtomTrigger.types';
3
3
  export type Options = {
4
4
  passiveEventListener?: boolean;
5
5
  eventListenerTimeoutMs?: number;
6
6
  };
7
7
  export declare function log<T>(log: T, color?: string): void;
8
- export declare function useWindowDimensions(options?: Options | undefined): Dimensions | null;
8
+ export declare function useWindowDimensions(options?: Options | undefined): Dimensions;
9
9
  export declare function useContainerScroll({ containerRef, options, }: {
10
10
  containerRef?: React.RefObject<HTMLDivElement>;
11
11
  options?: Options;
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/index.es.js",
7
7
  "typings": "lib/index.d.ts",
8
- "version": "1.0.10",
8
+ "version": "1.0.16",
9
9
  "license": "MIT",
10
10
  "author": "innrVoice <innrvoice@icloud.com>",
11
11
  "repository": {
@@ -19,27 +19,27 @@
19
19
  "build": "rimraf lib && rollup -c rollup.config.js"
20
20
  },
21
21
  "peerDependencies": {
22
- "react": "^18.2.0"
22
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@rollup/plugin-commonjs": "^28.0.1",
26
- "@rollup/plugin-node-resolve": "^15.3.0",
27
- "@types/node": "^16.11.9",
28
- "@types/react": "17.0.1",
29
- "@typescript-eslint/eslint-plugin": "^5.4.0",
30
- "@typescript-eslint/parser": "^5.4.0",
31
- "eslint": "^7.7.0",
32
- "eslint-config-prettier": "^8.3.0",
25
+ "@rollup/plugin-commonjs": "^28.0.3",
26
+ "@rollup/plugin-node-resolve": "^16.0.1",
27
+ "@rollup/plugin-terser": "0.4.4",
28
+ "@types/node": "^20.6.3",
29
+ "@types/react": "^19.0.12",
30
+ "@typescript-eslint/eslint-plugin": "^8.20.0",
31
+ "@typescript-eslint/parser": "^8.20.0",
32
+ "eslint": "^9.18.0",
33
+ "eslint-config-prettier": "^10.0.1",
33
34
  "eslint-plugin-node": "^11.1.0",
34
- "eslint-plugin-prettier": "^4.0.0",
35
+ "eslint-plugin-prettier": "^5.2.1",
35
36
  "eslint-plugin-react": "^7.27.1",
36
- "eslint-plugin-react-hooks": "^4.3.0",
37
+ "eslint-plugin-react-hooks": "^5.1.0",
37
38
  "eslint-plugin-sort-imports-es6-autofix": "^0.6.0",
38
- "prettier": "^2.4.1",
39
- "rimraf": "^3.0.2",
40
- "rollup": "^4.24.0",
41
- "rollup-plugin-node-externals": "^7.1.3",
42
- "rollup-plugin-terser": "^7.0.2",
39
+ "prettier": "^3.4.2",
40
+ "rimraf": "^6.0.1",
41
+ "rollup": "^4.37.0",
42
+ "rollup-plugin-node-externals": "^8.0.0",
43
43
  "rollup-plugin-typescript2": "^0.36.0",
44
44
  "tslib": "^2.8.0",
45
45
  "typescript": "^5.6.3"
@@ -55,6 +55,6 @@
55
55
  "lib"
56
56
  ],
57
57
  "volta": {
58
- "node": "18.20.4"
58
+ "node": "20.18.1"
59
59
  }
60
60
  }