react-carousel-query
Version:
A infinite carousel component made with react that handles the pagination for you.
63 lines (56 loc) • 1.63 kB
JavaScript
/* eslint-env browser */
import { useEffect } from '@storybook/addons';
import { drawSelectedElement } from './box-model/visualizer';
import { init, rescale, destroy } from './box-model/canvas';
import { deepElementFromPoint } from './util';
let nodeAtPointerRef;
const pointer = {
x: 0,
y: 0
};
function findAndDrawElement(x, y) {
nodeAtPointerRef = deepElementFromPoint(x, y);
drawSelectedElement(nodeAtPointerRef);
}
export const withMeasure = (StoryFn, context) => {
const {
measureEnabled
} = context.globals;
useEffect(() => {
const onMouseMove = event => {
window.requestAnimationFrame(() => {
event.stopPropagation();
pointer.x = event.clientX;
pointer.y = event.clientY;
});
};
document.addEventListener('mousemove', onMouseMove);
return () => {
document.removeEventListener('mousemove', onMouseMove);
};
}, []);
useEffect(() => {
const onMouseOver = event => {
window.requestAnimationFrame(() => {
event.stopPropagation();
findAndDrawElement(event.clientX, event.clientY);
});
};
const onResize = () => {
window.requestAnimationFrame(() => {
rescale();
});
};
if (measureEnabled) {
document.addEventListener('mouseover', onMouseOver);
init();
window.addEventListener('resize', onResize); // Draw the element below the pointer when first enabled
findAndDrawElement(pointer.x, pointer.y);
}
return () => {
window.removeEventListener('resize', onResize);
destroy();
};
}, [measureEnabled]);
return StoryFn();
};