import classNames from 'classnames' import { type HTMLAttributes, type ReactNode, useState } from 'react' import { getErrorMessage } from 'lib/errors.js' import { AddIcon } from 'lib/icons/Add.js' import { EditIcon } from 'lib/icons/Edit.js' import { FanIcon } from 'lib/icons/Fan.js' import { ThermostatCoolIcon } from 'lib/icons/ThermostatCool.js' import { ThermostatHeatIcon } from 'lib/icons/ThermostatHeat.js' import { TrashIcon } from 'lib/icons/Trash.js' import type { ThermostatClimatePreset, ThermostatDevice, } from 'lib/seam/thermostats/thermostat-device.js' import { getTemperatureUnitSymbol } from 'lib/seam/thermostats/unit-conversion.js' import { useDeleteThermostatClimatePreset } from 'lib/seam/thermostats/use-delete-thermostat-climate-preset.js' import { Button } from 'lib/ui/Button.js' import { IconButton } from 'lib/ui/IconButton.js' import { ContentHeader } from 'lib/ui/layout/ContentHeader.js' import { Popover } from 'lib/ui/Popover/Popover.js' import { PopoverContentPrompt } from 'lib/ui/Popover/PopoverContentPrompt.js' import { Snackbar } from 'lib/ui/Snackbar/Snackbar.js' import { Spinner } from 'lib/ui/Spinner/Spinner.js' import { ClimatePreset } from 'lib/ui/thermostat/ClimatePreset.js' interface ClimatePresetsManagement { device: ThermostatDevice onBack: () => void temperatureUnit: 'fahrenheit' | 'celsius' } const CreateNewPresetSymbol = Symbol('CreateNewPreset') export function ClimatePresets(props: ClimatePresetsManagement): JSX.Element { const { device, onBack } = props const [selectedClimatePreset, setSelectedClimatePreset] = useState< ThermostatClimatePreset | typeof CreateNewPresetSymbol | null >(null) const [ climatePresetKeySelectedForDeletion, setClimatePresetKeySelectedForDeletion, ] = useState(null) const { mutate, isError, error, isPending } = useDeleteThermostatClimatePreset() const errorMessage = getErrorMessage(error) if ( selectedClimatePreset != null || selectedClimatePreset === CreateNewPresetSymbol ) { return ( { setSelectedClimatePreset(null) }} device={device} preset={ selectedClimatePreset === CreateNewPresetSymbol ? undefined : selectedClimatePreset } /> ) } return ( <>
{device.properties.available_climate_presets.map((preset) => ( { setSelectedClimatePreset(preset) }} onClickDelete={() => { setClimatePresetKeySelectedForDeletion( preset.climate_preset_key ) mutate({ climate_preset_key: preset.climate_preset_key, device_id: device.device_id, }) }} temperatureUnit={props.temperatureUnit} preset={preset} key={preset.climate_preset_key} deletionLoading={ isPending && climatePresetKeySelectedForDeletion === preset.climate_preset_key } disabled={ isPending && climatePresetKeySelectedForDeletion !== preset.climate_preset_key } /> ))}
) } function PresetCard( props: HTMLAttributes & { preset: ThermostatClimatePreset temperatureUnit: 'fahrenheit' | 'celsius' onClickEdit: () => void onClickDelete: () => void deletionLoading?: boolean disabled?: boolean } ): JSX.Element { const { preset, temperatureUnit, onClickEdit, onClickDelete, deletionLoading = false, disabled = false, ...attrs } = props const heatPoint = temperatureUnit === 'fahrenheit' ? preset.heating_set_point_fahrenheit : (preset.heating_set_point_celsius ?? undefined) const coolPoint = temperatureUnit === 'fahrenheit' ? preset.cooling_set_point_fahrenheit : (preset.cooling_set_point_celsius ?? undefined) const unitSymbol = getTemperatureUnitSymbol(temperatureUnit) return (
{preset.display_name} {preset.name != null && (
{preset.climate_preset_key}
)}
( { onClickDelete() hide() }} /> )} > {({ setRef }) => ( {deletionLoading ? : } )}
{heatPoint != null && ( } text={`${heatPoint} ${unitSymbol}`} /> )} {coolPoint != null && ( } text={`${coolPoint} ${unitSymbol}`} /> )} {preset.fan_mode_setting != null && ( } text={preset.fan_mode_setting} /> )}
) } function Chip({ icon, text }: { icon: ReactNode; text: string }): JSX.Element { return (
{icon} {text}
) } const t = { title: 'Climate Presets', createNew: 'Create New', delete: 'Delete', edit: 'Edit', climatePresetNotFound: 'Climate Preset not found.', }