Skip to content

Commit 4631626

Browse files
committed
Centralize preset and chat submission validation in the backend, removing UI-level disabling and providing explicit user warnings
1 parent 99763f7 commit 4631626

4 files changed

Lines changed: 206 additions & 78 deletions

File tree

packages/ui/src/components/editor/ChatInput/ChatInput.tsx

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export const ChatInput: React.FC<Props> = (props) => {
7575
}
7676
}, [props.caret_position_to_set])
7777

78-
useEffect(() => {
78+
useEffect(() => {
7979
if (textarea_ref.current) {
8080
textarea_ref.current.focus()
8181
}
@@ -168,7 +168,6 @@ export const ChatInput: React.FC<Props> = (props) => {
168168
with_control?: boolean
169169
) => {
170170
e.stopPropagation()
171-
if (is_submit_disabled) return
172171
if (with_control || e.ctrlKey || e.metaKey) {
173172
props.on_submit_with_control()
174173
} else {
@@ -177,12 +176,6 @@ export const ChatInput: React.FC<Props> = (props) => {
177176
set_history_index(-1)
178177
}
179178

180-
const is_submit_disabled =
181-
(!props.is_connected && props.is_web_mode) ||
182-
(!props.is_in_code_completions_mode && !props.value.trim()) ||
183-
(props.is_in_code_completions_mode &&
184-
(props.has_active_selection || !props.has_active_editor))
185-
186179
const get_disabled_title = () => {
187180
if (props.is_in_code_completions_mode) {
188181
if (props.has_active_selection) {
@@ -436,7 +429,6 @@ export const ChatInput: React.FC<Props> = (props) => {
436429
styles['footer__right__button--secondary']
437430
])}
438431
onClick={(e) => handle_submit(e, true)}
439-
disabled={is_submit_disabled}
440432
>
441433
{navigator.userAgent.toUpperCase().indexOf('MAC') >= 0 ? (
442434
<Icon variant="COMMAND" />
@@ -450,7 +442,6 @@ export const ChatInput: React.FC<Props> = (props) => {
450442
<button
451443
className={styles.footer__right__button}
452444
onClick={handle_submit}
453-
disabled={is_submit_disabled}
454445
>
455446
<Icon variant="ENTER" />
456447
<span>{props.translations.use_last_choice}</span>

packages/ui/src/components/editor/Presets/Presets.module.scss

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,6 @@
3636
}
3737
}
3838

39-
&--disabled {
40-
cursor: default !important;
41-
42-
.presets__item__left__text {
43-
opacity: 0.7;
44-
}
45-
}
46-
4739
&--highlighted {
4840
background-color: var(--vscode-list-inactiveSelectionBackground);
4941

@@ -89,6 +81,12 @@
8981
}
9082
}
9183

84+
&__collapse-icon {
85+
display: flex;
86+
align-items: center;
87+
height: 100%;
88+
}
89+
9290
&__text {
9391
overflow: hidden;
9492
text-overflow: ellipsis;

packages/ui/src/components/editor/Presets/Presets.tsx

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,10 @@ export const Presets: React.FC<Presets.Props> = (props) => {
161161
<div
162162
className={cn(styles.presets__item, {
163163
[styles['presets__item--ungrouped']]: true,
164-
[styles['presets__item--highlighted']]:
165-
props.selected_preset_name == 'Ungrouped',
166-
[styles['presets__item--disabled']]: get_is_ungrouped_disabled()
164+
[styles['presets__item--highlighted']]: props.selected_preset_name == 'Ungrouped'
167165
})}
168166
onClick={() => {
169-
if (get_is_ungrouped_disabled()) return
170-
props.on_group_click('Ungrouped')
167+
props.on_group_click('Ungrouped') // disabled check will be handled by the consumer
171168
}}
172169
role="button"
173170
title={get_ungrouped_title()}
@@ -181,6 +178,9 @@ export const Presets: React.FC<Presets.Props> = (props) => {
181178
>
182179
<span className="codicon codicon-gripper" />
183180
</div>
181+
<div className={styles['presets__item__left__collapse-icon']}>
182+
<span className={'codicon codicon-dash'} />
183+
</div>
184184
<div className={styles.presets__item__left__text}>Ungrouped</div>
185185
</div>
186186
</div>
@@ -307,17 +307,12 @@ export const Presets: React.FC<Presets.Props> = (props) => {
307307
key={preset.name}
308308
className={cn(styles.presets__item, {
309309
[styles['presets__item--highlighted']]:
310-
props.selected_preset_name == preset.name,
311-
[styles['presets__item--disabled']]: preset.chatbot
312-
? get_is_preset_disabled(preset)
313-
: get_is_group_disabled()
310+
props.selected_preset_name == preset.name
314311
})}
315312
onClick={() => {
316313
if (preset.chatbot) {
317-
if (get_is_preset_disabled(preset)) return
318314
props.on_preset_click(preset.name)
319315
} else {
320-
if (get_is_group_disabled()) return
321316
props.on_group_click(preset.name)
322317
}
323318
}}
@@ -347,6 +342,28 @@ export const Presets: React.FC<Presets.Props> = (props) => {
347342
<Icon variant={chatbot_to_icon[preset.chatbot]} />
348343
</div>
349344
)}
345+
{!preset.chatbot && (
346+
<div
347+
className={styles['presets__item__left__collapse-icon']}
348+
style={{ cursor: 'pointer' }}
349+
title={
350+
preset.is_collapsed
351+
? props.translations.expand_group
352+
: props.translations.collapse_group
353+
}
354+
onClick={(e) => {
355+
e.stopPropagation()
356+
props.on_toggle_group_collapsed(preset.name)
357+
}}
358+
>
359+
<span
360+
className={cn('codicon', {
361+
'codicon-chevron-down': preset.is_collapsed,
362+
'codicon-chevron-up': !preset.is_collapsed
363+
})}
364+
/>
365+
</div>
366+
)}
350367
<div className={styles.presets__item__left__text}>
351368
<span>{display_name}</span>
352369
<span>{get_subtitle()}</span>
@@ -359,22 +376,6 @@ export const Presets: React.FC<Presets.Props> = (props) => {
359376
e.stopPropagation()
360377
}}
361378
>
362-
{!preset.chatbot && (
363-
<IconButton
364-
codicon_icon={
365-
preset.is_collapsed ? 'chevron-down' : 'chevron-up'
366-
}
367-
title={
368-
preset.is_collapsed
369-
? props.translations.expand_group
370-
: props.translations.collapse_group
371-
}
372-
on_click={(e) => {
373-
e.stopPropagation()
374-
props.on_toggle_group_collapsed(preset.name)
375-
}}
376-
/>
377-
)}
378379
{preset.chatbot &&
379380
(preset.prompt_prefix || preset.prompt_suffix) && (
380381
<IconButton

0 commit comments

Comments
 (0)