-
Notifications
You must be signed in to change notification settings - Fork 42
Expand file tree
/
Copy pathCreateTaskSection.tsx
More file actions
119 lines (110 loc) · 3.35 KB
/
CreateTaskSection.tsx
File metadata and controls
119 lines (110 loc) · 3.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import { logger } from "@repo/webview-shared/logger";
import { useMutation } from "@tanstack/react-query";
import {
VscodeOption,
VscodeSingleSelect,
} from "@vscode-elements/react-elements";
import { useState } from "react";
import { useTasksApi } from "../hooks/useTasksApi";
import { PromptInput } from "./PromptInput";
import type { CreateTaskParams, TaskPreset, TaskTemplate } from "@repo/shared";
interface CreateTaskSectionProps {
templates: readonly TaskTemplate[];
}
export function CreateTaskSection({ templates }: CreateTaskSectionProps) {
const api = useTasksApi();
const [prompt, setPrompt] = useState("");
const [templateId, setTemplateId] = useState(templates[0]?.id || "");
const selectedTemplate = templates.find((t) => t.id === templateId);
const [presetId, setPresetId] = useState(() =>
defaultPresetId(selectedTemplate?.presets ?? []),
);
const { mutate, isPending, error } = useMutation({
mutationFn: (params: CreateTaskParams) => api.createTask(params),
onSuccess: () => setPrompt(""),
onError: (err) => logger.error("Failed to create task", err),
});
const presets = selectedTemplate?.presets ?? [];
const canSubmit = prompt.trim().length > 0 && selectedTemplate && !isPending;
const handleSubmit = () => {
if (!canSubmit) {
logger.warn("handleSubmit called while submission is disabled");
return;
}
mutate({
templateVersionId: selectedTemplate.activeVersionId,
prompt: prompt.trim(),
presetId: presetId || undefined,
});
};
return (
<div className="create-task-section">
<PromptInput
value={prompt}
onChange={setPrompt}
onSubmit={handleSubmit}
loading={isPending}
actionIcon="send"
actionLabel="Create task"
actionEnabled={canSubmit === true}
/>
{error && <div className="create-task-error">{error.message}</div>}
<div className="create-task-options">
<div className="option-row">
<span className="option-label">Template:</span>
<VscodeSingleSelect
className="option-select"
value={templateId}
onChange={(e) => {
const newId = (e.target as HTMLSelectElement).value;
setTemplateId(newId);
const newTemplate = templates.find((t) => t.id === newId);
setPresetId(defaultPresetId(newTemplate?.presets ?? []));
}}
disabled={isPending}
>
{templates.map((template) => (
<VscodeOption
key={template.id}
value={template.id}
description={template.description}
>
{template.name}
</VscodeOption>
))}
</VscodeSingleSelect>
</div>
{presets.length > 0 && (
<div className="option-row">
<span className="option-label">Preset:</span>
<VscodeSingleSelect
className="option-select"
value={presetId}
onChange={(e) =>
setPresetId((e.target as HTMLSelectElement).value)
}
disabled={isPending}
>
{presets.map((preset) => (
<VscodeOption
key={preset.id}
value={preset.id}
description={preset.description}
>
{preset.name}
{preset.isDefault ? " (Default)" : ""}
</VscodeOption>
))}
</VscodeSingleSelect>
</div>
)}
</div>
</div>
);
}
function defaultPresetId(presets: readonly TaskPreset[]): string {
if (presets.length === 0) {
return "";
}
return (presets.find((p) => p.isDefault) ?? presets[0]).id;
}