@seamapi/react 4.6.0 → 4.8.0

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 (85) hide show
  1. package/README.md +2 -2
  2. package/dist/elements.js +11791 -9562
  3. package/dist/elements.js.map +1 -1
  4. package/dist/index.css +255 -3
  5. package/dist/index.css.map +1 -1
  6. package/dist/index.min.css +1 -1
  7. package/dist/index.min.css.map +1 -1
  8. package/lib/errors.d.ts +1 -0
  9. package/lib/errors.js +11 -0
  10. package/lib/errors.js.map +1 -0
  11. package/lib/icons/Trash.d.ts +2 -0
  12. package/lib/icons/Trash.js +5 -0
  13. package/lib/icons/Trash.js.map +1 -0
  14. package/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.js +17 -1
  15. package/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.js.map +1 -1
  16. package/lib/seam/thermostats/thermostat-device.d.ts +2 -1
  17. package/lib/seam/thermostats/thermostat-device.js +1 -1
  18. package/lib/seam/thermostats/thermostat-device.js.map +1 -1
  19. package/lib/seam/thermostats/unit-conversion.d.ts +5 -2
  20. package/lib/seam/thermostats/unit-conversion.js +5 -2
  21. package/lib/seam/thermostats/unit-conversion.js.map +1 -1
  22. package/lib/seam/thermostats/use-create-thermostat-climate-preset.d.ts +6 -0
  23. package/lib/seam/thermostats/use-create-thermostat-climate-preset.js +55 -0
  24. package/lib/seam/thermostats/use-create-thermostat-climate-preset.js.map +1 -0
  25. package/lib/seam/thermostats/use-delete-thermostat-climate-preset.d.ts +6 -0
  26. package/lib/seam/thermostats/use-delete-thermostat-climate-preset.js +44 -0
  27. package/lib/seam/thermostats/use-delete-thermostat-climate-preset.js.map +1 -0
  28. package/lib/seam/thermostats/use-update-thermostat-climate-preset.d.ts +6 -0
  29. package/lib/seam/thermostats/use-update-thermostat-climate-preset.js +55 -0
  30. package/lib/seam/thermostats/use-update-thermostat-climate-preset.js.map +1 -0
  31. package/lib/ui/Button.d.ts +3 -2
  32. package/lib/ui/Button.js +12 -4
  33. package/lib/ui/Button.js.map +1 -1
  34. package/lib/ui/IconButton.d.ts +5 -2
  35. package/lib/ui/IconButton.js +2 -2
  36. package/lib/ui/IconButton.js.map +1 -1
  37. package/lib/ui/Popover/Popover.d.ts +17 -0
  38. package/lib/ui/Popover/Popover.js +85 -0
  39. package/lib/ui/Popover/Popover.js.map +1 -0
  40. package/lib/ui/Popover/PopoverContentPrompt.d.ts +11 -0
  41. package/lib/ui/Popover/PopoverContentPrompt.js +12 -0
  42. package/lib/ui/Popover/PopoverContentPrompt.js.map +1 -0
  43. package/lib/ui/thermostat/ClimateModeMenu.d.ts +7 -2
  44. package/lib/ui/thermostat/ClimateModeMenu.js +7 -2
  45. package/lib/ui/thermostat/ClimateModeMenu.js.map +1 -1
  46. package/lib/ui/thermostat/ClimatePreset.d.ts +8 -0
  47. package/lib/ui/thermostat/ClimatePreset.js +146 -0
  48. package/lib/ui/thermostat/ClimatePreset.js.map +1 -0
  49. package/lib/ui/thermostat/ClimatePresets.d.ts +9 -0
  50. package/lib/ui/thermostat/ClimatePresets.js +76 -0
  51. package/lib/ui/thermostat/ClimatePresets.js.map +1 -0
  52. package/lib/ui/thermostat/FanModeMenu.d.ts +3 -1
  53. package/lib/ui/thermostat/FanModeMenu.js +5 -2
  54. package/lib/ui/thermostat/FanModeMenu.js.map +1 -1
  55. package/lib/ui/thermostat/ThermostatCard.d.ts +1 -0
  56. package/lib/ui/thermostat/ThermostatCard.js +4 -2
  57. package/lib/ui/thermostat/ThermostatCard.js.map +1 -1
  58. package/lib/ui/types.d.ts +3 -3
  59. package/lib/version.d.ts +1 -1
  60. package/lib/version.js +1 -1
  61. package/package.json +3 -2
  62. package/src/lib/errors.ts +13 -0
  63. package/src/lib/icons/Trash.tsx +28 -0
  64. package/src/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.tsx +52 -1
  65. package/src/lib/seam/thermostats/thermostat-device.ts +6 -1
  66. package/src/lib/seam/thermostats/unit-conversion.ts +12 -2
  67. package/src/lib/seam/thermostats/use-create-thermostat-climate-preset.ts +101 -0
  68. package/src/lib/seam/thermostats/use-delete-thermostat-climate-preset.ts +84 -0
  69. package/src/lib/seam/thermostats/use-update-thermostat-climate-preset.ts +103 -0
  70. package/src/lib/ui/Button.tsx +20 -3
  71. package/src/lib/ui/IconButton.tsx +19 -2
  72. package/src/lib/ui/Popover/Popover.tsx +168 -0
  73. package/src/lib/ui/Popover/PopoverContentPrompt.tsx +58 -0
  74. package/src/lib/ui/thermostat/ClimateModeMenu.tsx +33 -1
  75. package/src/lib/ui/thermostat/ClimatePreset.tsx +401 -0
  76. package/src/lib/ui/thermostat/ClimatePresets.tsx +251 -0
  77. package/src/lib/ui/thermostat/FanModeMenu.tsx +20 -2
  78. package/src/lib/ui/thermostat/ThermostatCard.tsx +10 -4
  79. package/src/lib/ui/types.ts +3 -3
  80. package/src/lib/version.ts +1 -1
  81. package/src/styles/_buttons.scss +56 -2
  82. package/src/styles/_main.scss +2 -0
  83. package/src/styles/_popover.scss +46 -0
  84. package/src/styles/_spinner.scss +1 -1
  85. package/src/styles/_thermostat.scss +154 -2
