Skip to content

Commit f6ecc40

Browse files
committed
correctly handle selecting default preset on presetData change
1 parent 1aaaf00 commit f6ecc40

File tree

1 file changed

+57
-31
lines changed

1 file changed

+57
-31
lines changed

site/src/pages/TasksPage/TasksPage.tsx

Lines changed: 57 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -231,18 +231,11 @@ const TaskForm: FC<TaskFormProps> = ({ templates, onSuccess }) => {
231231
const [selectedTemplateId, setSelectedTemplateId] = useState<string>(
232232
templates[0].id,
233233
);
234-
const [presets, setPresets] = useState<Preset[] | null>(null);
235234
const [selectedPresetId, setSelectedPresetId] = useState<string | null>(null);
236235
const selectedTemplate = templates.find(
237236
(t) => t.id === selectedTemplateId,
238237
) as Template;
239238

240-
// Extract AI prompt from selected preset
241-
const selectedPreset = presets?.find((p) => p.ID === selectedPresetId);
242-
const presetAIPrompt = selectedPreset?.Parameters?.find(
243-
(param) => param.Name === AI_PROMPT_PARAMETER_NAME,
244-
)?.Value;
245-
const isPromptReadOnly = !!presetAIPrompt;
246239
const {
247240
externalAuth,
248241
externalAuthError,
@@ -251,24 +244,41 @@ const TaskForm: FC<TaskFormProps> = ({ templates, onSuccess }) => {
251244
} = useExternalAuth(selectedTemplate.active_version_id);
252245

253246
// Fetch presets when template changes
254-
const { data: presetsData } = useQuery<Preset[] | null, Error>({
247+
const { data: presetsData, isLoading: isLoadingPresets } = useQuery<
248+
Preset[] | null,
249+
Error
250+
>({
255251
queryKey: ["template-version-presets", selectedTemplate.active_version_id],
256252
queryFn: () =>
257253
API.getTemplateVersionPresets(selectedTemplate.active_version_id),
258254
...disabledRefetchOptions,
259255
});
260256

261-
// Handle preset data changes
257+
// Handle preset selection when data changes
262258
useEffect(() => {
263-
if (!presetsData) {
264-
setPresets(null);
259+
if (presetsData === undefined) {
260+
// Still loading
261+
return;
262+
}
263+
264+
if (!presetsData || presetsData.length === 0) {
265+
setSelectedPresetId(null);
265266
return;
266267
}
267-
setPresets(presetsData);
268+
269+
// Always select the default preset when new data arrives
268270
const defaultPreset = presetsData.find((p: Preset) => p.Default);
269271
const defaultPresetID = defaultPreset?.ID || null;
270272
setSelectedPresetId(defaultPresetID);
271273
}, [presetsData]);
274+
275+
// Extract AI prompt from selected preset
276+
const selectedPreset = presetsData?.find((p) => p.ID === selectedPresetId);
277+
const presetAIPrompt = selectedPreset?.Parameters?.find(
278+
(param) => param.Name === AI_PROMPT_PARAMETER_NAME,
279+
)?.Value;
280+
const isPromptReadOnly = !!presetAIPrompt;
281+
272282
const missedExternalAuth = externalAuth?.filter(
273283
(auth) => !auth.optional && !auth.authenticated,
274284
);
@@ -373,39 +383,55 @@ const TaskForm: FC<TaskFormProps> = ({ templates, onSuccess }) => {
373383
</Select>
374384
</div>
375385

376-
{presets && presets.length > 0 && (
377-
<div className="flex flex-col gap-1">
378-
<label
379-
htmlFor="presetID"
380-
className="text-xs font-medium text-content-primary"
381-
>
382-
Preset
383-
</label>
386+
<div className="flex flex-col gap-1">
387+
<label
388+
htmlFor="presetID"
389+
className="text-xs font-medium text-content-primary"
390+
>
391+
Preset
392+
</label>
393+
{isLoadingPresets ? (
394+
<Skeleton variant="rounded" width={320} height={32} />
395+
) : (
384396
<Select
397+
key={`preset-select-${selectedTemplate.active_version_id}`}
385398
name="presetID"
386-
value={
387-
selectedPresetId === null ? undefined : selectedPresetId
388-
}
389-
onValueChange={(value) => setSelectedPresetId(value)}
399+
value={selectedPresetId || undefined}
400+
onValueChange={(value) => setSelectedPresetId(value || null)}
401+
disabled={!presetsData || presetsData.length === 0}
390402
>
391403
<SelectTrigger
392404
id="presetID"
393405
className="w-80 text-xs [&_svg]:size-icon-xs border-0 bg-surface-secondary h-8 px-3"
394406
>
395-
<SelectValue placeholder="Select a preset" />
407+
<SelectValue
408+
placeholder={
409+
!presetsData || presetsData.length === 0
410+
? "None"
411+
: "Select a preset"
412+
}
413+
/>
396414
</SelectTrigger>
397415
<SelectContent>
398-
{sortedPresets(presets).map((preset) => (
399-
<SelectItem value={preset.ID} key={preset.ID}>
416+
{presetsData && presetsData.length > 0 ? (
417+
sortedPresets(presetsData).map((preset) => (
418+
<SelectItem value={preset.ID} key={preset.ID}>
419+
<span className="overflow-hidden text-ellipsis block">
420+
{preset.Name} {preset.Default && "(Default)"}
421+
</span>
422+
</SelectItem>
423+
))
424+
) : (
425+
<SelectItem value="none" disabled>
400426
<span className="overflow-hidden text-ellipsis block">
401-
{preset.Name} {preset.Default && "(Default)"}
427+
No presets available
402428
</span>
403429
</SelectItem>
404-
))}
430+
)}
405431
</SelectContent>
406432
</Select>
407-
</div>
408-
)}
433+
)}
434+
</div>
409435
</div>
410436

411437
<div className="flex items-center gap-2">

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy