@seamapi/react 2.11.0 → 2.12.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.
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import classNames from 'classnames';
3
3
  import { useState } from 'react';
4
4
  import { ArrowRightIcon } from '../../../../lib/icons/ArrowRight.js';
@@ -6,17 +6,21 @@ import { ClimateSettingScheduleCard } from '../../../../lib/seam/components/Clim
6
6
  import { withRequiredCommonProps, } from '../../../../lib/seam/components/common-props.js';
7
7
  import { NestedDeviceDetails } from '../../../../lib/seam/components/DeviceDetails/DeviceDetails.js';
8
8
  import { useClimateSettingSchedule } from '../../../../lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedule.js';
9
+ import { useUpdateClimateSettingSchedule } from '../../../../lib/seam/thermostats/climate-setting-schedules/use-update-climate-setting-schedule.js';
9
10
  import { useComponentTelemetry } from '../../../../lib/telemetry/index.js';
10
11
  import { ContentHeader } from '../../../../lib/ui/layout/ContentHeader.js';
11
12
  import { DetailRow } from '../../../../lib/ui/layout/DetailRow.js';
12
13
  import { DetailSection } from '../../../../lib/ui/layout/DetailSection.js';
13
14
  import { DetailSectionGroup } from '../../../../lib/ui/layout/DetailSectionGroup.js';
15
+ import { Snackbar } from '../../../../lib/ui/Snackbar/Snackbar.js';
16
+ import { Switch } from '../../../../lib/ui/Switch/Switch.js';
14
17
  import { ClimateSettingStatus } from '../../../../lib/ui/thermostat/ClimateSettingStatus.js';
15
18
  import { formatDateTime } from './dates.js';
16
19
  export const NestedClimateSettingScheduleDetails = withRequiredCommonProps(ClimateSettingScheduleDetails);
17
20
  export function ClimateSettingScheduleDetails({ climateSettingScheduleId, disableLockUnlock = false, disableDeleteAccessCode = false, onBack, className, errorFilter = () => true, warningFilter = () => true, disableCreateAccessCode, disableEditAccessCode, disableResourceIds = false, disableClimateSettingSchedules, }) {
18
21
  useComponentTelemetry('ClimateSettingScheduleDetails');
19
22
  const { climateSettingSchedule } = useClimateSettingSchedule(climateSettingScheduleId);
23
+ const { mutate, isSuccess, isError } = useUpdateClimateSettingSchedule();
20
24
  const [selectedDeviceId, selectDevice] = useState(null);
21
25
  if (climateSettingSchedule == null) {
22
26
  return null;
@@ -27,7 +31,12 @@ export function ClimateSettingScheduleDetails({ climateSettingScheduleId, disabl
27
31
  selectDevice(null);
28
32
  }, className: className }));
29
33
  }