@@ -1,5 +1,5 @@
1
- export const celsiusToFahrenheit = (t) => (t * 9) / 5 + 32;
2
- export const fahrenheitToCelsius = (t) => (t - 32) * (5 / 9);
1
+ export const celsiusToFahrenheit = (t) => (typeof t === 'number' ? (t * 9) / 5 + 32 : t);
2
+ export const fahrenheitToCelsius = (t) => (typeof t === 'number' ? (t - 32) * (5 / 9) : t);
3
3
  export const getCoolingSetPointCelsius = (variables, device) => {
4
4
  if (variables.cooling_set_point_celsius != null) {
5
5
  return variables.cooling_set_point_celsius;
@@ -40,4 +40,7 @@ export const getHeatingSetPointFahrenheit = (variables, device) => {
40
40
  return (device.properties.current_climate_setting?.heating_set_point_fahrenheit ??
41
41
  undefined);
42
42
  };
43
+ export function getTemperatureUnitSymbol(type) {
44
+ return type === 'fahrenheit' ? '°F' : '°C';
45
+ }
43
46
  //# sourceMappingURL=unit-conversion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"unit-conversion.js","sourceRoot":"","sources":["../../../src/lib/seam/thermostats/unit-conversion.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;AAE1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AAE5E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,SAGC,EACD,MAAc,EACM,EAAE;IACtB,IAAI,SAAS,CAAC,yBAAyB,IAAI,IAAI,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC,yBAAyB,CAAA;IAC5C,CAAC;IAED,IAAI,SAAS,CAAC,4BAA4B,IAAI,IAAI,EAAE,CAAC;QACnD,OAAO,mBAAmB,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;IACpE,CAAC;IAED,OAAO,CACL,MAAM,CAAC,UAAU,CAAC,uBAAuB,EAAE,yBAAyB;QACpE,SAAS,CACV,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,SAGC,EACD,MAAc,EACM,EAAE;IACtB,IAAI,SAAS,CAAC,4BAA4B,IAAI,IAAI,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC,4BAA4B,CAAA;IAC/C,CAAC;IAED,IAAI,SAAS,CAAC,yBAAyB,IAAI,IAAI,EAAE,CAAC;QAChD,OAAO,mBAAmB,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;IACjE,CAAC;IAED,OAAO,CACL,MAAM,CAAC,UAAU,CAAC,uBAAuB,EAAE,4BAA4B;QACvE,SAAS,CACV,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,SAGC,EACD,MAAc,EACM,EAAE;IACtB,IAAI,SAAS,CAAC,yBAAyB,IAAI,IAAI,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC,yBAAyB,CAAA;IAC5C,CAAC;IAED,IAAI,SAAS,CAAC,4BAA4B,IAAI,IAAI,EAAE,CAAC;QACnD,OAAO,mBAAmB,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;IACpE,CAAC;IAED,OAAO,CACL,MAAM,CAAC,UAAU,CAAC,uBAAuB,EAAE,yBAAyB;QACpE,SAAS,CACV,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,SAGC,EACD,MAAc,EACM,EAAE;IACtB,IAAI,SAAS,CAAC,4BAA4B,IAAI,IAAI,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC,4BAA4B,CAAA;IAC/C,CAAC;IAED,IAAI,SAAS,CAAC,yBAAyB,IAAI,IAAI,EAAE,CAAC;QAChD,OAAO,mBAAmB,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;IACjE,CAAC;IAED,OAAO,CACL,MAAM,CAAC,UAAU,CAAC,uBAAuB,EAAE,4BAA4B;QACvE,SAAS,CACV,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"unit-conversion.js","sourceRoot":"","sources":["../../../src/lib/seam/thermostats/unit-conversion.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAI,CAAI,EAAuB,EAAE,CAClE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAwB,CAAA;AAEvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAI,CAAI,EAAuB,EAAE,CAClE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAwB,CAAA;AAEzE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,SAGC,EACD,MAAc,EACM,EAAE;IACtB,IAAI,SAAS,CAAC,yBAAyB,IAAI,IAAI,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC,yBAAyB,CAAA;IAC5C,CAAC;IAED,IAAI,SAAS,CAAC,4BAA4B,IAAI,IAAI,EAAE,CAAC;QACnD,OAAO,mBAAmB,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;IACpE,CAAC;IAED,OAAO,CACL,MAAM,CAAC,UAAU,CAAC,uBAAuB,EAAE,yBAAyB;QACpE,SAAS,CACV,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,SAGC,EACD,MAAc,EACM,EAAE;IACtB,IAAI,SAAS,CAAC,4BAA4B,IAAI,IAAI,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC,4BAA4B,CAAA;IAC/C,CAAC;IAED,IAAI,SAAS,CAAC,yBAAyB,IAAI,IAAI,EAAE,CAAC;QAChD,OAAO,mBAAmB,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;IACjE,CAAC;IAED,OAAO,CACL,MAAM,CAAC,UAAU,CAAC,uBAAuB,EAAE,4BAA4B;QACvE,SAAS,CACV,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,SAGC,EACD,MAAc,EACM,EAAE;IACtB,IAAI,SAAS,CAAC,yBAAyB,IAAI,IAAI,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC,yBAAyB,CAAA;IAC5C,CAAC;IAED,IAAI,SAAS,CAAC,4BAA4B,IAAI,IAAI,EAAE,CAAC;QACnD,OAAO,mBAAmB,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;IACpE,CAAC;IAED,OAAO,CACL,MAAM,CAAC,UAAU,CAAC,uBAAuB,EAAE,yBAAyB;QACpE,SAAS,CACV,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,SAGC,EACD,MAAc,EACM,EAAE;IACtB,IAAI,SAAS,CAAC,4BAA4B,IAAI,IAAI,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC,4BAA4B,CAAA;IAC/C,CAAC;IAED,IAAI,SAAS,CAAC,yBAAyB,IAAI,IAAI,EAAE,CAAC;QAChD,OAAO,mBAAmB,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;IACjE,CAAC;IAED,OAAO,CACL,MAAM,CAAC,UAAU,CAAC,uBAAuB,EAAE,4BAA4B;QACvE,SAAS,CACV,CAAA;AACH,CAAC,CAAA;AAED,MAAM,UAAU,wBAAwB,CACtC,IAA8B;IAE9B,OAAO,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SeamHttpApiError, ThermostatsCreateClimatePresetBody } from '@seamapi/http/connect';
2
+ import { type UseMutationResult } from '@tanstack/react-query';
3
+ export type UseCreateThermostatClimatePresetParams = never;
4
+ export type UseCreateThermostatClimatePresetData = undefined;
5
+ export type UseCreateThermostatClimatePresetVariables = ThermostatsCreateClimatePresetBody;
6
+ export declare function useCreateThermostatClimatePreset(): UseMutationResult<UseCreateThermostatClimatePresetData, SeamHttpApiError, UseCreateThermostatClimatePresetVariables>;
@@ -0,0 +1,55 @@
1
+ import { useMutation, useQueryClient, } from '@tanstack/react-query';
2
+ import { fahrenheitToCelsius } from '../../../lib/seam/thermostats/unit-conversion.js';
3
+ import { NullSeamClientError, useSeamClient } from '../../../lib/seam/use-seam-client.js';
4
+ export function useCreateThermostatClimatePreset() {
5
+ const { client } = useSeamClient();
6
+ const queryClient = useQueryClient();
7
+ return useMutation({
8
+ mutationFn: async (variables) => {
9
+ if (client === null)
10
+ throw new NullSeamClientError();
11
+ await client.thermostats.createClimatePreset(variables);
12
+ },
13
+ onSuccess: (_data, variables) => {
14
+ queryClient.setQueryData(['devices', 'get', { device_id: variables.device_id }], (device) => {
15
+ if (device == null) {
16
+ return;
17
+ }
18
+ return getUpdatedDevice(device, variables);
19
+ });
20
+ queryClient.setQueryData(['devices', 'list', { device_id: variables.device_id }], (devices) => {
21
+ if (devices == null) {
22
+ return [];
23
+ }
24
+ return devices.map((device) => {
25
+ if (device.device_id === variables.device_id) {
26
+ return getUpdatedDevice(device, variables);
27
+ }
28
+ return device;
29
+ });
30
+ });
31
+ },
32
+ });
33
+ }
34
+ const getUpdatedDevice = (device, variables) => {
35
+ const preset = {
36
+ ...variables,
37
+ cooling_set_point_celsius: fahrenheitToCelsius(variables.cooling_set_point_fahrenheit),
38
+ heating_set_point_celsius: fahrenheitToCelsius(variables.heating_set_point_fahrenheit),
39
+ display_name: variables.name ?? variables.climate_preset_key,
40
+ can_delete: true,
41
+ can_edit: true,
42
+ manual_override_allowed: false,
43
+ };
44
+ return {
45
+ ...device,
46
+ properties: {
47
+ ...device.properties,
48
+ available_climate_presets: [
49
+ preset,
50
+ ...(device.properties.available_climate_presets ?? []),
51
+ ],
52
+ },
53
+ };
54
+ };
55
+ //# sourceMappingURL=use-create-thermostat-climate-preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-create-thermostat-climate-preset.js","sourceRoot":"","sources":["../../../src/lib/seam/thermostats/use-create-thermostat-climate-preset.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EAEX,cAAc,GACf,MAAM,uBAAuB,CAAA;AAM9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAQhF,MAAM,UAAU,gCAAgC;IAK9C,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,OAAO,WAAW,CAIhB;QACA,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAC9B,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,IAAI,mBAAmB,EAAE,CAAA;YACpD,MAAM,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;QACzD,CAAC;QACD,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YAC9B,WAAW,CAAC,YAAY,CACtB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,EACtD,CAAC,MAAM,EAAE,EAAE;gBACT,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBACnB,OAAM;gBACR,CAAC;gBAED,OAAO,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAC5C,CAAC,CACF,CAAA;YAED,WAAW,CAAC,YAAY,CACtB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,EACvD,CAAC,OAAO,EAAsB,EAAE;gBAC9B,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;oBACpB,OAAO,EAAE,CAAA;gBACX,CAAC;gBAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC5B,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC;wBAC7C,OAAO,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;oBAC5C,CAAC;oBAED,OAAO,MAAM,CAAA;gBACf,CAAC,CAAC,CAAA;YACJ,CAAC,CACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,gBAAgB,GAAG,CACvB,MAAwB,EACxB,SAAoD,EAClC,EAAE;IACpB,MAAM,MAAM,GAA4B;QACtC,GAAG,SAAS;QACZ,yBAAyB,EAAE,mBAAmB,CAC5C,SAAS,CAAC,4BAA4B,CACvC;QACD,yBAAyB,EAAE,mBAAmB,CAC5C,SAAS,CAAC,4BAA4B,CACvC;QACD,YAAY,EAAE,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,kBAAkB;QAC5D,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,uBAAuB,EAAE,KAAK;KAC/B,CAAA;IAED,OAAO;QACL,GAAG,MAAM;QACT,UAAU,EAAE;YACV,GAAG,MAAM,CAAC,UAAU;YACpB,yBAAyB,EAAE;gBACzB,MAAM;gBACN,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,yBAAyB,IAAI,EAAE,CAAC;aACvD;SACF;KACF,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { SeamHttpApiError, ThermostatsDeleteClimatePresetBody } from '@seamapi/http/connect';
2
+ import { type UseMutationResult } from '@tanstack/react-query';
3
+ export type UseDeleteThermostatClimatePresetParams = never;
4
+ export type UseDeleteThermostatClimatePresetData = undefined;
5
+ export type UseDeleteThermostatClimatePresetVariables = ThermostatsDeleteClimatePresetBody;
6
+ export declare function useDeleteThermostatClimatePreset(): UseMutationResult<UseDeleteThermostatClimatePresetData, SeamHttpApiError, UseDeleteThermostatClimatePresetVariables>;
@@ -0,0 +1,44 @@
1
+ import { useMutation, useQueryClient, } from '@tanstack/react-query';
2
+ import { NullSeamClientError, useSeamClient } from '../../../lib/seam/use-seam-client.js';
3
+ export function useDeleteThermostatClimatePreset() {
4
+ const { client } = useSeamClient();
5
+ const queryClient = useQueryClient();
6
+ return useMutation({
7
+ mutationFn: async (variables) => {
8
+ if (client === null)
9
+ throw new NullSeamClientError();
10
+ await client.thermostats.deleteClimatePreset(variables);
11
+ },
12
+ onSuccess: (_data, variables) => {
13
+ queryClient.setQueryData(['devices', 'get', { device_id: variables.device_id }], (device) => {
14
+ if (device == null) {
15
+ return;
16
+ }
17
+ return getUpdatedDevice(device, variables);
18
+ });
19
+ queryClient.setQueryData(['devices', 'list', { device_id: variables.device_id }], (devices) => {
20
+ if (devices == null) {
21
+ return [];
22
+ }
23
+ return devices.map((device) => {
24
+ if (device.device_id === variables.device_id) {
25
+ return getUpdatedDevice(device, variables);
26
+ }
27
+ return device;
28
+ });
29
+ });
30
+ },
31
+ });
32
+ }
33
+ function getUpdatedDevice(device, variables) {
34
+ return {
35
+ ...device,
36
+ properties: {
37
+ ...device.properties,
38
+ available_climate_presets: device.properties.available_climate_presets.filter((preset) => {
39
+ return preset.climate_preset_key !== variables.climate_preset_key;
40
+ }),
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=use-delete-thermostat-climate-preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-delete-thermostat-climate-preset.js","sourceRoot":"","sources":["../../../src/lib/seam/thermostats/use-delete-thermostat-climate-preset.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EAEX,cAAc,GACf,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAShF,MAAM,UAAU,gCAAgC;IAK9C,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,OAAO,WAAW,CAIhB;QACA,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAC9B,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,IAAI,mBAAmB,EAAE,CAAA;YACpD,MAAM,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;QACzD,CAAC;QACD,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YAC9B,WAAW,CAAC,YAAY,CACtB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,EACtD,CAAC,MAAM,EAAE,EAAE;gBACT,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBACnB,OAAM;gBACR,CAAC;gBAED,OAAO,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAC5C,CAAC,CACF,CAAA;YAED,WAAW,CAAC,YAAY,CACtB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,EACvD,CAAC,OAAO,EAAsB,EAAE;gBAC9B,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;oBACpB,OAAO,EAAE,CAAA;gBACX,CAAC;gBAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC5B,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC;wBAC7C,OAAO,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;oBAC5C,CAAC;oBAED,OAAO,MAAM,CAAA;gBACf,CAAC,CAAC,CAAA;YACJ,CAAC,CACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,MAAwB,EACxB,SAAoD;IAEpD,OAAO;QACL,GAAG,MAAM;QACT,UAAU,EAAE;YACV,GAAG,MAAM,CAAC,UAAU;YACpB,yBAAyB,EACvB,MAAM,CAAC,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC5D,OAAO,MAAM,CAAC,kBAAkB,KAAK,SAAS,CAAC,kBAAkB,CAAA;YACnE,CAAC,CAAC;SACL;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SeamHttpApiError, ThermostatsUpdateClimatePresetBody } from '@seamapi/http/connect';
2
+ import { type UseMutationResult } from '@tanstack/react-query';
3
+ export type UseUpdateThermostatClimatePresetParams = never;
4
+ export type UseUpdateThermostatClimatePresetData = undefined;
5
+ export type UseUpdateThermostatClimatePresetVariables = Omit<ThermostatsUpdateClimatePresetBody, 'manual_override_allowed'>;
6
+ export declare function useUpdateThermostatClimatePreset(): UseMutationResult<UseUpdateThermostatClimatePresetData, SeamHttpApiError, UseUpdateThermostatClimatePresetVariables>;
@@ -0,0 +1,55 @@
1
+ import { useMutation, useQueryClient, } from '@tanstack/react-query';
2
+ import { fahrenheitToCelsius } from '../../../lib/seam/thermostats/unit-conversion.js';
3
+ import { NullSeamClientError, useSeamClient } from '../../../lib/seam/use-seam-client.js';
4
+ export function useUpdateThermostatClimatePreset() {
5
+ const { client } = useSeamClient();
6
+ const queryClient = useQueryClient();
7
+ return useMutation({
8
+ mutationFn: async (variables) => {
9
+ if (client === null)
10
+ throw new NullSeamClientError();
11
+ await client.thermostats.createClimatePreset(variables);
12
+ },
13
+ onSuccess: (_data, variables) => {
14
+ queryClient.setQueryData(['devices', 'get', { device_id: variables.device_id }], (device) => {
15
+ if (device == null) {
16
+ return;
17
+ }
18
+ return getUpdatedDevice(device, variables);
19
+ });
20
+ queryClient.setQueryData(['devices', 'list', { device_id: variables.device_id }], (devices) => {
21
+ if (devices == null) {
22
+ return [];
23
+ }
24
+ return devices.map((device) => {
25
+ if (device.device_id === variables.device_id) {
26
+ return getUpdatedDevice(device, variables);
27
+ }
28
+ return device;
29
+ });
30
+ });
31
+ },
32
+ });
33
+ }
34
+ function getUpdatedDevice(device, variables) {
35
+ const preset = {
36
+ ...variables,
37
+ cooling_set_point_celsius: fahrenheitToCelsius(variables.cooling_set_point_fahrenheit),
38
+ heating_set_point_celsius: fahrenheitToCelsius(variables.heating_set_point_fahrenheit),
39
+ display_name: variables.name ?? variables.climate_preset_key,
40
+ can_delete: true,
41
+ can_edit: true,
42
+ manual_override_allowed: true,
43
+ };
44
+ return {
45
+ ...device,
46
+ properties: {
47
+ ...device.properties,
48
+ available_climate_presets: [
49
+ preset,
50
+ ...(device.properties.available_climate_presets ?? []),
51
+ ],
52
+ },
53
+ };
54
+ }
55
+ //# sourceMappingURL=use-update-thermostat-climate-preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-update-thermostat-climate-preset.js","sourceRoot":"","sources":["../../../src/lib/seam/thermostats/use-update-thermostat-climate-preset.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EAEX,cAAc,GACf,MAAM,uBAAuB,CAAA;AAM9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAUhF,MAAM,UAAU,gCAAgC;IAK9C,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,OAAO,WAAW,CAIhB;QACA,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAC9B,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,IAAI,mBAAmB,EAAE,CAAA;YACpD,MAAM,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;QACzD,CAAC;QACD,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YAC9B,WAAW,CAAC,YAAY,CACtB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,EACtD,CAAC,MAAM,EAAE,EAAE;gBACT,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBACnB,OAAM;gBACR,CAAC;gBAED,OAAO,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAC5C,CAAC,CACF,CAAA;YAED,WAAW,CAAC,YAAY,CACtB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,EACvD,CAAC,OAAO,EAAsB,EAAE;gBAC9B,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;oBACpB,OAAO,EAAE,CAAA;gBACX,CAAC;gBAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC5B,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC;wBAC7C,OAAO,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;oBAC5C,CAAC;oBAED,OAAO,MAAM,CAAA;gBACf,CAAC,CAAC,CAAA;YACJ,CAAC,CACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,MAAwB,EACxB,SAAoD;IAEpD,MAAM,MAAM,GAA4B;QACtC,GAAG,SAAS;QACZ,yBAAyB,EAAE,mBAAmB,CAC5C,SAAS,CAAC,4BAA4B,CACvC;QACD,yBAAyB,EAAE,mBAAmB,CAC5C,SAAS,CAAC,4BAA4B,CACvC;QACD,YAAY,EAAE,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,kBAAkB;QAC5D,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,uBAAuB,EAAE,IAAI;KAC9B,CAAA;IAED,OAAO;QACL,GAAG,MAAM;QACT,UAAU,EAAE;YACV,GAAG,MAAM,CAAC,UAAU;YACpB,yBAAyB,EAAE;gBACzB,MAAM;gBACN,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,yBAAyB,IAAI,EAAE,CAAC;aACvD;SACF;KACF,CAAA;AACH,CAAC"}
@@ -1,12 +1,13 @@
1
1
  import type { MouseEventHandler, PropsWithChildren } from 'react';
2
2
  interface ButtonProps extends PropsWithChildren {
3
- variant?: 'solid' | 'outline' | 'neutral';
3
+ variant?: 'solid' | 'outline' | 'neutral' | 'danger';
4
4
  size?: 'small' | 'medium' | 'large';
5
5
  type?: 'button' | 'submit';
6
6
  disabled?: boolean;
7
7
  onClick?: MouseEventHandler<HTMLButtonElement>;
8
8
  className?: string;
9
9
  onMouseDown?: MouseEventHandler<HTMLButtonElement>;
10
+ loading?: boolean;
10
11
  }
11
- export declare function Button({ variant, children, size, disabled, onClick, className, onMouseDown, type, }: ButtonProps): JSX.Element;
12
+ export declare function Button({ variant, children, size, disabled, onClick, className, onMouseDown, type, loading, }: ButtonProps): JSX.Element;
12
13
  export {};
package/lib/ui/Button.js CHANGED
@@ -1,8 +1,16 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import classNames from 'classnames';
3
- export function Button({ variant = 'outline', children, size = 'medium', disabled = false, onClick, className, onMouseDown, type = 'button', }) {
4
- return (_jsx("button", { className: classNames(`seam-btn seam-btn-${variant} seam-btn-${size}`, {
3
+ import { Spinner } from '../../lib/ui/Spinner/Spinner.js';
4
+ export function Button({ variant = 'outline', children, size = 'medium', disabled = false, onClick, className, onMouseDown, type = 'button', loading = false, }) {
5
+ return (_jsxs("button", { className: classNames(`seam-btn seam-btn-${variant} seam-btn-${size}`, {
5
6
  'seam-btn-disabled': disabled,
6
- }, className), disabled: disabled, onClick: onClick, onMouseDown: onMouseDown, type: type, children: children }));
7
+ 'seam-btn-loading': loading,
8
+ }, className), disabled: disabled, onClick: (e) => {
9
+ if (loading || disabled) {
10
+ e.preventDefault();
11
+ return;
12
+ }
13
+ onClick?.(e);
14
+ }, onMouseDown: onMouseDown, type: type, children: [_jsx("span", { className: 'seam-btn-content', children: children }), loading && (_jsx("div", { className: 'seam-btn-loading', children: _jsx(Spinner, { size: 'small' }) }))] }));
7
15
  }
8
16
  //# sourceMappingURL=Button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../src/lib/ui/Button.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAanC,MAAM,UAAU,MAAM,CAAC,EACrB,OAAO,GAAG,SAAS,EACnB,QAAQ,EACR,IAAI,GAAG,QAAQ,EACf,QAAQ,GAAG,KAAK,EAChB,OAAO,EACP,SAAS,EACT,WAAW,EACX,IAAI,GAAG,QAAQ,GACH;IACZ,OAAO,CACL,iBACE,SAAS,EAAE,UAAU,CACnB,qBAAqB,OAAO,aAAa,IAAI,EAAE,EAC/C;YACE,mBAAmB,EAAE,QAAQ;SAC9B,EACD,SAAS,CACV,EACD,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,YAET,QAAQ,GACF,CACV,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../src/lib/ui/Button.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAGnC,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAanD,MAAM,UAAU,MAAM,CAAC,EACrB,OAAO,GAAG,SAAS,EACnB,QAAQ,EACR,IAAI,GAAG,QAAQ,EACf,QAAQ,GAAG,KAAK,EAChB,OAAO,EACP,SAAS,EACT,WAAW,EACX,IAAI,GAAG,QAAQ,EACf,OAAO,GAAG,KAAK,GACH;IACZ,OAAO,CACL,kBACE,SAAS,EAAE,UAAU,CACnB,qBAAqB,OAAO,aAAa,IAAI,EAAE,EAC/C;YACE,mBAAmB,EAAE,QAAQ;YAC7B,kBAAkB,EAAE,OAAO;SAC5B,EACD,SAAS,CACV,EACD,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACb,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;gBACxB,CAAC,CAAC,cAAc,EAAE,CAAA;gBAClB,OAAM;YACR,CAAC;YAED,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QACd,CAAC,EACD,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,aAEV,eAAM,SAAS,EAAC,kBAAkB,YAAE,QAAQ,GAAQ,EACnD,OAAO,IAAI,CACV,cAAK,SAAS,EAAC,kBAAkB,YAC/B,KAAC,OAAO,IAAC,IAAI,EAAC,OAAO,GAAG,GACpB,CACP,IACM,CACV,CAAA;AACH,CAAC"}
@@ -1,3 +1,6 @@
1
- /// <reference types="react" />
1
+ import type { Ref } from 'react';
2
2
  import type { ButtonProps } from '../../lib/ui/types.js';
3
- export declare function IconButton({ className, ...props }: ButtonProps): JSX.Element;
3
+ export type IconProps = ButtonProps & {
4
+ elRef?: Ref<HTMLButtonElement>;
5
+ };
6
+ export declare function IconButton({ className, elRef, ...props }: IconProps): JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import classNames from 'classnames';
3
- export function IconButton({ className, ...props }) {
4
- return (_jsx("button", { ...props, className: classNames('seam-icon-btn', className) }));
3
+ export function IconButton({ className, elRef, ...props }) {
4
+ return (_jsx("button", { ...props, ref: elRef, className: classNames('seam-icon-btn', props.disabled === true && 'seam-icon-btn-disabled', className) }));
5
5
  }
6
6
  //# sourceMappingURL=IconButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../../src/lib/ui/IconButton.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAInC,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAe;IAC7D,OAAO,CACL,oBAAY,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,eAAe,EAAE,SAAS,CAAC,GAAI,CACzE,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../../src/lib/ui/IconButton.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AASnC,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACE;IACV,OAAO,CACL,oBACM,KAAK,EACT,GAAG,EAAE,KAAK,EACV,SAAS,EAAE,UAAU,CACnB,eAAe,EACf,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,wBAAwB,EACnD,SAAS,CACV,GACD,CACH,CAAA;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type ReactNode, type Ref } from 'react';
2
+ export interface PopoverInstance {
3
+ show: () => void;
4
+ hide: () => void;
5
+ toggle: () => void;
6
+ }
7
+ type PopoverChildren = (params: {
8
+ setRef: (ref: HTMLElement | undefined | null) => void;
9
+ } & PopoverInstance) => ReactNode;
10
+ export interface PopoverProps {
11
+ children: PopoverChildren;
12
+ content: ReactNode | ((instance: PopoverInstance) => ReactNode);
13
+ instanceRef?: Ref<PopoverInstance>;
14
+ preventCloseOnClickOutside?: boolean;
15
+ }
16
+ export declare function Popover(props: PopoverProps): JSX.Element;
17
+ export {};
@@ -0,0 +1,85 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { autoUpdate, flip, limitShift, offset, shift, useFloating, } from '@floating-ui/react';
3
+ import { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, } from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { seamComponentsClassName } from '../../../lib/seam/SeamProvider.js';
6
+ export function Popover(props) {
7
+ const { children, content, instanceRef, preventCloseOnClickOutside } = props;
8
+ const [open, setOpen] = useState(false);
9
+ const { refs, floatingStyles } = useFloating({
10
+ whileElementsMounted: autoUpdate,
11
+ transform: false,
12
+ open,
13
+ onOpenChange: setOpen,
14
+ placement: 'bottom',
15
+ middleware: [
16
+ shift({
17
+ crossAxis: true,
18
+ limiter: limitShift(),
19
+ }),
20
+ flip(),
21
+ offset(5),
22
+ ],
23
+ });
24
+ const referenceEl = useRef();
25
+ const floatingEl = useRef();
26
+ const setFLoating = useCallback((ref) => {
27
+ refs.setFloating(ref);
28
+ floatingEl.current = ref;
29
+ }, [refs, floatingEl]);
30
+ const toggle = useCallback(() => {
31
+ setOpen((value) => !value);
32
+ }, []);
33
+ const instance = useMemo(() => ({
34
+ show: () => {
35
+ setOpen(true);
36
+ },
37
+ hide: () => {
38
+ setOpen(false);
39
+ },
40
+ toggle,
41
+ }), [toggle]);
42
+ const setReference = useCallback((ref) => {
43
+ if (!(ref instanceof HTMLElement) || referenceEl.current === ref)
44
+ return;
45
+ if (referenceEl.current != null) {
46
+ referenceEl.current.removeEventListener('click', toggle);
47
+ }
48
+ refs.setReference(ref);
49
+ ref.addEventListener('click', toggle);
50
+ referenceEl.current = ref;
51
+ }, [toggle, refs]);
52
+ useImperativeHandle(instanceRef, () => instance);
53
+ /**
54
+ * Closes the popover when the user clicks outside of it.
55
+ */
56
+ const windowClickHandler = useCallback((e) => {
57
+ const target = e.target;
58
+ // If the target is the reference element, do nothing.
59
+ if (referenceEl.current === target ||
60
+ referenceEl.current?.contains(target) === true) {
61
+ return;
62
+ }
63
+ const closest = target.closest('[data-seam-popover]');
64
+ // Prevents closing if target is floating element, also adds support for nested popovers somehow :)
65
+ if (closest != null &&
66
+ referenceEl.current != null &&
67
+ !closest.contains(referenceEl.current)) {
68
+ return;
69
+ }
70
+ setOpen(false);
71
+ }, []);
72
+ useEffect(() => {
73
+ setTimeout(() => {
74
+ if (preventCloseOnClickOutside === false)
75
+ return;
76
+ globalThis.addEventListener('click', windowClickHandler);
77
+ }, 0);
78
+ return () => {
79
+ globalThis.removeEventListener('click', windowClickHandler);
80
+ };
81
+ }, [windowClickHandler, preventCloseOnClickOutside]);
82
+ return (_jsxs(_Fragment, { children: [children({ setRef: setReference, ...instance }), open &&
83
+ createPortal(_jsx("div", { className: seamComponentsClassName, "data-seam-popover": '', ref: setFLoating, style: floatingStyles, children: _jsx("div", { className: 'seam-popover', children: typeof content === 'function' ? content(instance) : content }) }), globalThis.document.body)] }));
84
+ }
85
+ //# sourceMappingURL=Popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.js","sourceRoot":"","sources":["../../../src/lib/ui/Popover/Popover.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ export interface PopoverContentPromptProps {
3
+ onConfirm?: () => void;
4
+ onCancel?: () => void;
5
+ prompt?: string;
6
+ description?: string;
7
+ confirmText?: string;
8
+ cancelText?: string;
9
+ confirmLoading?: boolean;
10
+ }
11
+ export declare function PopoverContentPrompt(props: PopoverContentPromptProps): JSX.Element;
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from '../../../lib/ui/Button.js';
3
+ export function PopoverContentPrompt(props) {
4
+ const { confirmText = t.confirm, cancelText = t.cancel, confirmLoading = false, prompt = t.areYouSure, description, onConfirm, onCancel, } = props;
5
+ return (_jsxs("div", { className: 'seam-popover-content-prompt', children: [_jsxs("div", { children: [_jsx("div", { className: 'seam-popover-content-prompt-text', children: prompt }), description != null && (_jsx("div", { className: 'seam-popover-content-prompt-description', children: description }))] }), _jsxs("div", { className: 'seam-popover-content-prompt-buttons', children: [_jsx(Button, { variant: 'solid', onClick: onConfirm, loading: confirmLoading, size: 'small', children: confirmText }), _jsx(Button, { variant: 'danger', size: 'small', onClick: onCancel, children: cancelText })] })] }));
6
+ }
7
+ const t = {
8
+ confirm: 'Confirm',
9
+ cancel: 'Cancel',
10
+ areYouSure: 'Are you sure?',
11
+ };
12
+ //# sourceMappingURL=PopoverContentPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PopoverContentPrompt.js","sourceRoot":"","sources":["../../../src/lib/ui/Popover/PopoverContentPrompt.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAYzC,MAAM,UAAU,oBAAoB,CAClC,KAAgC;IAEhC,MAAM,EACJ,WAAW,GAAG,CAAC,CAAC,OAAO,EACvB,UAAU,GAAG,CAAC,CAAC,MAAM,EACrB,cAAc,GAAG,KAAK,EACtB,MAAM,GAAG,CAAC,CAAC,UAAU,EACrB,WAAW,EACX,SAAS,EACT,QAAQ,GACT,GAAG,KAAK,CAAA;IAET,OAAO,CACL,eAAK,SAAS,EAAC,6BAA6B,aAC1C,0BACE,cAAK,SAAS,EAAC,kCAAkC,YAAE,MAAM,GAAO,EAC/D,WAAW,IAAI,IAAI,IAAI,CACtB,cAAK,SAAS,EAAC,yCAAyC,YACrD,WAAW,GACR,CACP,IACG,EACN,eAAK,SAAS,EAAC,qCAAqC,aAClD,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,cAAc,EACvB,IAAI,EAAC,OAAO,YAEX,WAAW,GACL,EAET,KAAC,MAAM,IAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,QAAQ,YACpD,UAAU,GACJ,IACL,IACF,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,eAAe;CAC5B,CAAA"}
@@ -1,9 +1,14 @@
1
- /// <reference types="react" />
1
+ import type { CSSProperties } from 'react';
2
2
  import type { HvacModeSetting } from '../../../lib/seam/thermostats/thermostat-device.js';
3
3
  interface ClimateModeMenuProps {
4
4
  mode: HvacModeSetting;
5
5
  onChange: (mode: HvacModeSetting) => void;
6
6
  supportedModes?: HvacModeSetting[];
7
+ buttonTextVisible?: boolean;
8
+ className?: string;
9
+ style?: CSSProperties;
10
+ block?: boolean;
11
+ size?: 'regular' | 'large';
7
12
  }
8
- export declare function ClimateModeMenu({ mode, onChange, supportedModes, }: ClimateModeMenuProps): JSX.Element;
13
+ export declare function ClimateModeMenu({ mode, onChange, supportedModes, buttonTextVisible, className, style, block, size, }: ClimateModeMenuProps): JSX.Element;
9
14
  export {};
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import classNames from 'classnames';
2
3
  import { ChevronDownIcon } from '../../../lib/icons/ChevronDown.js';
3
4
  import { OffIcon } from '../../../lib/icons/Off.js';
4
5
  import { ThermostatCoolIcon } from '../../../lib/icons/ThermostatCool.js';
@@ -6,8 +7,12 @@ import { ThermostatHeatIcon } from '../../../lib/icons/ThermostatHeat.js';
6
7
  import { ThermostatHeatCoolIcon } from '../../../lib/icons/ThermostatHeatCool.js';
7
8
  import { Menu } from '../../../lib/ui/Menu/Menu.js';
8
9
  import { ThermoModeMenuOption } from '../../../lib/ui/thermostat/ThermoModeMenuOption.js';
9
- export function ClimateModeMenu({ mode, onChange, supportedModes = ['heat', 'cool', 'heat_cool', 'off'], }) {
10
- return (_jsx(Menu, { renderButton: ({ onOpen }) => (_jsxs("button", { onClick: onOpen, className: 'seam-climate-mode-menu-button', children: [_jsx("div", { className: 'seam-climate-mode-menu-button-icon', children: _jsx(ModeIcon, { mode: mode }) }), _jsx(ChevronDownIcon, { className: 'seam-climate-mode-menu-button-chevron' })] })), verticalOffset: -180, horizontalOffset: -32, backgroundProps: {
10
+ export function ClimateModeMenu({ mode, onChange, supportedModes = ['heat', 'cool', 'heat_cool', 'off'], buttonTextVisible = false, className, style, block, size = 'regular', }) {
11
+ return (_jsx(Menu, { renderButton: ({ onOpen }) => (_jsxs("button", { style: style, onClick: onOpen, className: classNames('seam-climate-mode-menu-button', {
12
+ 'seam-climate-mode-menu-button-block': block,
13
+ 'seam-climate-mode-menu-button-regular': size === 'regular',
14
+ 'seam-climate-mode-menu-button-large': size === 'large',
15
+ }, className), children: [_jsx("div", { className: 'seam-climate-mode-menu-button-icon', children: _jsx(ModeIcon, { mode: mode }) }), buttonTextVisible && (_jsx("span", { className: 'seam-climate-mode-menu-button-text', children: t[mode] })), _jsx(ChevronDownIcon, { className: 'seam-climate-mode-menu-button-chevron' })] })), verticalOffset: -180, horizontalOffset: -32, backgroundProps: {
11
16
  className: 'seam-thermo-mode-menu',
12
17
  }, children: supportedModes.map((m) => (_jsx(ThermoModeMenuOption, { label: t[m], icon: _jsx(ModeIcon, { mode: m }), isSelected: mode === m, onClick: () => {
13
18
  onChange(m);
@@ -1 +1 @@
1
- {"version":3,"file":"ClimateModeMenu.js","sourceRoot":"","sources":["../../../src/lib/ui/thermostat/ClimateModeMenu.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AAExE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAQhF,MAAM,UAAU,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,GAChC;IACrB,OAAO,CACL,KAAC,IAAI,IACH,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAC5B,kBAAQ,OAAO,EAAE,MAAM,EAAE,SAAS,EAAC,+BAA+B,aAChE,cAAK,SAAS,EAAC,oCAAoC,YACjD,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,GAAI,GACpB,EACN,KAAC,eAAe,IAAC,SAAS,EAAC,uCAAuC,GAAG,IAC9D,CACV,EACD,cAAc,EAAE,CAAC,GAAG,EACpB,gBAAgB,EAAE,CAAC,EAAE,EACrB,eAAe,EAAE;YACf,SAAS,EAAE,uBAAuB;SACnC,YAEA,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACzB,KAAC,oBAAoB,IAEnB,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EACX,IAAI,EAAE,KAAC,QAAQ,IAAC,IAAI,EAAE,CAAC,GAAI,EAC3B,UAAU,EAAE,IAAI,KAAK,CAAC,EACtB,OAAO,EAAE,GAAG,EAAE;gBACZ,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,CAAC,IANI,CAAC,CAON,CACH,CAAC,GACG,CACR,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAgC;IAChD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,KAAC,kBAAkB,KAAG,CAAA;QAC/B,KAAK,MAAM;YACT,OAAO,KAAC,kBAAkB,KAAG,CAAA;QAC/B,KAAK,WAAW;YACd,OAAO,KAAC,sBAAsB,KAAG,CAAA;QACnC,KAAK,KAAK;YACR,OAAO,KAAC,OAAO,KAAG,CAAA;IACtB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,aAAa;IACxB,GAAG,EAAE,KAAK;CACX,CAAA"}
1
+ {"version":3,"file":"ClimateModeMenu.js","sourceRoot":"","sources":["../../../src/lib/ui/thermostat/ClimateModeMenu.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAGnC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AAExE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAahF,MAAM,UAAU,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,EACrD,iBAAiB,GAAG,KAAK,EACzB,SAAS,EACT,KAAK,EACL,KAAK,EACL,IAAI,GAAG,SAAS,GACK;IACrB,OAAO,CACL,KAAC,IAAI,IACH,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAC5B,kBACE,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,UAAU,CACnB,+BAA+B,EAC/B;gBACE,qCAAqC,EAAE,KAAK;gBAC5C,uCAAuC,EAAE,IAAI,KAAK,SAAS;gBAC3D,qCAAqC,EAAE,IAAI,KAAK,OAAO;aACxD,EACD,SAAS,CACV,aAED,cAAK,SAAS,EAAC,oCAAoC,YACjD,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,GAAI,GACpB,EAEL,iBAAiB,IAAI,CACpB,eAAM,SAAS,EAAC,oCAAoC,YACjD,CAAC,CAAC,IAAI,CAAC,GACH,CACR,EAED,KAAC,eAAe,IAAC,SAAS,EAAC,uCAAuC,GAAG,IAC9D,CACV,EACD,cAAc,EAAE,CAAC,GAAG,EACpB,gBAAgB,EAAE,CAAC,EAAE,EACrB,eAAe,EAAE;YACf,SAAS,EAAE,uBAAuB;SACnC,YAEA,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACzB,KAAC,oBAAoB,IAEnB,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EACX,IAAI,EAAE,KAAC,QAAQ,IAAC,IAAI,EAAE,CAAC,GAAI,EAC3B,UAAU,EAAE,IAAI,KAAK,CAAC,EACtB,OAAO,EAAE,GAAG,EAAE;gBACZ,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,CAAC,IANI,CAAC,CAON,CACH,CAAC,GACG,CACR,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAgC;IAChD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,KAAC,kBAAkB,KAAG,CAAA;QAC/B,KAAK,MAAM;YACT,OAAO,KAAC,kBAAkB,KAAG,CAAA;QAC/B,KAAK,WAAW;YACd,OAAO,KAAC,sBAAsB,KAAG,CAAA;QACnC,KAAK,KAAK;YACR,OAAO,KAAC,OAAO,KAAG,CAAA;IACtB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,aAAa;IACxB,GAAG,EAAE,KAAK;CACX,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { type HTMLAttributes } from 'react';
2
+ import type { ThermostatClimatePreset, ThermostatDevice } from '../../../lib/seam/thermostats/thermostat-device.js';
3
+ export type ClimatePresetProps = {
4
+ preset?: ThermostatClimatePreset;
5
+ onBack: () => void;
6
+ device: ThermostatDevice;
7
+ } & Omit<HTMLAttributes<HTMLDivElement>, 'children'>;
8
+ export declare function ClimatePreset(props: ClimatePresetProps): JSX.Element;