react-emergence
Version:
React wrapper for detecting element visibility in the browser
66 lines (53 loc) • 1.77 kB
JavaScript
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import Emergence from 'emergence.js';
import cx from 'classnames';
export default class EmergeContainer extends Component {
constructor(props) {
super(props);
this.state = {
containerRef: void 0
};
if (props.useWindowAsContainer) {
Emergence.init(props.args);
}
this.setContainerRef = this.setContainerRef.bind(this);
}
setContainerRef(el) {
if (el && !this.state.containerRef) {
const { args } = this.props;
this.setState({ containerRef: el });
Emergence.init({ ...args, container: el, callback: (el, state) => console.log(el, state) });
}
}
render() {
const { useWindowAsContainer, children, className } = this.props;
if (useWindowAsContainer) { return children; }
return (
<div className={cx('emerge-container', className)} ref={this.setContainerRef}>
{children}
</div>
);
}
}
EmergeContainer.propTypes = {
className: PropTypes.string,
children: PropTypes.node.isRequired,
useWindowAsContainer: PropTypes.bool,
args: PropTypes.shape({
reset: PropTypes.bool,
handheld: PropTypes.bool,
throttle: PropTypes.number,
elemCushion: PropTypes.number,
offsetTop: PropTypes.number,
offsetRight: PropTypes.number,
offsetBottom: PropTypes.number,
offsetLeft: PropTypes.number,
callback: PropTypes.func
})
};
EmergeContainer.defaultProps = {
args: {},
useWindowAsContainer: false,
className: void 0
};