30
- return (_jsxs("div", { className: classNames('seam-climate-setting-schedule-details', className), children: [_jsx(ContentHeader, { title: t.climateSettingSchedule, onBack: onBack }), _jsxs("div", { className: 'seam-climate-setting-schedule-details-content', children: [_jsx(ClimateSettingScheduleCard, { climateSettingScheduleId: climateSettingScheduleId, onSelectDevice: selectDevice }), _jsx("div", { className: 'seam-default-setting-message-container', children: _jsxs("span", { className: 'seam-default-setting-message', children: [t.defaultSettingMessagePart1, ' ', _jsx("span", { className: 'seam-default-setting-text', children: t.defaultSetting }), ' ', t.defaultSettingMessagePart2] }) }), _jsxs(DetailSectionGroup, { children: [_jsxs(DetailSection, { children: [_jsx(DetailRow, { label: t.startEndTime, children: _jsxs("span", { className: 'seam-climate-setting-details-value seam-climate-setting-details-schedule-range', children: [formatDateTime(climateSettingSchedule.schedule_starts_at), _jsx(ArrowRightIcon, {}), formatDateTime(climateSettingSchedule.schedule_ends_at)] }) }), _jsx(DetailRow, { label: t.climateSetting, children: _jsx(ClimateSettingStatus, { climateSetting: climateSettingSchedule, iconPlacement: 'right' }) }), _jsx(DetailRow, { label: t.allowManualOverride, children: _jsx("span", { className: 'seam-climate-setting-details-value', children: isManualOverrideAllowed ? t.on : t.off }) })] }), _jsx(DetailSection, { children: _jsx(DetailRow, { label: t.creationDate, children: _jsx("div", { className: 'seam-creation-date', children: formatDateTime(climateSettingSchedule.created_at) }) }) })] })] })] }));
34
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: classNames('seam-climate-setting-schedule-details', className), children: [_jsx(ContentHeader, { title: t.climateSettingSchedule, onBack: onBack }), _jsxs("div", { className: 'seam-climate-setting-schedule-details-content', children: [_jsx(ClimateSettingScheduleCard, { climateSettingScheduleId: climateSettingScheduleId, onSelectDevice: selectDevice }), _jsx("div", { className: 'seam-default-setting-message-container', children: _jsxs("span", { className: 'seam-default-setting-message', children: [t.defaultSettingMessagePart1, ' ', _jsx("span", { className: 'seam-default-setting-text', children: t.defaultSetting }), ' ', t.defaultSettingMessagePart2] }) }), _jsxs(DetailSectionGroup, { children: [_jsxs(DetailSection, { children: [_jsx(DetailRow, { label: t.startEndTime, children: _jsxs("span", { className: 'seam-climate-setting-details-value seam-climate-setting-details-schedule-range', children: [formatDateTime(climateSettingSchedule.schedule_starts_at), _jsx(ArrowRightIcon, {}), formatDateTime(climateSettingSchedule.schedule_ends_at)] }) }), _jsx(DetailRow, { label: t.climateSetting, children: _jsx(ClimateSettingStatus, { climateSetting: climateSettingSchedule, iconPlacement: 'right' }) }), _jsx(DetailRow, { label: t.allowManualOverride, children: _jsx("span", { className: 'seam-climate-setting-details-value', children: _jsx(Switch, { checked: isManualOverrideAllowed, onChange: (checked) => {
35
+ mutate({
36
+ climate_setting_schedule_id: climateSettingSchedule.climate_setting_schedule_id,
37
+ manual_override_allowed: checked,
38
+ });
39
+ } }) }) })] }), _jsx(DetailSection, { children: _jsx(DetailRow, { label: t.creationDate, children: _jsx("div", { className: 'seam-creation-date', children: formatDateTime(climateSettingSchedule.created_at) }) }) })] })] })] }), _jsx(Snackbar, { message: t.manualOverrideSuccess, variant: 'success', visible: isSuccess, automaticVisibility: true }), _jsx(Snackbar, { message: t.manualOverrideError, variant: 'error', visible: isError, automaticVisibility: true })] }));
31
40
  }
