@@ -9,11 +9,14 @@ import {
99} from 'lib/seam/components/common-props.js'
1010import { NestedDeviceDetails } from 'lib/seam/components/DeviceDetails/DeviceDetails.js'
1111import { 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'
1213import { useComponentTelemetry } from 'lib/telemetry/index.js'
1314import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'
1415import { DetailRow } from 'lib/ui/layout/DetailRow.js'
1516import { DetailSection } from 'lib/ui/layout/DetailSection.js'
1617import { 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'
1720import { ClimateSettingStatus } from 'lib/ui/thermostat/ClimateSettingStatus.js'
1821
1922import { formatDateTime } from './dates.js'
@@ -45,6 +48,8 @@ export function ClimateSettingScheduleDetails({
4548 climateSettingScheduleId
4649 )
4750
51+ const { mutate, isSuccess, isError } = useUpdateClimateSettingSchedule ( )
52+
4853 const [ selectedDeviceId , selectDevice ] = useState < string | null > ( null )
4954
5055 if ( climateSettingSchedule == null ) {
@@ -75,55 +80,82 @@ export function ClimateSettingScheduleDetails({
7580 }
7681
7782 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 >
95143 </ 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 >
125144 </ 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+ </ >
127159 )
128160}
129161
@@ -136,6 +168,6 @@ const t = {
136168 defaultSettingMessagePart1 : 'Thermostat will return to its' ,
137169 defaultSetting : 'default setting' ,
138170 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. ' ,
141173}
0 commit comments