Skip to content

Commit 75e7904

Browse files
committed
Extract all schedule controls from machine
1 parent de196b8 commit 75e7904

File tree

2 files changed

+55
-20
lines changed

2 files changed

+55
-20
lines changed

site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx

+5-20
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { useActor } from "@xstate/react";
21
import { useDashboard } from "components/Dashboard/DashboardProvider";
32
import dayjs from "dayjs";
43
import { useFeatureVisibility } from "hooks/useFeatureVisibility";
@@ -34,6 +33,7 @@ import { templateVersion, templateVersions } from "api/queries/templates";
3433
import { Alert } from "components/Alert/Alert";
3534
import { Stack } from "components/Stack/Stack";
3635
import { useWorkspaceBuildLogs } from "hooks/useWorkspaceBuildLogs";
36+
import { useDecreaseDeadline, useIncreaseDeadline } from "./scheduleControls";
3737

3838
interface WorkspaceReadyPageProps {
3939
workspaceState: StateFrom<typeof workspaceMachine>;
@@ -56,9 +56,6 @@ export const WorkspaceReadyPage = ({
5656
isLoadingMoreBuilds,
5757
hasMoreBuilds,
5858
}: WorkspaceReadyPageProps): JSX.Element => {
59-
const [_, bannerSend] = useActor(
60-
workspaceState.children["scheduleBannerMachine"],
61-
);
6259
const { buildInfo } = useDashboard();
6360
const featureVisibility = useFeatureVisibility();
6461
const {
@@ -121,10 +118,8 @@ export const WorkspaceReadyPage = ({
121118
} = useMutation({
122119
mutationFn: restartWorkspace,
123120
});
124-
// keep banner machine in sync with workspace
125-
useEffect(() => {
126-
bannerSend({ type: "REFRESH_WORKSPACE", workspace });
127-
}, [bannerSend, workspace]);
121+
const decreaseDeadline = useDecreaseDeadline(workspace);
122+
const increaseDeadline = useIncreaseDeadline(workspace);
128123

129124
return (
130125
<>
@@ -144,18 +139,8 @@ export const WorkspaceReadyPage = ({
144139

145140
<Workspace
146141
scheduleProps={{
147-
onDeadlineMinus: (hours: number) => {
148-
bannerSend({
149-
type: "DECREASE_DEADLINE",
150-
hours,
151-
});
152-
},
153-
onDeadlinePlus: (hours: number) => {
154-
bannerSend({
155-
type: "INCREASE_DEADLINE",
156-
hours,
157-
});
158-
},
142+
onDeadlineMinus: decreaseDeadline,
143+
onDeadlinePlus: increaseDeadline,
159144
maxDeadlineDecrease: getMaxDeadlineChange(deadline, getMinDeadline()),
160145
maxDeadlineIncrease: getMaxDeadlineChange(
161146
getMaxDeadline(workspace),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { putWorkspaceExtension } from "api/api";
2+
import { Workspace } from "api/typesGenerated";
3+
import dayjs from "dayjs";
4+
import { getDeadline, getMaxDeadline, getMinDeadline } from "utils/schedule";
5+
import minMax from "dayjs/plugin/minMax";
6+
import { useMutation } from "react-query";
7+
import { displayError, displaySuccess } from "components/GlobalSnackbar/utils";
8+
import { getErrorMessage } from "api/errors";
9+
10+
dayjs.extend(minMax);
11+
12+
const callbacks = {
13+
onSuccess: () => {
14+
displaySuccess("Updated workspace shutdown time.");
15+
},
16+
onError: (error: unknown) => {
17+
displayError(
18+
getErrorMessage(error, "Failed to update workspace shutdown time."),
19+
);
20+
},
21+
};
22+
23+
export const useIncreaseDeadline = (workspace: Workspace) => {
24+
const mutation = useMutation({
25+
mutationFn: (hours: number) => increaseDeadline(workspace, hours),
26+
...callbacks,
27+
});
28+
return mutation.mutate;
29+
};
30+
31+
export const useDecreaseDeadline = (workspace: Workspace) => {
32+
const mutation = useMutation({
33+
mutationFn: (hours: number) => decreaseDeadline(workspace, hours),
34+
...callbacks,
35+
});
36+
return mutation.mutate;
37+
};
38+
39+
const increaseDeadline = (workspace: Workspace, hours: number) => {
40+
const proposedDeadline = getDeadline(workspace).add(hours, "hours");
41+
const newDeadline = dayjs.min(proposedDeadline, getMaxDeadline(workspace));
42+
43+
return putWorkspaceExtension(workspace.id, newDeadline);
44+
};
45+
46+
const decreaseDeadline = (workspace: Workspace, hours: number) => {
47+
const proposedDeadline = getDeadline(workspace).subtract(hours, "hours");
48+
const newDeadline = dayjs.max(proposedDeadline, getMinDeadline());
49+
return putWorkspaceExtension(workspace.id, newDeadline);
50+
};

0 commit comments

Comments
 (0)