12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- import React, {
- useEffect, useState, useRef, useCallback,
- } from 'react';
- import { fromEvent } from 'rxjs';
- import {
- throttleTime,
- } from 'rxjs/operators';
- import {
- Container, Wrapper, Rail, Track,
- } from './styled';
- type Props = {
- color?: 'primary' | 'secondary';
- max?: number;
- min?: number;
- defaultValue?: number;
- disabled?: boolean;
- onChange?: (value: number) => void;
- };
- const Sliders: React.FunctionComponent<Props> = ({
- defaultValue = 0,
- onChange,
- }: Props) => {
- const sliderRef = useRef<HTMLDivElement>(null);
- const [valueState, setValueState] = useState(defaultValue);
- const [isActive, setActive] = useState(false);
- let subscription: any = null;
- const parseValueToPercent = (value: number): number => Math.floor(value * 100);
- const getFingerMoveValue = (event: MouseEvent | React.MouseEvent<HTMLElement>): void => {
- const { current: slider } = sliderRef;
- if (slider) {
- const { width, left } = slider.getBoundingClientRect();
- const value = (event.clientX - left) / width;
- let percent = parseValueToPercent(value);
- if (percent <= 0) {
- percent = 0;
- } else if (percent >= 100) {
- percent = 100;
- }
- setValueState(percent);
- if (onChange) onChange(percent);
- }
- };
- const handleTouchMove = useCallback((event: any) => {
- event.preventDefault();
- getFingerMoveValue(event);
- }, []);
- const handleTouchEnd = useCallback((event: MouseEvent) => {
- event.preventDefault();
- setActive(false);
- subscription.unsubscribe();
- }, []);
- const handleMouseDown = useCallback((event: React.MouseEvent<HTMLElement>) => {
- event.preventDefault();
- getFingerMoveValue(event);
- setActive(true);
- subscription = fromEvent(document.body, 'mousemove').pipe(throttleTime(35)).subscribe(handleTouchMove);
- document.body.addEventListener('mouseup', handleTouchEnd);
- }, []);
- useEffect(() => {
- setValueState(defaultValue);
- }, []);
- return (
- <Container>
- <Wrapper
- ref={sliderRef}
- onMouseDown={handleMouseDown}
- >
- <Rail track={valueState} />
- <Track
- track={valueState}
- isActive={isActive}
- />
- </Wrapper>
- </Container>
- );
- };
- export default Sliders;
|