@seamapi/react 4.7.0 → 4.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/elements.js +4712 -4620
- package/dist/elements.js.map +1 -1
- package/lib/errors.d.ts +1 -0
- package/lib/errors.js +11 -0
- package/lib/errors.js.map +1 -0
- package/lib/seam/components/SupportedDeviceTable/FilterCategoryMenu.js +1 -1
- package/lib/seam/components/SupportedDeviceTable/FilterCategoryMenu.js.map +1 -1
- package/lib/seam/components/SupportedDeviceTable/ShowAllDevicesButton.js +1 -1
- package/lib/seam/components/SupportedDeviceTable/ShowAllDevicesButton.js.map +1 -1
- package/lib/seam/thermostats/thermostat-device.js +1 -1
- package/lib/seam/thermostats/thermostat-device.js.map +1 -1
- package/lib/seam/thermostats/use-update-thermostat-climate-preset.d.ts +1 -1
- package/lib/seam/thermostats/use-update-thermostat-climate-preset.js +1 -1
- package/lib/seam/thermostats/use-update-thermostat-climate-preset.js.map +1 -1
- package/lib/ui/Alert/Alert.js +1 -1
- package/lib/ui/Alert/Alert.js.map +1 -1
- package/lib/ui/IconButton.js +1 -1
- package/lib/ui/IconButton.js.map +1 -1
- package/lib/ui/Snackbar/Snackbar.js +1 -1
- package/lib/ui/Snackbar/Snackbar.js.map +1 -1
- package/lib/ui/TabSet.js +1 -1
- package/lib/ui/TabSet.js.map +1 -1
- package/lib/ui/TextButton.js +1 -1
- package/lib/ui/TextButton.js.map +1 -1
- package/lib/ui/TextField/TextField.js +1 -1
- package/lib/ui/TextField/TextField.js.map +1 -1
- package/lib/ui/Tooltip/Tooltip.js +1 -1
- package/lib/ui/Tooltip/Tooltip.js.map +1 -1
- package/lib/ui/device/EditableDeviceName.js +1 -1
- package/lib/ui/device/EditableDeviceName.js.map +1 -1
- package/lib/ui/layout/AccordionRow.js +1 -1
- package/lib/ui/layout/AccordionRow.js.map +1 -1
- package/lib/ui/thermostat/ClimateModeMenu.js +1 -1
- package/lib/ui/thermostat/ClimateModeMenu.js.map +1 -1
- package/lib/ui/thermostat/ClimatePreset.js +23 -17
- package/lib/ui/thermostat/ClimatePreset.js.map +1 -1
- package/lib/ui/thermostat/ClimatePresets.js +21 -17
- package/lib/ui/thermostat/ClimatePresets.js.map +1 -1
- package/lib/ui/thermostat/FanModeMenu.js +1 -1
- package/lib/ui/thermostat/FanModeMenu.js.map +1 -1
- package/lib/ui/thermostat/TemperatureControl.js +2 -2
- package/lib/ui/thermostat/TemperatureControl.js.map +1 -1
- package/lib/ui/thermostat/ThermostatCard.js +1 -1
- package/lib/ui/thermostat/ThermostatCard.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +1 -1
- package/src/lib/errors.ts +13 -0
- package/src/lib/seam/components/SupportedDeviceTable/FilterCategoryMenu.tsx +1 -1
- package/src/lib/seam/components/SupportedDeviceTable/ShowAllDevicesButton.tsx +1 -1
- package/src/lib/seam/thermostats/thermostat-device.ts +2 -1
- package/src/lib/seam/thermostats/use-update-thermostat-climate-preset.ts +3 -5
- package/src/lib/ui/Alert/Alert.tsx +1 -1
- package/src/lib/ui/IconButton.tsx +1 -0
- package/src/lib/ui/Snackbar/Snackbar.tsx +2 -0
- package/src/lib/ui/TabSet.tsx +1 -0
- package/src/lib/ui/TextButton.tsx +5 -1
- package/src/lib/ui/TextField/TextField.tsx +1 -0
- package/src/lib/ui/Tooltip/Tooltip.tsx +5 -1
- package/src/lib/ui/device/EditableDeviceName.tsx +1 -0
- package/src/lib/ui/layout/AccordionRow.tsx +5 -1
- package/src/lib/ui/thermostat/ClimateModeMenu.tsx +1 -0
- package/src/lib/ui/thermostat/ClimatePreset.tsx +57 -28
- package/src/lib/ui/thermostat/ClimatePresets.tsx +61 -45
- package/src/lib/ui/thermostat/FanModeMenu.tsx +1 -0
- package/src/lib/ui/thermostat/TemperatureControl.tsx +10 -2
- package/src/lib/ui/thermostat/ThermostatCard.tsx +1 -0
- package/src/lib/version.ts +1 -1
|
@@ -9,9 +9,9 @@ export function TemperatureControl({ variant, value, onChange, min = 50, max = 9
|
|
|
9
9
|
const decrement = () => {
|
|
10
10
|
onChange(Math.max(value - 1, min));
|
|
11
11
|
};
|
|
12
|
-
return (_jsxs("div", { className: 'seam-temperature-control', children: [_jsx("button", { className: 'seam-temperature-stepper-button', onClick: decrement, children: _jsx(TemperatureSubtractIcon, {}) }), _jsx(RangeSlider, { variant: variant, min: min, max: max, value: value, onChange: (temperature) => {
|
|
12
|
+
return (_jsxs("div", { className: 'seam-temperature-control', children: [_jsx("button", { type: 'button', className: 'seam-temperature-stepper-button', onClick: decrement, children: _jsx(TemperatureSubtractIcon, {}) }), _jsx(RangeSlider, { variant: variant, min: min, max: max, value: value, onChange: (temperature) => {
|
|
13
13
|
onChange(temperature);
|
|
14
|
-
}, unit: unit }), _jsx("button", { className: 'seam-temperature-stepper-button', onClick: increment, children: _jsx(TemperatureAddIcon, {}) })] }));
|
|
14
|
+
}, unit: unit }), _jsx("button", { type: 'button', className: 'seam-temperature-stepper-button', onClick: increment, children: _jsx(TemperatureAddIcon, {}) })] }));
|
|
15
15
|
}
|
|
16
16
|
function RangeSlider({ variant, value, onChange, min, max, unit, }) {
|
|
17
17
|
const wrapRef = useRef(null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemperatureControl.js","sourceRoot":"","sources":["../../../src/lib/ui/thermostat/TemperatureControl.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA2B,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAElE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAA;AAW1E,MAAM,UAAU,kBAAkB,CAAC,EACjC,OAAO,EACP,KAAK,EACL,QAAQ,EACR,GAAG,GAAG,EAAE,EACR,GAAG,GAAG,EAAE,EACR,IAAI,GAAG,YAAY,GACK;IACxB,MAAM,SAAS,GAAG,GAAS,EAAE;QAC3B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IACpC,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,GAAS,EAAE;QAC3B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IACpC,CAAC,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAC,0BAA0B,aACvC,
|
|
1
|
+
{"version":3,"file":"TemperatureControl.js","sourceRoot":"","sources":["../../../src/lib/ui/thermostat/TemperatureControl.tsx"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ function Content(props) {
|
|
|
20
20
|
};
|
|
21
21
|
const { temperature_fahrenheit: temperatureFahrenheit, temperature_celsius: temperatureCelsius, current_climate_setting: currentClimateSetting, is_fan_running: isFanRunning, relative_humidity: relativeHumidity, } = device.properties;
|
|
22
22
|
const systemStatus = getSystemStatus(device);
|
|
23
|
-
return (_jsxs("div", { className: 'seam-thermostat-card-content', children: [_jsx("div", { className: 'seam-thermostat-card-image-wrap', children: _jsx(DeviceImage, { device: device }) }), _jsxs("div", { className: 'seam-thermostat-card-details', children: [_jsxs("div", { className: 'seam-thermostat-heading-wrap', children: [_jsx(EditableDeviceName, { value: device.properties.name, tagName: 'h4', className: 'seam-thermostat-card-heading', onEdit: props.onEditName }), _jsx("button", { onClick: toggleTemperatureUnit, className: 'seam-thermostat-temperature-toggle', children: _jsx("span", { className: 'seam-thermostat-temperature-toggle-label', children: temperatureUnit === 'fahrenheit' ? t.fahrenheit : t.celsius }) })] }), _jsx("div", { className: 'seam-thermostat-properties-wrap', children: _jsxs("div", { className: 'seam-thermostat-properties', children: [_jsx("div", { className: 'seam-thermostat-property-block', children: _jsxs("p", { className: 'seam-thermostat-property-label', children: [t.temperature, ":"] }) }), _jsxs("div", { className: 'seam-thermostat-property-block', children: [_jsx("p", { className: 'seam-thermostat-property-value', children: _jsx(Temperature, { fahrenheit: temperatureFahrenheit, celsius: temperatureCelsius, unit: temperatureUnit }) }), _jsx("p", { className: 'seam-thermostat-property-value', children: "|" }), _jsxs("p", { className: 'seam-thermostat-property-label', children: [t.humidity, ":"] }), relativeHumidity != null && (_jsxs("p", { className: 'seam-thermostat-property-value', children: [relativeHumidity * 100, "%"] }))] }), _jsx("div", { className: 'seam-thermostat-property-block', children: _jsxs("p", { className: 'seam-thermostat-property-label', children: [t.setting, ":"] }) }), _jsx("div", { className: 'seam-thermostat-property-block', children: _jsx(ClimateSettingStatus, { climateSetting: currentClimateSetting, temperatureUnit: temperatureUnit }) }), _jsx("div", { className: 'seam-thermostat-property-block', children: _jsxs("p", { className: 'seam-thermostat-property-label', children: [t.fanMode, ":"] }) }), _jsxs("div", { className: 'seam-thermostat-property-block seam-thermostat-property-icon-block', children: [_jsx("div", { className: 'seam-thermostat-property-icon', children: isFanRunning ? _jsx(FanIcon, {}) : _jsx(OffIcon, {}) }), _jsx("p", { className: 'seam-thermostat-property-value', children: isFanRunning ? t.auto : t.off })] }), _jsx("div", { className: 'seam-thermostat-property-block', children: _jsxs("p", { className: 'seam-thermostat-property-label', children: [t.systemStatus, ":"] }) }), _jsx("div", { className: 'seam-thermostat-property-block', children: _jsx("div", { className: classNames('seam-thermostat-property-tag', `seam-thermostat-property-tag-${systemStatus}`), children: _jsx("p", { className: 'seam-thermostat-property-tag-label', children: systemStatus === 'off' ? '--' : t[systemStatus] }) }) })] }) })] })] }));
|
|
23
|
+
return (_jsxs("div", { className: 'seam-thermostat-card-content', children: [_jsx("div", { className: 'seam-thermostat-card-image-wrap', children: _jsx(DeviceImage, { device: device }) }), _jsxs("div", { className: 'seam-thermostat-card-details', children: [_jsxs("div", { className: 'seam-thermostat-heading-wrap', children: [_jsx(EditableDeviceName, { value: device.properties.name, tagName: 'h4', className: 'seam-thermostat-card-heading', onEdit: props.onEditName }), _jsx("button", { type: 'button', onClick: toggleTemperatureUnit, className: 'seam-thermostat-temperature-toggle', children: _jsx("span", { className: 'seam-thermostat-temperature-toggle-label', children: temperatureUnit === 'fahrenheit' ? t.fahrenheit : t.celsius }) })] }), _jsx("div", { className: 'seam-thermostat-properties-wrap', children: _jsxs("div", { className: 'seam-thermostat-properties', children: [_jsx("div", { className: 'seam-thermostat-property-block', children: _jsxs("p", { className: 'seam-thermostat-property-label', children: [t.temperature, ":"] }) }), _jsxs("div", { className: 'seam-thermostat-property-block', children: [_jsx("p", { className: 'seam-thermostat-property-value', children: _jsx(Temperature, { fahrenheit: temperatureFahrenheit, celsius: temperatureCelsius, unit: temperatureUnit }) }), _jsx("p", { className: 'seam-thermostat-property-value', children: "|" }), _jsxs("p", { className: 'seam-thermostat-property-label', children: [t.humidity, ":"] }), relativeHumidity != null && (_jsxs("p", { className: 'seam-thermostat-property-value', children: [relativeHumidity * 100, "%"] }))] }), _jsx("div", { className: 'seam-thermostat-property-block', children: _jsxs("p", { className: 'seam-thermostat-property-label', children: [t.setting, ":"] }) }), _jsx("div", { className: 'seam-thermostat-property-block', children: _jsx(ClimateSettingStatus, { climateSetting: currentClimateSetting, temperatureUnit: temperatureUnit }) }), _jsx("div", { className: 'seam-thermostat-property-block', children: _jsxs("p", { className: 'seam-thermostat-property-label', children: [t.fanMode, ":"] }) }), _jsxs("div", { className: 'seam-thermostat-property-block seam-thermostat-property-icon-block', children: [_jsx("div", { className: 'seam-thermostat-property-icon', children: isFanRunning ? _jsx(FanIcon, {}) : _jsx(OffIcon, {}) }), _jsx("p", { className: 'seam-thermostat-property-value', children: isFanRunning ? t.auto : t.off })] }), _jsx("div", { className: 'seam-thermostat-property-block', children: _jsxs("p", { className: 'seam-thermostat-property-label', children: [t.systemStatus, ":"] }) }), _jsx("div", { className: 'seam-thermostat-property-block', children: _jsx("div", { className: classNames('seam-thermostat-property-tag', `seam-thermostat-property-tag-${systemStatus}`), children: _jsx("p", { className: 'seam-thermostat-property-tag-label', children: systemStatus === 'off' ? '--' : t[systemStatus] }) }) })] }) })] })] }));
|
|
24
24
|
}
|
|
25
25
|
const getSystemStatus = (device) => {
|
|
26
26
|
const { properties } = device;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThermostatCard.js","sourceRoot":"","sources":["../../../src/lib/ui/thermostat/ThermostatCard.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ThermostatCard.js","sourceRoot":"","sources":["../../../src/lib/ui/thermostat/ThermostatCard.tsx"],"names":[],"mappings":"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"}
|
package/lib/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const seamapiReactVersion = "4.
|
|
1
|
+
declare const seamapiReactVersion = "4.8.1";
|
|
2
2
|
export default seamapiReactVersion;
|
package/lib/version.js
CHANGED
package/package.json
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { isSeamHttpApiError } from '@seamapi/http/connect'
|
|
2
|
+
|
|
3
|
+
export function getErrorMessage(error?: Error | null | undefined): string {
|
|
4
|
+
if (isSeamHttpApiError(error)) {
|
|
5
|
+
return error.message
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
return t.anUnknownErrorOccurred
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const t = {
|
|
12
|
+
anUnknownErrorOccurred: 'An unknown error occurred',
|
|
13
|
+
}
|
|
@@ -20,7 +20,7 @@ export function ShowAllDevicesButton({
|
|
|
20
20
|
const label = expanded ? t.showLess : t.showAll(totalDeviceCount)
|
|
21
21
|
|
|
22
22
|
return (
|
|
23
|
-
<button className='show-all-devices-button' onClick={onClick}>
|
|
23
|
+
<button type='button' className='show-all-devices-button' onClick={onClick}>
|
|
24
24
|
<ChevronRightIcon /> {label}
|
|
25
25
|
</button>
|
|
26
26
|
)
|
|
@@ -36,7 +36,8 @@ export interface ClimateSetting {
|
|
|
36
36
|
|
|
37
37
|
export const isThermostatDevice = (
|
|
38
38
|
device: Device
|
|
39
|
-
): device is ThermostatDevice =>
|
|
39
|
+
): device is ThermostatDevice =>
|
|
40
|
+
'available_climate_presets' in device.properties
|
|
40
41
|
|
|
41
42
|
export type ThermostatClimatePreset =
|
|
42
43
|
ThermostatDevice['properties']['available_climate_presets'][number]
|
|
@@ -18,10 +18,8 @@ import { NullSeamClientError, useSeamClient } from 'lib/seam/use-seam-client.js'
|
|
|
18
18
|
export type UseUpdateThermostatClimatePresetParams = never
|
|
19
19
|
export type UseUpdateThermostatClimatePresetData = undefined
|
|
20
20
|
|
|
21
|
-
export type UseUpdateThermostatClimatePresetVariables =
|
|
22
|
-
ThermostatsUpdateClimatePresetBody
|
|
23
|
-
'manual_override_allowed'
|
|
24
|
-
>
|
|
21
|
+
export type UseUpdateThermostatClimatePresetVariables =
|
|
22
|
+
ThermostatsUpdateClimatePresetBody
|
|
25
23
|
|
|
26
24
|
export function useUpdateThermostatClimatePreset(): UseMutationResult<
|
|
27
25
|
UseUpdateThermostatClimatePresetData,
|
|
@@ -38,7 +36,7 @@ export function useUpdateThermostatClimatePreset(): UseMutationResult<
|
|
|
38
36
|
>({
|
|
39
37
|
mutationFn: async (variables) => {
|
|
40
38
|
if (client === null) throw new NullSeamClientError()
|
|
41
|
-
await client.thermostats.
|
|
39
|
+
await client.thermostats.updateClimatePreset(variables)
|
|
42
40
|
},
|
|
43
41
|
onSuccess: (_data, variables) => {
|
|
44
42
|
queryClient.setQueryData<ThermostatDevice | null>(
|
|
@@ -49,7 +49,7 @@ function Action(props: ActionProps): JSX.Element | null {
|
|
|
49
49
|
|
|
50
50
|
return (
|
|
51
51
|
<div className='seam-alert-action-wrap'>
|
|
52
|
-
<button onClick={handleClick} className='seam-alert-action'>
|
|
52
|
+
<button type='button' onClick={handleClick} className='seam-alert-action'>
|
|
53
53
|
{props.label}
|
|
54
54
|
</button>
|
|
55
55
|
</div>
|
|
@@ -77,6 +77,7 @@ export function Snackbar({
|
|
|
77
77
|
<div className='seam-snackbar-actions-wrap'>
|
|
78
78
|
{action != null && (
|
|
79
79
|
<button
|
|
80
|
+
type='button'
|
|
80
81
|
className='seam-snackbar-action'
|
|
81
82
|
onClick={handleActionClick}
|
|
82
83
|
>
|
|
@@ -85,6 +86,7 @@ export function Snackbar({
|
|
|
85
86
|
)}
|
|
86
87
|
{!disableCloseButton && (
|
|
87
88
|
<button
|
|
89
|
+
type='button'
|
|
88
90
|
className='seam-snackbar-close-button'
|
|
89
91
|
onClick={() => {
|
|
90
92
|
handleClose()
|
package/src/lib/ui/TabSet.tsx
CHANGED
|
@@ -10,6 +10,10 @@ export function TextButton({
|
|
|
10
10
|
...buttonProps
|
|
11
11
|
}: TextButtonProps): JSX.Element {
|
|
12
12
|
return (
|
|
13
|
-
<button
|
|
13
|
+
<button
|
|
14
|
+
type='button'
|
|
15
|
+
className={`seam-text-btn seam-color-${color}`}
|
|
16
|
+
{...buttonProps}
|
|
17
|
+
/>
|
|
14
18
|
)
|
|
15
19
|
}
|
|
@@ -40,7 +40,11 @@ export function Tooltip({ children }: PropsWithChildren): JSX.Element {
|
|
|
40
40
|
return (
|
|
41
41
|
<div className='seam-tooltip'>
|
|
42
42
|
<div className='seam-tooltip-trigger-wrap'>
|
|
43
|
-
<button
|
|
43
|
+
<button
|
|
44
|
+
type='button'
|
|
45
|
+
onClick={handleToggle}
|
|
46
|
+
className='seam-tooltip-button'
|
|
47
|
+
>
|
|
44
48
|
<div className='seam-tooltip-button-icon seam-tooltip-button-icon-default'>
|
|
45
49
|
<InfoIcon />
|
|
46
50
|
</div>
|
|
@@ -19,7 +19,11 @@ export function AccordionRow({
|
|
|
19
19
|
|
|
20
20
|
return (
|
|
21
21
|
<div className='seam-accordion-row' aria-expanded={isExpanded}>
|
|
22
|
-
<button
|
|
22
|
+
<button
|
|
23
|
+
type='button'
|
|
24
|
+
className='seam-accordion-row-trigger'
|
|
25
|
+
onClick={toggle}
|
|
26
|
+
>
|
|
23
27
|
<div className='seam-row-inner-wrap'>
|
|
24
28
|
<p className='seam-row-label'>{label}</p>
|
|
25
29
|
<div className='seam-row-trigger-left-content'>{leftContent}</div>
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from 'react'
|
|
9
9
|
import { Controller, useForm, type UseFormReturn } from 'react-hook-form'
|
|
10
10
|
|
|
11
|
+
import { getErrorMessage } from 'lib/errors.js'
|
|
11
12
|
import type {
|
|
12
13
|
FanModeSetting,
|
|
13
14
|
HvacModeSetting,
|
|
@@ -21,6 +22,7 @@ import { Button } from 'lib/ui/Button.js'
|
|
|
21
22
|
import { FormField } from 'lib/ui/FormField.js'
|
|
22
23
|
import { InputLabel } from 'lib/ui/InputLabel.js'
|
|
23
24
|
import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'
|
|
25
|
+
import { Snackbar } from 'lib/ui/Snackbar/Snackbar.js'
|
|
24
26
|
import { TextField } from 'lib/ui/TextField/TextField.js'
|
|
25
27
|
import { ClimateModeMenu } from 'lib/ui/thermostat/ClimateModeMenu.js'
|
|
26
28
|
import { FanModeMenu } from 'lib/ui/thermostat/FanModeMenu.js'
|
|
@@ -266,11 +268,14 @@ interface CreateFormProps {
|
|
|
266
268
|
}
|
|
267
269
|
|
|
268
270
|
function CreateForm({ device, onComplete }: CreateFormProps): JSX.Element {
|
|
269
|
-
const
|
|
271
|
+
const { mutate, isError, error, isPending } =
|
|
272
|
+
useCreateThermostatClimatePreset()
|
|
273
|
+
|
|
274
|
+
const errorMessage = getErrorMessage(error)
|
|
270
275
|
|
|
271
276
|
const onSubmit = useCallback(
|
|
272
277
|
(values: PresetFormProps['defaultValues']) => {
|
|
273
|
-
|
|
278
|
+
mutate(
|
|
274
279
|
{
|
|
275
280
|
climate_preset_key: values.key,
|
|
276
281
|
device_id: device.device_id,
|
|
@@ -285,24 +290,33 @@ function CreateForm({ device, onComplete }: CreateFormProps): JSX.Element {
|
|
|
285
290
|
{ onSuccess: onComplete }
|
|
286
291
|
)
|
|
287
292
|
},
|
|
288
|
-
[device,
|
|
293
|
+
[device, mutate, onComplete]
|
|
289
294
|
)
|
|
290
295
|
|
|
291
296
|
return (
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
297
|
+
<>
|
|
298
|
+
<Snackbar
|
|
299
|
+
message={errorMessage}
|
|
300
|
+
variant='error'
|
|
301
|
+
visible={isError}
|
|
302
|
+
automaticVisibility
|
|
303
|
+
/>
|
|
304
|
+
|
|
305
|
+
<PresetForm
|
|
306
|
+
defaultValues={{
|
|
307
|
+
key: '',
|
|
308
|
+
coolPoint: 60,
|
|
309
|
+
heatPoint: 80,
|
|
310
|
+
name: '',
|
|
311
|
+
hvacMode: 'off',
|
|
312
|
+
fanMode: 'auto',
|
|
313
|
+
}}
|
|
314
|
+
device={device}
|
|
315
|
+
loading={isPending}
|
|
316
|
+
onSubmit={onSubmit}
|
|
317
|
+
withKeyField
|
|
318
|
+
/>
|
|
319
|
+
</>
|
|
306
320
|
)
|
|
307
321
|
}
|
|
308
322
|
|
|
@@ -317,11 +331,13 @@ function UpdateForm({
|
|
|
317
331
|
onComplete,
|
|
318
332
|
preset,
|
|
319
333
|
}: UpdateFormProps): JSX.Element {
|
|
320
|
-
const
|
|
334
|
+
const { mutate, isError, error, isPending } =
|
|
335
|
+
useUpdateThermostatClimatePreset()
|
|
336
|
+
|
|
321
337
|
const defaultValues = useMemo<PresetFormProps['defaultValues']>(
|
|
322
338
|
() => ({
|
|
323
|
-
coolPoint: preset.cooling_set_point_fahrenheit
|
|
324
|
-
heatPoint: preset.heating_set_point_fahrenheit
|
|
339
|
+
coolPoint: preset.cooling_set_point_fahrenheit,
|
|
340
|
+
heatPoint: preset.heating_set_point_fahrenheit,
|
|
325
341
|
name: preset.display_name,
|
|
326
342
|
hvacMode: preset.hvac_mode_setting,
|
|
327
343
|
fanMode: preset.fan_mode_setting,
|
|
@@ -332,7 +348,7 @@ function UpdateForm({
|
|
|
332
348
|
|
|
333
349
|
const onSubmit = useCallback(
|
|
334
350
|
(values: PresetFormProps['defaultValues']) => {
|
|
335
|
-
|
|
351
|
+
mutate(
|
|
336
352
|
{
|
|
337
353
|
climate_preset_key: values.key,
|
|
338
354
|
device_id: device.device_id,
|
|
@@ -343,20 +359,32 @@ function UpdateForm({
|
|
|
343
359
|
cooling_set_point_celsius: fahrenheitToCelsius(values.coolPoint),
|
|
344
360
|
heating_set_point_celsius: fahrenheitToCelsius(values.heatPoint),
|
|
345
361
|
hvac_mode_setting: values.hvacMode,
|
|
362
|
+
manual_override_allowed: false, // deprecated but type still wants it.
|
|
346
363
|
},
|
|
347
364
|
{ onSuccess: onComplete }
|
|
348
365
|
)
|
|
349
366
|
},
|
|
350
|
-
[device,
|
|
367
|
+
[device, mutate, onComplete]
|
|
351
368
|
)
|
|
352
369
|
|
|
370
|
+
const errorMessage = getErrorMessage(error)
|
|
371
|
+
|
|
353
372
|
return (
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
373
|
+
<>
|
|
374
|
+
<Snackbar
|
|
375
|
+
message={errorMessage}
|
|
376
|
+
variant='error'
|
|
377
|
+
visible={isError}
|
|
378
|
+
automaticVisibility
|
|
379
|
+
/>
|
|
380
|
+
|
|
381
|
+
<PresetForm
|
|
382
|
+
defaultValues={defaultValues}
|
|
383
|
+
device={device}
|
|
384
|
+
loading={isPending}
|
|
385
|
+
onSubmit={onSubmit}
|
|
386
|
+
/>
|
|
387
|
+
</>
|
|
360
388
|
)
|
|
361
389
|
}
|
|
362
390
|
|
|
@@ -370,4 +398,5 @@ const t = {
|
|
|
370
398
|
delete: 'Delete',
|
|
371
399
|
save: 'Save',
|
|
372
400
|
crateNewPreset: 'Create New Climate Preset',
|
|
401
|
+
unknownErrorOccured: 'An unknown error occurred.',
|
|
373
402
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import classNames from 'classnames'
|
|
2
2
|
import { type HTMLAttributes, type ReactNode, useState } from 'react'
|
|
3
3
|
|
|
4
|
+
import { getErrorMessage } from 'lib/errors.js'
|
|
4
5
|
import { AddIcon } from 'lib/icons/Add.js'
|
|
5
6
|
import { EditIcon } from 'lib/icons/Edit.js'
|
|
6
7
|
import { FanIcon } from 'lib/icons/Fan.js'
|
|
@@ -18,6 +19,7 @@ import { IconButton } from 'lib/ui/IconButton.js'
|
|
|
18
19
|
import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'
|
|
19
20
|
import { Popover } from 'lib/ui/Popover/Popover.js'
|
|
20
21
|
import { PopoverContentPrompt } from 'lib/ui/Popover/PopoverContentPrompt.js'
|
|
22
|
+
import { Snackbar } from 'lib/ui/Snackbar/Snackbar.js'
|
|
21
23
|
import { Spinner } from 'lib/ui/Spinner/Spinner.js'
|
|
22
24
|
import { ClimatePreset } from 'lib/ui/thermostat/ClimatePreset.js'
|
|
23
25
|
|
|
@@ -40,7 +42,11 @@ export function ClimatePresets(props: ClimatePresetsManagement): JSX.Element {
|
|
|
40
42
|
climatePresetKeySelectedForDeletion,
|
|
41
43
|
setClimatePresetKeySelectedForDeletion,
|
|
42
44
|
] = useState<ThermostatClimatePreset['climate_preset_key'] | null>(null)
|
|
43
|
-
|
|
45
|
+
|
|
46
|
+
const { mutate, isError, error, isPending } =
|
|
47
|
+
useDeleteThermostatClimatePreset()
|
|
48
|
+
|
|
49
|
+
const errorMessage = getErrorMessage(error)
|
|
44
50
|
|
|
45
51
|
if (
|
|
46
52
|
selectedClimatePreset != null ||
|
|
@@ -62,52 +68,61 @@ export function ClimatePresets(props: ClimatePresetsManagement): JSX.Element {
|
|
|
62
68
|
}
|
|
63
69
|
|
|
64
70
|
return (
|
|
65
|
-
|
|
66
|
-
<
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
71
|
+
<>
|
|
72
|
+
<Snackbar
|
|
73
|
+
message={errorMessage}
|
|
74
|
+
variant='error'
|
|
75
|
+
visible={isError}
|
|
76
|
+
automaticVisibility
|
|
77
|
+
/>
|
|
78
|
+
|
|
79
|
+
<div className='seam-thermostat-climate-presets'>
|
|
80
|
+
<ContentHeader title={t.title} onBack={onBack} />
|
|
81
|
+
<div className='seam-thermostat-climate-presets-body'>
|
|
82
|
+
<Button
|
|
83
|
+
onClick={() => {
|
|
84
|
+
setSelectedClimatePreset(CreateNewPresetSymbol)
|
|
85
|
+
}}
|
|
86
|
+
className='seam-climate-presets-add-button'
|
|
87
|
+
>
|
|
88
|
+
<AddIcon />
|
|
89
|
+
{t.createNew}
|
|
90
|
+
</Button>
|
|
91
|
+
|
|
92
|
+
<div className='seam-thermostat-climate-presets-cards'>
|
|
93
|
+
{device.properties.available_climate_presets.map((preset) => (
|
|
94
|
+
<PresetCard
|
|
95
|
+
onClickEdit={() => {
|
|
96
|
+
setSelectedClimatePreset(preset)
|
|
97
|
+
}}
|
|
98
|
+
onClickDelete={() => {
|
|
99
|
+
setClimatePresetKeySelectedForDeletion(
|
|
100
|
+
preset.climate_preset_key
|
|
101
|
+
)
|
|
102
|
+
mutate({
|
|
103
|
+
climate_preset_key: preset.climate_preset_key,
|
|
104
|
+
device_id: device.device_id,
|
|
105
|
+
})
|
|
106
|
+
}}
|
|
107
|
+
temperatureUnit={props.temperatureUnit}
|
|
108
|
+
preset={preset}
|
|
109
|
+
key={preset.climate_preset_key}
|
|
110
|
+
deletionLoading={
|
|
111
|
+
isPending &&
|
|
112
|
+
climatePresetKeySelectedForDeletion ===
|
|
113
|
+
preset.climate_preset_key
|
|
114
|
+
}
|
|
115
|
+
disabled={
|
|
116
|
+
isPending &&
|
|
117
|
+
climatePresetKeySelectedForDeletion !==
|
|
118
|
+
preset.climate_preset_key
|
|
119
|
+
}
|
|
120
|
+
/>
|
|
121
|
+
))}
|
|
122
|
+
</div>
|
|
108
123
|
</div>
|
|
109
124
|
</div>
|
|
110
|
-
|
|
125
|
+
</>
|
|
111
126
|
)
|
|
112
127
|
}
|
|
113
128
|
|
|
@@ -232,4 +247,5 @@ const t = {
|
|
|
232
247
|
createNew: 'Create New',
|
|
233
248
|
delete: 'Delete',
|
|
234
249
|
edit: 'Edit',
|
|
250
|
+
climatePresetNotFound: 'Climate Preset not found.',
|
|
235
251
|
}
|
|
@@ -30,7 +30,11 @@ export function TemperatureControl({
|
|
|
30
30
|
|
|
31
31
|
return (
|
|
32
32
|
<div className='seam-temperature-control'>
|
|
33
|
-
<button
|
|
33
|
+
<button
|
|
34
|
+
type='button'
|
|
35
|
+
className='seam-temperature-stepper-button'
|
|
36
|
+
onClick={decrement}
|
|
37
|
+
>
|
|
34
38
|
<TemperatureSubtractIcon />
|
|
35
39
|
</button>
|
|
36
40
|
<RangeSlider
|
|
@@ -43,7 +47,11 @@ export function TemperatureControl({
|
|
|
43
47
|
}}
|
|
44
48
|
unit={unit}
|
|
45
49
|
/>
|
|
46
|
-
<button
|
|
50
|
+
<button
|
|
51
|
+
type='button'
|
|
52
|
+
className='seam-temperature-stepper-button'
|
|
53
|
+
onClick={increment}
|
|
54
|
+
>
|
|
47
55
|
<TemperatureAddIcon />
|
|
48
56
|
</button>
|
|
49
57
|
</div>
|
package/src/lib/version.ts
CHANGED