Skip to content

Commit fa28964

Browse files
authored
Merge pull request #9991 from weseek/feat/166531-display-spinner-while-creating-diff
feat(ai): Display spinner while creating diff
2 parents 621bc60 + 9a21a01 commit fa28964

File tree

8 files changed

+125
-97
lines changed

8 files changed

+125
-97
lines changed

apps/app/public/static/locales/en_US/translation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,7 @@
515515
"accept": "Accept",
516516
"use_assistant": "Use Assistant",
517517
"remove_assistant": "Deselect the selected assistant",
518+
"text_generation_by_editor_assistant_label": "Editor Assistant is generating text",
518519
"preset_menu": {
519520
"summarize": {
520521
"title": "Summarize this article",

apps/app/public/static/locales/fr_FR/translation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,7 @@
509509
"accept": "Accepter",
510510
"use_assistant": "Utiliser l'assistant",
511511
"remove_assistant": "Désélectionner l'assistant sélectionné",
512+
"text_generation_by_editor_assistant_label": "L'assistant de rédaction génère du texte",
512513
"preset_menu": {
513514
"summarize": {
514515
"title": "Résumer cet article'",

apps/app/public/static/locales/ja_JP/translation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,7 @@
547547
"accept": "採用",
548548
"use_assistant": "アシスタントを使用する",
549549
"remove_assistant": "選択されているアシスタントの解除",
550+
"text_generation_by_editor_assistant_label": "エディターアシスタントが文章を生成中",
550551
"preset_menu": {
551552
"summarize": {
552553
"title": "この記事の要約をつくる",

apps/app/public/static/locales/zh_CN/translation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,7 @@
504504
"accept": "接受",
505505
"use_assistant": "使用助手",
506506
"remove_assistant": "取消选定的助手",
507+
"text_generation_by_editor_assistant_label": "编辑助理正在生成文本",
507508
"preset_menu": {
508509
"summarize": {
509510
"title": "为此文章创建摘要",

apps/app/src/features/openai/client/components/AiAssistant/AiAssistantSidebar/AiAssistantSidebar.tsx

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import {
2929
import { useAiAssistantSidebar } from '../../../stores/ai-assistant';
3030
import { useSWRxThreads } from '../../../stores/thread';
3131

32-
import { MessageCard, type MessageCardRole } from './MessageCard';
32+
import { MessageCard } from './MessageCard';
3333
import { ResizableTextarea } from './ResizableTextArea';
3434

3535
import styles from './AiAssistantSidebar.module.scss';
@@ -78,7 +78,6 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
7878

7979
// Views
8080
initialView: initialViewForKnowledgeAssistant,
81-
generateMessageCard: generateMessageCardForKnowledgeAssistant,
8281
generateModeSwitchesDropdown: generateModeSwitchesDropdownForKnowledgeAssistant,
8382
headerIcon: headerIconForKnowledgeAssistant,
8483
headerText: headerTextForKnowledgeAssistant,
@@ -95,7 +94,8 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
9594

9695
// Views
9796
generateInitialView: generateInitialViewForEditorAssistant,
98-
generateMessageCard: generateMessageCardForEditorAssistant,
97+
generatingEditorTextLabel,
98+
generateActionButtons,
9999
headerIcon: headerIconForEditorAssistant,
100100
headerText: headerTextForEditorAssistant,
101101
placeHolder: placeHolderForEditorAssistant,
@@ -354,18 +354,25 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
354354
return initialViewForKnowledgeAssistant;
355355
}, [generateInitialViewForEditorAssistant, initialViewForKnowledgeAssistant, isEditorAssistant, submit]);
356356

357-
const messageCard = useCallback(
358-
(role: MessageCardRole, children: string, messageId?: string, messageLogs?: MessageLog[], generatingAnswerMessage?: MessageLog) => {
359-
if (isEditorAssistant) {
360-
if (messageId == null || messageLogs == null) {
361-
return <></>;
362-
}
363-
return generateMessageCardForEditorAssistant(role, children, messageId, messageLogs, generatingAnswerMessage);
357+
const messageCardAdditionalItemForGeneratingMessage = useMemo(() => {
358+
if (isEditorAssistant) {
359+
return generatingEditorTextLabel;
360+
}
361+
362+
return <></>;
363+
}, [generatingEditorTextLabel, isEditorAssistant]);
364+
365+
366+
const messageCardAdditionalItemForGeneratedMessage = useCallback((messageId?: string) => {
367+
if (isEditorAssistant) {
368+
if (messageId == null || messageLogs == null) {
369+
return <></>;
364370
}
371+
return generateActionButtons(messageId, messageLogs, generatingAnswerMessage);
372+
}
365373

366-
return generateMessageCardForKnowledgeAssistant(role, children);
367-
}, [generateMessageCardForEditorAssistant, generateMessageCardForKnowledgeAssistant, isEditorAssistant],
368-
);
374+
return undefined;
375+
}, [generateActionButtons, generatingAnswerMessage, isEditorAssistant, messageLogs]);
369376

370377
return (
371378
<>
@@ -390,11 +397,21 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
390397
<div className="vstack gap-4 pb-2">
391398
{ messageLogs.map(message => (
392399
<>
393-
{messageCard(message.isUserMessage ? 'user' : 'assistant', message.content, message.id, messageLogs, generatingAnswerMessage)}
400+
<MessageCard
401+
role={message.isUserMessage ? 'user' : 'assistant'}
402+
additionalItem={messageCardAdditionalItemForGeneratedMessage(message.id)}
403+
>
404+
{message.content}
405+
</MessageCard>
394406
</>
395407
)) }
396408
{ generatingAnswerMessage != null && (
397-
<MessageCard role="assistant">{generatingAnswerMessage.content}</MessageCard>
409+
<MessageCard
410+
role="assistant"
411+
additionalItem={messageCardAdditionalItemForGeneratingMessage}
412+
>
413+
{generatingAnswerMessage.content}
414+
</MessageCard>
398415
)}
399416
{ messageLogs.length > 0 && (
400417
<div className="d-flex justify-content-center">
@@ -471,7 +488,6 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
471488
</Collapse>
472489
</div>
473490
)}
474-
475491
</div>
476492
</div>
477493
</div>

apps/app/src/features/openai/client/components/AiAssistant/AiAssistantSidebar/MessageCard.tsx

Lines changed: 10 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback, useState, type JSX } from 'react';
1+
import { type JSX } from 'react';
22

33
import type { LinkProps } from 'next/link';
44
import { useTranslation } from 'react-i18next';
@@ -33,27 +33,14 @@ const NextLinkWrapper = (props: LinkProps & {children: string, href: string}): J
3333
};
3434

3535
const AssistantMessageCard = ({
36-
children, showActionButtons, onAccept, onDiscard,
36+
children,
37+
additionalItem,
3738
}: {
3839
children: string,
39-
showActionButtons?: boolean
40-
onAccept?: () => void,
41-
onDiscard?: () => void,
40+
additionalItem?: JSX.Element,
4241
}): JSX.Element => {
4342
const { t } = useTranslation();
4443

45-
const [isActionButtonClicked, setIsActionButtonClicked] = useState(false);
46-
47-
const clickActionButtonHandler = useCallback((action: 'accept' | 'discard') => {
48-
setIsActionButtonClicked(true);
49-
if (action === 'accept') {
50-
onAccept?.();
51-
return;
52-
}
53-
54-
onDiscard?.();
55-
}, [onAccept, onDiscard]);
56-
5744
return (
5845
<div className={`card border-0 ${moduleClass} ${assistantMessageCardModuleClass}`}>
5946
<div className="card-body d-flex">
@@ -65,25 +52,7 @@ const AssistantMessageCard = ({
6552
? (
6653
<>
6754
<ReactMarkdown components={{ a: NextLinkWrapper }}>{children}</ReactMarkdown>
68-
69-
{showActionButtons && !isActionButtonClicked && (
70-
<div className="d-flex mt-2 justify-content-start">
71-
<button
72-
type="button"
73-
className="btn btn-outline-secondary me-2"
74-
onClick={() => clickActionButtonHandler('discard')}
75-
>
76-
{t('sidebar_ai_assistant.discard')}
77-
</button>
78-
<button
79-
type="button"
80-
className="btn btn-success"
81-
onClick={() => clickActionButtonHandler('accept')}
82-
>
83-
{t('sidebar_ai_assistant.accept')}
84-
</button>
85-
</div>
86-
)}
55+
{ additionalItem }
8756
</>
8857
)
8958
: (
@@ -98,28 +67,25 @@ const AssistantMessageCard = ({
9867
);
9968
};
10069

101-
export type MessageCardRole = 'user' | 'assistant';
70+
71+
type MessageCardRole = 'user' | 'assistant';
10272

10373
type Props = {
10474
role: MessageCardRole,
10575
children: string,
106-
showActionButtons?: boolean,
107-
onDiscard?: () => void,
108-
onAccept?: () => void,
76+
additionalItem?: JSX.Element,
10977
}
11078

11179
export const MessageCard = (props: Props): JSX.Element => {
11280
const {
113-
role, children, showActionButtons, onAccept, onDiscard,
81+
role, children, additionalItem,
11482
} = props;
11583

11684
return role === 'user'
11785
? <UserMessageCard>{children}</UserMessageCard>
11886
: (
11987
<AssistantMessageCard
120-
showActionButtons={showActionButtons}
121-
onAccept={onAccept}
122-
onDiscard={onDiscard}
88+
additionalItem={additionalItem}
12389
>{children}
12490
</AssistantMessageCard>
12591
);

0 commit comments

Comments
 (0)