From c89f55bc7949e2741d29f76392ab3af8d49886ca Mon Sep 17 00:00:00 2001 From: Yuval Adam <_@yuv.al> Date: Wed, 24 Sep 2025 10:07:20 +0200 Subject: Remove rc-slider --- src/components/Geshem.tsx | 2 +- src/components/Slider.tsx | 99 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 71 insertions(+), 30 deletions(-) (limited to 'src/components') diff --git a/src/components/Geshem.tsx b/src/components/Geshem.tsx index acd2bc6..982d841 100644 --- a/src/components/Geshem.tsx +++ b/src/components/Geshem.tsx @@ -23,7 +23,7 @@ export function Geshem({ date }: GeshemProps) { const fetchImages = async () => fetch(`${IMAGES_BASE_URL}/imgs.json`) .then(res => res.json()) - .then(imgs => imgs["280"]) + .then(imgs => (imgs as any)["280"]) .then(setImages); const buildPlayback = async () => { diff --git a/src/components/Slider.tsx b/src/components/Slider.tsx index 2ee3fa1..bb1b84f 100644 --- a/src/components/Slider.tsx +++ b/src/components/Slider.tsx @@ -1,43 +1,84 @@ -import React from "react"; -import RcSlider from 'rc-slider'; +import React, { useCallback, useRef, useState } from "react"; import { PLAYBACK_SLOTS } from "../config"; -import "rc-slider/assets/index.css"; -interface GeshemSliderProps { +interface SliderProps { playback?: string; slider: number; setSlider: React.Dispatch>; } -export function Slider({ playback, slider, setSlider }: GeshemSliderProps) { - const handleStyle = { - height: 40, - width: 40, - border: 0, - marginTop: -10, - boxShadow: ".5px .5px 2px 1px rgba(0,0,0,.32)" - }; +export function Slider({ playback, slider, setSlider }: SliderProps) { + const sliderRef = useRef(null); + const [isDragging, setIsDragging] = useState(false); - const railStyle = { - height: 20, - backgroundColor: "#3498db" - }; + const max = playback ? PLAYBACK_SLOTS : 9; - const trackStyle = { - display: "none" - }; + const handleMouseDown = useCallback((e: React.MouseEvent) => { + setIsDragging(true); + updateSliderValue(e); + }, []); + + const updateSliderValue = useCallback((e: MouseEvent | React.MouseEvent) => { + if (!sliderRef.current) return; + + const rect = sliderRef.current.getBoundingClientRect(); + const percentage = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width)); + const value = Math.round(percentage * max); + setSlider(value); + }, [max, setSlider]); + + const handleMouseMove = useCallback((e: MouseEvent) => { + if (isDragging) { + updateSliderValue(e); + } + }, [isDragging, updateSliderValue]); + + const handleMouseUp = useCallback(() => { + setIsDragging(false); + }, []); + + React.useEffect(() => { + if (isDragging) { + document.addEventListener('mousemove', handleMouseMove); + document.addEventListener('mouseup', handleMouseUp); + + return () => { + document.removeEventListener('mousemove', handleMouseMove); + document.removeEventListener('mouseup', handleMouseUp); + }; + } + }, [isDragging, handleMouseMove, handleMouseUp]); + + const percentage = (slider / max) * 100; return ( -
- setSlider(val as number)} - /> +
+
+
+
); } \ No newline at end of file -- cgit v1.3.1