Skip to content

Commit 2caa836

Browse files
committed
add state
1 parent 9093d20 commit 2caa836

File tree

7 files changed

+88
-11
lines changed

7 files changed

+88
-11
lines changed

site/src/api/api.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,3 +500,8 @@ export const getApplicationsHost = async (): Promise<TypesGen.GetAppHostResponse
500500
const response = await axios.get(`/api/v2/applications/host`)
501501
return response.data
502502
}
503+
504+
export const getWorkspaceQuota = async (): Promise<TypesGen.WorkspaceQuota> => {
505+
const response = await axios.get(`/api/v2/users/me/workspace-quota`)
506+
return response.data
507+
}

site/src/components/FormFooter/FormFooter.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface FormFooterProps {
1212
onCancel: () => void
1313
isLoading: boolean
1414
submitLabel?: string
15+
submitDisabled?: boolean
1516
}
1617

1718
const useStyles = makeStyles((theme) => ({
@@ -34,6 +35,7 @@ export const FormFooter: FC<React.PropsWithChildren<FormFooterProps>> = ({
3435
onCancel,
3536
isLoading,
3637
submitLabel = Language.defaultSubmitLabel,
38+
submitDisabled,
3739
}) => {
3840
const styles = useStyles()
3941
return (
@@ -45,6 +47,7 @@ export const FormFooter: FC<React.PropsWithChildren<FormFooterProps>> = ({
4547
variant="contained"
4648
color="primary"
4749
type="submit"
50+
disabled={submitDisabled}
4851
>
4952
{submitLabel}
5053
</LoadingButton>

site/src/components/WorkspaceQuota/WorkspaceQuota.stories.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,19 @@ Loading.args = {
2929
quota: undefined,
3030
}
3131

32+
export const Error = Template.bind({})
33+
Error.args = {
34+
quota: undefined,
35+
error: {
36+
response: {
37+
data: {
38+
message: "Failed to fetch workspace quotas!",
39+
},
40+
},
41+
isAxiosError: true,
42+
},
43+
}
44+
3245
export const Disabled = Template.bind({})
3346
Disabled.args = {
3447
quota: {

site/src/components/WorkspaceQuota/WorkspaceQuota.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Box from "@material-ui/core/Box"
22
import LinearProgress from "@material-ui/core/LinearProgress"
33
import { makeStyles } from "@material-ui/core/styles"
44
import Skeleton from "@material-ui/lab/Skeleton"
5+
import { ErrorSummary } from "components/ErrorSummary/ErrorSummary"
56
import { Stack } from "components/Stack/Stack"
67
import { FC } from "react"
78
import * as TypesGen from "../../api/typesGenerated"
@@ -15,12 +16,27 @@ export const Language = {
1516

1617
export interface WorkspaceQuotaProps {
1718
quota?: TypesGen.WorkspaceQuota
19+
error: Error | unknown
1820
}
1921

20-
export const WorkspaceQuota: FC<WorkspaceQuotaProps> = ({ quota }) => {
22+
export const WorkspaceQuota: FC<WorkspaceQuotaProps> = ({ quota, error }) => {
2123
const styles = useStyles()
2224

23-
// loading state
25+
// error state
26+
if (error !== undefined) {
27+
return (
28+
<Box>
29+
<Stack spacing={1} className={styles.stack}>
30+
<span className={styles.title}>Workspace Quota</span>
31+
<ErrorSummary
32+
error={error}
33+
/>
34+
</Stack>
35+
</Box>
36+
)
37+
}
38+
39+
// loading
2440
if (quota === undefined) {
2541
return (
2642
<Box>

site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ const CreateWorkspacePage: FC = () => {
2828
getTemplateSchemaError,
2929
getTemplatesError,
3030
createWorkspaceError,
31-
quota,
31+
workspaceQuota,
32+
getWorkspaceQuotaError,
3233
} = createWorkspaceState.context
3334

3435
return (
@@ -45,11 +46,12 @@ const CreateWorkspacePage: FC = () => {
4546
templates={templates}
4647
selectedTemplate={selectedTemplate}
4748
templateSchema={templateSchema}
48-
quota={quota}
49+
quota={workspaceQuota}
4950
createWorkspaceErrors={{
5051
[CreateWorkspaceErrors.GET_TEMPLATES_ERROR]: getTemplatesError,
5152
[CreateWorkspaceErrors.GET_TEMPLATE_SCHEMA_ERROR]: getTemplateSchemaError,
5253
[CreateWorkspaceErrors.CREATE_WORKSPACE_ERROR]: createWorkspaceError,
54+
[CreateWorkspaceErrors.GET_WORKSPACE_QUOTA_ERROR]: getWorkspaceQuotaError,
5355
}}
5456
onCancel={() => {
5557
navigate("/templates")

site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export enum CreateWorkspaceErrors {
2222
GET_TEMPLATES_ERROR = "getTemplatesError",
2323
GET_TEMPLATE_SCHEMA_ERROR = "getTemplateSchemaError",
2424
CREATE_WORKSPACE_ERROR = "createWorkspaceError",
25+
GET_WORKSPACE_QUOTA_ERROR = "getWorkspaceQuotaError"
2526
}
2627

2728
export interface CreateWorkspacePageViewProps {
@@ -112,6 +113,8 @@ export const CreateWorkspacePageView: FC<React.PropsWithChildren<CreateWorkspace
112113
)
113114
}
114115

116+
const canSubmit = props.quota && props.quota.user_workspace_limit > 0 ? props.quota.user_workspace_count < props.quota.user_workspace_limit : true
117+
115118
return (
116119
<FullPageForm title="Create workspace" onCancel={props.onCancel}>
117120
<form onSubmit={form.handleSubmit}>
@@ -162,9 +165,14 @@ export const CreateWorkspacePageView: FC<React.PropsWithChildren<CreateWorkspace
162165
</Stack>
163166
)}
164167

165-
<WorkspaceQuota quota={props.quota} />
168+
{props.quota ? (
169+
<WorkspaceQuota quota={props.quota} error={props.createWorkspaceErrors[CreateWorkspaceErrors.GET_WORKSPACE_QUOTA_ERROR]}/>
170+
) : (
171+
<></>
172+
)
173+
}
166174

167-
<FormFooter onCancel={props.onCancel} isLoading={props.creatingWorkspace} />
175+
<FormFooter onCancel={props.onCancel} isLoading={props.creatingWorkspace} submitDisabled={!canSubmit}/>
168176
</>
169177
)}
170178
</Stack>

site/src/xServices/createWorkspace/createWorkspaceXService.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { assign, createMachine } from "xstate"
2-
import { createWorkspace, getTemplates, getTemplateVersionSchema } from "../../api/api"
2+
import { createWorkspace, getTemplates, getTemplateVersionSchema, getWorkspaceQuota } from "../../api/api"
33
import {
44
CreateWorkspaceRequest,
55
ParameterSchema,
66
Template,
77
Workspace,
8+
WorkspaceQuota,
89
} from "../../api/typesGenerated"
910

1011
type CreateWorkspaceContext = {
@@ -18,6 +19,8 @@ type CreateWorkspaceContext = {
1819
createWorkspaceError?: Error | unknown
1920
getTemplatesError?: Error | unknown
2021
getTemplateSchemaError?: Error | unknown
22+
workspaceQuota?: WorkspaceQuota
23+
getWorkspaceQuotaError?: Error | unknown
2124
}
2225

2326
type CreateWorkspaceEvent = {
@@ -36,13 +39,16 @@ export const createWorkspaceMachine = createMachine(
3639
services: {} as {
3740
getTemplates: {
3841
data: Template[]
39-
}
42+
},
4043
getTemplateSchema: {
4144
data: ParameterSchema[]
42-
}
45+
},
46+
getWorkspaceQuota: {
47+
data: WorkspaceQuota
48+
},
4349
createWorkspace: {
4450
data: Workspace
45-
}
51+
},
4652
},
4753
},
4854
initial: "gettingTemplates",
@@ -73,14 +79,28 @@ export const createWorkspaceMachine = createMachine(
7379
src: "getTemplateSchema",
7480
onDone: {
7581
actions: ["assignTemplateSchema"],
76-
target: "fillingParams",
82+
target: "gettingWorkspaceQuota",
7783
},
7884
onError: {
7985
actions: ["assignGetTemplateSchemaError"],
8086
target: "error",
8187
},
8288
},
8389
},
90+
gettingWorkspaceQuota: {
91+
entry: "clearGetWorkspaceQuotaError",
92+
invoke: {
93+
src: "getWorkspaceQuota",
94+
onDone: {
95+
actions: ["assignWorkspaceQuota"],
96+
target: "fillingParams",
97+
},
98+
onError: {
99+
actions: ["assignGetWorkspaceQuotaError"],
100+
target: "error",
101+
},
102+
},
103+
},
84104
fillingParams: {
85105
on: {
86106
CREATE_WORKSPACE: {
@@ -130,6 +150,7 @@ export const createWorkspaceMachine = createMachine(
130150

131151
return createWorkspace(organizationId, "me", createWorkspaceRequest)
132152
},
153+
getWorkspaceQuota: () => getWorkspaceQuota(),
133154
},
134155
guards: {
135156
areTemplatesEmpty: (_, event) => event.data.length === 0,
@@ -170,6 +191,15 @@ export const createWorkspaceMachine = createMachine(
170191
clearGetTemplateSchemaError: assign({
171192
getTemplateSchemaError: (_) => undefined,
172193
}),
194+
assignWorkspaceQuota: assign({
195+
workspaceQuota: (_, event) => event.data,
196+
}),
197+
assignGetWorkspaceQuotaError: assign({
198+
getWorkspaceQuotaError: (_, event) => event.data,
199+
}),
200+
clearGetWorkspaceQuotaError: assign({
201+
getWorkspaceQuotaError: (_) => undefined,
202+
}),
173203
},
174204
},
175205
)

0 commit comments

Comments
 (0)