Skip to content

Instantly share code, notes, and snippets.

@andrzejewsky
Created March 2, 2019 13:35
Show Gist options
  • Save andrzejewsky/ef97bd2657384ecc09f6141ab27fe339 to your computer and use it in GitHub Desktop.
Save andrzejewsky/ef97bd2657384ecc09f6141ab27fe339 to your computer and use it in GitHub Desktop.
Netflix Slider.js
import React, { useState } from 'react';
import cx from 'classnames';
import SliderContext from './context'
import Content from './Content'
import SlideButton from './SlideButton'
import SliderWrapper from './SliderWrapper'
import useSliding from './useSliding'
import useSizeElement from './useSizeElement'
import './Slider.scss'
const Slider = ({ children, activeSlide }) => {
const [currentSlide, setCurrentSlide] = useState(activeSlide);
const { width, elementRef } = useSizeElement();
const {
handlePrev,
handleNext,
slideProps,
containerRef,
hasNext,
hasPrev
} = useSliding(width, React.Children.count(children));
const handleSelect = movie => {
setCurrentSlide(movie);
};
const handleClose = () => {
setCurrentSlide(null);
};
const contextValue = {
onSelectSlide: handleSelect,
onCloseSlide: handleClose,
elementRef,
currentSlide,
};
return (
<SliderContext.Provider value={contextValue}>
<SliderWrapper>
<div
className={cx('slider', { 'slider--open': currentSlide != null })}
>
<div ref={containerRef} className="slider__container" {...slideProps}>{children}</div>
</div>
{hasPrev && <SlideButton onClick={handlePrev} type="prev" />}
{hasNext && <SlideButton onClick={handleNext} type="next" />}
</SliderWrapper>
{currentSlide && <Content movie={currentSlide} onClose={handleClose} />}
</SliderContext.Provider>
);
};
export default Slider;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment