diff --git a/apps/web/src/api/buster-electric/messages/hooks.ts b/apps/web/src/api/buster-electric/messages/hooks.ts index b3a039d2b..c5480ce2a 100644 --- a/apps/web/src/api/buster-electric/messages/hooks.ts +++ b/apps/web/src/api/buster-electric/messages/hooks.ts @@ -6,6 +6,12 @@ import { updateMessageShapeToIChatMessage } from './helpers'; import { useMemoizedFn } from '@/hooks'; import { prefetchGetListChats, useGetChatMemoized } from '@/api/buster_rest/chats'; import uniq from 'lodash/uniq'; +import type { ChatMessageResponseMessage_File } from '@buster/server-shared/chats'; +import type { BusterChatMessage } from '../../asset_interfaces/chat'; +import { useQueryClient } from '@tanstack/react-query'; +import { dashboardQueryKeys } from '../../query_keys/dashboard'; +import last from 'lodash/last'; +import isEmpty from 'lodash/isEmpty'; export const useGetMessage = ({ chatId, messageId }: { chatId: string; messageId: string }) => { const shape = useMemo(() => messageShape({ chatId, messageId }), [chatId, messageId]); @@ -32,6 +38,7 @@ export const useTrackAndUpdateMessageChanges = ( callback?: (message: ReturnType) => void ) => { const { onUpdateChatMessage, onUpdateChat } = useChatUpdate(); + const checkIfWeHaveAFollowupDashboard = useCheckIfWeHaveAFollowupDashboard(); const getChatMemoized = useGetChatMemoized(); const subscribe = !!chatId && !!messageId && messageId !== 'undefined'; @@ -60,6 +67,22 @@ export const useTrackAndUpdateMessageChanges = ( }); } + //check if we have a files in the message + const hasFiles = iChatMessage.reasoning_message_ids?.some((id) => { + const reasoningMessage = iChatMessage.response_messages?.[id]; + return ( + reasoningMessage && + (reasoningMessage as ChatMessageResponseMessage_File)?.file_type === 'dashboard' + ); + }); + if (hasFiles) { + prefetchGetListChats(); + } + + if (!isEmpty(iChatMessage.reasoning_message_ids)) { + checkIfWeHaveAFollowupDashboard(iChatMessage); + } + if (iChatMessage.is_completed) { prefetchGetListChats(); } @@ -71,3 +94,27 @@ export const useTrackAndUpdateMessageChanges = ( subscribe ); }; + +const useCheckIfWeHaveAFollowupDashboard = () => { + const queryClient = useQueryClient(); + const method = (message: Partial) => { + const lastResponseMessageId = last(message.response_message_ids || []) || ''; + const lastResponseMessage = message.response_messages?.[lastResponseMessageId] as + | ChatMessageResponseMessage_File + | undefined; + const hasDashboardInMessage = + lastResponseMessage && lastResponseMessage?.file_type === 'dashboard'; + + if (hasDashboardInMessage) { + const fileId = lastResponseMessage?.id; + const versionNumber = lastResponseMessage?.version_number; + const { queryKey } = dashboardQueryKeys.dashboardGetDashboard(fileId, versionNumber); + const isFoundInCache = queryClient.getQueryData(queryKey); + if (isFoundInCache) { + queryClient.invalidateQueries({ queryKey }); + } + } + }; + + return useMemoizedFn(method); +}; diff --git a/apps/web/src/api/buster_rest/dashboards/queryRequests.ts b/apps/web/src/api/buster_rest/dashboards/queryRequests.ts index 17669b8cc..b9560f1df 100644 --- a/apps/web/src/api/buster_rest/dashboards/queryRequests.ts +++ b/apps/web/src/api/buster_rest/dashboards/queryRequests.ts @@ -87,6 +87,10 @@ export const usePrefetchGetDashboardClient = () => { const queryClient = useQueryClient(); const queryFn = useGetDashboardAndInitializeMetrics(false); return useMemoizedFn((id: string, versionNumber: number) => { + const getDashboardQueryKey = dashboardQueryKeys.dashboardGetDashboard(id, versionNumber); + const isStale = isQueryStale(getDashboardQueryKey, queryClient); + if (!isStale) return queryClient; + return queryClient.prefetchQuery({ ...dashboardQueryKeys.dashboardGetDashboard(id, versionNumber), queryFn: () => queryFn(id, versionNumber) diff --git a/apps/web/src/layouts/ChatLayout/ChatContainer/ChatContent/ChatResponseMessages/ChatResponseMessage_File/ChatResponseMessage_DashboardFile.tsx b/apps/web/src/layouts/ChatLayout/ChatContainer/ChatContent/ChatResponseMessages/ChatResponseMessage_File/ChatResponseMessage_DashboardFile.tsx index 7cd922be1..8b5e2d87f 100644 --- a/apps/web/src/layouts/ChatLayout/ChatContainer/ChatContent/ChatResponseMessages/ChatResponseMessage_File/ChatResponseMessage_DashboardFile.tsx +++ b/apps/web/src/layouts/ChatLayout/ChatContainer/ChatContent/ChatResponseMessages/ChatResponseMessage_File/ChatResponseMessage_DashboardFile.tsx @@ -73,10 +73,6 @@ export const ChatResponseMessage_DashboardFile: React.FC<{ return ; }, [file_name, version_number, metricId]); - useMount(() => { - if (isSelectedFile) prefetchGetDashboard(id, version_number); - }); - return ( { const queryState = queryClient.getQueryState(options.queryKey); + const updatedAt = queryState?.dataUpdatedAt; const staleTime = (options.staleTime as number) || @@ -15,7 +16,7 @@ export const isQueryStale = ( 0; const isStale = updatedAt ? Date.now() - updatedAt > staleTime : true; - return isStale; + return isStale && queryState?.fetchStatus !== 'fetching'; }; export const hasOrganizationId = (queryClient: QueryClient): boolean => {