import { type ChangeEventHandler, useEffect, useRef } from 'react' import { TemperatureAddIcon } from 'lib/icons/TemperatureAdd.js' import { TemperatureSubtractIcon } from 'lib/icons/TemperatureSubtract.js' interface TemperatureControlProps { variant: 'heat' | 'cool' value: number onChange: (temperature: number) => void min?: number max?: number unit?: 'fahrenheit' | 'celsius' } export function TemperatureControl({ variant, value, onChange, min = 50, max = 90, unit = 'fahrenheit', }: TemperatureControlProps): JSX.Element { const increment = (): void => { onChange(Math.min(value + 1, max)) } const decrement = (): void => { onChange(Math.max(value - 1, min)) } return (
{ onChange(temperature) }} unit={unit} />
) } interface RangeSliderProps { variant: 'heat' | 'cool' value: number onChange: (temperature: number) => void min: number max: number unit: 'fahrenheit' | 'celsius' } function RangeSlider({ variant, value, onChange, min, max, unit, }: RangeSliderProps): JSX.Element { const wrapRef = useRef(null) useEffect(() => { if (wrapRef.current == null) return const wrap = wrapRef.current wrap.style.setProperty('--temperature-current', value.toString()) wrap.style.setProperty('--temperature-min', min.toString()) wrap.style.setProperty('--temperature-max', max.toString()) }, [value, min, max]) const handleRangeChange: ChangeEventHandler = ( event ): void => { onChange(Number(event.target.value)) } return (
{value} {unit === 'fahrenheit' ? t.degreeFahrenheit : t.degreeCelsius}
) } const t = { degreeFahrenheit: 'ºF', degreeCelsius: 'ºC', }