Skip to content

Commit f372027

Browse files
committedJan 31, 2023
XState done
1 parent b9da6e0 commit f372027

File tree

5 files changed

+280
-11
lines changed

5 files changed

+280
-11
lines changed
 

‎site/src/AppRouter.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,10 @@ export const AppRouter: FC = () => {
214214
path="change-version"
215215
element={<WorkspaceChangeVersionPage />}
216216
/>
217-
<Route path="build-parameters" element={<WorkspaceBuildParametersPage />} />
217+
<Route
218+
path="build-parameters"
219+
element={<WorkspaceBuildParametersPage />}
220+
/>
218221
</Route>
219222
</Route>
220223
</Route>

‎site/src/api/api.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -799,3 +799,23 @@ export const updateWorkspaceVersion = async (
799799
const template = await getTemplate(workspace.template_id)
800800
return startWorkspace(workspace.id, template.active_version_id)
801801
}
802+
803+
export const getWorkspaceBuildParameters = async (
804+
workspaceBuildId: TypesGen.WorkspaceBuild["id"],
805+
): Promise<TypesGen.WorkspaceBuildParameter[]> => {
806+
const response = await axios.get<TypesGen.WorkspaceBuildParameter[]>(
807+
`/api/v2/workspacebuilds/${workspaceBuildId}/parameters`,
808+
)
809+
return response.data
810+
}
811+
812+
export const updateWorkspaceBuild = async (
813+
workspaceId: string,
814+
data: TypesGen.WorkspaceBuildsRequest,
815+
): Promise<TypesGen.WorkspaceBuild> => {
816+
const response = await axios.post(
817+
`/api/v2/workspaces/${workspaceId}/builds`,
818+
data,
819+
)
820+
return response.data
821+
}

‎site/src/pages/WorkspaceBuildParametersPage/WorkspaceBuildParametersPage.tsx

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,45 @@ import { FC } from "react"
22
import { Helmet } from "react-helmet-async"
33
import { useTranslation } from "react-i18next"
44
import { pageTitle } from "util/page"
5+
import { useMachine } from "@xstate/react"
6+
import { useNavigate, useParams } from "react-router-dom"
7+
import { workspaceBuildParametersMachine } from "xServices/workspace/workspaceBuildParametersXService"
58
import { WorkspaceBuildParametersPageView } from "./WorkspaceBuildParametersPageView"
69

710
export const WorkspaceBuildParametersPage: FC = () => {
811
const { t } = useTranslation("workspaceBuildParametersPage")
912

13+
const navigate = useNavigate()
14+
const { owner: workspaceOwner, workspace: workspaceName } = useParams() as {
15+
owner: string
16+
workspace: string
17+
}
18+
const [state, send] = useMachine(workspaceBuildParametersMachine, {
19+
context: {
20+
workspaceOwner,
21+
workspaceName,
22+
},
23+
actions: {
24+
onUpdateWorkspace: (_, event) => {
25+
navigate(
26+
`/@${event.data.workspace_owner_name}/${event.data.workspace_name}`,
27+
)
28+
},
29+
},
30+
})
31+
const {
32+
selectedTemplate,
33+
templateParameters,
34+
buildParameters,
35+
updateWorkspaceError,
36+
} = state.context
37+
1038
return (
1139
<>
1240
<Helmet>
1341
<title>{pageTitle(t("title"))}</title>
1442
</Helmet>
15-
<WorkspaceBuildParametersPageView
16-
isLoading={false}
17-
/>
43+
<WorkspaceBuildParametersPageView isLoading={false} />
1844
</>
1945
)
2046
}

‎site/src/pages/WorkspaceBuildParametersPage/WorkspaceBuildParametersPageView.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,10 @@ export interface WorkspaceBuildParametersPageViewProps {
66
isLoading: boolean
77
}
88

9-
export const WorkspaceBuildParametersPageView: FC<WorkspaceBuildParametersPageViewProps> = ({
10-
isLoading,
11-
}) => {
9+
export const WorkspaceBuildParametersPageView: FC<
10+
WorkspaceBuildParametersPageViewProps
11+
> = ({ isLoading }) => {
1212
const { t } = useTranslation("workspaceBuildParametersPage")
1313

14-
return (
15-
<FullPageForm title={t("title")}>
16-
</FullPageForm>
17-
)
14+
return <FullPageForm title={t("title")}></FullPageForm>
1815
}
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
import {
2+
getTemplateVersionRichParameters,
3+
getWorkspaceByOwnerAndName,
4+
getWorkspaceBuildParameters,
5+
updateWorkspaceBuild,
6+
} from "api/api"
7+
import {
8+
Template,
9+
TemplateVersionParameter,
10+
Workspace,
11+
WorkspaceBuild,
12+
WorkspaceBuildParameter,
13+
WorkspaceBuildsRequest,
14+
} from "api/typesGenerated"
15+
import { assign, createMachine } from "xstate"
16+
17+
type WorkspaceBuildParametersContext = {
18+
workspaceOwner: string
19+
workspaceName: string
20+
21+
selectedWorkspace?: Workspace
22+
selectedTemplate?: Template
23+
templateParameters?: TemplateVersionParameter[]
24+
workspaceBuildParameters?: WorkspaceBuildParameter[]
25+
26+
updateWorkspaceBuildRequest?: WorkspaceBuildsRequest
27+
28+
getWorkspaceError?: Error | unknown
29+
getTemplateParametersError?: Error | unknown
30+
getWorkspaceBuildParametersError?: Error | unknown
31+
updateWorkspaceError?: Error | unknown
32+
}
33+
34+
type UpdateWorkspaceEvent = {
35+
type: "UPDATE_WORKSPACE"
36+
request: WorkspaceBuildsRequest
37+
}
38+
39+
export const workspaceBuildParametersMachine = createMachine(
40+
{
41+
id: "workspaceBuildParametersState",
42+
predictableActionArguments: true,
43+
tsTypes:
44+
{} as import("./workspaceBuildParametersXService.typegen").Typegen0,
45+
schema: {
46+
context: {} as WorkspaceBuildParametersContext,
47+
events: {} as UpdateWorkspaceEvent,
48+
services: {} as {
49+
getWorkspace: {
50+
data: Workspace
51+
}
52+
getTemplateParameters: {
53+
data: TemplateVersionParameter[]
54+
}
55+
getWorkspaceBuildParameters: {
56+
data: WorkspaceBuildParameter[]
57+
}
58+
updateWorkspace: {
59+
data: WorkspaceBuild
60+
}
61+
},
62+
},
63+
initial: "gettingWorkspace",
64+
states: {
65+
gettingWorkspace: {
66+
entry: "clearGetWorkspaceError",
67+
invoke: {
68+
src: "getWorkspace",
69+
onDone: [
70+
{
71+
actions: ["assignWorkspace"],
72+
target: "gettingTemplateParameters",
73+
},
74+
],
75+
onError: {
76+
actions: ["assignGetWorkspaceError"],
77+
target: "error",
78+
},
79+
},
80+
},
81+
gettingTemplateParameters: {
82+
entry: "clearGetTemplateParametersError",
83+
invoke: {
84+
src: "getTemplateParameters",
85+
onDone: [
86+
{
87+
actions: ["assignTemplateParameters"],
88+
target: "gettingWorkspaceBuildParameters",
89+
},
90+
],
91+
onError: {
92+
actions: ["assignGetTemplateParametersError"],
93+
target: "error",
94+
},
95+
},
96+
},
97+
gettingWorkspaceBuildParameters: {
98+
entry: "clearGetWorkspaceBuildParametersError",
99+
invoke: {
100+
src: "getWorkspaceBuildParameters",
101+
onDone: {
102+
actions: ["assignWorkspaceBuildParameters"],
103+
target: "fillingParams",
104+
},
105+
onError: {
106+
actions: ["assignGetWorkspaceBuildParametersError"],
107+
target: "error",
108+
},
109+
},
110+
},
111+
fillingParams: {
112+
on: {
113+
UPDATE_WORKSPACE: {
114+
actions: ["assignUpdateWorkspaceBuildRequest"],
115+
target: "updatingWorkspace",
116+
},
117+
},
118+
},
119+
updatingWorkspace: {
120+
entry: "clearUpdateWorkspaceError",
121+
invoke: {
122+
src: "updateWorkspace",
123+
onDone: {
124+
actions: ["onUpdateWorkspace"],
125+
target: "updated",
126+
},
127+
onError: {
128+
actions: ["assignUpdateWorkspaceError"],
129+
target: "fillingParams",
130+
},
131+
},
132+
},
133+
updated: {
134+
entry: "onUpdateWorkspace",
135+
type: "final",
136+
},
137+
error: {},
138+
},
139+
},
140+
{
141+
services: {
142+
getWorkspace: (context) => {
143+
const { workspaceOwner, workspaceName } = context
144+
return getWorkspaceByOwnerAndName(workspaceOwner, workspaceName)
145+
},
146+
getTemplateParameters: (context) => {
147+
const { selectedWorkspace } = context
148+
149+
if (!selectedWorkspace) {
150+
throw new Error("No workspace selected")
151+
}
152+
153+
return getTemplateVersionRichParameters(
154+
selectedWorkspace.latest_build.template_version_id,
155+
)
156+
},
157+
getWorkspaceBuildParameters: (context) => {
158+
const { selectedWorkspace } = context
159+
160+
if (!selectedWorkspace) {
161+
throw new Error("No workspace selected")
162+
}
163+
164+
return getWorkspaceBuildParameters(selectedWorkspace.latest_build.id)
165+
},
166+
updateWorkspace: (context) => {
167+
const { selectedWorkspace, updateWorkspaceBuildRequest } = context
168+
169+
if (!selectedWorkspace) {
170+
throw new Error("No workspace selected")
171+
}
172+
173+
if (!updateWorkspaceBuildRequest) {
174+
throw new Error("No workspace build request")
175+
}
176+
177+
return updateWorkspaceBuild(
178+
selectedWorkspace.id,
179+
updateWorkspaceBuildRequest,
180+
)
181+
},
182+
},
183+
actions: {
184+
assignWorkspace: assign({
185+
selectedWorkspace: (_, event) => event.data,
186+
}),
187+
assignTemplateParameters: assign({
188+
templateParameters: (_, event) => event.data,
189+
}),
190+
assignWorkspaceBuildParameters: assign({
191+
workspaceBuildParameters: (_, event) => event.data,
192+
}),
193+
194+
assignUpdateWorkspaceBuildRequest: assign({
195+
updateWorkspaceBuildRequest: (_, event) => event.request,
196+
}),
197+
assignGetWorkspaceError: assign({
198+
getWorkspaceError: (_, event) => event.data,
199+
}),
200+
clearGetWorkspaceError: assign({
201+
getWorkspaceError: (_) => undefined,
202+
}),
203+
assignGetTemplateParametersError: assign({
204+
getTemplateParametersError: (_, event) => event.data,
205+
}),
206+
clearGetTemplateParametersError: assign({
207+
getTemplateParametersError: (_) => undefined,
208+
}),
209+
clearGetWorkspaceBuildParametersError: assign({
210+
getWorkspaceBuildParametersError: (_) => undefined,
211+
}),
212+
assignGetWorkspaceBuildParametersError: assign({
213+
getWorkspaceBuildParametersError: (_, event) => event.data,
214+
}),
215+
clearUpdateWorkspaceError: assign({
216+
updateWorkspaceError: (_) => undefined,
217+
}),
218+
assignUpdateWorkspaceError: assign({
219+
updateWorkspaceError: (_, event) => event.data,
220+
}),
221+
},
222+
},
223+
)

0 commit comments

Comments
 (0)