import { useState, useEffect } from 'react';
import { useSettingsStore, Settings } from '../store/settingsStore';
interface SettingsPanelProps {
open: boolean;
onClose: () => void;
}
export function SettingsPanel({ open, onClose }: SettingsPanelProps) {
const { settings, fetchSettings, updateSettings } = useSettingsStore();
const [workMins, setWorkMins] = useState(25);
const [shortBreakMins, setShortBreakMins] = useState(5);
const [longBreakMins, setLongBreakMins] = useState(15);
const [sessionsBeforeLong, setSessionsBeforeLong] = useState(4);
useEffect(() => {
if (open && !settings) {
fetchSettings();
}
}, [open, settings, fetchSettings]);
useEffect(() => {
if (settings) {
setWorkMins(Math.round(settings.work_duration_secs / 60));
setShortBreakMins(Math.round(settings.short_break_secs / 60));
setLongBreakMins(Math.round(settings.long_break_secs / 60));
setSessionsBeforeLong(settings.sessions_before_long_break);
}
}, [settings]);
if (!open) return null;
const handleSave = async () => {
const s: Settings = {
work_duration_secs: workMins * 60,
short_break_secs: shortBreakMins * 60,
long_break_secs: longBreakMins * 60,
sessions_before_long_break: sessionsBeforeLong,
};
await updateSettings(s);
onClose();
};
return (
{/* Modal card */}
e.stopPropagation()}
style={{
background: 'var(--ink-1)',
border: '1px solid var(--line-2)',
borderRadius: 'var(--r-3)',
boxShadow: 'var(--shadow-3)',
padding: '32px',
width: '360px',
display: 'flex',
flexDirection: 'column',
gap: '24px',
}}
>
Settings
);
}
interface NumberFieldProps {
label: string;
unit: string;
value: number;
min: number;
max: number;
onChange: (v: number) => void;
}
function NumberField({ label, unit, value, min, max, onChange }: NumberFieldProps) {
return (
onChange(Math.min(max, Math.max(min, parseInt(e.target.value) || min)))}
style={{
fontFamily: 'var(--font-mono)',
fontSize: '14px',
fontVariantNumeric: 'tabular-nums',
padding: '5px 8px',
borderRadius: 'var(--r-2)',
border: '1px solid var(--line-2)',
background: 'var(--ink-3)',
color: 'var(--fg-1)',
outline: 'none',
width: '56px',
textAlign: 'center',
}}
onFocus={(e) => {
(e.currentTarget as HTMLInputElement).style.boxShadow = 'var(--shadow-brass)';
}}
onBlur={(e) => {
(e.currentTarget as HTMLInputElement).style.boxShadow = 'none';
}}
/>
{unit}
);
}