@@ -14,6 +14,7 @@ import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
14
14
import { EnvironmentPageFilter } from 'sentry/components/organizations/environmentPageFilter' ;
15
15
import PageFilterBar from 'sentry/components/organizations/pageFilterBar' ;
16
16
import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle' ;
17
+ import { TimezoneProvider , useTimezone } from 'sentry/components/timezoneProvider' ;
17
18
import { t } from 'sentry/locale' ;
18
19
import { space } from 'sentry/styles/space' ;
19
20
import type { RouteComponentProps } from 'sentry/types/legacyReactRouter' ;
@@ -30,6 +31,7 @@ import {MonitorOnboarding} from 'sentry/views/insights/crons/components/onboardi
30
31
import { MonitorProcessingErrors } from 'sentry/views/insights/crons/components/processingErrors/monitorProcessingErrors' ;
31
32
import { makeMonitorErrorsQueryKey } from 'sentry/views/insights/crons/components/processingErrors/utils' ;
32
33
import { StatusToggleButton } from 'sentry/views/insights/crons/components/statusToggleButton' ;
34
+ import { TimezoneOverride } from 'sentry/views/insights/crons/components/timezoneOverride' ;
33
35
import type {
34
36
CheckinProcessingError ,
35
37
Monitor ,
@@ -114,6 +116,9 @@ function MonitorDetails({params, location}: Props) {
114
116
refetchErrors ( ) ;
115
117
}
116
118
119
+ const userTimezone = useTimezone ( ) ;
120
+ const [ timezoneOverride , setTimezoneOverride ] = useState ( userTimezone ) ;
121
+
117
122
// Only display the unknown legend when there are visible unknown check-ins
118
123
// in the timeline
119
124
const [ showUnknownLegend , setShowUnknownLegend ] = useState ( false ) ;
@@ -146,61 +151,77 @@ function MonitorDetails({params, location}: Props) {
146
151
< SentryDocumentTitle title = { `${ monitor . name } — Alerts` } />
147
152
< MonitorHeader monitor = { monitor } orgSlug = { organization . slug } onUpdate = { onUpdate } />
148
153
< Layout . Body >
149
- < Layout . Main >
150
- < StyledPageFilterBar condensed >
151
- < DatePageFilter maxPickableDays = { 30 } />
152
- < EnvironmentPageFilter />
153
- </ StyledPageFilterBar >
154
- { monitor . status === 'disabled' && (
155
- < Alert . Container >
156
- < Alert
157
- type = "muted"
158
- showIcon
159
- trailingItems = {
160
- < StatusToggleButton
161
- monitor = { monitor }
162
- size = "xs"
163
- onToggleStatus = { status => handleUpdate ( { status} ) }
164
- >
165
- { t ( 'Enable' ) }
166
- </ StatusToggleButton >
167
- }
154
+ < TimezoneProvider timezone = { timezoneOverride } >
155
+ < Layout . Main >
156
+ < MainActions >
157
+ < StyledPageFilterBar condensed >
158
+ < DatePageFilter maxPickableDays = { 30 } />
159
+ < EnvironmentPageFilter />
160
+ </ StyledPageFilterBar >
161
+ < TimezoneOverride
162
+ monitor = { monitor }
163
+ userTimezone = { userTimezone }
164
+ onTimezoneSelected = { setTimezoneOverride }
165
+ />
166
+ </ MainActions >
167
+ { monitor . status === 'disabled' && (
168
+ < Alert . Container >
169
+ < Alert
170
+ type = "muted"
171
+ showIcon
172
+ trailingItems = {
173
+ < StatusToggleButton
174
+ monitor = { monitor }
175
+ size = "xs"
176
+ onToggleStatus = { status => handleUpdate ( { status} ) }
177
+ >
178
+ { t ( 'Enable' ) }
179
+ </ StatusToggleButton >
180
+ }
181
+ >
182
+ { t ( 'This monitor is disabled and is not accepting check-ins.' ) }
183
+ </ Alert >
184
+ </ Alert . Container >
185
+ ) }
186
+ { ! ! checkinErrors ?. length && (
187
+ < MonitorProcessingErrors
188
+ checkinErrors = { checkinErrors }
189
+ onDismiss = { handleDismissError }
168
190
>
169
- { t ( 'This monitor is disabled and is not accepting check-ins.' ) }
170
- </ Alert >
171
- </ Alert . Container >
172
- ) }
173
- { ! ! checkinErrors ?. length && (
174
- < MonitorProcessingErrors
175
- checkinErrors = { checkinErrors }
176
- onDismiss = { handleDismissError }
177
- >
178
- { t ( 'Errors were encountered while ingesting check-ins for this monitor' ) }
179
- </ MonitorProcessingErrors >
180
- ) }
181
- { hasLastCheckIn ( monitor ) ? (
182
- < Fragment >
183
- < DetailsTimeline monitor = { monitor } onStatsLoaded = { checkHasUnknown } />
184
- < MonitorStats monitor = { monitor } monitorEnvs = { monitor . environments } />
185
- < MonitorIssues monitor = { monitor } monitorEnvs = { monitor . environments } />
186
- < MonitorCheckIns monitor = { monitor } monitorEnvs = { monitor . environments } />
187
- </ Fragment >
188
- ) : (
189
- < MonitorOnboarding monitor = { monitor } />
190
- ) }
191
- </ Layout . Main >
192
- < Layout . Side >
193
- < DetailsSidebar
194
- monitorEnv = { envsSortedByLastCheck [ envsSortedByLastCheck . length - 1 ] }
195
- monitor = { monitor }
196
- showUnknownLegend = { showUnknownLegend }
197
- />
198
- </ Layout . Side >
191
+ { t ( 'Errors were encountered while ingesting check-ins for this monitor' ) }
192
+ </ MonitorProcessingErrors >
193
+ ) }
194
+ { hasLastCheckIn ( monitor ) ? (
195
+ < Fragment >
196
+ < DetailsTimeline monitor = { monitor } onStatsLoaded = { checkHasUnknown } />
197
+ < MonitorStats monitor = { monitor } monitorEnvs = { monitor . environments } />
198
+ < MonitorIssues monitor = { monitor } monitorEnvs = { monitor . environments } />
199
+ < MonitorCheckIns monitor = { monitor } monitorEnvs = { monitor . environments } />
200
+ </ Fragment >
201
+ ) : (
202
+ < MonitorOnboarding monitor = { monitor } />
203
+ ) }
204
+ </ Layout . Main >
205
+ < Layout . Side >
206
+ < DetailsSidebar
207
+ monitorEnv = { envsSortedByLastCheck [ envsSortedByLastCheck . length - 1 ] }
208
+ monitor = { monitor }
209
+ showUnknownLegend = { showUnknownLegend }
210
+ />
211
+ </ Layout . Side >
212
+ </ TimezoneProvider >
199
213
</ Layout . Body >
200
214
</ Layout . Page >
201
215
) ;
202
216
}
203
217
218
+ const MainActions = styled ( 'div' ) `
219
+ display: flex;
220
+ gap: ${ space ( 1 ) } ;
221
+ justify-content: space-between;
222
+ align-items: center;
223
+ ` ;
224
+
204
225
const StyledPageFilterBar = styled ( PageFilterBar ) `
205
226
margin-bottom: ${ space ( 2 ) } ;
206
227
` ;
0 commit comments