@seamapi/react 3.1.2 → 4.0.0-beta.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 (135) hide show
  1. package/README.md +2 -2
  2. package/dist/elements.js +9896 -10373
  3. package/dist/elements.js.map +1 -1
  4. package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.d.ts +1 -1
  5. package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.js +3 -3
  6. package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.js.map +1 -1
  7. package/lib/seam/components/AccessCodeTable/AccessCodeTable.d.ts +1 -1
  8. package/lib/seam/components/AccessCodeTable/AccessCodeTable.js +4 -4
  9. package/lib/seam/components/AccessCodeTable/AccessCodeTable.js.map +1 -1
  10. package/lib/seam/components/DeviceDetails/DeviceDetails.d.ts +1 -1
  11. package/lib/seam/components/DeviceDetails/DeviceDetails.js +1 -2
  12. package/lib/seam/components/DeviceDetails/DeviceDetails.js.map +1 -1
  13. package/lib/seam/components/DeviceDetails/LockDeviceDetails.d.ts +1 -1
  14. package/lib/seam/components/DeviceDetails/LockDeviceDetails.js +2 -2
  15. package/lib/seam/components/DeviceDetails/LockDeviceDetails.js.map +1 -1
  16. package/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.d.ts +1 -1
  17. package/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.js +2 -40
  18. package/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.js.map +1 -1
  19. package/lib/seam/components/DeviceTable/DeviceTable.d.ts +1 -1
  20. package/lib/seam/components/DeviceTable/DeviceTable.js +2 -2
  21. package/lib/seam/components/DeviceTable/DeviceTable.js.map +1 -1
  22. package/lib/seam/components/common-props.d.ts +0 -1
  23. package/lib/seam/components/common-props.js.map +1 -1
  24. package/lib/seam/components/index.d.ts +0 -2
  25. package/lib/seam/components/index.js +0 -2
  26. package/lib/seam/components/index.js.map +1 -1
  27. package/lib/seam/index.d.ts +0 -2
  28. package/lib/seam/index.js +0 -2
  29. package/lib/seam/index.js.map +1 -1
  30. package/lib/ui/thermostat/FanModeMenu.js +1 -0
  31. package/lib/ui/thermostat/FanModeMenu.js.map +1 -1
  32. package/lib/version.d.ts +1 -1
  33. package/lib/version.js +1 -1
  34. package/lib/version.js.map +1 -1
  35. package/package.json +3 -3
  36. package/src/lib/element.tsx +0 -1
  37. package/src/lib/seam/components/AccessCodeDetails/AccessCodeDetails.tsx +0 -3
  38. package/src/lib/seam/components/AccessCodeTable/AccessCodeTable.tsx +0 -4
  39. package/src/lib/seam/components/DeviceDetails/DeviceDetails.tsx +0 -2
  40. package/src/lib/seam/components/DeviceDetails/LockDeviceDetails.tsx +0 -2
  41. package/src/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.tsx +0 -137
  42. package/src/lib/seam/components/DeviceTable/DeviceTable.tsx +0 -2
  43. package/src/lib/seam/components/common-props.tsx +0 -1
  44. package/src/lib/seam/components/elements.ts +0 -2
  45. package/src/lib/seam/components/index.ts +0 -2
  46. package/src/lib/seam/index.ts +0 -2
  47. package/src/lib/ui/thermostat/FanModeMenu.tsx +1 -0
  48. package/src/lib/version.ts +1 -1
  49. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleCard.d.ts +0 -7
  50. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleCard.js +0 -43
  51. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleCard.js.map +0 -1
  52. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.d.ts +0 -7
  53. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.js +0 -55
  54. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.js.map +0 -1
  55. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDeviceBar.d.ts +0 -5
  56. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDeviceBar.js +0 -31
  57. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDeviceBar.js.map +0 -1
  58. package/lib/seam/components/ClimateSettingScheduleDetails/dates.d.ts +0 -1
  59. package/lib/seam/components/ClimateSettingScheduleDetails/dates.js +0 -9
  60. package/lib/seam/components/ClimateSettingScheduleDetails/dates.js.map +0 -1
  61. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRow.d.ts +0 -8
  62. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRow.js +0 -10
  63. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRow.js.map +0 -1
  64. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRowDetails.d.ts +0 -5
  65. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRowDetails.js +0 -28
  66. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRowDetails.js.map +0 -1
  67. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.d.ts +0 -14
  68. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.js +0 -80
  69. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.js.map +0 -1
  70. package/lib/seam/components/CreateClimateSettingScheduleForm/CreateClimateSettingScheduleForm.d.ts +0 -5
  71. package/lib/seam/components/CreateClimateSettingScheduleForm/CreateClimateSettingScheduleForm.js +0 -29
  72. package/lib/seam/components/CreateClimateSettingScheduleForm/CreateClimateSettingScheduleForm.js.map +0 -1
  73. package/lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedule.d.ts +0 -6
  74. package/lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedule.js +0 -16
  75. package/lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedule.js.map +0 -1
  76. package/lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedules.d.ts +0 -6
  77. package/lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedules.js +0 -28
  78. package/lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedules.js.map +0 -1
  79. package/lib/seam/thermostats/climate-setting-schedules/use-create-climate-setting-schedule.d.ts +0 -7
  80. package/lib/seam/thermostats/climate-setting-schedules/use-create-climate-setting-schedule.js +0 -25
  81. package/lib/seam/thermostats/climate-setting-schedules/use-create-climate-setting-schedule.js.map +0 -1
  82. package/lib/seam/thermostats/climate-setting-schedules/use-delete-climate-setting-schedule.d.ts +0 -6
  83. package/lib/seam/thermostats/climate-setting-schedules/use-delete-climate-setting-schedule.js +0 -27
  84. package/lib/seam/thermostats/climate-setting-schedules/use-delete-climate-setting-schedule.js.map +0 -1
  85. package/lib/seam/thermostats/climate-setting-schedules/use-update-climate-setting-schedule.d.ts +0 -6
  86. package/lib/seam/thermostats/climate-setting-schedules/use-update-climate-setting-schedule.js +0 -46
  87. package/lib/seam/thermostats/climate-setting-schedules/use-update-climate-setting-schedule.js.map +0 -1
  88. package/lib/seam/thermostats/use-update-thermostat.d.ts +0 -6
  89. package/lib/seam/thermostats/use-update-thermostat.js +0 -51
  90. package/lib/seam/thermostats/use-update-thermostat.js.map +0 -1
  91. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleForm.d.ts +0 -32
  92. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleForm.js +0 -85
  93. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleForm.js.map +0 -1
  94. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormClimateSetting.d.ts +0 -13
  95. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormClimateSetting.js +0 -44
  96. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormClimateSetting.js.map +0 -1
  97. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormDefaultClimateSetting.d.ts +0 -10
  98. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormDefaultClimateSetting.js +0 -24
  99. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormDefaultClimateSetting.js.map +0 -1
  100. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormDeviceSelect.d.ts +0 -10
  101. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormDeviceSelect.js +0 -10
  102. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormDeviceSelect.js.map +0 -1
  103. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormNameAndSchedule.d.ts +0 -15
  104. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormNameAndSchedule.js +0 -30
  105. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormNameAndSchedule.js.map +0 -1
  106. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormTimeZonePicker.d.ts +0 -9
  107. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormTimeZonePicker.js +0 -16
  108. package/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormTimeZonePicker.js.map +0 -1
  109. package/lib/ui/ClimateSettingForm/set-point-bounds.d.ts +0 -4
  110. package/lib/ui/ClimateSettingForm/set-point-bounds.js +0 -17
  111. package/lib/ui/ClimateSettingForm/set-point-bounds.js.map +0 -1
  112. package/src/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleCard.tsx +0 -107
  113. package/src/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.element.ts +0 -11
  114. package/src/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.tsx +0 -175
  115. package/src/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDeviceBar.tsx +0 -72
  116. package/src/lib/seam/components/ClimateSettingScheduleDetails/dates.ts +0 -10
  117. package/src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRow.tsx +0 -35
  118. package/src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRowDetails.tsx +0 -60
  119. package/src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.element.ts +0 -17
  120. package/src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.tsx +0 -220
  121. package/src/lib/seam/components/CreateClimateSettingScheduleForm/CreateClimateSettingScheduleForm.element.ts +0 -9
  122. package/src/lib/seam/components/CreateClimateSettingScheduleForm/CreateClimateSettingScheduleForm.tsx +0 -56
  123. package/src/lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedule.ts +0 -34
  124. package/src/lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedules.ts +0 -53
  125. package/src/lib/seam/thermostats/climate-setting-schedules/use-create-climate-setting-schedule.ts +0 -53
  126. package/src/lib/seam/thermostats/climate-setting-schedules/use-delete-climate-setting-schedule.ts +0 -51
  127. package/src/lib/seam/thermostats/climate-setting-schedules/use-update-climate-setting-schedule.ts +0 -83
  128. package/src/lib/seam/thermostats/use-update-thermostat.ts +0 -90
  129. package/src/lib/ui/ClimateSettingForm/ClimateSettingScheduleForm.tsx +0 -189
  130. package/src/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormClimateSetting.tsx +0 -118
  131. package/src/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormDefaultClimateSetting.tsx +0 -79
  132. package/src/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormDeviceSelect.tsx +0 -36
  133. package/src/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormNameAndSchedule.tsx +0 -120
  134. package/src/lib/ui/ClimateSettingForm/ClimateSettingScheduleFormTimeZonePicker.tsx +0 -43
  135. package/src/lib/ui/ClimateSettingForm/set-point-bounds.ts +0 -31
