From 61953a761ac4ceb262bb9e757e9fbd6cc21457ef Mon Sep 17 00:00:00 2001 From: Richard Roberson Date: Sun, 23 Feb 2025 19:03:52 -0700 Subject: [PATCH] Change speed menu to slider --- src/components/player/SpeedControl.tsx | 87 ++++++++++++++------------ 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/src/components/player/SpeedControl.tsx b/src/components/player/SpeedControl.tsx index 23a4bb6..af9e2e6 100644 --- a/src/components/player/SpeedControl.tsx +++ b/src/components/player/SpeedControl.tsx @@ -1,55 +1,60 @@ 'use client'; -import { - Listbox, - ListboxButton, - ListboxOption, - ListboxOptions, -} from '@headlessui/react'; +import { Input, Popover, PopoverButton, PopoverPanel } from '@headlessui/react'; import { ChevronUpDownIcon } from '@/components/icons/Icons'; import { useConfig } from '@/contexts/ConfigContext'; - -const speedOptions = [ - { value: 0.5, label: '0.5x' }, - { value: 0.75, label: '0.75x' }, - { value: 1, label: '1x' }, - { value: 1.25, label: '1.25x' }, - { value: 1.5, label: '1.5x' }, - { value: 1.75, label: '1.75x' }, - { value: 2, label: '2x' }, - { value: 2.5, label: '2.5x' }, - { value: 3, label: '3x' }, -]; +import { useCallback, useEffect, useState } from 'react'; export const SpeedControl = ({ setSpeedAndRestart }: { setSpeedAndRestart: (speed: number) => void; }) => { const { voiceSpeed } = useConfig(); + const [localSpeed, setLocalSpeed] = useState(voiceSpeed); - // Use voiceSpeed as the source of truth - const currentSpeed = voiceSpeed; + // Sync local speed with global state + useEffect(() => { + setLocalSpeed(voiceSpeed); + }, [voiceSpeed]); + + // Handler for slider change (updates local state only) + const handleSpeedChange = useCallback((event: React.ChangeEvent) => { + setLocalSpeed(parseFloat(event.target.value)); + }, []); + + // Handler for slider release + const handleSpeedChangeComplete = useCallback(() => { + if (localSpeed !== voiceSpeed) { + setSpeedAndRestart(localSpeed); + } + }, [localSpeed, voiceSpeed, setSpeedAndRestart]); return ( -
- - - {currentSpeed}x - - - - {speedOptions.map((option) => ( - - `relative cursor-pointer select-none py-0.5 px-1.5 sm:py-2 sm:px-3 ${active ? 'bg-offbase' : ''} ${selected ? 'font-medium' : ''}` - } - > - {option.label} - - ))} - - -
+ + + {Number.isInteger(localSpeed) ? localSpeed.toString() : localSpeed.toFixed(1)}x + + + +
+
+ 0.5x + {Number.isInteger(localSpeed) ? localSpeed.toString() : localSpeed.toFixed(1)}x + 3x +
+ +
+
+
); } \ No newline at end of file