Yuki Takei 11 bulan lalu
induk
melakukan
9e65d9e1ad

+ 19 - 13
apps/app/src/features/openai/client/components/AiAssistant/AiAssistantSidebar/AiAssistantSidebar.tsx

@@ -29,7 +29,7 @@ import {
   type FormData as FormDataForKnowledgeAssistant,
 } from '../../../services/knowledge-assistant';
 import { useAiAssistantSidebar } from '../../../stores/ai-assistant';
-// import { useSWRxThreads } from '../../../stores/thread'; // 削除
+import { useSWRxThreads } from '../../../stores/thread';
 
 import { MessageCard, type MessageCardRole } from './MessageCard';
 import { ResizableTextarea } from './ResizableTextArea';
@@ -67,8 +67,8 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
   // Hooks
   const { t } = useTranslation();
   const { data: growiCloudUri } = useGrowiCloudUri();
-  // const { data: threads, isLoading: isLoadingThreads } = useSWRxThreads(aiAssistantData?._id); // 削除
-  const { data: aiAssistantSidebarData, refreshCurrentThreadData } = useAiAssistantSidebar(); // refreshCurrentThreadData を追加
+  const { data: threads, mutate: mutateThreads } = useSWRxThreads(aiAssistantData?._id);
+  const { data: aiAssistantSidebarData, refreshThreadData } = useAiAssistantSidebar();
 
   const {
     createThread: createThreadForKnowledgeAssistant,
@@ -107,6 +107,18 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
   // Effects
   useFetchAndSetMessageDataEffect(setMessageLogs, threadData?.threadId);
 
+  // refresh thread data when the data is changed
+  useEffect(() => {
+    if (threads == null) {
+      return;
+    }
+
+    const currentThread = threads.find(t => t.threadId === currentThreadId);
+    if (currentThread != null) {
+      refreshThreadData(currentThread);
+    }
+  }, [threads, currentThreadId, refreshThreadData]);
+
   // Functions
   const resetForm = useCallback(() => {
     if (isEditorAssistant) {
@@ -229,7 +241,9 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
             setMessageLogs(msgs => [...msgs, generatingAnswerMessage]);
             return undefined;
           });
-          refreshCurrentThreadData(); // メッセージ送信成功後に呼び出し
+
+          // refresh thread data
+          mutateThreads();
           return;
         }
 
@@ -291,7 +305,7 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
     }
 
   // eslint-disable-next-line max-len
-  }, [isGenerating, messageLogs, resetForm, currentThreadId, createThread, t, postMessage, form, processMessageForKnowledgeAssistant, processMessageForEditorAssistant, growiCloudUri]);
+  }, [isGenerating, messageLogs, resetForm, currentThreadId, createThread, t, postMessage, form, processMessageForKnowledgeAssistant, processMessageForEditorAssistant, growiCloudUri, mutateThreads]);
 
   const submit = useCallback((data: FormData) => {
     if (isEditorAssistant) {
@@ -322,14 +336,6 @@ const AiAssistantSidebarSubstance: React.FC<AiAssistantSidebarSubstanceProps> =
       : headerIconForKnowledgeAssistant;
   }, [headerIconForEditorAssistant, headerIconForKnowledgeAssistant, isEditorAssistant]);
 
-  // const currentThreadTitleFromSWR = useMemo(() => { // 削除
-  //   if (isLoadingThreads || threads == null || currentThreadId == null) { // 削除
-  //     return undefined; // 削除
-  //   } // 削除
-  //   const foundThread = threads.find(t => t.threadId === currentThreadId); // 削除
-  //   return foundThread?.title; // 削除
-  // }, [threads, currentThreadId, isLoadingThreads]); // 削除
-
   const headerText = useMemo(() => {
     if (aiAssistantSidebarData?.threadData?.title) { // useAiAssistantSidebar から取得した title を使用
       return aiAssistantSidebarData.threadData.title;

+ 8 - 28
apps/app/src/features/openai/client/stores/ai-assistant.tsx

@@ -74,7 +74,7 @@ type AiAssistantSidebarUtils = {
   ): void
   openEditor(): void
   close(): void
-  refreshCurrentThreadData(): Promise<void>
+  refreshThreadData(threadData?: IThreadRelationHasId): void
 }
 
 export const useAiAssistantSidebar = (
@@ -82,32 +82,6 @@ export const useAiAssistantSidebar = (
 ): SWRResponse<AiAssistantSidebarStatus, Error> & AiAssistantSidebarUtils => {
   const initialStatus = { isOpened: false };
   const swrResponse = useSWRStatic<AiAssistantSidebarStatus, Error>('AiAssistantSidebar', status, { fallbackData: initialStatus });
-  const { cache } = useSWRConfig();
-
-  const refreshCurrentThreadData = useCallback(async() => {
-    const { aiAssistantData, threadData } = swrResponse.data ?? {};
-
-    if (aiAssistantData?._id == null || threadData?._id == null) {
-      return;
-    }
-
-    const threadsCacheKey = ['threads', aiAssistantData._id];
-    await mutate(threadsCacheKey);
-
-    // useSWRxThreads を直接呼び出す代わりに cache を使用
-    // cache.get のキーは文字列である必要があるため、配列を結合
-    const threadsData = cache.get(threadsCacheKey.join(','))?.data as IThreadRelationHasId[] | undefined; // IThread を IThreadRelationHasId に変更
-
-    if (threadsData == null) {
-      return;
-    }
-
-    const newThreadDataFromServer = threadsData.find(t => t._id === threadData._id);
-
-    if (newThreadDataFromServer != null && swrResponse.data != null) { // swrResponse.data の存在を確認
-      swrResponse.mutate({ ...swrResponse.data, threadData: newThreadDataFromServer });
-    }
-  }, [swrResponse, cache]);
 
   return {
     ...swrResponse,
@@ -128,6 +102,12 @@ export const useAiAssistantSidebar = (
         isOpened: false, isEditorAssistant: false, aiAssistantData: undefined, threadData: undefined,
       }), [swrResponse],
     ),
-    refreshCurrentThreadData,
+    refreshThreadData: useCallback(
+      (threadData?: IThreadRelationHasId) => {
+        swrResponse.mutate((currentState = { isOpened: false }) => {
+          return { ...currentState, threadData };
+        });
+      }, [swrResponse],
+    ),
   };
 };