@@ -1,35 +0,0 @@
1
- import type { ClimateSettingSchedule } from '@seamapi/types/connect'
2
-
3
- import { ClimateSettingScheduleIcon } from 'lib/icons/ClimateSettingSchedule.js'
4
- import { ClimateSettingScheduleRowDetails } from 'lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRowDetails.js'
5
- import { TableCell } from 'lib/ui/Table/TableCell.js'
6
- import { TableRow } from 'lib/ui/Table/TableRow.js'
7
- import { Title } from 'lib/ui/typography/Title.js'
8
-
9
- interface ClimateSettingScheduleRowProps {
10
- climateSettingSchedule: ClimateSettingSchedule
11
- onClick: () => void
12
- }
13
-
14
- export function ClimateSettingScheduleRow({
15
- climateSettingSchedule,
16
- onClick,
17
- }: ClimateSettingScheduleRowProps): JSX.Element {
18
- return (
19
- <TableRow onClick={onClick}>
20
- <TableCell className='seam-icon-cell'>
21
- <div>
22
- <ClimateSettingScheduleIcon />
23
- </div>
24
- </TableCell>
25
- <TableCell className='seam-name-cell'>
26
- <Title className='seam-truncated-text'>
27
- {climateSettingSchedule.name}
28
- </Title>
29
- <ClimateSettingScheduleRowDetails
30
- climateSettingSchedule={climateSettingSchedule}
31
- />
32
- </TableCell>
33
- </TableRow>
34
- )
35
- }
@@ -1,60 +0,0 @@
1
- import type { ClimateSettingSchedule } from '@seamapi/types/connect'
2
- import { DateTime } from 'luxon'
3
-
4
- import { useDevice } from 'lib/seam/devices/use-device.js'
5
- import { DotDivider } from 'lib/ui/layout/DotDivider.js'
6
- import { ClimateSettingStatus } from 'lib/ui/thermostat/ClimateSettingStatus.js'
7
- import { useIsDateInPast } from 'lib/ui/use-is-date-in-past.js'
8
-
9
- export function ClimateSettingScheduleRowDetails(props: {
10
- climateSettingSchedule: ClimateSettingSchedule
11
- }): JSX.Element {
12
- const { climateSettingSchedule } = props
13
- const { device } = useDevice({ device_id: climateSettingSchedule.device_id })
14
-
15
- return (
16
- <div className='seam-details'>
17
- <span className='seam-device-name seam-truncated-text'>
18
- {device?.properties.name}
19
- </span>
20
- <DotDivider />
21
- <Duration climateSettingSchedule={climateSettingSchedule} />
22
- <DotDivider />
23
- <ClimateSettingStatus climateSetting={climateSettingSchedule} />
24
- </div>
25
- )
26
- }
27
-
28
- function Duration(props: {
29
- climateSettingSchedule: ClimateSettingSchedule
30
- }): JSX.Element {
31
- const { climateSettingSchedule } = props
32
-
33
- const hasStarted =
34
- useIsDateInPast(climateSettingSchedule.schedule_starts_at) ?? false
35
-
36
- if (hasStarted) {
37
- return (
38
- <span>
39
- {t.ends} {formatDate(climateSettingSchedule.schedule_ends_at)}{' '}
40
- </span>
41
- )
42
- }
43
-
44
- return (
45
- <span>
46
- {t.starts} {formatDate(climateSettingSchedule.schedule_starts_at)}
47
- </span>
48
- )
49
- }
50
-
51
- const formatDate = (date: string): string =>
52
- DateTime.fromISO(date).toLocaleString({
53
- month: 'long',
54
- day: 'numeric',
55
- })
56
-
57
- const t = {
58
- starts: 'Starts',
59
- ends: 'Ends',
60
- }
@@ -1,17 +0,0 @@
1
- import type { ElementProps } from 'lib/element.js'
2
-
3
- import type { ClimateSettingScheduleTableProps } from './ClimateSettingScheduleTable.js'
4
-
5
- export const name = 'seam-climate-setting-schedule-table'
6
-
7
- export const props: ElementProps<ClimateSettingScheduleTableProps> = {
8
- deviceId: 'string',
9
- disableSearch: 'boolean',
10
- onClimateSettingScheduleClick: 'object',
11
- preventDefaultOnClimateSettingScheduleClick: 'boolean',
12
- climateSettingScheduleFilter: 'object',
13
- climateSettingScheduleComparator: 'object',
14
- heading: 'string',
15
- }
16
-
17
- export { ClimateSettingScheduleTable as Component } from './ClimateSettingScheduleTable.js'
@@ -1,220 +0,0 @@
1
- import type { ClimateSettingSchedule } from '@seamapi/types/connect'
2
- import classNames from 'classnames'
3
- import { useCallback, useMemo, useState } from 'react'
4
-
5
- import { compareByCreatedAtDesc } from 'lib/dates.js'
6
- import { NestedClimateSettingScheduleDetails } from 'lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.js'
7
- import { ClimateSettingScheduleRow } from 'lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleRow.js'
8
- import {
9
- type CommonProps,
10
- withRequiredCommonProps,
11
- } from 'lib/seam/components/common-props.js'
12
- import { useClimateSettingSchedules } from 'lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedules.js'
13
- import { useComponentTelemetry } from 'lib/telemetry/index.js'
14
- import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'
15
- import { LoadingToast } from 'lib/ui/LoadingToast/LoadingToast.js'
16
- import { Snackbar } from 'lib/ui/Snackbar/Snackbar.js'
17
- import { EmptyPlaceholder } from 'lib/ui/Table/EmptyPlaceholder.js'
18
- import { TableBody } from 'lib/ui/Table/TableBody.js'
19
- import { TableHeader } from 'lib/ui/Table/TableHeader.js'
20
- import { TableTitle } from 'lib/ui/Table/TableTitle.js'
21
- import { SearchTextField } from 'lib/ui/TextField/SearchTextField.js'
22
- import { Caption } from 'lib/ui/typography/Caption.js'
23
-
24
- export const NestedClimateSettingScheduleTable = withRequiredCommonProps(
25
- ClimateSettingScheduleTable
26
- )
27
-
28
- export interface ClimateSettingScheduleTableProps extends CommonProps {
29
- deviceId: string
30
- disableSearch?: boolean
31
- onClimateSettingScheduleClick?: (climateSettingScheduleId: string) => void
32
- preventDefaultOnClimateSettingScheduleClick?: boolean
33
- climateSettingScheduleFilter?: (
34
- climateSettingSchedule: ClimateSettingSchedule,
35
- searchInputValue: string
36
- ) => boolean
37
- climateSettingScheduleComparator?: (
38
- climateSettingScheduleA: ClimateSettingSchedule,
39
- climateSettingScheduleB: ClimateSettingSchedule
40
- ) => number
41
- heading?: string | null
42
- }
43
-
44
- const defaultClimateSettingScheduleFilter = (
45
- climateSettingSchedule: ClimateSettingSchedule,
46
- searchInputValue: string
47
- ): boolean => {
48
- const value = searchInputValue.trim().toLowerCase()
49
- if (value === '') return true
50
- const name = climateSettingSchedule.name ?? ''
51
- return name.trim().toLowerCase().includes(value)
52
- }
53
-
54
- export function ClimateSettingScheduleTable({
55
- deviceId,
56
- disableSearch = false,
57
- onClimateSettingScheduleClick = () => {},
58
- preventDefaultOnClimateSettingScheduleClick = false,
59
- climateSettingScheduleFilter = defaultClimateSettingScheduleFilter,
60
- climateSettingScheduleComparator = compareByCreatedAtDesc,
61
- heading = t.climateSettingSchedules,
62
- disableLockUnlock = false,
63
- disableDeleteAccessCode = false,
64
- onBack,
65
- className,
66
- errorFilter = () => true,
67
- warningFilter = () => true,
68
- disableCreateAccessCode,
69
- disableEditAccessCode,
70
- disableResourceIds = false,
71
- disableConnectedAccountInformation = false,
72
- disableClimateSettingSchedules,
73
- }: ClimateSettingScheduleTableProps): JSX.Element {
74
- useComponentTelemetry('ClimateSettingScheduleTable')
75
-
76
- const { climateSettingSchedules, isInitialLoading, isError, refetch } =
77
- useClimateSettingSchedules({
78
- device_id: deviceId,
79
- })
80
-
81
- const [searchInputValue, setSearchInputValue] = useState('')
82
- const [
83
- selectedViewClimateSettingScheduleId,
84
- setSelectedViewClimateSettingScheduleId,
85
- ] = useState<string | null>(null)
86
-
87
- const filteredClimateSettingSchedules = useMemo(
88
- () =>
89
- climateSettingSchedules
90
- ?.filter((schedule) =>
91
- climateSettingScheduleFilter(schedule, searchInputValue)
92
- )
93
- ?.sort(climateSettingScheduleComparator) ?? [],
94
- [
95
- climateSettingSchedules,
96
- searchInputValue,
97
- climateSettingScheduleFilter,
98
- climateSettingScheduleComparator,
99
- ]
100
- )
101
-
102
- const handleClimateSettingScheduleClick = useCallback(
103
- (climateSettingScheduleId: string): void => {
104
- onClimateSettingScheduleClick(climateSettingScheduleId)
105
- if (preventDefaultOnClimateSettingScheduleClick) return
106
- setSelectedViewClimateSettingScheduleId(climateSettingScheduleId)
107
- },
108
- [
109
- onClimateSettingScheduleClick,
110
- preventDefaultOnClimateSettingScheduleClick,
111
- setSelectedViewClimateSettingScheduleId,
112
- ]
113
- )
114
-
115
- if (selectedViewClimateSettingScheduleId != null) {
116
- return (
117
- <NestedClimateSettingScheduleDetails
118
- climateSettingScheduleId={selectedViewClimateSettingScheduleId}
119
- errorFilter={errorFilter}
120
- warningFilter={warningFilter}
121
- disableLockUnlock={disableLockUnlock}
122
- disableCreateAccessCode={disableCreateAccessCode}
123
- disableEditAccessCode={disableEditAccessCode}
124
- disableDeleteAccessCode={disableDeleteAccessCode}
125
- disableResourceIds={disableResourceIds}
126
- disableConnectedAccountInformation={disableConnectedAccountInformation}
127
- disableClimateSettingSchedules={disableClimateSettingSchedules}
128
- onBack={() => {
129
- setSelectedViewClimateSettingScheduleId(null)
130
- }}
131
- className={className}
132
- />
133
- )
134
- }
135
-
136
- return (
137
- <div className={classNames('seam-table', className)}>
138
- <ContentHeader onBack={onBack} />
139
- <TableHeader>
140
- {heading != null ? (
141
- <TableTitle>
142
- {heading ?? t.climateSettingSchedules}{' '}
143
- <Caption>({filteredClimateSettingSchedules.length})</Caption>
144
- </TableTitle>
145
- ) : (
146
- <div className='seam-fragment' />
147
- )}
148
- <div className='seam-table-header-loading-wrap'>
149
- <LoadingToast
150
- isLoading={isInitialLoading}
151
- label={t.loading}
152
- top={-20}
153
- />
154
- </div>
155
- {!disableSearch && (
156
- <SearchTextField
157
- value={searchInputValue}
158
- onChange={setSearchInputValue}
159
- disabled={(climateSettingSchedules?.length ?? 0) === 0}
160
- />
161
- )}
162
- </TableHeader>
163
- <TableBody>
164
- <Content
165
- climateSettingSchedules={filteredClimateSettingSchedules}
166
- onClimateSettingScheduleClick={handleClimateSettingScheduleClick}
167
- />
168
- </TableBody>
169
-
170
- <Snackbar
171
- variant='error'
172
- visible={isError}
173
- message={t.fallbackErrorMessage}
174
- action={{
175
- label: t.tryAgain,
176
- onClick: () => {
177
- void refetch()
178
- },
179
- }}
180
- disableCloseButton
181
- />
182
- </div>
183
- )
184
- }
185
-
186
- function Content(props: {
187
- climateSettingSchedules: ClimateSettingSchedule[]
188
- onClimateSettingScheduleClick: (climateSettingScheduleId: string) => void
189
- }): JSX.Element {
190
- const { climateSettingSchedules, onClimateSettingScheduleClick } = props
191
-
192
- if (climateSettingSchedules.length === 0) {
193
- return (
194
- <EmptyPlaceholder>{t.noClimateSettingSchedulesMessage}</EmptyPlaceholder>
195
- )
196
- }
197
-
198
- return (
199
- <>
200
- {climateSettingSchedules.map((schedule) => (
201
- <ClimateSettingScheduleRow
202
- climateSettingSchedule={schedule}
203
- key={schedule.climate_setting_schedule_id}
204
- onClick={() => {
205
- onClimateSettingScheduleClick(schedule.climate_setting_schedule_id)
206
- }}
207
- />
208
- ))}
209
- </>
210
- )
211
- }
212
-
213
- const t = {
214
- climateSettingSchedules: 'Climate setting schedules',
215
- noClimateSettingSchedulesMessage:
216
- 'Sorry, no climate setting schedules were found',
217
- loading: 'Loading schedules',
218
- tryAgain: 'Try again',
219
- fallbackErrorMessage: 'Climate settings could not be loaded',
220
- }
@@ -1,9 +0,0 @@
1
- import type { ElementProps } from 'lib/element.js'
2
-
3
- import type { CreateClimateSettingScheduleFormProps } from './CreateClimateSettingScheduleForm.js'
4
-
5
- export const name = 'seam-create-climate-setting-schedule-form'
6
-
7
- export const props: ElementProps<CreateClimateSettingScheduleFormProps> = {}
8
-
9
- export { CreateClimateSettingScheduleForm as Component } from './CreateClimateSettingScheduleForm.js'
@@ -1,56 +0,0 @@
1
- import type { CommonProps } from 'lib/seam/components/common-props.js'
2
- import { useCreateClimateSettingSchedule } from 'lib/seam/thermostats/climate-setting-schedules/use-create-climate-setting-schedule.js'
3
- import { useComponentTelemetry } from 'lib/telemetry/index.js'
4
- import {
5
- ClimateSettingScheduleForm,
6
- type ClimateSettingScheduleFormSubmitData,
7
- } from 'lib/ui/ClimateSettingForm/ClimateSettingScheduleForm.js'
8
-
9
- export interface CreateClimateSettingScheduleFormProps extends CommonProps {}
10
-
11
- export function CreateClimateSettingScheduleForm({
12
- className,
13
- onBack,
14
- }: CreateClimateSettingScheduleFormProps): JSX.Element | null {
15
- useComponentTelemetry('CreateClimateSettingScheduleForm')
16
-
17
- const { submit, isSubmitting } = useSubmitCreateClimateSettingSchedule(onBack)
18
-
19
- return (
20
- <ClimateSettingScheduleForm
21
- className={className}
22
- onBack={onBack}
23
- onSubmit={submit}
24
- isSubmitting={isSubmitting}
25
- />
26
- )
27
- }
28
-
29
- function useSubmitCreateClimateSettingSchedule(onSuccess?: () => void): {
30
- submit: (data: ClimateSettingScheduleFormSubmitData) => void
31
- isSubmitting: boolean
32
- } {
33
- const { mutate, isPending: isSubmitting } = useCreateClimateSettingSchedule()
34
- const submit = (data: ClimateSettingScheduleFormSubmitData): void => {
35
- const { name, deviceId, startDate, endDate, climateSetting } = data
36
-
37
- if (isSubmitting) {
38
- return
39
- }
40
-
41
- mutate(
42
- {
43
- name,
44
- device_id: deviceId,
45
- schedule_starts_at: startDate,
46
- schedule_ends_at: endDate,
47
- ...climateSetting,
48
- },
49
- {
50
- onSuccess,
51
- }
52
- )
53
- }
54
-
55
- return { submit, isSubmitting }
56
- }
@@ -1,34 +0,0 @@
1
- import type {
2
- SeamHttpApiError,
3
- ThermostatsClimateSettingSchedulesGetParams,
4
- } from '@seamapi/http/connect'
5
- import type { ClimateSettingSchedule } from '@seamapi/types/connect'
6
- import { useQuery } from '@tanstack/react-query'
7
-
8
- import { useSeamClient } from 'lib/seam/use-seam-client.js'
9
- import type { UseSeamQueryResult } from 'lib/seam/use-seam-query-result.js'
10
-
11
- export type UseClimateSettingScheduleParams =
12
- ThermostatsClimateSettingSchedulesGetParams
13
-
14
- export type UseClimateSettingScheduleData = ClimateSettingSchedule | null
15
-
16
- export function useClimateSettingSchedule(
17
- params: UseClimateSettingScheduleParams
18
- ): UseSeamQueryResult<'climateSettingSchedule', UseClimateSettingScheduleData> {
19
- const { client } = useSeamClient()
20
-
21
- const { data, ...rest } = useQuery<
22
- UseClimateSettingScheduleData,
23
- SeamHttpApiError
24
- >({
25
- enabled: client != null,
26
- queryKey: ['thermostats', 'climate_setting_schedules', 'get', params],
27
- queryFn: async () => {
28
- if (client == null) return null
29
- return await client.thermostats.climateSettingSchedules.get(params)
30
- },
31
- })
32
-
33
- return { ...rest, climateSettingSchedule: data }
34
- }
@@ -1,53 +0,0 @@
1
- import type {
2
- SeamHttpApiError,
3
- ThermostatsClimateSettingSchedulesListParams,
4
- } from '@seamapi/http/connect'
5
- import type { ClimateSettingSchedule } from '@seamapi/types/connect'
6
- import { useQuery, useQueryClient } from '@tanstack/react-query'
7
-
8
- import { useSeamClient } from 'lib/seam/use-seam-client.js'
9
- import type { UseSeamQueryResult } from 'lib/seam/use-seam-query-result.js'
10
-
11
- export type UseClimateSettingSchedulesParams =
12
- ThermostatsClimateSettingSchedulesListParams
13
-
14
- export type UseClimateSettingSchedulesData = ClimateSettingSchedule[]
15
-
16
- export function useClimateSettingSchedules(
17
- params: UseClimateSettingSchedulesParams
18
- ): UseSeamQueryResult<
19
- 'climateSettingSchedules',
20
- UseClimateSettingSchedulesData
21
- > {
22
- const { client } = useSeamClient()
23
- const queryClient = useQueryClient()
24
-
25
- const { data, ...rest } = useQuery<
26
- UseClimateSettingSchedulesData,
27
- SeamHttpApiError
28
- >({
29
- enabled: client != null,
30
- queryKey: ['thermostats', 'climate_setting_schedules', 'list', params],
31
- queryFn: async () => {
32
- if (client == null) return []
33
- const climateSettingSchedules =
34
- await client.thermostats.climateSettingSchedules.list(params)
35
- for (const schedule of climateSettingSchedules) {
36
- queryClient.setQueryData(
37
- [
38
- 'thermostats',
39
- 'climate_setting_schedules',
40
- 'get',
41
- {
42
- climate_setting_schedule_id: schedule.climate_setting_schedule_id,
43
- },
44
- ],
45
- schedule
46
- )
47
- }
48
- return climateSettingSchedules
49
- },
50
- })
51
-
52
- return { ...rest, climateSettingSchedules: data }
53
- }
@@ -1,53 +0,0 @@
1
- import type {
2
- SeamHttpApiError,
3
- ThermostatsClimateSettingSchedulesCreateBody,
4
- } from '@seamapi/http/connect'
5
- import type { ClimateSettingSchedule } from '@seamapi/types/connect'
6
- import {
7
- useMutation,
8
- type UseMutationResult,
9
- useQueryClient,
10
- } from '@tanstack/react-query'
11
-
12
- import { NullSeamClientError, useSeamClient } from 'lib/seam/use-seam-client.js'
13
-
14
- export type UseCreateClimateSettingScheduleParams = never
15
-
16
- export type UseCreateClimateSettingScheduleData = ClimateSettingSchedule
17
-
18
- export type UseCreateClimateSettingScheduleMutationVariables =
19
- ThermostatsClimateSettingSchedulesCreateBody
20
-
21
- export function useCreateClimateSettingSchedule(): UseMutationResult<
22
- UseCreateClimateSettingScheduleData,
23
- SeamHttpApiError,
24
- UseCreateClimateSettingScheduleMutationVariables
25
- > {
26
- const { client } = useSeamClient()
27
- const queryClient = useQueryClient()
28
-
29
- return useMutation<
30
- UseCreateClimateSettingScheduleData,
31
- SeamHttpApiError,
32
- UseCreateClimateSettingScheduleMutationVariables
33
- >({
34
- mutationFn: async (variables) => {
35
- if (client === null) throw new NullSeamClientError()
36
- return await client.thermostats.climateSettingSchedules.create(variables)
37
- },
38
- onSuccess: (data) => {
39
- queryClient.setQueryData(
40
- [
41
- 'thermostats',
42
- 'climate_setting_schedules',
43
- 'get',
44
- { climate_setting_schedules: data.climate_setting_schedule_id },
45
- ],
46
- data
47
- )
48
- void queryClient.invalidateQueries({
49
- queryKey: ['thermostats', 'climate_setting_schedules', 'list'],
50
- })
51
- },
52
- })
53
- }
@@ -1,51 +0,0 @@
1
- import type {
2
- SeamHttpApiError,
3
- ThermostatsClimateSettingSchedulesDeleteParams,
4
- } from '@seamapi/http/connect'
5
- import {
6
- useMutation,
7
- type UseMutationResult,
8
- useQueryClient,
9
- } from '@tanstack/react-query'
10
-
11
- import { NullSeamClientError, useSeamClient } from 'lib/seam/use-seam-client.js'
12
-
13
- export type UseDeleteClimateSettingScheduleParams = never
14
-
15
- export type UseDeleteClimateSettingScheduleData = undefined
16
-
17
- export type UseDeleteClimateSettingScheduleMutationVariables =
18
- ThermostatsClimateSettingSchedulesDeleteParams
19
-
20
- export function useDeleteClimateSettingSchedule(): UseMutationResult<
21
- UseDeleteClimateSettingScheduleData,
22
- SeamHttpApiError,
23
- UseDeleteClimateSettingScheduleMutationVariables
24
- > {
25
- const { client } = useSeamClient()
26
- const queryClient = useQueryClient()
27
-
28
- return useMutation<
29
- UseDeleteClimateSettingScheduleData,
30
- SeamHttpApiError,
31
- UseDeleteClimateSettingScheduleMutationVariables
32
- >({
33
- mutationFn: async (variables) => {
34
- if (client === null) throw new NullSeamClientError()
35
- await client.thermostats.climateSettingSchedules.delete(variables)
36
- },
37
- onSuccess: (_data, variables) => {
38
- void queryClient.invalidateQueries({
39
- queryKey: [
40
- 'thermostats',
41
- 'climate_setting_schedules',
42
- 'get',
43
- { climate_setting_schedules: variables.climate_setting_schedule_id },
44
- ],
45
- })
46
- void queryClient.invalidateQueries({
47
- queryKey: ['thermostats', 'climate_setting_schedules', 'list'],
48
- })
49
- },
50
- })
51
- }
@@ -1,83 +0,0 @@
1
- import type {
2
- SeamHttpApiError,
3
- ThermostatsClimateSettingSchedulesUpdateBody,
4
- } from '@seamapi/http/connect'
5
- import type { ClimateSettingSchedule } from '@seamapi/types/connect'
6
- import {
7
- useMutation,
8
- type UseMutationResult,
9
- useQueryClient,
10
- } from '@tanstack/react-query'
11
-
12
- import { shake } from 'lib/object.js'
13
- import { NullSeamClientError, useSeamClient } from 'lib/seam/use-seam-client.js'
14
-
15
- export type UseUpdateClimateSettingScheduleParams = never
16
-
17
- export type UseUpdateClimateSettingScheduleData = undefined
18
-
19
- export type UseUpdateClimateSettingScheduleMutationVariables =
20
- ThermostatsClimateSettingSchedulesUpdateBody
21
-
22
- export function useUpdateClimateSettingSchedule(): UseMutationResult<
23
- UseUpdateClimateSettingScheduleData,
24
- SeamHttpApiError,
25
- UseUpdateClimateSettingScheduleMutationVariables
26
- > {
27
- const { client } = useSeamClient()
28
- const queryClient = useQueryClient()
29
-
30
- return useMutation<
31
- UseUpdateClimateSettingScheduleData,
32
- SeamHttpApiError,
33
- UseUpdateClimateSettingScheduleMutationVariables
34
- >({
35
- mutationFn: async (variables) => {
36
- if (client === null) throw new NullSeamClientError()
37
- await client.thermostats.climateSettingSchedules.update(variables)
38
- },
39
- onSuccess: (_data, variables) => {
40
- queryClient.setQueryData<ClimateSettingSchedule | null>(
41
- [
42
- 'thermostats',
43
- 'climate_setting_schedules',
44
- 'get',
45
- { climate_setting_schedules: variables.climate_setting_schedule_id },
46
- ],
47
- (climateSettingSchedule) => {
48
- if (climateSettingSchedule == null) {
49
- return
50
- }
51
-
52
- return {
53
- ...climateSettingSchedule,
54
- ...shake(variables),
55
- }
56
- }
57
- )
58
-
59
- queryClient.setQueryData<ClimateSettingSchedule[]>(
60
- ['thermostats', 'climate_setting_schedules', 'list'],
61
- (climateSettingSchedules) => {
62
- if (climateSettingSchedules == null) {
63
- return climateSettingSchedules
64
- }
65
-
66
- return climateSettingSchedules.map((climateSettingSchedule) => {
67
- if (
68
- climateSettingSchedule.climate_setting_schedule_id ===
69
- variables.climate_setting_schedule_id
70
- ) {
71
- return {
72
- ...climateSettingSchedule,
73
- ...shake(variables),
74
- }
75
- }
76
-
77
- return climateSettingSchedule
78
- })
79
- }
80
- )
81
- },
82
- })
83
- }