@seamapi/react 1.62.0 → 1.63.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 (48) hide show
  1. package/README.md +1 -1
  2. package/dist/elements.js +984 -946
  3. package/dist/elements.js.map +1 -1
  4. package/lib/seam/access-codes/use-update-access-code.js +28 -6
  5. package/lib/seam/access-codes/use-update-access-code.js.map +1 -1
  6. package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.d.ts +1 -1
  7. package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.js +4 -4
  8. package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.js.map +1 -1
  9. package/lib/seam/components/AccessCodeTable/AccessCodeTable.d.ts +1 -1
  10. package/lib/seam/components/AccessCodeTable/AccessCodeTable.js +4 -4
  11. package/lib/seam/components/AccessCodeTable/AccessCodeTable.js.map +1 -1
  12. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.d.ts +1 -1
  13. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.js +2 -2
  14. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.js.map +1 -1
  15. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.d.ts +1 -1
  16. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.js +2 -2
  17. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.js.map +1 -1
  18. package/lib/seam/components/DeviceDetails/DeviceDetails.d.ts +1 -1
  19. package/lib/seam/components/DeviceDetails/DeviceDetails.js +2 -1
  20. package/lib/seam/components/DeviceDetails/DeviceDetails.js.map +1 -1
  21. package/lib/seam/components/DeviceDetails/LockDeviceDetails.js +2 -2
  22. package/lib/seam/components/DeviceDetails/LockDeviceDetails.js.map +1 -1
  23. package/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.d.ts +1 -1
  24. package/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.js +3 -4
  25. package/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.js.map +1 -1
  26. package/lib/seam/components/DeviceTable/DeviceTable.d.ts +1 -1
  27. package/lib/seam/components/DeviceTable/DeviceTable.js +2 -2
  28. package/lib/seam/components/DeviceTable/DeviceTable.js.map +1 -1
  29. package/lib/seam/components/EditAccessCodeForm/EditAccessCodeForm.js +1 -0
  30. package/lib/seam/components/EditAccessCodeForm/EditAccessCodeForm.js.map +1 -1
  31. package/lib/seam/components/common-props.d.ts +1 -0
  32. package/lib/seam/components/common-props.js.map +1 -1
  33. package/lib/version.d.ts +1 -1
  34. package/lib/version.js +1 -1
  35. package/package.json +1 -1
  36. package/src/lib/element.tsx +1 -0
  37. package/src/lib/seam/access-codes/use-update-access-code.ts +41 -6
  38. package/src/lib/seam/components/AccessCodeDetails/AccessCodeDetails.tsx +16 -12
  39. package/src/lib/seam/components/AccessCodeTable/AccessCodeTable.tsx +4 -0
  40. package/src/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.tsx +2 -0
  41. package/src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.tsx +2 -0
  42. package/src/lib/seam/components/DeviceDetails/DeviceDetails.tsx +2 -0
  43. package/src/lib/seam/components/DeviceDetails/LockDeviceDetails.tsx +2 -0
  44. package/src/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.tsx +16 -14
  45. package/src/lib/seam/components/DeviceTable/DeviceTable.tsx +2 -0
  46. package/src/lib/seam/components/EditAccessCodeForm/EditAccessCodeForm.tsx +1 -0
  47. package/src/lib/seam/components/common-props.tsx +1 -0
  48. package/src/lib/version.ts +1 -1
@@ -4,6 +4,8 @@ import {
4
4
  useQueryClient,
5
5
  } from '@tanstack/react-query'
6
6
  import type {
7
+ AccessCode,
8
+ AccessCodesListResponse,
7
9
  AccessCodeUpdateRequest,
8
10
  AccessCodeUpdateResponse,
9
11
  ActionAttempt,
@@ -35,12 +37,45 @@ export function useUpdateAccessCode(): UseMutationResult<
35
37
  return await client.accessCodes.update(mutationParams)
36
38
  },
