Skip to content

Commit f53ca93

Browse files
refactor: change AddSubcommandDialog to use new loading pattern
1 parent 52bf0f0 commit f53ca93

File tree

2 files changed

+20
-32
lines changed

2 files changed

+20
-32
lines changed

src/web/src/services/commandApi.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,18 @@ export const commandApi = {
126126
},
127127
},
128128

129-
createSubresource: async (
130-
subresourceUrl: string,
131-
data: {
132-
commandGroupName: string;
133-
refArgsOptions: { [argVar: string]: string[] };
134-
arg: string;
129+
createSubresource: {
130+
loadingMessage: "Creating subcommands...",
131+
fn: async (
132+
subresourceUrl: string,
133+
data: {
134+
commandGroupName: string;
135+
refArgsOptions: { [argVar: string]: string[] };
136+
arg: string;
137+
},
138+
): Promise<any> => {
139+
const response = await axios.post(subresourceUrl, data);
140+
return response.data;
135141
},
136-
): Promise<any> => {
137-
const response = await axios.post(subresourceUrl, data);
138-
return response.data;
139142
},
140143
} as const;

src/web/src/views/workspace/components/WSEditorCommandContent/AddSubcommandDialog.tsx

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,8 @@
1-
import {
2-
Alert,
3-
Box,
4-
Button,
5-
Dialog,
6-
DialogActions,
7-
DialogContent,
8-
DialogTitle,
9-
FormLabel,
10-
LinearProgress,
11-
TextField,
12-
} from "@mui/material";
1+
import { Alert, Button, Dialog, DialogActions, DialogContent, DialogTitle, FormLabel, TextField } from "@mui/material";
132
import React, { useState, useEffect } from "react";
143
import { commandApi, errorHandlerApi } from "../../../../services";
4+
import { useAsyncOperation } from "../../../../services/hooks";
5+
import { AsyncOperationBanner } from "../../../../components";
156
import type { Command } from "../../interfaces";
167

178
export interface AddSubcommandDialogProps {
@@ -33,11 +24,12 @@ const AddSubcommandDialog: React.FC<AddSubcommandDialogProps> = ({
3324
open,
3425
onClose,
3526
}) => {
36-
const [updating, setUpdating] = useState<boolean>(false);
3727
const [invalidText, setInvalidText] = useState<string | undefined>(undefined);
3828
const [commandGroupName, setCommandGroupName] = useState<string>("");
3929
const [refArgsOptions, setRefArgsOptions] = useState<{ var: string; options: string }[]>([]);
4030

31+
const createSubresourceOperation = useAsyncOperation(commandApi.createSubresource);
32+
4133
useEffect(() => {
4234
setCommandGroupName(defaultGroupNames.join(" "));
4335
setRefArgsOptions(subArgOptions);
@@ -103,10 +95,8 @@ const AddSubcommandDialog: React.FC<AddSubcommandDialogProps> = ({
10395
return;
10496
}
10597

106-
setUpdating(true);
107-
10898
try {
109-
await commandApi.createSubresource(urls[0], {
99+
await createSubresourceOperation.execute(urls[0], {
110100
...data,
111101
arg: argVar,
112102
});
@@ -115,7 +105,6 @@ const AddSubcommandDialog: React.FC<AddSubcommandDialogProps> = ({
115105
console.error(err);
116106
const message = errorHandlerApi.getErrorMessage(err);
117107
setInvalidText(`ResponseError: ${message}`);
118-
setUpdating(false);
119108
}
120109
};
121110

@@ -180,14 +169,10 @@ const AddSubcommandDialog: React.FC<AddSubcommandDialogProps> = ({
180169
{refArgsOptions.map(buildRefArgText)}
181170
</>
182171
)}
172+
<AsyncOperationBanner operation={createSubresourceOperation} />
183173
</DialogContent>
184174
<DialogActions>
185-
{updating && (
186-
<Box sx={{ width: "100%" }}>
187-
<LinearProgress color="secondary" />
188-
</Box>
189-
)}
190-
{!updating && (
175+
{!createSubresourceOperation.loading && (
191176
<>
192177
<Button onClick={handleClose}>Cancel</Button>
193178
<Button onClick={handleAddSubresource}>Add Subcommands</Button>

0 commit comments

Comments
 (0)