@folklore/hooks 0.0.77 → 0.0.81

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 +132 -35
  2. package/dist/es.js +131 -36
  3. package/package.json +2 -2
package/dist/cjs.js CHANGED
@@ -1077,6 +1077,136 @@ 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
+
1182
+ function checkWebpSupport() {
1183
+ return new Promise(resolve => {
1184
+ const img = document.createElement('img');
1185
+ img.onload = () => {
1186
+ resolve(img.width > 0 && img.height > 0);
1187
+ };
1188
+ img.onerror = () => {
1189
+ resolve(false);
1190
+ };
1191
+ img.src = 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoCAAEAAQAcJaQAA3AA/v3AgAA=';
1192
+ });
1193
+ }
1194
+ function useSupportsWebp(defaultValue = true) {
1195
+ const [supportsWebp, setSupportsWebp] = react.useState(defaultValue);
1196
+ react.useEffect(() => {
1197
+ let canceled = false;
1198
+ checkWebpSupport().then(newSupport => {
1199
+ if (!canceled && newSupport !== supportsWebp) {
1200
+ setSupportsWebp(newSupport);
1201
+ }
1202
+ });
1203
+ return () => {
1204
+ canceled = true;
1205
+ };
1206
+ }, []);
1207
+ return supportsWebp;
1208
+ }
1209
+
1080
1210
  const NO_PLAYER_ERROR$1 = new Error('No player');
1081
1211
  function useVimeoPlayer(id, {
1082
1212
  width = 0,
@@ -1695,41 +1825,6 @@ function useVideoPlayer(params) {
1695
1825
  return player;
1696
1826
  }
1697
1827
 
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
1828
  function useVisualViewport() {
1734
1829
  const {
1735
1830
  width: windowWidth,
@@ -1833,6 +1928,8 @@ exports.useNativeVideoPlayer = useNativeVideoPlayer;
1833
1928
  exports.useObserver = useObserver;
1834
1929
  exports.usePlayerCurrentTime = usePlayerCurrentTime;
1835
1930
  exports.useResizeObserver = useResizeObserver;
1931
+ exports.useScrollTrigger = useScrollTrigger;
1932
+ exports.useSupportsWebp = useSupportsWebp;
1836
1933
  exports.useVideoPlayer = useVideoPlayer;
1837
1934
  exports.useVimeoPlayer = useVimeoPlayer;
1838
1935
  exports.useVisualViewport = useVisualViewport;
package/dist/es.js CHANGED
@@ -1075,6 +1075,136 @@ 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
+
1180
+ function checkWebpSupport() {
1181
+ return new Promise(resolve => {
1182
+ const img = document.createElement('img');
1183
+ img.onload = () => {
1184
+ resolve(img.width > 0 && img.height > 0);
1185
+ };
1186
+ img.onerror = () => {
1187
+ resolve(false);
1188
+ };
1189
+ img.src = 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoCAAEAAQAcJaQAA3AA/v3AgAA=';
1190
+ });
1191
+ }
1192
+ function useSupportsWebp(defaultValue = true) {
1193
+ const [supportsWebp, setSupportsWebp] = useState(defaultValue);
1194
+ useEffect(() => {
1195
+ let canceled = false;
1196
+ checkWebpSupport().then(newSupport => {
1197
+ if (!canceled && newSupport !== supportsWebp) {
1198
+ setSupportsWebp(newSupport);
1199
+ }
1200
+ });
1201
+ return () => {
1202
+ canceled = true;
1203
+ };
1204
+ }, []);
1205
+ return supportsWebp;
1206
+ }
1207
+
1078
1208
  const NO_PLAYER_ERROR$1 = new Error('No player');
1079
1209
  function useVimeoPlayer(id, {
1080
1210
  width = 0,
@@ -1693,41 +1823,6 @@ function useVideoPlayer(params) {
1693
1823
  return player;
1694
1824
  }
1695
1825
 
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
1826
  function useVisualViewport() {
1732
1827
  const {
1733
1828
  width: windowWidth,
@@ -1818,4 +1913,4 @@ function useWindowScroll(opts = {}) {
1818
1913
  return scroll;
1819
1914
  }
1820
1915
 
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 };
1916
+ export { eventsManager$1 as documentEventsManager, getObserver, useCounter, useDailymotionPlayer, useDocumentEvent, useIntersectionObserver, useIsVisible, useItemsPaginated, useKeyboard, useNativeVideoPlayer, useObserver, usePlayerCurrentTime, useResizeObserver, useScrollTrigger, useSupportsWebp, 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.81",
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": "82992826efc61cfa8c435412cb4f6388b2cb2c84",
53
53
  "dependencies": {
54
54
  "@folklore/events": "^0.0.10",
55
55
  "@folklore/services": "^0.1.44",