37
39
  onSuccess: (_data, variables) => {
38
- void queryClient.invalidateQueries([
39
- 'access_codes',
40
- 'get',
41
- { access_code_id: variables.access_code_id },
42
- ])
43
- void queryClient.invalidateQueries(['access_codes', 'list'])
40
+ // There is no guarantee that the actual code has updated even if the
41
+ // request was succesful. To prevent stale data in the UI, the
42
+ // code below optimistically updates the data in cache.
43
+
44
+ queryClient.setQueryData<AccessCode | null>(
45
+ ['access_codes', 'get', { access_code_id: variables.access_code_id }],
46
+ (accessCode) => {
47
+ if (accessCode == null) {
48
+ return
49
+ }
50
+
51
+ return {
52
+ ...accessCode,
53
+ code: variables.code ?? accessCode.code,
54
+ name: variables.name ?? accessCode.name,
55
+ }
56
+ }
57
+ )
58
+
59
+ queryClient.setQueryData<AccessCodesListResponse['access_codes']>(
60
+ ['access_codes', 'list', { device_id: variables.device_id }],
61
+ (accessCodes) => {
62
+ if (accessCodes == null) {
63
+ return
64
+ }
65
+
66
+ return accessCodes.map((accessCode) => {
67
+ if (accessCode.access_code_id === variables.access_code_id) {
68
+ return {
69
+ ...accessCode,
70
+ code: variables.code ?? accessCode.code,
71
+ name: variables.name ?? accessCode.name,
72
+ }
73
+ }
74
+
75
+ return accessCode
76
+ })
77
+ }
78
+ )
44
79
  },
45
80
  })
46
81
  }