32
41
  const t = {
33
42
  climateSettingSchedule: 'Climate setting schedule',
@@ -38,7 +47,7 @@ const t = {
38
47
  defaultSettingMessagePart1: 'Thermostat will return to its',
39
48
  defaultSetting: 'default setting',
40
49
  defaultSettingMessagePart2: 'at end time.',
41
- on: 'On',
42
- off: 'Off',
50
+ manualOverrideSuccess: 'Successfully updated manual override!',
51
+ manualOverrideError: 'Error updating manual override. Please try again.',
43
52
  };
44
53
  //# sourceMappingURL=ClimateSettingScheduleDetails.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClimateSettingScheduleDetails.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iFAAiF,CAAA;AAC5H,OAAO,EAEL,uBAAuB,GACxB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAA;AACxF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gFAAgF,CAAA;AAC1H,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAM3C,MAAM,CAAC,MAAM,mCAAmC,GAAG,uBAAuB,CACxE,6BAA6B,CAC9B,CAAA;AAED,MAAM,UAAU,6BAA6B,CAAC,EAC5C,wBAAwB,EACxB,iBAAiB,GAAG,KAAK,EACzB,uBAAuB,GAAG,KAAK,EAC/B,MAAM,EACN,SAAS,EACT,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,EACxB,aAAa,GAAG,GAAG,EAAE,CAAC,IAAI,EAC1B,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,GAAG,KAAK,EAC1B,8BAA8B,GACK;IACnC,qBAAqB,CAAC,+BAA+B,CAAC,CAAA;IAEtD,MAAM,EAAE,sBAAsB,EAAE,GAAG,yBAAyB,CAC1D,wBAAwB,CACzB,CAAA;IAED,MAAM,CAAC,gBAAgB,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IAEtE,IAAI,sBAAsB,IAAI,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,uBAAuB,GAC3B,sBAAsB,CAAC,uBAAuB,IAAI,KAAK,CAAA;IAEzD,IAAI,gBAAgB,IAAI,IAAI,EAAE,CAAC;QAC7B,OAAO,CACL,KAAC,mBAAmB,IAClB,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,iBAAiB,EACpC,uBAAuB,EAAE,uBAAuB,EAChD,qBAAqB,EAAE,qBAAqB,EAC5C,uBAAuB,EAAE,uBAAuB,EAChD,kBAAkB,EAAE,kBAAkB,EACtC,8BAA8B,EAAE,8BAA8B,EAC9D,MAAM,EAAE,GAAG,EAAE;gBACX,YAAY,CAAC,IAAI,CAAC,CAAA;YACpB,CAAC,EACD,SAAS,EAAE,SAAS,GACpB,CACH,CAAA;IACH,CAAC;IAED,OAAO,CACL,eACE,SAAS,EAAE,UAAU,CAAC,uCAAuC,EAAE,SAAS,CAAC,aAEzE,KAAC,aAAa,IAAC,KAAK,EAAE,CAAC,CAAC,sBAAsB,EAAE,MAAM,EAAE,MAAM,GAAI,EAClE,eAAK,SAAS,EAAC,+CAA+C,aAC5D,KAAC,0BAA0B,IACzB,wBAAwB,EAAE,wBAAwB,EAClD,cAAc,EAAE,YAAY,GAC5B,EACF,cAAK,SAAS,EAAC,wCAAwC,YACrD,gBAAM,SAAS,EAAC,8BAA8B,aAC3C,CAAC,CAAC,0BAA0B,EAAE,GAAG,EAClC,eAAM,SAAS,EAAC,2BAA2B,YACxC,CAAC,CAAC,cAAc,GACZ,EAAC,GAAG,EACV,CAAC,CAAC,0BAA0B,IACxB,GACH,EACN,MAAC,kBAAkB,eACjB,MAAC,aAAa,eACZ,KAAC,SAAS,IAAC,KAAK,EAAE,CAAC,CAAC,YAAY,YAC9B,gBAAM,SAAS,EAAC,gFAAgF,aAC7F,cAAc,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,EAC1D,KAAC,cAAc,KAAG,EACjB,cAAc,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,IACnD,GACG,EACZ,KAAC,SAAS,IAAC,KAAK,EAAE,CAAC,CAAC,cAAc,YAChC,KAAC,oBAAoB,IACnB,cAAc,EAAE,sBAAsB,EACtC,aAAa,EAAC,OAAO,GACrB,GACQ,EACZ,KAAC,SAAS,IAAC,KAAK,EAAE,CAAC,CAAC,mBAAmB,YACrC,eAAM,SAAS,EAAC,oCAAoC,YACjD,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAClC,GACG,IACE,EAChB,KAAC,aAAa,cACZ,KAAC,SAAS,IAAC,KAAK,EAAE,CAAC,CAAC,YAAY,YAC9B,cAAK,SAAS,EAAC,oBAAoB,YAChC,cAAc,CAAC,sBAAsB,CAAC,UAAU,CAAC,GAC9C,GACI,GACE,IACG,IACjB,IACF,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,sBAAsB,EAAE,0BAA0B;IAClD,YAAY,EAAE,gBAAgB;IAC9B,cAAc,EAAE,iBAAiB;IACjC,mBAAmB,EAAE,uBAAuB;IAC5C,YAAY,EAAE,eAAe;IAC7B,0BAA0B,EAAE,+BAA+B;IAC3D,cAAc,EAAE,iBAAiB;IACjC,0BAA0B,EAAE,cAAc;IAC1C,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,KAAK;CACX,CAAA"}
1
+ {"version":3,"file":"ClimateSettingScheduleDetails.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type UseMutationResult } from '@tanstack/react-query';
2
+ import type { ClimateSettingScheduleUpdateRequest, ClimateSettingScheduleUpdateResponse, SeamError } from 'seamapi';
3
+ type UseUpdateClimateSettingScheduleData = ClimateSettingScheduleUpdateResponse['climate_setting_schedule'];
4
+ type UseUpdateClimateSettingScheduleMutationParams = ClimateSettingScheduleUpdateRequest;
5
+ export declare function useUpdateClimateSettingSchedule(): UseMutationResult<UseUpdateClimateSettingScheduleData, SeamError, UseUpdateClimateSettingScheduleMutationParams>;
6
+ export {};
@@ -0,0 +1,51 @@
1
+ import { useMutation, useQueryClient, } from '@tanstack/react-query';
2
+ import { NullSeamClientError, useSeamClient } from '../../../../lib/index.js';
3
+ export function useUpdateClimateSettingSchedule() {
4
+ const { client } = useSeamClient();
5
+ const queryClient = useQueryClient();
6
+ return useMutation({
7
+ mutationFn: async (mutationPararms) => {
8
+ if (client === null)
9
+ throw new NullSeamClientError();
10
+ return await client.thermostats.climateSettingSchedules.update(mutationPararms);
11
+ },
12
+ onSuccess: (updated) => {
13
+ queryClient.setQueryData([
14
+ 'thermostats',
15
+ 'climate_setting_schedules',
16
+ 'get',
17
+ {
18
+ climate_setting_schedule_id: updated.climate_setting_schedule_id,
19
+ },
20
+ ], (climateSettingSchedule) => {
21
+ if (climateSettingSchedule == null) {
22
+ return;
23
+ }
24
+ return {
25
+ ...climateSettingSchedule,
26
+ ...updated,
27
+ };
28
+ });
29
+ queryClient.setQueryData([
30
+ 'thermostats',
31
+ 'climate_setting_schedules',
32
+ 'list',
33
+ { device_id: updated.device_id },
34
+ ], (climateSettingSchedules) => {
35
+ if (climateSettingSchedules == null) {
36
+ return [];
37
+ }
38
+ return climateSettingSchedules.map((climateSettingSchedule) => {
39
+ if (climateSettingSchedule.device_id === updated.device_id) {
40
+ return {
41
+ ...climateSettingSchedule,
42
+ ...updated,
43
+ };
44
+ }
45
+ return climateSettingSchedule;
46
+ });
47
+ });
48
+ },
49
+ });
50
+ }
51
+ //# sourceMappingURL=use-update-climate-setting-schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-update-climate-setting-schedule.js","sourceRoot":"","sources":["../../../../src/lib/seam/thermostats/climate-setting-schedules/use-update-climate-setting-schedule.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAEX,cAAc,GACf,MAAM,uBAAuB,CAAA;AAS9B,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAOjE,MAAM,UAAU,+BAA+B;IAK7C,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,OAAO,WAAW,CAIhB;QACA,UAAU,EAAE,KAAK,EACf,eAA8D,EAC9D,EAAE;YACF,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,IAAI,mBAAmB,EAAE,CAAA;YACpD,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,MAAM,CAC5D,eAAe,CAChB,CAAA;QACH,CAAC;QACD,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;YACrB,WAAW,CAAC,YAAY,CACtB;gBACE,aAAa;gBACb,2BAA2B;gBAC3B,KAAK;gBACL;oBACE,2BAA2B,EAAE,OAAO,CAAC,2BAA2B;iBACjE;aACF,EACD,CAAC,sBAAsB,EAAE,EAAE;gBACzB,IAAI,sBAAsB,IAAI,IAAI,EAAE,CAAC;oBACnC,OAAM;gBACR,CAAC;gBAED,OAAO;oBACL,GAAG,sBAAsB;oBACzB,GAAG,OAAO;iBACX,CAAA;YACH,CAAC,CACF,CAAA;YAED,WAAW,CAAC,YAAY,CAGtB;gBACE,aAAa;gBACb,2BAA2B;gBAC3B,MAAM;gBACN,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE;aACjC,EACD,CAAC,uBAAuB,EAA4B,EAAE;gBACpD,IAAI,uBAAuB,IAAI,IAAI,EAAE,CAAC;oBACpC,OAAO,EAAE,CAAA;gBACX,CAAC;gBAED,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC,sBAAsB,EAAE,EAAE;oBAC5D,IAAI,sBAAsB,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;wBAC3D,OAAO;4BACL,GAAG,sBAAsB;4BACzB,GAAG,OAAO;yBACX,CAAA;oBACH,CAAC;oBAED,OAAO,sBAAsB,CAAA;gBAC/B,CAAC,CAAC,CAAA;YACJ,CAAC,CACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
package/lib/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- declare const seamapiReactVersion = "2.11.0";
1
+ declare const seamapiReactVersion = "2.12.0";
2
2
  export default seamapiReactVersion;
package/lib/version.js CHANGED
@@ -1,3 +1,3 @@
1
- const seamapiReactVersion = '2.11.0';
1
+ const seamapiReactVersion = '2.12.0';
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": "2.11.0",
3
+ "version": "2.12.0",
4
4
  "description": "Seam Components.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -9,11 +9,14 @@ import {
9
9
  } from 'lib/seam/components/common-props.js'
10
10
  import { NestedDeviceDetails } from 'lib/seam/components/DeviceDetails/DeviceDetails.js'
11
11
  import { useClimateSettingSchedule } from 'lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedule.js'
12
+ import { useUpdateClimateSettingSchedule } from 'lib/seam/thermostats/climate-setting-schedules/use-update-climate-setting-schedule.js'
12
13
  import { useComponentTelemetry } from 'lib/telemetry/index.js'
13
14
  import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'
14
15
  import { DetailRow } from 'lib/ui/layout/DetailRow.js'
15
16
  import { DetailSection } from 'lib/ui/layout/DetailSection.js'
16
17
  import { DetailSectionGroup } from 'lib/ui/layout/DetailSectionGroup.js'
18
+ import { Snackbar } from 'lib/ui/Snackbar/Snackbar.js'
19
+ import { Switch } from 'lib/ui/Switch/Switch.js'
17
20
  import { ClimateSettingStatus } from 'lib/ui/thermostat/ClimateSettingStatus.js'
18
21
 
19
22
  import { formatDateTime } from './dates.js'
@@ -45,6 +48,8 @@ export function ClimateSettingScheduleDetails({
45
48
  climateSettingScheduleId
46
49
  )
47
50
 
51
+ const { mutate, isSuccess, isError } = useUpdateClimateSettingSchedule()
52
+
48
53
  const [selectedDeviceId, selectDevice] = useState<string | null>(null)
49
54
 
50
55
  if (climateSettingSchedule == null) {
@@ -75,55 +80,82 @@ export function ClimateSettingScheduleDetails({
75
80
  }
76
81
 
77
82
  return (
78
- <div
79
- className={classNames('seam-climate-setting-schedule-details', className)}
80
- >
81
- <ContentHeader title={t.climateSettingSchedule} onBack={onBack} />
82
- <div className='seam-climate-setting-schedule-details-content'>
83
- <ClimateSettingScheduleCard
84
- climateSettingScheduleId={climateSettingScheduleId}
85
- onSelectDevice={selectDevice}
86
- />
87
- <div className='seam-default-setting-message-container'>
88
- <span className='seam-default-setting-message'>
89
- {t.defaultSettingMessagePart1}{' '}
90
- <span className='seam-default-setting-text'>
91
- {t.defaultSetting}
92
- </span>{' '}
93
- {t.defaultSettingMessagePart2}
94
- </span>
83
+ <>
84
+ <div
85
+ className={classNames(
86
+ 'seam-climate-setting-schedule-details',
87
+ className
88
+ )}
89
+ >
90
+ <ContentHeader title={t.climateSettingSchedule} onBack={onBack} />
91
+ <div className='seam-climate-setting-schedule-details-content'>
92
+ <ClimateSettingScheduleCard
93
+ climateSettingScheduleId={climateSettingScheduleId}
94
+ onSelectDevice={selectDevice}
95
+ />
96
+ <div className='seam-default-setting-message-container'>
97
+ <span className='seam-default-setting-message'>
98
+ {t.defaultSettingMessagePart1}{' '}
99
+ <span className='seam-default-setting-text'>
100
+ {t.defaultSetting}
101
+ </span>{' '}
102
+ {t.defaultSettingMessagePart2}
103
+ </span>
104
+ </div>
105
+ <DetailSectionGroup>
106
+ <DetailSection>
107
+ <DetailRow label={t.startEndTime}>
108
+ <span className='seam-climate-setting-details-value seam-climate-setting-details-schedule-range'>
109
+ {formatDateTime(climateSettingSchedule.schedule_starts_at)}
110
+ <ArrowRightIcon />
111
+ {formatDateTime(climateSettingSchedule.schedule_ends_at)}
112
+ </span>
113
+ </DetailRow>
114
+ <DetailRow label={t.climateSetting}>
115
+ <ClimateSettingStatus
116
+ climateSetting={climateSettingSchedule}
117
+ iconPlacement='right'
118
+ />
119
+ </DetailRow>
120
+ <DetailRow label={t.allowManualOverride}>
121
+ <span className='seam-climate-setting-details-value'>
122
+ <Switch
123
+ checked={isManualOverrideAllowed}
124
+ onChange={(checked) => {
125
+ mutate({
126
+ climate_setting_schedule_id:
127
+ climateSettingSchedule.climate_setting_schedule_id,
128
+ manual_override_allowed: checked,
129
+ })
130
+ }}
131
+ />
132
+ </span>
133
+ </DetailRow>
134
+ </DetailSection>
135
+ <DetailSection>
136
+ <DetailRow label={t.creationDate}>
137
+ <div className='seam-creation-date'>
138
+ {formatDateTime(climateSettingSchedule.created_at)}
139
+ </div>
140
+ </DetailRow>
141
+ </DetailSection>
142
+ </DetailSectionGroup>
95
143
  </div>
96
- <DetailSectionGroup>
97
- <DetailSection>
98
- <DetailRow label={t.startEndTime}>
99
- <span className='seam-climate-setting-details-value seam-climate-setting-details-schedule-range'>
100
- {formatDateTime(climateSettingSchedule.schedule_starts_at)}
101
- <ArrowRightIcon />
102
- {formatDateTime(climateSettingSchedule.schedule_ends_at)}
103
- </span>
104
- </DetailRow>
105
- <DetailRow label={t.climateSetting}>
106
- <ClimateSettingStatus
107
- climateSetting={climateSettingSchedule}
108
- iconPlacement='right'
109
- />
110
- </DetailRow>
111
- <DetailRow label={t.allowManualOverride}>
112
- <span className='seam-climate-setting-details-value'>
113
- {isManualOverrideAllowed ? t.on : t.off}
114
- </span>
115
- </DetailRow>
116
- </DetailSection>
117
- <DetailSection>
118
- <DetailRow label={t.creationDate}>
119
- <div className='seam-creation-date'>
120
- {formatDateTime(climateSettingSchedule.created_at)}
121
- </div>
122
- </DetailRow>
123
- </DetailSection>
124
- </DetailSectionGroup>
125
144
  </div>
126
- </div>
145
+ <Snackbar
146
+ message={t.manualOverrideSuccess}
147
+ variant='success'
148
+ visible={isSuccess}
149
+ automaticVisibility
150
+ />
151
+
152
+ <Snackbar
153
+ message={t.manualOverrideError}
154
+ variant='error'
155
+ visible={isError}
156
+ automaticVisibility
157
+ />
158
+ </>
127
159
  )
128
160
  }
129
161
 
@@ -136,6 +168,6 @@ const t = {
136
168
  defaultSettingMessagePart1: 'Thermostat will return to its',
137
169
  defaultSetting: 'default setting',
138
170
  defaultSettingMessagePart2: 'at end time.',
139
- on: 'On',
140
- off: 'Off',
171
+ manualOverrideSuccess: 'Successfully updated manual override!',
172
+ manualOverrideError: 'Error updating manual override. Please try again.',
141
173
  }
@@ -0,0 +1,92 @@
1
+ import {
2
+ useMutation,
3
+ type UseMutationResult,
4
+ useQueryClient,
5
+ } from '@tanstack/react-query'
6
+ import type {
7
+ ClimateSettingSchedule,
8
+ ClimateSettingSchedulesListResponse,
9
+ ClimateSettingScheduleUpdateRequest,
10
+ ClimateSettingScheduleUpdateResponse,
11
+ SeamError,
12
+ } from 'seamapi'
13
+
14
+ import { NullSeamClientError, useSeamClient } from 'lib/index.js'
15
+
16
+ type UseUpdateClimateSettingScheduleData =
17
+ ClimateSettingScheduleUpdateResponse['climate_setting_schedule']
18
+ type UseUpdateClimateSettingScheduleMutationParams =
19
+ ClimateSettingScheduleUpdateRequest
20
+
21
+ export function useUpdateClimateSettingSchedule(): UseMutationResult<
22
+ UseUpdateClimateSettingScheduleData,
23
+ SeamError,
24
+ UseUpdateClimateSettingScheduleMutationParams
25
+ > {
26
+ const { client } = useSeamClient()
27
+ const queryClient = useQueryClient()
28
+
29
+ return useMutation<
30
+ UseUpdateClimateSettingScheduleData,
31
+ SeamError,
32
+ UseUpdateClimateSettingScheduleMutationParams
33
+ >({
34
+ mutationFn: async (
35
+ mutationPararms: UseUpdateClimateSettingScheduleMutationParams
36
+ ) => {
37
+ if (client === null) throw new NullSeamClientError()
38
+ return await client.thermostats.climateSettingSchedules.update(
39
+ mutationPararms
40
+ )
41
+ },
42
+ onSuccess: (updated) => {
43
+ queryClient.setQueryData<ClimateSettingSchedule>(
44
+ [
45
+ 'thermostats',
46
+ 'climate_setting_schedules',
47
+ 'get',
48
+ {
49
+ climate_setting_schedule_id: updated.climate_setting_schedule_id,
50
+ },
51
+ ],
52
+ (climateSettingSchedule) => {
53
+ if (climateSettingSchedule == null) {
54
+ return
55
+ }
56
+
57
+ return {
58
+ ...climateSettingSchedule,
59
+ ...updated,
60
+ }
61
+ }
62
+ )
63
+
64
+ queryClient.setQueryData<
65
+ ClimateSettingSchedulesListResponse['climate_setting_schedules']
66
+ >(
67
+ [
68
+ 'thermostats',
69
+ 'climate_setting_schedules',
70
+ 'list',
71
+ { device_id: updated.device_id },
72
+ ],
73
+ (climateSettingSchedules): ClimateSettingSchedule[] => {
74
+ if (climateSettingSchedules == null) {
75
+ return []
76
+ }
77
+
78
+ return climateSettingSchedules.map((climateSettingSchedule) => {
79
+ if (climateSettingSchedule.device_id === updated.device_id) {
80
+ return {
81
+ ...climateSettingSchedule,
82
+ ...updated,
83
+ }
84
+ }
85
+
86
+ return climateSettingSchedule
87
+ })
88
+ }
89
+ )
90
+ },
91
+ })
92
+ }
@@ -1,3 +1,3 @@
1
- const seamapiReactVersion = '2.11.0'
1
+ const seamapiReactVersion = '2.12.0'
2
2
 
3
3
  export default seamapiReactVersion