@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.
- package/dist/cjs.js +132 -35
- package/dist/es.js +131 -36
- 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.
|
|
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": "
|
|
52
|
+
"gitHead": "82992826efc61cfa8c435412cb4f6388b2cb2c84",
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@folklore/events": "^0.0.10",
|
|
55
55
|
"@folklore/services": "^0.1.44",
|