@@ -41,6 +41,7 @@ export function AccessCodeDetails({
41
41
  disableEditAccessCode = false,
42
42
  disableLockUnlock = false,
43
43
  disableDeleteAccessCode = false,
44
+ disableResourceIds = false,
44
45
  onBack,
45
46
  className,
46
47
  }: AccessCodeDetailsProps): JSX.Element | null {
@@ -64,6 +65,7 @@ export function AccessCodeDetails({
64
65
  disableCreateAccessCode={disableCreateAccessCode}
65
66
  disableEditAccessCode={disableEditAccessCode}
66
67
  disableDeleteAccessCode={disableDeleteAccessCode}
68
+ disableResourceIds={disableResourceIds}
67
69
  onBack={() => {
68
70
  selectDevice(null)
69
71
  }}
@@ -137,19 +139,21 @@ export function AccessCodeDetails({
137
139
  </div>
138
140
  )}
139
141
  <div className='seam-details'>
140
- <div className='seam-row'>
141
- <div className='seam-heading'>{t.id}:</div>
142
- <div className='seam-content seam-code-id'>
143
- <span>{accessCode.access_code_id}</span>
144
- <IconButton
145
- onClick={() => {
146
- void copyToClipboard(accessCode.access_code_id)
147
- }}
148
- >
149
- <CopyIcon />
150
- </IconButton>
142
+ {!disableResourceIds && (
143
+ <div className='seam-row'>
144
+ <div className='seam-heading'>{t.id}:</div>
145
+ <div className='seam-content seam-code-id'>
146
+ <span>{accessCode.access_code_id}</span>
147
+ <IconButton
148
+ onClick={() => {
149
+ void copyToClipboard(accessCode.access_code_id)
150
+ }}
151
+ >
152
+ <CopyIcon />
153
+ </IconButton>
154
+ </div>
151
155
  </div>
152
- </div>
156
+ )}
153
157
  <div className='seam-row'>
154
158
  <div className='seam-heading'>{t.created}:</div>
155
159
  <div className='seam-content'>
@@ -86,6 +86,7 @@ export function AccessCodeTable({
86
86
  disableEditAccessCode = false,
87
87
  disableLockUnlock = false,
88
88
  disableDeleteAccessCode = false,
89
+ disableResourceIds = false,
89
90
  }: AccessCodeTableProps): JSX.Element {
90
91
  useComponentTelemetry('AccessCodeTable')
91
92
 
@@ -146,6 +147,7 @@ export function AccessCodeTable({
146
147
  disableCreateAccessCode={disableCreateAccessCode}
147
148
  disableEditAccessCode={disableEditAccessCode}
148
149
  disableDeleteAccessCode={disableDeleteAccessCode}
150
+ disableResourceIds={disableResourceIds}
149
151
  onBack={() => {
150
152
  setSelectedEditAccessCodeId(null)
151
153
  }}
@@ -178,6 +180,7 @@ export function AccessCodeTable({
178
180
  disableCreateAccessCode={disableCreateAccessCode}
179
181
  disableEditAccessCode={disableEditAccessCode}
180
182
  disableDeleteAccessCode={disableDeleteAccessCode}
183
+ disableResourceIds={disableResourceIds}
181
184
  onBack={() => {
182
185
  setSelectedViewAccessCodeId(null)
183
186
  }}
@@ -195,6 +198,7 @@ export function AccessCodeTable({
195
198
  disableCreateAccessCode={disableCreateAccessCode}
196
199
  disableEditAccessCode={disableEditAccessCode}
197
200
  disableDeleteAccessCode={disableDeleteAccessCode}
201
+ disableResourceIds={disableResourceIds}
198
202
  onBack={toggleAddAccessCodeForm}
199
203
  className={className}
200
204
  onSuccess={() => {
@@ -35,6 +35,7 @@ export function ClimateSettingScheduleDetails({
35
35
  className,
36
36
  disableCreateAccessCode,
37
37
  disableEditAccessCode,
38
+ disableResourceIds = false,
38
39
  }: ClimateSettingScheduleDetailsProps): JSX.Element | null {
39
40
  useComponentTelemetry('ClimateSettingScheduleDetails')
40
41
 
@@ -59,6 +60,7 @@ export function ClimateSettingScheduleDetails({
59
60
  disableCreateAccessCode={disableCreateAccessCode}
60
61
  disableEditAccessCode={disableEditAccessCode}
61
62
  disableDeleteAccessCode={disableDeleteAccessCode}
63
+ disableResourceIds={disableResourceIds}
62
64
  onBack={() => {
63
65
  selectDevice(null)
64
66
  }}
@@ -68,6 +68,7 @@ export function ClimateSettingScheduleTable({
68
68
  className,
69
69
  disableCreateAccessCode,
70
70
  disableEditAccessCode,
71
+ disableResourceIds = false,
71
72
  }: ClimateSettingScheduleTableProps): JSX.Element {
72
73
  useComponentTelemetry('ClimateSettingScheduleTable')
73
74
 
@@ -118,6 +119,7 @@ export function ClimateSettingScheduleTable({
118
119
  disableCreateAccessCode={disableCreateAccessCode}
119
120
  disableEditAccessCode={disableEditAccessCode}
120
121
  disableDeleteAccessCode={disableDeleteAccessCode}
122
+ disableResourceIds={disableResourceIds}
121
123
  onBack={() => {
122
124
  setSelectedViewClimateSettingScheduleId(null)
123
125
  }}
@@ -20,6 +20,7 @@ export function DeviceDetails({
20
20
  deviceId,
21
21
  disableLockUnlock = false,
22
22
  disableDeleteAccessCode = false,
23
+ disableResourceIds = false,
23
24
  onBack,
24
25
  className,
25
26
  }: DeviceDetailsProps): JSX.Element | null {
@@ -36,6 +37,7 @@ export function DeviceDetails({
36
37
  const props = {
37
38
  disableLockUnlock,
38
39
  disableDeleteAccessCode,
40
+ disableResourceIds,
39
41
  onBack,
40
42
  className,
41
43
  }
@@ -28,6 +28,7 @@ export function LockDeviceDetails(
28
28
  disableCreateAccessCode,
29
29
  disableEditAccessCode,
30
30
  disableDeleteAccessCode,
31
+ disableResourceIds,
31
32
  onBack,
32
33
  className,
33
34
  } = props
@@ -55,6 +56,7 @@ export function LockDeviceDetails(
55
56
  disableCreateAccessCode={disableCreateAccessCode}
56
57
  disableEditAccessCode={disableEditAccessCode}
57
58
  disableDeleteAccessCode={disableDeleteAccessCode}
59
+ disableResourceIds={disableResourceIds}
58
60
  onBack={toggleAccessCodesOpen}
59
61
  className={className}
60
62
  />
@@ -19,17 +19,16 @@ interface ThermostatDeviceDetailsProps extends CommonProps {
19
19
  device: ThermostatDevice
20
20
  }
21
21
 
22
- export function ThermostatDeviceDetails(
23
- props: ThermostatDeviceDetailsProps
24
- ): JSX.Element | null {
25
- const {
26
- device,
27
- onBack,
28
- className,
29
- disableCreateAccessCode,
30
- disableEditAccessCode,
31
- } = props
32
-
22
+ export function ThermostatDeviceDetails({
23
+ device,
24
+ onBack,
25
+ className,
26
+ disableLockUnlock,
27
+ disableCreateAccessCode,
28
+ disableEditAccessCode,
29
+ disableDeleteAccessCode,
30
+ disableResourceIds = false,
31
+ }: ThermostatDeviceDetailsProps): JSX.Element | null {
33
32
  const [climateSettingsOpen, setClimateSettingsOpen] = useState(false)
34
33
 
35
34
  const { connectedAccount } = useConnectedAccount(device.connected_account_id)
@@ -42,10 +41,11 @@ export function ThermostatDeviceDetails(
42
41
  return (
43
42
  <NestedClimateSettingScheduleTable
44
43
  deviceId={device.device_id}
45
- disableLockUnlock={props.disableLockUnlock}
44
+ disableLockUnlock={disableLockUnlock}
46
45
  disableCreateAccessCode={disableCreateAccessCode}
47
46
  disableEditAccessCode={disableEditAccessCode}
48
- disableDeleteAccessCode={props.disableDeleteAccessCode}
47
+ disableDeleteAccessCode={disableDeleteAccessCode}
48
+ disableResourceIds={disableResourceIds}
49
49
  onBack={() => {
50
50
  setClimateSettingsOpen(false)
51
51
  }}
@@ -142,7 +142,9 @@ export function ThermostatDeviceDetails(
142
142
  device.connected_account_id
143
143
  }
144
144
  />
145
- <DetailRow label={t.deviceId} sublabel={device.device_id} />
145
+ {!disableResourceIds && (
146
+ <DetailRow label={t.deviceId} sublabel={device.device_id} />
147
+ )}
146
148
  </DetailSection>
147
149
  </DetailSectionGroup>
148
150
  </div>
@@ -71,6 +71,7 @@ export function DeviceTable({
71
71
  disableCreateAccessCode = false,
72
72
  disableEditAccessCode = false,
73
73
  disableDeleteAccessCode = false,
74
+ disableResourceIds = false,
74
75
  onBack,
75
76
  className,
76
77
  }: DeviceTableProps = {}): JSX.Element {
@@ -110,6 +111,7 @@ export function DeviceTable({
110
111
  disableCreateAccessCode={disableCreateAccessCode}
111
112
  disableEditAccessCode={disableEditAccessCode}
112
113
  disableDeleteAccessCode={disableDeleteAccessCode}
114
+ disableResourceIds={disableResourceIds}
113
115
  onBack={() => {
114
116
  setSelectedDeviceId(null)
115
117
  }}
@@ -141,6 +141,7 @@ function useSubmitEditAccessCode(
141
141
  {
142
142
  access_code_id: accessCode.access_code_id,
143
143
  name,
144
+ code,
144
145
  type: 'ongoing',
145
146
  device_id: device.device_id,
146
147
  },
@@ -7,6 +7,7 @@ export interface RequiredCommonProps {
7
7
  disableCreateAccessCode: boolean | undefined
8
8
  disableEditAccessCode: boolean | undefined
9
9
  disableLockUnlock: boolean | undefined
10
+ disableResourceIds: boolean | undefined
10
11
  }
11
12
 
12
13
  export type CommonProps = Partial<RequiredCommonProps>
@@ -1,3 +1,3 @@
1
- const seamapiReactVersion = '1.62.0'
1
+ const seamapiReactVersion = '1.63.1'
2
2
 
3
3
  export default seamapiReactVersion