diff options
| author | Yuval Adam <_@yuv.al> | 2025-09-24 10:07:20 +0200 |
|---|---|---|
| committer | Yuval Adam <_@yuv.al> | 2025-09-24 10:07:20 +0200 |
| commit | c89f55bc7949e2741d29f76392ab3af8d49886ca (patch) | |
| tree | 4e217ab6f1da0f85ddcd2881ba547fed4a8399ba /src | |
| parent | bd921aa827d0edbf8ad8523cf570d8baba4c9076 (diff) | |
Remove rc-slider
Diffstat (limited to 'src')
| -rw-r--r-- | src/components/Geshem.tsx | 2 | ||||
| -rw-r--r-- | src/components/Slider.tsx | 99 | ||||
| -rw-r--r-- | src/config.ts | 2 |
3 files changed, 72 insertions, 31 deletions
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<React.SetStateAction<number>>; } -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<HTMLDivElement>(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 ( - <div id="slider"> - <RcSlider - min={0} - max={playback ? PLAYBACK_SLOTS : 9} - defaultValue={slider} - handleStyle={handleStyle} - railStyle={railStyle} - trackStyle={trackStyle} - onChange={(val) => setSlider(val as number)} - /> + <div id="slider" style={{ padding: '10px 0' }}> + <div + ref={sliderRef} + style={{ + position: 'relative', + height: '20px', + backgroundColor: '#3498db', + borderRadius: '10px', + cursor: 'pointer' + }} + onMouseDown={handleMouseDown} + > + <div + style={{ + position: 'absolute', + top: '-10px', + left: `calc(${percentage}% - 20px)`, + width: '40px', + height: '40px', + backgroundColor: '#fff', + borderRadius: '50%', + boxShadow: '.5px .5px 2px 1px rgba(0,0,0,.32)', + cursor: isDragging ? 'grabbing' : 'grab', + zIndex: 1 + }} + /> + </div> </div> ); }
\ No newline at end of file diff --git a/src/config.ts b/src/config.ts index 6d838be..615e6d4 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,6 +1,6 @@ const hostname = typeof window !== 'undefined' && window.location && window.location.hostname; -const PRODUCTION = hostname ? hostname.includes("geshem") : false; +const PRODUCTION = true; export const IMAGES_BASE_URL = PRODUCTION ? "https://imgs.geshem.space" : ""; |
