Skip to content

Commit d389040

Browse files
fix(lightspeed): disable model selector when chat session is active
Fixes: https://redhat.atlassian.net/browse/RHDHBUGS-3313 Signed-off-by: its-mitesh-kumar <itsmiteshkumar98@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent d69d6d6 commit d389040

6 files changed

Lines changed: 56 additions & 2 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@red-hat-developer-hub/backstage-plugin-lightspeed': patch
3+
---
4+
5+
Disable model selector when a chat session is active and show a tooltip explaining that each session supports only one model

workspaces/lightspeed/plugins/lightspeed/report-alpha.api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ export const lightspeedTranslationRef: TranslationRef<
179179
readonly 'tooltip.close': string;
180180
readonly 'tooltip.fab.open': string;
181181
readonly 'tooltip.fab.close': string;
182+
readonly 'tooltip.modelSelector.disabled': string;
182183
readonly 'attach.menu.title': string;
183184
readonly 'attach.menu.description': string;
184185
readonly 'modal.title.preview': string;

workspaces/lightspeed/plugins/lightspeed/src/components/LightSpeedChat.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1805,7 +1805,12 @@ export const LightspeedChat = ({
18051805
onNewChat();
18061806
handleSelectedModel(item);
18071807
}}
1808-
disabled={isSendButtonDisabled}
1808+
disabled={isSendButtonDisabled || messages.length > 0}
1809+
disabledTooltip={
1810+
messages.length > 0
1811+
? t('tooltip.modelSelector.disabled')
1812+
: undefined
1813+
}
18091814
/>
18101815
}
18111816
forceMultilineLayout

workspaces/lightspeed/plugins/lightspeed/src/components/MessageBarModelSelector.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
DropdownList,
2424
MenuToggle,
2525
MenuToggleElement,
26+
Tooltip,
2627
} from '@patternfly/react-core';
2728
import { AngleDownIcon } from '@patternfly/react-icons';
2829

@@ -33,6 +34,7 @@ type MessageBarModelSelectorProps = {
3334
models: { label: string; value: string; provider: string }[];
3435
onSelect: (model: string) => void;
3536
disabled?: boolean;
37+
disabledTooltip?: string;
3638
};
3739

3840
const useStyles = makeStyles(theme => ({
@@ -69,6 +71,7 @@ export const MessageBarModelSelector = ({
6971
models,
7072
onSelect,
7173
disabled = false,
74+
disabledTooltip,
7275
}: MessageBarModelSelectorProps) => {
7376
const [isOpen, setIsOpen] = useState(false);
7477
const classes = useStyles();
@@ -77,7 +80,7 @@ export const MessageBarModelSelector = ({
7780
const selectedModelLabel =
7881
models.find(m => m.value === selectedModel)?.label ?? selectedModel;
7982

80-
const toggle = (toggleRef: Ref<MenuToggleElement>) => (
83+
const toggleButton = (toggleRef: Ref<MenuToggleElement>) => (
8184
<MenuToggle
8285
ref={toggleRef}
8386
onClick={() => setIsOpen(!isOpen)}
@@ -92,6 +95,17 @@ export const MessageBarModelSelector = ({
9295
</MenuToggle>
9396
);
9497

98+
const toggle = (toggleRef: Ref<MenuToggleElement>) => {
99+
if (disabled && disabledTooltip) {
100+
return (
101+
<Tooltip content={disabledTooltip}>
102+
<span>{toggleButton(toggleRef)}</span>
103+
</Tooltip>
104+
);
105+
}
106+
return toggleButton(toggleRef);
107+
};
108+
95109
return (
96110
<Dropdown
97111
className={classes.dropdown}

workspaces/lightspeed/plugins/lightspeed/src/components/__tests__/MessageBarModelSelector.test.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,4 +235,31 @@ describe('MessageBarModelSelector', () => {
235235

236236
expect(screen.getByText('granite-3.3')).toBeInTheDocument();
237237
});
238+
239+
it('should show tooltip when disabled with disabledTooltip', async () => {
240+
render(
241+
<MessageBarModelSelector
242+
selectedModel="granite-3.3"
243+
models={mockModels}
244+
onSelect={mockOnSelect}
245+
disabled
246+
disabledTooltip="Each chat session supports only one model. To switch models, open a new chat."
247+
/>,
248+
);
249+
250+
const toggleButton = screen.getByRole('button', {
251+
name: 'Chatbot selector',
252+
});
253+
expect(toggleButton).toBeDisabled();
254+
255+
await userEvent.hover(toggleButton.parentElement!);
256+
257+
await waitFor(() => {
258+
expect(
259+
screen.getByText(
260+
'Each chat session supports only one model. To switch models, open a new chat.',
261+
),
262+
).toBeInTheDocument();
263+
});
264+
});
238265
});

workspaces/lightspeed/plugins/lightspeed/src/translations/ref.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,8 @@ export const lightspeedMessages = {
266266
'tooltip.close': 'Close',
267267
'tooltip.fab.open': 'Open intelligent assistant',
268268
'tooltip.fab.close': 'Close intelligent assistant',
269+
'tooltip.modelSelector.disabled':
270+
'Each chat session supports only one model. To switch models, open a new chat.',
269271

270272
// Attach menu
271273
'attach.menu.title': 'Attach',

0 commit comments

Comments
 (0)