Skip to content

Commit bdce03a

Browse files
committed
add state
1 parent 65a20a9 commit bdce03a

File tree

7 files changed

+86
-9
lines changed

7 files changed

+86
-9
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
@@ -31,7 +31,8 @@ const CreateWorkspacePage: FC = () => {
3131
getTemplatesError,
3232
createWorkspaceError,
3333
permissions,
34-
quota,
34+
workspaceQuota,
35+
getWorkspaceQuotaError,
3536
} = createWorkspaceState.context
3637

3738
const xServices = useContext(XServiceContext)
@@ -54,11 +55,12 @@ const CreateWorkspacePage: FC = () => {
5455
templates={templates}
5556
selectedTemplate={selectedTemplate}
5657
templateSchema={templateSchema}
57-
quota={quota}
58+
quota={workspaceQuota}
5859
createWorkspaceErrors={{
5960
[CreateWorkspaceErrors.GET_TEMPLATES_ERROR]: getTemplatesError,
6061
[CreateWorkspaceErrors.GET_TEMPLATE_SCHEMA_ERROR]: getTemplateSchemaError,
6162
[CreateWorkspaceErrors.CREATE_WORKSPACE_ERROR]: createWorkspaceError,
63+
[CreateWorkspaceErrors.GET_WORKSPACE_QUOTA_ERROR]: getWorkspaceQuotaError,
6264
}}
6365
canCreateForUser={permissions?.createWorkspaceForUser}
6466
defaultWorkspaceOwner={me ?? null}

site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export enum CreateWorkspaceErrors {
1919
GET_TEMPLATES_ERROR = "getTemplatesError",
2020
GET_TEMPLATE_SCHEMA_ERROR = "getTemplateSchemaError",
2121
CREATE_WORKSPACE_ERROR = "createWorkspaceError",
22+
GET_WORKSPACE_QUOTA_ERROR = "getWorkspaceQuotaError"
2223
}
2324

2425
export interface CreateWorkspacePageViewProps {
@@ -115,6 +116,8 @@ export const CreateWorkspacePageView: FC<React.PropsWithChildren<CreateWorkspace
115116
)
116117
}
117118

119+
const canSubmit = props.quota && props.quota.user_workspace_limit > 0 ? props.quota.user_workspace_count < props.quota.user_workspace_limit : true
120+
118121
return (
119122
<FullPageForm title="Create workspace" onCancel={props.onCancel}>
120123
<form onSubmit={form.handleSubmit}>
@@ -172,9 +175,14 @@ export const CreateWorkspacePageView: FC<React.PropsWithChildren<CreateWorkspace
172175
</Stack>
173176
)}
174177

175-
<WorkspaceQuota quota={props.quota} />
178+
{props.quota ? (
179+
<WorkspaceQuota quota={props.quota} error={props.createWorkspaceErrors[CreateWorkspaceErrors.GET_WORKSPACE_QUOTA_ERROR]}/>
180+
) : (
181+
<></>
182+
)
183+
}
176184

177-
<FormFooter onCancel={props.onCancel} isLoading={props.creatingWorkspace} />
185+
<FormFooter onCancel={props.onCancel} isLoading={props.creatingWorkspace} submitDisabled={!canSubmit}/>
178186
</>
179187
)}
180188
</Stack>

site/src/xServices/createWorkspace/createWorkspaceXService.ts

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ import {
33
createWorkspace,
44
getTemplates,
55
getTemplateVersionSchema,
6+
getWorkspaceQuota,
67
} from "api/api"
78
import {
89
CreateWorkspaceRequest,
910
ParameterSchema,
1011
Template,
1112
User,
1213
Workspace,
14+
WorkspaceQuota,
1315
} from "api/typesGenerated"
1416
import { assign, createMachine } from "xstate"
1517

@@ -27,6 +29,8 @@ type CreateWorkspaceContext = {
2729
getTemplateSchemaError?: Error | unknown
2830
permissions?: Record<string, boolean>
2931
checkPermissionsError?: Error | unknown
32+
workspaceQuota?: WorkspaceQuota
33+
getWorkspaceQuotaError?: Error | unknown
3034
}
3135

3236
type CreateWorkspaceEvent = {
@@ -46,13 +50,16 @@ export const createWorkspaceMachine = createMachine(
4650
services: {} as {
4751
getTemplates: {
4852
data: Template[]
49-
}
53+
},
5054
getTemplateSchema: {
5155
data: ParameterSchema[]
52-
}
56+
},
57+
getWorkspaceQuota: {
58+
data: WorkspaceQuota
59+
},
5360
createWorkspace: {
5461
data: Workspace
55-
}
62+
},
5663
},
5764
},
5865
initial: "gettingTemplates",
@@ -102,6 +109,19 @@ export const createWorkspaceMachine = createMachine(
102109
},
103110
onError: {
104111
actions: ["assignCheckPermissionsError"],
112+
}
113+
}
114+
},
115+
gettingWorkspaceQuota: {
116+
entry: "clearGetWorkspaceQuotaError",
117+
invoke: {
118+
src: "getWorkspaceQuota",
119+
onDone: {
120+
actions: ["assignWorkspaceQuota"],
121+
target: "fillingParams",
122+
},
123+
onError: {
124+
actions: ["assignGetWorkspaceQuotaError"],
105125
target: "error",
106126
},
107127
},
@@ -178,6 +198,7 @@ export const createWorkspaceMachine = createMachine(
178198

179199
return createWorkspace(organizationId, owner?.id ?? "me", createWorkspaceRequest)
180200
},
201+
getWorkspaceQuota: () => getWorkspaceQuota(),
181202
},
182203
guards: {
183204
areTemplatesEmpty: (_, event) => event.data.length === 0,
@@ -230,6 +251,15 @@ export const createWorkspaceMachine = createMachine(
230251
clearGetTemplateSchemaError: assign({
231252
getTemplateSchemaError: (_) => undefined,
232253
}),
254+
assignWorkspaceQuota: assign({
255+
workspaceQuota: (_, event) => event.data,
256+
}),
257+
assignGetWorkspaceQuotaError: assign({
258+
getWorkspaceQuotaError: (_, event) => event.data,
259+
}),
260+
clearGetWorkspaceQuotaError: assign({
261+
getWorkspaceQuotaError: (_) => undefined,
262+
}),
233263
},
234264
},
235265
)

0 commit comments

Comments
 (0)