Spaces:
Runtime error
Runtime error
feat: extract form submit into own function
Browse files- src/components/GameCreator.tsx +55 -59
src/components/GameCreator.tsx
CHANGED
@@ -137,6 +137,45 @@ export default function GameCreator() {
|
|
137 |
};
|
138 |
}, [subscribe, loadingLive]);
|
139 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
const handleCancel = async () => {
|
141 |
if (abortController.current) {
|
142 |
abortController.current.abort();
|
@@ -186,13 +225,15 @@ export default function GameCreator() {
|
|
186 |
>
|
187 |
<AppBar position="static" elevation={0} color="default">
|
188 |
<Toolbar>
|
189 |
-
<
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
|
|
|
|
196 |
|
197 |
<IconButton
|
198 |
color="inherit"
|
@@ -250,64 +291,16 @@ export default function GameCreator() {
|
|
250 |
component="form"
|
251 |
id="gpt-form"
|
252 |
sx={{ p: 0, pt: 0 }}
|
253 |
-
onSubmit={
|
254 |
-
event.preventDefault();
|
255 |
-
const formData = new FormData(event.target as HTMLFormElement);
|
256 |
-
const formObject = Object.fromEntries(formData);
|
257 |
-
try {
|
258 |
-
setLoading(true);
|
259 |
-
|
260 |
-
abortController.current = new AbortController();
|
261 |
-
|
262 |
-
const {
|
263 |
-
command,
|
264 |
-
prompt,
|
265 |
-
temperature,
|
266 |
-
template,
|
267 |
-
model,
|
268 |
-
maxTokens,
|
269 |
-
} = formObject;
|
270 |
-
|
271 |
-
const client = createClient(
|
272 |
-
formObject.openAIAPIKey as string
|
273 |
-
);
|
274 |
-
const answer = await toOpenAI({
|
275 |
-
command: command as string,
|
276 |
-
prompt: prompt as string,
|
277 |
-
temperature: temperature as string,
|
278 |
-
template: template as string,
|
279 |
-
model: model as string,
|
280 |
-
maxTokens: maxTokens as string,
|
281 |
-
client,
|
282 |
-
signal: abortController.current.signal,
|
283 |
-
});
|
284 |
-
|
285 |
-
setAnswers(previousAnswers => [answer, ...previousAnswers]);
|
286 |
-
setRunningId(answer.id);
|
287 |
-
setActiveId(answer.id);
|
288 |
-
setTemplate(prettify(answer.content));
|
289 |
-
setErrorMessage("");
|
290 |
-
reload();
|
291 |
-
} catch (error) {
|
292 |
-
if (
|
293 |
-
(error as { message?: string }).message !== "canceled"
|
294 |
-
) {
|
295 |
-
setErrorMessage((error as AxiosError).message);
|
296 |
-
console.error(error);
|
297 |
-
}
|
298 |
-
} finally {
|
299 |
-
setLoading(false);
|
300 |
-
}
|
301 |
-
}}
|
302 |
>
|
303 |
-
<Stack sx={{ p: 1, pl: 0, gap:
|
304 |
<Secret label="OpenAI API Key" name="openAIAPIKey" />
|
305 |
|
306 |
<Stack direction="row" spacing={1}>
|
307 |
<TextField
|
308 |
multiline
|
309 |
fullWidth
|
310 |
-
variant="
|
311 |
required
|
312 |
id="prompt"
|
313 |
name="prompt"
|
@@ -524,7 +517,10 @@ export default function GameCreator() {
|
|
524 |
</Stack>
|
525 |
</Box>
|
526 |
|
527 |
-
<Paper
|
|
|
|
|
|
|
528 |
<List sx={{ flex: 1, p: 0 }}>
|
529 |
<ListSubheader
|
530 |
sx={{
|
|
|
137 |
};
|
138 |
}, [subscribe, loadingLive]);
|
139 |
|
140 |
+
const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
|
141 |
+
event.preventDefault();
|
142 |
+
const formData = new FormData(event.target as HTMLFormElement);
|
143 |
+
const formObject = Object.fromEntries(formData);
|
144 |
+
try {
|
145 |
+
setLoading(true);
|
146 |
+
|
147 |
+
abortController.current = new AbortController();
|
148 |
+
|
149 |
+
const { command, prompt, temperature, template, model, maxTokens } = formObject;
|
150 |
+
|
151 |
+
const client = createClient(formObject.openAIAPIKey as string);
|
152 |
+
const answer = await toOpenAI({
|
153 |
+
command: command as string,
|
154 |
+
prompt: prompt as string,
|
155 |
+
temperature: temperature as string,
|
156 |
+
template: template as string,
|
157 |
+
model: model as string,
|
158 |
+
maxTokens: maxTokens as string,
|
159 |
+
client,
|
160 |
+
signal: abortController.current.signal,
|
161 |
+
});
|
162 |
+
|
163 |
+
setAnswers(previousAnswers => [answer, ...previousAnswers]);
|
164 |
+
setRunningId(answer.id);
|
165 |
+
setActiveId(answer.id);
|
166 |
+
setTemplate(prettify(answer.content));
|
167 |
+
setErrorMessage("");
|
168 |
+
reload();
|
169 |
+
} catch (error) {
|
170 |
+
if ((error as { message?: string }).message !== "canceled") {
|
171 |
+
setErrorMessage((error as AxiosError).message);
|
172 |
+
console.error(error);
|
173 |
+
}
|
174 |
+
} finally {
|
175 |
+
setLoading(false);
|
176 |
+
}
|
177 |
+
};
|
178 |
+
|
179 |
const handleCancel = async () => {
|
180 |
if (abortController.current) {
|
181 |
abortController.current.abort();
|
|
|
225 |
>
|
226 |
<AppBar position="static" elevation={0} color="default">
|
227 |
<Toolbar>
|
228 |
+
<Stack sx={{ alignItems: "baseline", flex: 1 }} direction="row">
|
229 |
+
<Typography variant="h5" component="h2" sx={{ m: 0 }}>
|
230 |
+
2D GameCreator
|
231 |
+
</Typography>
|
232 |
+
|
233 |
+
<Typography variant="body2" sx={{ ml: 1 }}>
|
234 |
+
v1.0.0
|
235 |
+
</Typography>
|
236 |
+
</Stack>
|
237 |
|
238 |
<IconButton
|
239 |
color="inherit"
|
|
|
291 |
component="form"
|
292 |
id="gpt-form"
|
293 |
sx={{ p: 0, pt: 0 }}
|
294 |
+
onSubmit={handleSubmit}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
295 |
>
|
296 |
+
<Stack sx={{ p: 1, pl: 0, gap: 1 }}>
|
297 |
<Secret label="OpenAI API Key" name="openAIAPIKey" />
|
298 |
|
299 |
<Stack direction="row" spacing={1}>
|
300 |
<TextField
|
301 |
multiline
|
302 |
fullWidth
|
303 |
+
variant="filled"
|
304 |
required
|
305 |
id="prompt"
|
306 |
name="prompt"
|
|
|
517 |
</Stack>
|
518 |
</Box>
|
519 |
|
520 |
+
<Paper
|
521 |
+
variant="elevation"
|
522 |
+
sx={{ p: 1, pl: 0, pt: 0, overflow: "auto" }}
|
523 |
+
>
|
524 |
<List sx={{ flex: 1, p: 0 }}>
|
525 |
<ListSubheader
|
526 |
sx={{
|