Skip to content

Commit 36f0b5d

Browse files
committed
fixup! feat: add user quiet hours settings page
1 parent a4faf5b commit 36f0b5d

File tree

3 files changed

+60
-39
lines changed

3 files changed

+60
-39
lines changed

site/src/components/SettingsLayout/Sidebar.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ const SidebarNavItemIcon: React.FC<{ icon: ElementType }> = ({
4444
export const Sidebar: React.FC<{ user: User }> = ({ user }) => {
4545
const styles = useStyles()
4646
const { entitlements } = useDashboard()
47-
const allowAutostopRequirement = entitlements.features.template_autostop_requirement.enabled
47+
const allowAutostopRequirement =
48+
entitlements.features.template_autostop_requirement.enabled
4849

4950
return (
5051
<nav className={styles.sidebar}>

site/src/pages/UserSettingsPage/SchedulePage/ScheduleForm.tsx

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import TextField from "@mui/material/TextField"
22
import { FormikContextType, useFormik } from "formik"
33
import { FC, useEffect, useState } from "react"
44
import * as Yup from "yup"
5-
import {
6-
getFormHelpers,
7-
} from "utils/formUtils"
5+
import { getFormHelpers } from "utils/formUtils"
86
import { LoadingButton } from "components/LoadingButton/LoadingButton"
97
import { ErrorAlert } from "components/Alert/ErrorAlert"
108
import { Form, FormFields } from "components/Form/Form"
11-
import { UpdateUserQuietHoursScheduleRequest, UserQuietHoursScheduleResponse } from "api/typesGenerated"
9+
import {
10+
UpdateUserQuietHoursScheduleRequest,
11+
UserQuietHoursScheduleResponse,
12+
} from "api/typesGenerated"
1213
import cronParser from "cron-parser"
1314
import MenuItem from "@mui/material/MenuItem"
1415
import Stack from "@mui/material/Stack"
@@ -50,13 +51,13 @@ export const ScheduleForm: FC<React.PropsWithChildren<ScheduleFormProps>> = ({
5051
now,
5152
}) => {
5253
// Force a re-render every 15 seconds to update the "Next occurrence" field.
53-
const [_, setTime] = useState<number>(Date.now());
54+
const [_, setTime] = useState<number>(Date.now())
5455
useEffect(() => {
55-
const interval = setInterval(() => setTime(Date.now()), 15000);
56+
const interval = setInterval(() => setTime(Date.now()), 15000)
5657
return () => {
57-
clearInterval(interval);
58-
};
59-
}, []);
58+
clearInterval(interval)
59+
}
60+
}, [])
6061

6162
const formInitialValues = {
6263
hours: 0,
@@ -79,32 +80,27 @@ export const ScheduleForm: FC<React.PropsWithChildren<ScheduleFormProps>> = ({
7980
})
8081
},
8182
})
82-
const getFieldHelpers = getFormHelpers<ScheduleFormValues>(
83-
form,
84-
updateErr,
85-
)
83+
const getFieldHelpers = getFormHelpers<ScheduleFormValues>(form, updateErr)
8684

