suranadira-resize
Version:
A library for resizing Suranadira components.
117 lines (101 loc) • 2.97 kB
JavaScript
/**
* Suranadira Resize
*
* Copyright 2019, Armands Strazds <armands@strazds.com>
*
*/
import React, { useState, useEffect } from "react";
import Debug, { info } from "suranadira-utils/debug";
let _styles = {};
// Suranadira Icon
const SuranadiraResize = args => {
// Define default properties
let defaults = {
name: "suranadiraResize1",
unit: 10,
styleHook: () => {},
onResize: () => {}
};
// Assign external properties
let properties = Object.assign(defaults, args);
// Define state hooks
const [dimensions, setDimensions] = useState({
height: window.innerHeight, // window.screen.height,
width: window.innerWidth // window.screen.width
});
const [styles, setStyles] = useState(properties.styles[0].styles);
// Add/remove windows resize event listener
useEffect(() => {
const debouncedHandleResize = debounce(function handleResize() {
setDimensions({
height: window.innerHeight,
width: window.innerWidth
});
}, 500);
window.addEventListener("resize", debouncedHandleResize);
return () => {
window.removeEventListener("resize", debouncedHandleResize);
};
}, []);
useEffect(() => {
let found = false;
for (let style of properties.styles) {
if (
dimensions.width > style.dimensions.minWidth &&
dimensions.width <= style.dimensions.maxWidth
) {
found = true;
_styles = style.styles;
setStyles(style.styles);
Debug(
info({
module: "SuranadiraResize.js",
func: "useEffect [dimensions]",
param: "dimensions.width",
value: `${style.dimensions.minWidth} > ${dimensions.width} <= ${style.dimensions.maxWidth}`
})
);
}
}
if (!found) {
setStyles(properties.styles[0].styles);
_styles = properties.styles[0].styles;
}
// Use style hook to dynamically change style properties
_styles = JSON.parse(properties.styleHook(_styles, dimensions));
setStyles(_styles);
properties.onResize(JSON.stringify(dimensions));
// eslint-disable-next-line
}, [dimensions]);
useEffect(() => {
document.body.style.display = "block";
}, [styles]);
return (
<div
className="SuranadiraResize"
style={{
position: "relative",
display: "inline-block"
// boxSizing: "border-box"
}}
>
{React.Children.map(args.children, child => {
return React.cloneElement(child, {
styles: styles[child.props.name],
key: child.props.name
});
})}
</div>
);
};
function debounce(fn, ms) {
let timer;
return _ => {
clearTimeout(timer);
timer = setTimeout(_ => {
timer = null;
fn.apply(this, arguments);
}, ms);
};
}
export default SuranadiraResize;