|
10 | 10 | type SettingsValues, |
11 | 11 | formatDuration, |
12 | 12 | } from '$lib/settings' |
| 13 | + import type { DurationUnit } from '$lib/settings/types' |
13 | 14 | import SettingsSection from '../components/SettingsSection.svelte' |
14 | 15 | import Button from '$lib/ui/Button.svelte' |
15 | 16 | import { Switch } from '@ark-ui/svelte/switch' |
|
63 | 64 | setSetting(id, checked as SettingsValues[typeof id]) |
64 | 65 | } |
65 | 66 |
|
66 | | - function handleNumberChange(id: SettingId, details: NumberInputValueChangeDetails) { |
67 | | - setSetting(id, details.valueAsNumber as SettingsValues[typeof id]) |
| 67 | + const DURATION_UNIT_MS: Record<DurationUnit, number> = { |
| 68 | + ms: 1, |
| 69 | + s: 1000, |
| 70 | + min: 60_000, |
| 71 | + h: 3_600_000, |
| 72 | + d: 86_400_000, |
| 73 | + } |
| 74 | +
|
| 75 | + function unitFactor(unit: DurationUnit | undefined): number { |
| 76 | + return unit ? DURATION_UNIT_MS[unit] : 1 |
| 77 | + } |
| 78 | +
|
| 79 | + function handleNumberChange( |
| 80 | + id: SettingId, |
| 81 | + details: NumberInputValueChangeDetails, |
| 82 | + durationUnit?: DurationUnit, |
| 83 | + ) { |
| 84 | + const raw = details.valueAsNumber |
| 85 | + const value = durationUnit ? raw * unitFactor(durationUnit) : raw |
| 86 | + setSetting(id, value as SettingsValues[typeof id]) |
68 | 87 | } |
69 | 88 |
|
70 | 89 | function handleReset(id: SettingId) { |
|
138 | 157 | <Switch.HiddenInput /> |
139 | 158 | </Switch.Root> |
140 | 159 | {:else if setting.type === 'number' || setting.type === 'duration'} |
| 160 | + {@const durationUnit = |
| 161 | + setting.type === 'duration' ? setting.constraints?.unit : undefined} |
| 162 | + {@const factor = unitFactor(durationUnit)} |
| 163 | + {@const rawValue = Number(getSetting(id))} |
141 | 164 | <NumberInput.Root |
142 | | - value={String(getSetting(id))} |
| 165 | + value={String(durationUnit ? rawValue / factor : rawValue)} |
143 | 166 | onValueChange={(d) => { |
144 | | - handleNumberChange(id, d) |
| 167 | + handleNumberChange(id, d, durationUnit) |
145 | 168 | }} |
146 | | - min={setting.constraints?.min ?? setting.constraints?.minMs} |
147 | | - max={setting.constraints?.max ?? setting.constraints?.maxMs} |
| 169 | + min={setting.type === 'duration' |
| 170 | + ? (setting.constraints?.minMs ?? 0) / factor |
| 171 | + : setting.constraints?.min} |
| 172 | + max={setting.type === 'duration' |
| 173 | + ? (setting.constraints?.maxMs ?? Infinity) / factor |
| 174 | + : setting.constraints?.max} |
148 | 175 | step={setting.constraints?.step ?? 1} |
149 | 176 | > |
150 | 177 | <NumberInput.Control class="number-control"> |
|
0 commit comments