@konradkierus/react-custom-scroll
Version:
An easily designable, cross browser (!!), custom scroll with ReactJS Animations and scroll rate **exactly** like native scroll
153 lines (142 loc) • 5.16 kB
JavaScript
import React, {Component, Fragment} from 'react'
import {times, map} from 'lodash/fp'
import {demoText} from './demoText'
import CustomScroll from '../../dist/reactCustomScroll'
function getParameterByName(name) {
const url = window.location.href
name = name.replace(/[\[\]]/g, '\\$&')
const regex = new RegExp(`[?&]${ name }(=([^&#]*)|&|#|$)`)
const results = regex.exec(url)
if (!results) {
return null
}
if (!results[2]) {
return false
}
return decodeURIComponent(results[2].replace(/\+/g, ' '))
}
export class FirstComp extends Component {
static displayName = 'firstComp'
constructor() {
super()
this.state = {
dynamicContentCounter: 4
}
}
getText() {
return demoText.text
}
getDynamicContent() {
return times(index => `Content #${ index}`, this.state.dynamicContentCounter)
}
addContent = () => {
this.setState({
dynamicContentCounter: this.state.dynamicContentCounter + 1
})
}
removeContent = () => {
this.setState({
dynamicContentCounter: Math.max(this.state.dynamicContentCounter - 1, 4)
})
}
getExamplesToDisplay() {
const isFlex = getParameterByName('flex')
const isDynamic = getParameterByName('dynamic')
return {
flex: isFlex,
dynamic: isDynamic,
standard: !isFlex && !isDynamic
}
}
renderStandardExample() {
return (
<Fragment>
<div key="native-example" className="container native-scroll">
<label className="side-title">Native Scroll</label>
<div className="panel">
<div className="panel-header">
<label className="panel-title">This is boring</label>
</div>
<div className="panel-content-native panel-content">
<div className="content-fill">{this.getText()}</div>
</div>
</div>
</div>
<div key="cool-example" className="container custom-scroll-example">
<label className="side-title">Custom Scroll</label>
<div className="panel">
<div className="panel-header">
<label className="panel-title">Cool Scrollbar !</label>
</div>
<CustomScroll allowOuterScroll="{true}">
<div className="panel-content-custom panel-content">
<div className="content-fill">{this.getText()}</div>
</div>
</CustomScroll>
</div>
</div>
<div key="crazy-example" className="container custom-scroll-example">
<label className="side-title">Crazy Designer</label>
<div className="panel crazy-scroll">
<div className="panel-header">
<label className="panel-title">Who designed this ???</label>
</div>
<CustomScroll allowOuterScroll="{true}">
<div className="panel-content-custom panel-content">
<div className="content-fill">{this.getText()}</div>
</div>
</CustomScroll>
</div>
</div>
</Fragment>
)
}
render() {
const exampleTypes = this.getExamplesToDisplay()
return (
<div className="example-wrapper">
{exampleTypes.standard && this.renderStandardExample()}
{exampleTypes.flex && (
<div key="flex-example" className="container example-flex-wrapper">
<label className="side-title">With CSS Flex</label>
<div className="panel flex-scroll">
<div className="panel-header">
<label className="panel-title">Flexbox!!!</label>
</div>
<CustomScroll allowOuterScroll={true} flex="1">
<div className="panel-content-custom panel-content">
<div className="content-fill">{this.getText()}</div>
</div>
</CustomScroll>
</div>
</div>
)}
{exampleTypes.dynamic && (
<div key="dynamic-example" className="container example-dynamic-wrapper">
<label className="side-title">KeepAtBottom prop</label>
<div className="panel dynamic-scroll">
<div className="panel-header">
<label className="panel-title">DYNAMIC CONTENT!!!</label>
</div>
<CustomScroll allowOuterScroll={true} keepAtBottom={true}>
<div className="panel-content-custom panel-content">
<div className="content-fill">
{map(content => <div className="dynamic-content" key={content}>{content}</div>, this.getDynamicContent())}
</div>
</div>
</CustomScroll>
</div>
<button className="dynamic-content-button"
key="addContent"
onClick={this.addContent}>Add Content
</button>
<button className="dynamic-content-button"
key="removeContent"
onClick={this.removeContent}>Remove Content
</button>
</div>
)}
<div className="scroll-creator"/>
</div>)
}
}