8785
return (
8886
<>
8987
<Form onSubmit={form.handleSubmit}>
9088
<FormFields>
91-
{Boolean(updateErr) && (
92-
<ErrorAlert error={updateErr} />
93-
)}
89+
{Boolean(updateErr) && <ErrorAlert error={updateErr} />}
9490

9591
<p>
9692
Workspaces will only be turned off for updates (due to settings{" "}
9793
configured by template admins) when your configured quiet hours{" "}
98-
start. Workspaces may still be automatically stopped at any{" "}
99-
other time due to inactivity.
94+
start. Workspaces may still be automatically stopped at any other
95+
time due to inactivity.
10096
</p>
10197

10298
{!initialValues.user_set && (
10399
<p>
104-
You are currently using the default quiet hours schedule,{" "}
105-
which is every day at <code>{initialValues.time}</code> in{" "}
106-
<code>{initialValues.timezone}</code>. You can set a custom{" "}
107-
quiet hours schedule below.
100+
You are currently using the default quiet hours schedule, which is
101+
every day at <code>{initialValues.time}</code> in{" "}
102+
<code>{initialValues.timezone}</code>. You can set a custom quiet
103+
hours schedule below.
108104
</p>
109105
)}
110106

@@ -148,14 +144,23 @@ export const ScheduleForm: FC<React.PropsWithChildren<ScheduleFormProps>> = ({
148144
disabled
149145
fullWidth
150146
label="Cron schedule"
151-
value={timeToCron(form.values.hours, form.values.minutes, form.values.timezone)}
147+
value={timeToCron(
148+
form.values.hours,
149+
form.values.minutes,
150+
form.values.timezone,
151+
)}
152152
/>
153153

154154
<TextField
155155
disabled
156156
fullWidth
157157
label="Next occurrence"
158-
value={formatNextRun(form.values.hours, form.values.minutes, form.values.timezone, now)}
158+
value={formatNextRun(
159+
form.values.hours,
160+
form.values.minutes,
161+
form.values.timezone,
162+
now,
163+
)}
159164
/>
160165

161166
<div>
@@ -551,7 +556,12 @@ const timeToCron = (hours: number, minutes: number, tz: string) => {
551556
}
552557

553558
// evaluateNextRun returns a Date object of the next cron run time.
554-
const evaluateNextRun = (hours: number, minutes: number, tz: string, now: Date | undefined): Date => {
559+
const evaluateNextRun = (
560+
hours: number,
561+
minutes: number,
562+
tz: string,
563+
now: Date | undefined,
564+
): Date => {
555565
// The cron-parser package doesn't accept a timezone in the cron string, but
556566
// accepts it as an option.
557567
const cron = timeToCron(hours, minutes, "")
@@ -565,7 +575,12 @@ const evaluateNextRun = (hours: number, minutes: number, tz: string, now: Date |
565575
return parsed.next().toDate()
566576
}
567577

568-
const formatNextRun = (hours: number, minutes: number, tz: string, now: Date | undefined): string => {
578+
const formatNextRun = (
579+
hours: number,
580+
minutes: number,
581+
tz: string,
582+
now: Date | undefined,
583+
): string => {
569584
const nowDjs = dayjs(now).tz(tz)
570585
const djs = dayjs(evaluateNextRun(hours, minutes, tz, now)).tz(tz)
571586
let str = djs.format("h:mm A")

site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.tsx

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,33 @@ import { FC, useEffect, useState } from "react"
22
import { Section } from "../../../components/SettingsLayout/Section"
33
import { ScheduleForm } from "./ScheduleForm"
44
import { useMe } from "hooks/useMe"
5-
import { UpdateUserQuietHoursScheduleRequest, UserQuietHoursScheduleResponse } from "api/typesGenerated"
5+
import {
6+
UpdateUserQuietHoursScheduleRequest,
7+
UserQuietHoursScheduleResponse,
8+
} from "api/typesGenerated"
69
import * as API from "api/api"
710
import { Loader } from "components/Loader/Loader"
811

912
export const SchedulePage: FC = () => {
1013
const me = useMe()
1114

12-
const [quietHoursSchedule, setQuietHoursSchedule] = useState<UserQuietHoursScheduleResponse | undefined>(undefined)
13-
const [quietHoursSubmitting, setQuietHoursSubmitting] = useState<boolean>(false)
14-
const [quietHoursScheduleError, setQuietHoursScheduleError] = useState<unknown>("")
15+
const [quietHoursSchedule, setQuietHoursSchedule] = useState<
16+
UserQuietHoursScheduleResponse | undefined
17+
>(undefined)
18+
const [quietHoursSubmitting, setQuietHoursSubmitting] =
19+
useState<boolean>(false)
20+
const [quietHoursScheduleError, setQuietHoursScheduleError] =
21+
useState<unknown>("")
1522

1623
useEffect(() => {
1724
setQuietHoursSchedule(undefined)
1825
setQuietHoursScheduleError(undefined)
1926
API.getUserQuietHoursSchedule(me.id)
20-
.then(response => {
27+
.then((response) => {
2128
setQuietHoursSchedule(response)
2229
setQuietHoursScheduleError(undefined)
2330
})
24-
.catch(error => {
31+
.catch((error) => {
2532
setQuietHoursSchedule(undefined)
2633
setQuietHoursScheduleError(error)
2734
})
@@ -30,24 +37,22 @@ export const SchedulePage: FC = () => {
3037
const onSubmit = async (data: UpdateUserQuietHoursScheduleRequest) => {
3138
setQuietHoursSubmitting(true)
3239
API.updateUserQuietHoursSchedule(me.id, data)
33-
.then(response => {
40+
.then((response) => {
3441
setQuietHoursSchedule(response)
3542
setQuietHoursSubmitting(false)
3643
setQuietHoursScheduleError(undefined)
3744
})
38-
.catch(error => {
45+
.catch((error) => {
3946
setQuietHoursSubmitting(false)
4047
setQuietHoursScheduleError(error)
4148
})
4249
}
4350

4451
return (
4552
<Section title="Schedule" description="Manage your quiet hours schedule">
46-
{ quietHoursSchedule === undefined && (
47-
<Loader />
48-
)}
53+
{quietHoursSchedule === undefined && <Loader />}
4954

50-
{ quietHoursSchedule !== undefined && (
55+
{quietHoursSchedule !== undefined && (
5156
<ScheduleForm
5257
submitting={quietHoursSubmitting}
5358
initialValues={quietHoursSchedule}

0 commit comments

Comments
 (0)