@folklore/hooks 0.0.77 → 0.0.80

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 (3) hide show
  1. package/dist/cjs.js +103 -35
  2. package/dist/es.js +103 -36
  3. package/package.json +2 -2
package/dist/cjs.js CHANGED
@@ -1077,6 +1077,108 @@ function useNativeVideoPlayer(url, {
1077
1077
  };
1078
1078
  }
1079
1079
 
1080
+ const getWindowSize = () => ({
1081
+ width: typeof window !== 'undefined' ? window.innerWidth || 0 : 0,
1082
+ height: typeof window !== 'undefined' ? window.innerHeight || 0 : 0
1083
+ });
1084
+ let currentSize = getWindowSize();
1085
+ function useWindowSize({
1086
+ onChange = null
1087
+ } = {}) {
1088
+ const [size, setSize] = react.useState(currentSize);
1089
+ const sizeRef = react.useRef(size);
1090
+ const updateSize = react.useCallback(() => {
1091
+ const newSize = getWindowSize();
1092
+ if (currentSize.width !== newSize.width || currentSize.height !== newSize.height) {
1093
+ currentSize = newSize;
1094
+ }
1095
+ if (sizeRef.current.width !== newSize.width || sizeRef.current.height !== newSize.height) {
1096
+ sizeRef.current = newSize;
1097
+ setSize(newSize);
1098
+ return newSize;
1099
+ }
1100
+ return null;
1101
+ }, [setSize]);
1102
+ const onResize = react.useCallback(() => {
1103
+ const newSize = updateSize();
1104
+ if (newSize !== null && onChange !== null) {
1105
+ onChange(newSize);
1106
+ }
1107
+ }, [onChange, updateSize]);
1108
+ useWindowEvent('resize', onResize);
1109
+ react.useEffect(() => {
1110
+ onResize();
1111
+ }, []);
1112
+ return size;
1113
+ }
1114
+
1115
+ function useScrollTrigger({
1116
+ disabled = false,
1117
+ triggers = [0.1, 0.25, 0.5, 0.75, 0.9, 1.0],
1118
+ useElementScroll = false,
1119
+ onTrigger = null
1120
+ } = {}) {
1121
+ const triggersCompletedRef = react.useRef([]);
1122
+ const {
1123
+ height
1124
+ } = useWindowSize();
1125
+ const {
1126
+ ref,
1127
+ entry: {
1128
+ contentRect = null
1129
+ }
1130
+ } = useResizeObserver({
1131
+ disabled: !useElementScroll
1132
+ });
1133
+ const {
1134
+ top: elementTop = 0,
1135
+ height: elementHeight = null
1136
+ } = contentRect || {};
1137
+ const elementScrollHeight = elementHeight !== null ? elementHeight + elementTop : 0;
1138
+ react.useEffect(() => {
1139
+ if (eventsManager === null || disabled) {
1140
+ return () => {};
1141
+ }
1142
+ function onScroll() {
1143
+ const scrollY = useElementScroll ? ref.current.scrollTop : window.scrollY;
1144
+ let scrollHeight = 0;
1145
+ if (useElementScroll) {
1146
+ scrollHeight = ref.current.scrollHeight - ref.current.clientHeight;
1147
+ } else if (ref.current !== null && elementScrollHeight > 0) {
1148
+ scrollHeight = elementScrollHeight - height;
1149
+ } else {
1150
+ scrollHeight = document.documentElement.scrollHeight - height;
1151
+ }
1152
+ const progress = Math.min(Math.max(scrollY / scrollHeight, 0), 1);
1153
+ const newTriggersCompleted = triggers.filter(step => progress >= step && triggersCompletedRef.current.indexOf(step) === -1);
1154
+ newTriggersCompleted.forEach(step => {
1155
+ if (onTrigger != null) {
1156
+ onTrigger(step);
1157
+ }
1158
+ });
1159
+ if (newTriggersCompleted.length > 0) {
1160
+ triggersCompletedRef.current = [...triggersCompletedRef.current, ...newTriggersCompleted];
1161
+ }
1162
+ }
1163
+ if (useElementScroll) {
1164
+ ref.current.addEventListener('scroll', onScroll);
1165
+ } else {
1166
+ eventsManager.subscribe('scroll', onScroll);
1167
+ }
1168
+ onScroll();
1169
+ return () => {
1170
+ if (useElementScroll) {
1171
+ ref.current.removeEventListener('scroll', onScroll);
1172
+ } else {
1173
+ eventsManager.unsubscribe('scroll', onScroll);
1174
+ }
1175
+ };
1176
+ }, [triggers, disabled, onTrigger, height, elementScrollHeight, useElementScroll]);
1177
+ return {
1178
+ ref
1179
+ };
1180
+ }
1181
+
1080
1182
  const NO_PLAYER_ERROR$1 = new Error('No player');
