'use client'; import * as React from 'react'; import { Timer } from 'lucide-react'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; interface ClockDurationPickerProps { duration: number; // Duration in minutes setDuration: (duration: number) => void; label?: string; isDark?: boolean; options?: number[]; // Optional custom duration options } export function ClockDurationPicker({ duration, setDuration, label, isDark = false, options = [15, 30, 45, 60, 75, 90, 105, 120] }: ClockDurationPickerProps) { const [isOpen, setIsOpen] = React.useState(false); const wrapperRef = React.useRef(null); // Close picker when clicking outside React.useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) { setIsOpen(false); } }; if (isOpen) { document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isOpen]); // Handle duration selection const handleDurationClick = (selectedDuration: number) => { setDuration(selectedDuration); setIsOpen(false); }; // Calculate position for clock numbers const getClockPosition = (index: number, total: number, radius: number = 130) => { const angle = (index * 360) / total - 90; // Start from top (-90 degrees) const radian = (angle * Math.PI) / 180; const x = Math.cos(radian) * radius; const y = Math.sin(radian) * radius; return { x, y }; }; // Format duration display const formatDuration = (minutes: number) => { if (minutes < 60) { return `${minutes}m`; } const hours = Math.floor(minutes / 60); const mins = minutes % 60; return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`; }; const displayDuration = duration ? formatDuration(duration) : 'Select duration'; return (
{label && ( )}
{isOpen && (
{/* Clock face */}
{/* Clock circle */}
{/* Center dot */}
{/* Duration options arranged in a circle */} {options.map((option, index) => { const { x, y } = getClockPosition(index, options.length, 130); const isSelected = duration === option; return ( ); })}
{/* Quick select buttons for common durations */}
{[30, 60, 90, 120].map((quickDuration) => ( ))}
)}
); }