Ver Fonte

Reorganize logic for determining ActionButton visibility

Shun Miyazawa há 11 meses atrás
pai
commit
7717e1b085

+ 2 - 21
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantSidebar/AiAssistantSidebar.tsx

@@ -78,6 +78,7 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
     createThread: createThreadForEditorAssistant,
     postMessage: postMessageForEditorAssistant,
     processMessage: processMessageForEditorAssistant,
+    isActionButtonShown,
     accept,
     reject,
     headerIcon: headerIconForEditorAssistant,
@@ -105,26 +106,6 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
     return thread;
   }, [aiAssistantData, createThreadForEditorAssistant, createThreadForKnowledgeAssistant, isEditorAssistant, selectedAiAssistant?._id]);
 
-  const isActionButtonShown = useCallback((messageId: string) => {
-    if (!isEditorAssistant) {
-      return false;
-    }
-
-    if (generatingAnswerMessage != null) {
-      return false;
-    }
-
-    const latestAssistantMessageLogId = messageLogs
-      .filter(message => !message.isUserMessage)
-      .slice(-1)[0];
-
-    if (messageId === latestAssistantMessageLogId?.id) {
-      return true;
-    }
-
-    return false;
-  }, [generatingAnswerMessage, isEditorAssistant, messageLogs]);
-
   const headerIcon = useMemo(() => {
     return isEditorAssistant
       ? headerIconForEditorAssistant
@@ -350,7 +331,7 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
                   <MessageCard
                     key={message.id}
                     role={message.isUserMessage ? 'user' : 'assistant'}
-                    showActionButtons={isActionButtonShown(message.id)}
+                    showActionButtons={isActionButtonShown(message.id, messageLogs, generatingAnswerMessage)}
                     onAccept={clickAcceptHandler}
                     onDiscard={clickDiscardHandler}
                   >

+ 32 - 4
apps/app/src/features/openai/client/services/editor-assistant.tsx

@@ -28,8 +28,10 @@ import { handleIfSuccessfullyParsed } from '~/features/openai/utils/handle-if-su
 import { useIsEnableUnifiedMergeView } from '~/stores-universal/context';
 import { useCurrentPageId } from '~/stores/page';
 
+import type { MessageLog } from '../../interfaces/message';
 import type { IThreadRelationHasId } from '../../interfaces/thread-relation';
 import { ThreadType } from '../../interfaces/thread-relation';
+import { useAiAssistantSidebar } from '../stores/ai-assistant';
 
 interface CreateThread {
   (aiAssistantId?: string): Promise<IThreadRelationHasId>;
@@ -45,6 +47,10 @@ interface ProcessMessage {
   }): void;
 }
 
+interface IsActionButtonShown {
+  (messageId: string, messageLogs: MessageLog[], generatingAnswerMessage?: MessageLog): boolean;
+}
+
 type DetectedDiff = Array<{
   data: SseDetectedDiff,
   applied: boolean,
@@ -55,6 +61,7 @@ type UseEditorAssistant = () => {
   createThread: CreateThread,
   postMessage: PostMessage,
   processMessage: ProcessMessage,
+  isActionButtonShown: IsActionButtonShown,
   accept: () => void,
   reject: () => void,
 
@@ -126,14 +133,13 @@ export const useEditorAssistant: UseEditorAssistant = () => {
   const [detectedDiff, setDetectedDiff] = useState<DetectedDiff>();
   const [selectedText, setSelectedText] = useState<string>();
 
-  // SWR Hooks
+  // Hooks
+  const { t } = useTranslation();
   const { data: currentPageId } = useCurrentPageId();
   const { data: isEnableUnifiedMergeView, mutate: mutateIsEnableUnifiedMergeView } = useIsEnableUnifiedMergeView();
   const { data: codeMirrorEditor } = useCodeMirrorEditorIsolated(GlobalCodeMirrorEditorKey.MAIN);
   const yDocs = useSecondaryYdocs(isEnableUnifiedMergeView ?? false, { pageId: currentPageId ?? undefined, useSecondary: isEnableUnifiedMergeView ?? false });
-
-  // Hooks
-  const { t } = useTranslation();
+  const { data: aiAssistantSidebarData } = useAiAssistantSidebar();
 
   // Functions
   const createThread: CreateThread = useCallback(async(aiAssistantId) => {
@@ -198,6 +204,27 @@ export const useEditorAssistant: UseEditorAssistant = () => {
     lineRef.current = selectedTextFirstLineNumber;
   }, []);
 
+
+  const isActionButtonShown: IsActionButtonShown = useCallback((messageId: string, messageLogs: MessageLog[], generatingAnswerMessage: MessageLog) => {
+    if (!aiAssistantSidebarData?.isEditorAssistant) {
+      return false;
+    }
+
+    if (generatingAnswerMessage != null) {
+      return false;
+    }
+
+    const latestAssistantMessageLogId = messageLogs
+      .filter(message => !message.isUserMessage)
+      .slice(-1)[0];
+
+    if (messageId === latestAssistantMessageLogId?.id) {
+      return true;
+    }
+
+    return false;
+  }, [aiAssistantSidebarData?.isEditorAssistant]);
+
   // Effects
   useTextSelectionEffect(codeMirrorEditor, selectTextHandler);
 
@@ -292,6 +319,7 @@ export const useEditorAssistant: UseEditorAssistant = () => {
     createThread,
     postMessage,
     processMessage,
+    isActionButtonShown,
     accept,
     reject,