You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.5 KiB
64 lines
1.5 KiB
import React from 'react'; |
|
import PropTypes from 'prop-types'; |
|
import { supportsPassiveEvents } from 'detect-passive-events'; |
|
import { scrollTop } from '../scroll'; |
|
|
|
const listenerOptions = supportsPassiveEvents ? { passive: true } : false; |
|
|
|
export default class Column extends React.PureComponent { |
|
|
|
static propTypes = { |
|
children: PropTypes.node, |
|
label: PropTypes.string, |
|
bindToDocument: PropTypes.bool, |
|
}; |
|
|
|
scrollTop () { |
|
const scrollable = this.props.bindToDocument ? document.scrollingElement : this.node.querySelector('.scrollable'); |
|
|
|
if (!scrollable) { |
|
return; |
|
} |
|
|
|
this._interruptScrollAnimation = scrollTop(scrollable); |
|
} |
|
|
|
handleWheel = () => { |
|
if (typeof this._interruptScrollAnimation !== 'function') { |
|
return; |
|
} |
|
|
|
this._interruptScrollAnimation(); |
|
}; |
|
|
|
setRef = c => { |
|
this.node = c; |
|
}; |
|
|
|
componentDidMount () { |
|
if (this.props.bindToDocument) { |
|
document.addEventListener('wheel', this.handleWheel, listenerOptions); |
|
} else { |
|
this.node.addEventListener('wheel', this.handleWheel, listenerOptions); |
|
} |
|
} |
|
|
|
componentWillUnmount () { |
|
if (this.props.bindToDocument) { |
|
document.removeEventListener('wheel', this.handleWheel, listenerOptions); |
|
} else { |
|
this.node.removeEventListener('wheel', this.handleWheel, listenerOptions); |
|
} |
|
} |
|
|
|
render () { |
|
const { label, children } = this.props; |
|
|
|
return ( |
|
<div role='region' aria-label={label} className='column' ref={this.setRef}> |
|
{children} |
|
</div> |
|
); |
|
} |
|
|
|
}
|
|
|