@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.
Files changed (69) hide show
  1. package/README.md +2 -2
  2. package/dist/elements.js +4712 -4620
  3. package/dist/elements.js.map +1 -1
  4. package/lib/errors.d.ts +1 -0
  5. package/lib/errors.js +11 -0
  6. package/lib/errors.js.map +1 -0
  7. package/lib/seam/components/SupportedDeviceTable/FilterCategoryMenu.js +1 -1
  8. package/lib/seam/components/SupportedDeviceTable/FilterCategoryMenu.js.map +1 -1
  9. package/lib/seam/components/SupportedDeviceTable/ShowAllDevicesButton.js +1 -1
  10. package/lib/seam/components/SupportedDeviceTable/ShowAllDevicesButton.js.map +1 -1
  11. package/lib/seam/thermostats/thermostat-device.js +1 -1
  12. package/lib/seam/thermostats/thermostat-device.js.map +1 -1
  13. package/lib/seam/thermostats/use-update-thermostat-climate-preset.d.ts +1 -1
  14. package/lib/seam/thermostats/use-update-thermostat-climate-preset.js +1 -1
  15. package/lib/seam/thermostats/use-update-thermostat-climate-preset.js.map +1 -1
  16. package/lib/ui/Alert/Alert.js +1 -1
  17. package/lib/ui/Alert/Alert.js.map +1 -1
  18. package/lib/ui/IconButton.js +1 -1
  19. package/lib/ui/IconButton.js.map +1 -1
  20. package/lib/ui/Snackbar/Snackbar.js +1 -1
  21. package/lib/ui/Snackbar/Snackbar.js.map +1 -1
  22. package/lib/ui/TabSet.js +1 -1
  23. package/lib/ui/TabSet.js.map +1 -1
  24. package/lib/ui/TextButton.js +1 -1
  25. package/lib/ui/TextButton.js.map +1 -1
  26. package/lib/ui/TextField/TextField.js +1 -1
  27. package/lib/ui/TextField/TextField.js.map +1 -1
  28. package/lib/ui/Tooltip/Tooltip.js +1 -1
  29. package/lib/ui/Tooltip/Tooltip.js.map +1 -1
  30. package/lib/ui/device/EditableDeviceName.js +1 -1
  31. package/lib/ui/device/EditableDeviceName.js.map +1 -1
  32. package/lib/ui/layout/AccordionRow.js +1 -1
  33. package/lib/ui/layout/AccordionRow.js.map +1 -1
  34. package/lib/ui/thermostat/ClimateModeMenu.js +1 -1
  35. package/lib/ui/thermostat/ClimateModeMenu.js.map +1 -1
  36. package/lib/ui/thermostat/ClimatePreset.js +23 -17
  37. package/lib/ui/thermostat/ClimatePreset.js.map +1 -1
  38. package/lib/ui/thermostat/ClimatePresets.js +21 -17
  39. package/lib/ui/thermostat/ClimatePresets.js.map +1 -1
  40. package/lib/ui/thermostat/FanModeMenu.js +1 -1
  41. package/lib/ui/thermostat/FanModeMenu.js.map +1 -1
  42. package/lib/ui/thermostat/TemperatureControl.js +2 -2
  43. package/lib/ui/thermostat/TemperatureControl.js.map +1 -1
  44. package/lib/ui/thermostat/ThermostatCard.js +1 -1
  45. package/lib/ui/thermostat/ThermostatCard.js.map +1 -1
  46. package/lib/version.d.ts +1 -1
  47. package/lib/version.js +1 -1
  48. package/package.json +1 -1
  49. package/src/lib/errors.ts +13 -0
  50. package/src/lib/seam/components/SupportedDeviceTable/FilterCategoryMenu.tsx +1 -1
  51. package/src/lib/seam/components/SupportedDeviceTable/ShowAllDevicesButton.tsx +1 -1
  52. package/src/lib/seam/thermostats/thermostat-device.ts +2 -1
  53. package/src/lib/seam/thermostats/use-update-thermostat-climate-preset.ts +3 -5
  54. package/src/lib/ui/Alert/Alert.tsx +1 -1
  55. package/src/lib/ui/IconButton.tsx +1 -0
  56. package/src/lib/ui/Snackbar/Snackbar.tsx +2 -0
  57. package/src/lib/ui/TabSet.tsx +1 -0
  58. package/src/lib/ui/TextButton.tsx +5 -1
  59. package/src/lib/ui/TextField/TextField.tsx +1 -0
  60. package/src/lib/ui/Tooltip/Tooltip.tsx +5 -1
  61. package/src/lib/ui/device/EditableDeviceName.tsx +1 -0
  62. package/src/lib/ui/layout/AccordionRow.tsx +5 -1
  63. package/src/lib/ui/thermostat/ClimateModeMenu.tsx +1 -0
  64. package/src/lib/ui/thermostat/ClimatePreset.tsx +57 -28
  65. package/src/lib/ui/thermostat/ClimatePresets.tsx +61 -45
  66. package/src/lib/ui/thermostat/FanModeMenu.tsx +1 -0
  67. package/src/lib/ui/thermostat/TemperatureControl.tsx +10 -2
  68. package/src/lib/ui/thermostat/ThermostatCard.tsx +1 -0
  69. 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":"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"}
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.7.0";
1
+ declare const seamapiReactVersion = "4.8.1";
2
2
  export default seamapiReactVersion;