1081
1183
  function useVimeoPlayer(id, {
1082
1184
  width = 0,
@@ -1695,41 +1797,6 @@ function useVideoPlayer(params) {
1695
1797
  return player;
1696
1798
  }
1697
1799
 
1698
- const getWindowSize = () => ({
1699
- width: typeof window !== 'undefined' ? window.innerWidth || 0 : 0,
1700
- height: typeof window !== 'undefined' ? window.innerHeight || 0 : 0
1701
- });
1702
- let currentSize = getWindowSize();
1703
- function useWindowSize({
1704
- onChange = null
1705
- } = {}) {
1706
- const [size, setSize] = react.useState(currentSize);
1707
- const sizeRef = react.useRef(size);
1708
- const updateSize = react.useCallback(() => {
1709
- const newSize = getWindowSize();
1710
- if (currentSize.width !== newSize.width || currentSize.height !== newSize.height) {
1711
- currentSize = newSize;
1712
- }
1713
- if (sizeRef.current.width !== newSize.width || sizeRef.current.height !== newSize.height) {
1714
- sizeRef.current = newSize;
1715
- setSize(newSize);
1716
- return newSize;
1717
- }
1718
- return null;
1719
- }, [setSize]);
1720
- const onResize = react.useCallback(() => {
1721
- const newSize = updateSize();
1722
- if (newSize !== null && onChange !== null) {
1723
- onChange(newSize);
1724
- }
1725
- }, [onChange, updateSize]);
1726
- useWindowEvent('resize', onResize);
1727
- react.useEffect(() => {
1728
- onResize();
1729
- }, []);
1730
- return size;
1731
- }
1732
-
1733
1800
  function useVisualViewport() {
1734
1801
  const {
1735
1802
  width: windowWidth,
@@ -1833,6 +1900,7 @@ exports.useNativeVideoPlayer = useNativeVideoPlayer;
1833
1900
  exports.useObserver = useObserver;
1834
1901
  exports.usePlayerCurrentTime = usePlayerCurrentTime;
1835
1902
  exports.useResizeObserver = useResizeObserver;
1903
+ exports.useScrollTrigger = useScrollTrigger;
1836
1904
  exports.useVideoPlayer = useVideoPlayer;
1837
1905
  exports.useVimeoPlayer = useVimeoPlayer;
1838
1906
  exports.useVisualViewport = useVisualViewport;
package/dist/es.js CHANGED
@@ -1075,6 +1075,108 @@ function useNativeVideoPlayer(url, {
1075
1075
  };
1076
1076
  }
1077
1077
 
1078
+ const getWindowSize = () => ({
1079
+ width: typeof window !== 'undefined' ? window.innerWidth || 0 : 0,
1080
+ height: typeof window !== 'undefined' ? window.innerHeight || 0 : 0
1081
+ });
1082
+ let currentSize = getWindowSize();
1083
+ function useWindowSize({
1084
+ onChange = null
1085
+ } = {}) {
1086
+ const [size, setSize] = useState(currentSize);
1087
+ const sizeRef = useRef(size);
1088
+ const updateSize = useCallback(() => {
1089
+ const newSize = getWindowSize();
1090
+ if (currentSize.width !== newSize.width || currentSize.height !== newSize.height) {
1091
+ currentSize = newSize;
1092
+ }
1093
+ if (sizeRef.current.width !== newSize.width || sizeRef.current.height !== newSize.height) {
1094
+ sizeRef.current = newSize;
1095
+ setSize(newSize);
1096
+ return newSize;
1097
+ }
1098
+ return null;
1099
+ }, [setSize]);
1100
+ const onResize = useCallback(() => {
1101
+ const newSize = updateSize();
1102
+ if (newSize !== null && onChange !== null) {
1103
+ onChange(newSize);
1104
+ }
1105
+ }, [onChange, updateSize]);
1106
+ useWindowEvent('resize', onResize);
1107
+ useEffect(() => {
1108
+ onResize();
1109
+ }, []);
1110
+ return size;
1111
+ }
1112
+
1113
+ function useScrollTrigger({
1114
+ disabled = false,
1115
+ triggers = [0.1, 0.25, 0.5, 0.75, 0.9, 1.0],
1116
+ useElementScroll = false,
1117
+ onTrigger = null
1118
+ } = {}) {
1119
+ const triggersCompletedRef = useRef([]);
1120
+ const {
1121
+ height
1122
+ } = useWindowSize();
1123
+ const {
1124
+ ref,
1125
+ entry: {
1126
+ contentRect = null
1127
+ }
1128
+ } = useResizeObserver({
1129
+ disabled: !useElementScroll
1130
+ });
1131
+ const {
1132
+ top: elementTop = 0,
1133
+ height: elementHeight = null
1134
+ } = contentRect || {};
1135
+ const elementScrollHeight = elementHeight !== null ? elementHeight + elementTop : 0;
1136
+ useEffect(() => {
1137
+ if (eventsManager === null || disabled) {
1138
+ return () => {};
1139
+ }
1140
+ function onScroll() {
1141
+ const scrollY = useElementScroll ? ref.current.scrollTop : window.scrollY;
1142
+ let scrollHeight = 0;
1143
+ if (useElementScroll) {
1144
+ scrollHeight = ref.current.scrollHeight - ref.current.clientHeight;
1145
+ } else if (ref.current !== null && elementScrollHeight > 0) {
1146
+ scrollHeight = elementScrollHeight - height;
1147
+ } else {
1148
+ scrollHeight = document.documentElement.scrollHeight - height;
1149
+ }
1150
+ const progress = Math.min(Math.max(scrollY / scrollHeight, 0), 1);
1151
+ const newTriggersCompleted = triggers.filter(step => progress >= step && triggersCompletedRef.current.indexOf(step) === -1);
1152
+ newTriggersCompleted.forEach(step => {
1153
+ if (onTrigger != null) {
1154
+ onTrigger(step);
1155
+ }
1156
+ });
1157
+ if (newTriggersCompleted.length > 0) {
1158
+ triggersCompletedRef.current = [...triggersCompletedRef.current, ...newTriggersCompleted];
1159
+ }
1160
+ }
1161
+ if (useElementScroll) {
1162
+ ref.current.addEventListener('scroll', onScroll);
1163
+ } else {
1164
+ eventsManager.subscribe('scroll', onScroll);
1165
+ }
1166
+ onScroll();
1167
+ return () => {
1168
+ if (useElementScroll) {
1169
+ ref.current.removeEventListener('scroll', onScroll);
1170
+ } else {
1171
+ eventsManager.unsubscribe('scroll', onScroll);
1172
+ }
1173
+ };
1174
+ }, [triggers, disabled, onTrigger, height, elementScrollHeight, useElementScroll]);
1175
+ return {
1176
+ ref
1177
+ };
1178
+ }
1179
+
1078
1180
  const NO_PLAYER_ERROR$1 = new Error('No player');
1079
1181
  function useVimeoPlayer(id, {
1080
1182
  width = 0,
@@ -1693,41 +1795,6 @@ function useVideoPlayer(params) {
1693
1795
  return player;
1694
1796
  }
1695
1797
 
1696
- const getWindowSize = () => ({
1697
- width: typeof window !== 'undefined' ? window.innerWidth || 0 : 0,
1698
- height: typeof window !== 'undefined' ? window.innerHeight || 0 : 0
1699
- });
1700
- let currentSize = getWindowSize();
1701
- function useWindowSize({
1702
- onChange = null
1703
- } = {}) {
1704
- const [size, setSize] = useState(currentSize);
1705
- const sizeRef = useRef(size);
1706
- const updateSize = useCallback(() => {
1707
- const newSize = getWindowSize();
1708
- if (currentSize.width !== newSize.width || currentSize.height !== newSize.height) {
1709
- currentSize = newSize;
1710
- }
1711
- if (sizeRef.current.width !== newSize.width || sizeRef.current.height !== newSize.height) {
1712
- sizeRef.current = newSize;
1713
- setSize(newSize);
1714
- return newSize;
1715
- }
1716
- return null;
1717
- }, [setSize]);
1718
- const onResize = useCallback(() => {
1719
- const newSize = updateSize();
1720
- if (newSize !== null && onChange !== null) {
1721
- onChange(newSize);
1722
- }
1723
- }, [onChange, updateSize]);
1724
- useWindowEvent('resize', onResize);
1725
- useEffect(() => {
1726
- onResize();
1727
- }, []);
1728
- return size;
1729
- }
1730
-
1731
1798
  function useVisualViewport() {
1732
1799
  const {
1733
1800
  width: windowWidth,
@@ -1818,4 +1885,4 @@ function useWindowScroll(opts = {}) {
1818
1885
  return scroll;
1819
1886
  }
1820
1887
 
1821
- export { eventsManager$1 as documentEventsManager, getObserver, useCounter, useDailymotionPlayer, useDocumentEvent, useIntersectionObserver, useIsVisible, useItemsPaginated, useKeyboard, useNativeVideoPlayer, useObserver, usePlayerCurrentTime, useResizeObserver, useVideoPlayer, useVimeoPlayer, useVisualViewport, useVisualViewport as useVisualViewportSize, useWindowEvent, useWindowScroll, useWindowSize, useYouTubePlayer, eventsManager as windowEventsManager };
1888
+ export { eventsManager$1 as documentEventsManager, getObserver, useCounter, useDailymotionPlayer, useDocumentEvent, useIntersectionObserver, useIsVisible, useItemsPaginated, useKeyboard, useNativeVideoPlayer, useObserver, usePlayerCurrentTime, useResizeObserver, useScrollTrigger, useVideoPlayer, useVimeoPlayer, useVisualViewport, useVisualViewport as useVisualViewportSize, useWindowEvent, useWindowScroll, useWindowSize, useYouTubePlayer, eventsManager as windowEventsManager };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@folklore/hooks",
3
- "version": "0.0.77",
3
+ "version": "0.0.80",
4
4
  "description": "React hooks",
5
5
  "keywords": [
6
6
  "javascript",
@@ -49,7 +49,7 @@
49
49
  "publishConfig": {
50
50
  "access": "public"
51
51
  },
52
- "gitHead": "ac2a28eb9ac66baf8b2203307806e752719e771c",
52
+ "gitHead": "6d9d9e7770eaabf06aff6864a4d33d0b6ad99eb2",
53
53
  "dependencies": {
54
54
  "@folklore/events": "^0.0.10",
55
55
  "@folklore/services": "^0.1.44",