import { FunctionComponent, useEffect, useState } from 'react' import tw from 'twin.macro' import styled from '@emotion/styled' import Slider from 'rc-slider' import 'rc-slider/assets/index.css' type StyledSliderProps = { enableTransition?: boolean disabled?: boolean } const StyledSlider = styled(Slider)` .rc-slider-rail { ${tw`bg-th-bkg-3 h-2.5 rounded-full`} } .rc-slider-track { ${tw`bg-th-primary h-2.5 rounded-full ring-1 ring-th-primary ring-inset`} ${({ enableTransition }) => enableTransition && tw`transition-all duration-500`} } .rc-slider-step { ${tw`hidden`} } .rc-slider-handle { ${tw`border-4 border-th-primary h-4 w-4`} background: #fff; box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1); margin-top: -3px; ${({ enableTransition }) => enableTransition && tw`transition-all duration-500`} ${({ disabled }) => disabled && tw`bg-th-fgd-3 border-th-fgd-4`} } ${({ disabled }) => disabled && 'background-color: transparent'} ` const StyledSliderButtonWrapper = styled.div` ${tw`absolute left-0 top-5 w-full`} ` type StyledSliderButtonProps = { disabled: boolean styleValue: number sliderValue: number } const StyledSliderButton = styled.button` ${tw`bg-none text-th-fgd-3 transition-all duration-300 hover:text-th-primary focus:outline-none`} font-size: 0.65rem; position: absolute; display: inline-block; vertical-align: middle; text-align: center; left: 0%; :nth-of-type(2) { left: 23%; transform: translateX(-23%); } :nth-of-type(3) { left: 50%; transform: translateX(-50%); } :nth-of-type(4) { left: 76%; transform: translateX(-76%); } :nth-of-type(5) { left: 100%; transform: translateX(-100%); } ${({ styleValue, sliderValue }) => styleValue < sliderValue && tw`opacity-40`} ${({ styleValue, sliderValue }) => styleValue === sliderValue && tw`text-th-primary`} ${({ disabled }) => disabled && tw`cursor-not-allowed text-th-fgd-4 hover:text-th-fgd-4`} ` type SliderProps = { onChange: (x) => void onAfterChange?: (x) => void step: number value: number disabled?: boolean max?: number maxButtonTransition?: boolean } const AmountSlider: FunctionComponent = ({ onChange, onAfterChange, step, value, disabled, max, maxButtonTransition, }) => { const [enableTransition, setEnableTransition] = useState(false) useEffect(() => { if (maxButtonTransition) { setEnableTransition(true) } }, [maxButtonTransition]) useEffect(() => { if (enableTransition) { const transitionTimer = setTimeout(() => { setEnableTransition(false) }, 500) return () => clearTimeout(transitionTimer) } }, [enableTransition]) const handleSliderButtonClick = (value) => { onChange(value) setEnableTransition(true) } return (
handleSliderButtonClick(0)} styleValue={0} sliderValue={value} > 0% handleSliderButtonClick(25)} styleValue={25} sliderValue={value} > 25% handleSliderButtonClick(50)} styleValue={50} sliderValue={value} > 50% handleSliderButtonClick(75)} styleValue={75} sliderValue={value} > 75% handleSliderButtonClick(100)} styleValue={100} sliderValue={value} > 100%
) } export default AmountSlider