package/lib/version.js CHANGED
@@ -1,3 +1,3 @@
1
- const seamapiReactVersion = '4.7.0';
1
+ const seamapiReactVersion = '4.8.1';
2
2
  export default seamapiReactVersion;
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seamapi/react",
3
- "version": "4.7.0",
3
+ "version": "4.8.1",
4
4
  "description": "Seam Components.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -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
+ }
@@ -46,7 +46,7 @@ export function FilterCategoryMenu({
46
46
  <p>{label}</p>
47
47
  <Menu
48
48
  renderButton={({ onOpen }) => (
49
- <button onClick={onOpen}>
49
+ <button type='button' onClick={onOpen}>
50
50
  <span>{buttonLabel}</span>
51
51
  <ChevronDownIcon />
52
52
  </button>
@@ -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 => 'is_fan_running' in device.properties
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 = Omit<
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.createClimatePreset(variables)
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>
@@ -15,6 +15,7 @@ export function IconButton({
15
15
  return (
16
16
  <button
17
17
  {...props}
18
+ type='button'
18
19
  ref={elRef}
19
20
  className={classNames(
20
21
  'seam-icon-btn',
@@ -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()
@@ -102,6 +102,7 @@ function TabButton<TabType extends string>({
102
102
  'seam-tab-button',
103
103
  isActive && 'seam-tab-button-active'
104
104
  )}
105
+ type='button'
105
106
  onClick={handleClick}
106
107
  >
107
108
  <p className='seam-tab-button-label'>{title}</p>
@@ -10,6 +10,10 @@ export function TextButton({
10
10
  ...buttonProps
11
11
  }: TextButtonProps): JSX.Element {
12
12
  return (
13
- <button className={`seam-text-btn seam-color-${color}`} {...buttonProps} />
13
+ <button
14
+ type='button'
15
+ className={`seam-text-btn seam-color-${color}`}
16
+ {...buttonProps}
17
+ />
14
18
  )
15
19
  }
@@ -105,6 +105,7 @@ export const TextField = forwardRef<
105
105
  <div className='seam-adornment seam-end'>
106
106
  {clearable && (
107
107
  <button
108
+ type='button'
108
109
  className={classNames({
109
110
  'seam-hidden': valueIsEmpty,
110
111
  })}
@@ -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 onClick={handleToggle} className='seam-tooltip-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>
@@ -171,6 +171,7 @@ function IconButton(
171
171
  return (
172
172
  <button
173
173
  {...props}
174
+ type='button'
174
175
  className={classNames(
175
176
  'seam-editable-device-name-icon-button',
176
177
  props.className
@@ -19,7 +19,11 @@ export function AccordionRow({
19
19
 
20
20
  return (
21
21
  <div className='seam-accordion-row' aria-expanded={isExpanded}>
22
- <button className='seam-accordion-row-trigger' onClick={toggle}>
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>
@@ -35,6 +35,7 @@ export function ClimateModeMenu({
35
35
  <Menu
36
36
  renderButton={({ onOpen }) => (
37
37
  <button
38
+ type='button'
38
39
  style={style}
39
40
  onClick={onOpen}
40
41
  className={classNames(
@@ -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 mutation = useCreateThermostatClimatePreset()
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
- mutation.mutate(
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, mutation, onComplete]
293
+ [device, mutate, onComplete]
289
294
  )
290
295
 
291
296
  return (
292
- <PresetForm
293
- defaultValues={{
294
- key: '',
295
- coolPoint: 60,
296
- heatPoint: 80,
297
- name: '',
298
- hvacMode: 'off',
299
- fanMode: 'auto',
300
- }}
301
- device={device}
302
- loading={mutation.isPending}
303
- onSubmit={onSubmit}
304
- withKeyField
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 mutation = useUpdateThermostatClimatePreset()
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 ?? 60,
324
- heatPoint: preset.heating_set_point_fahrenheit ?? 80,
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
- mutation.mutate(
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, mutation, onComplete]
367
+ [device, mutate, onComplete]
351
368
  )
352
369
 
370
+ const errorMessage = getErrorMessage(error)
371
+
353
372
  return (
354
- <PresetForm
355
- defaultValues={defaultValues}
356
- device={device}
357
- loading={mutation.isPending}
358
- onSubmit={onSubmit}
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
- const deleteMutation = useDeleteThermostatClimatePreset()
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
- <div className='seam-thermostat-climate-presets'>
66
- <ContentHeader title={t.title} onBack={onBack} />
67
- <div className='seam-thermostat-climate-presets-body'>
68
- <Button
69
- onClick={() => {
70
- setSelectedClimatePreset(CreateNewPresetSymbol)
71
- }}
72
- className='seam-climate-presets-add-button'
73
- >
74
- <AddIcon />
75
- {t.createNew}
76
- </Button>
77
-
78
- <div className='seam-thermostat-climate-presets-cards'>
79
- {device.properties.available_climate_presets.map((preset) => (
80
- <PresetCard
81
- onClickEdit={() => {
82
- setSelectedClimatePreset(preset)
83
- }}
84
- onClickDelete={() => {
85
- setClimatePresetKeySelectedForDeletion(
86
- preset.climate_preset_key
87
- )
88
- deleteMutation.mutate({
89
- climate_preset_key: preset.climate_preset_key,
90
- device_id: device.device_id,
91
- })
92
- }}
93
- temperatureUnit={props.temperatureUnit}
94
- preset={preset}
95
- key={preset.climate_preset_key}
96
- deletionLoading={
97
- deleteMutation.isPending &&
98
- climatePresetKeySelectedForDeletion ===
99
- preset.climate_preset_key
100
- }
101
- disabled={
102
- deleteMutation.isPending &&
103
- climatePresetKeySelectedForDeletion !==
104
- preset.climate_preset_key
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
- </div>
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
  }
@@ -26,6 +26,7 @@ export function FanModeMenu({
26
26
  <Menu
27
27
  renderButton={({ onOpen }) => (
28
28
  <button
29
+ type='button'
29
30
  onClick={onOpen}
30
31
  className={classNames(
31
32
  'seam-fan-mode-menu-button',
@@ -30,7 +30,11 @@ export function TemperatureControl({
30
30
 
31
31
  return (
32
32
  <div className='seam-temperature-control'>
33
- <button className='seam-temperature-stepper-button' onClick={decrement}>
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 className='seam-temperature-stepper-button' onClick={increment}>
50
+ <button
51
+ type='button'
52
+ className='seam-temperature-stepper-button'
53
+ onClick={increment}
54
+ >
47
55
  <TemperatureAddIcon />
48
56
  </button>
49
57
  </div>
@@ -65,6 +65,7 @@ function Content(props: ThermostatCardProps): JSX.Element | null {
65
65
  onEdit={props.onEditName}
66
66
  />
67
67
  <button
68
+ type='button'
68
69
  onClick={toggleTemperatureUnit}
69
70
  className='seam-thermostat-temperature-toggle'
70
71
  >
@@ -1,3 +1,3 @@
1
- const seamapiReactVersion = '4.7.0'
1
+ const seamapiReactVersion = '4.8.1'
2
2
 
3
3
  export default seamapiReactVersion