diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/index.tsx index 72d33d7a52460..08d3fcd922990 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/index.tsx @@ -13,7 +13,14 @@ import React, { useMemo, useRef, } from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiText } from '@elastic/eui'; +import { + EuiEmptyPrompt, + EuiFlexGroup, + EuiFlexItem, + EuiLoadingLogo, + EuiPanel, + EuiText, +} from '@elastic/eui'; import { HttpSetup } from '@kbn/core-http-browser'; import { euiThemeVars } from '@kbn/ui-theme'; import { css } from '@emotion/react'; @@ -33,6 +40,7 @@ interface Props { isAssistantEnabled: boolean; isSettingsModalVisible: boolean; isWelcomeSetup: boolean; + isLoading: boolean; refetchCurrentUserConversations: () => Promise< QueryObserverResult, unknown> >; @@ -50,6 +58,7 @@ export const AssistantBody: FunctionComponent = ({ setCurrentSystemPromptId, http, isAssistantEnabled, + isLoading, isSettingsModalVisible, isWelcomeSetup, refetchCurrentUserConversations, @@ -103,7 +112,12 @@ export const AssistantBody: FunctionComponent = ({ return ( - {isWelcomeSetup ? ( + {isLoading ? ( + } + /> + ) : isWelcomeSetup ? ( void; setIsSettingsModalVisible: React.Dispatch>; @@ -62,6 +64,7 @@ export const AssistantHeader: React.FC = ({ selectedConversation, defaultConnector, isDisabled, + isLoading, isSettingsModalVisible, onToggleShowAnonymizedValues, setIsSettingsModalVisible, @@ -145,6 +148,7 @@ export const AssistantHeader: React.FC = ({ return ( <> = ({ overflow: hidden; `} > - + {isLoading ? ( + + ) : ( + + )} @@ -241,6 +249,7 @@ export const AssistantHeader: React.FC = ({ button={ void; children: React.ReactNode; onConversationCreate?: () => Promise; @@ -35,7 +36,14 @@ const VerticalSeparator = styled.div` */ export const FlyoutNavigation = memo( - ({ isExpanded, setIsExpanded, children, onConversationCreate, isAssistantEnabled }) => { + ({ + isLoading, + isExpanded, + setIsExpanded, + children, + onConversationCreate, + isAssistantEnabled, + }) => { const onToggle = useCallback( () => setIsExpanded && setIsExpanded(!isExpanded), [isExpanded, setIsExpanded] @@ -44,7 +52,7 @@ export const FlyoutNavigation = memo( const toggleButton = useMemo( () => ( ( } /> ), - [isAssistantEnabled, isExpanded, onToggle] + [isAssistantEnabled, isExpanded, isLoading, onToggle] ); return ( @@ -99,7 +107,7 @@ export const FlyoutNavigation = memo( color="primary" iconType="newChat" onClick={onConversationCreate} - disabled={!isAssistantEnabled} + disabled={isLoading || !isAssistantEnabled} > {NEW_CHAT} diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx index 10938ab21b299..725adde176fd6 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx @@ -145,6 +145,18 @@ const AssistantComponent: React.FC = ({ Object.keys(conversations).length > 0, }); + const isInitialLoad = useMemo(() => { + return ( + (!isFetchedAnonymizationFields && !isFetchedCurrentUserConversations && !isFetchedPrompts) || + !(currentConversation && currentConversation?.id !== '') + ); + }, [ + currentConversation, + isFetchedAnonymizationFields, + isFetchedCurrentUserConversations, + isFetchedPrompts, + ]); + // Welcome setup state const isWelcomeSetup = useMemo( () => @@ -158,7 +170,10 @@ const AssistantComponent: React.FC = ({ : (connectors?.length ?? 0) === 0, [connectors?.length, conversations] ); - const isDisabled = isWelcomeSetup || !isAssistantEnabled; + const isDisabled = useMemo( + () => isWelcomeSetup || !isAssistantEnabled || isInitialLoad, + [isWelcomeSetup, isAssistantEnabled, isInitialLoad] + ); // Settings modal state (so it isn't shared between assistant instances like Timeline) const [isSettingsModalVisible, setIsSettingsModalVisible] = useState(false); @@ -438,6 +453,7 @@ const AssistantComponent: React.FC = ({ > = ({ handleOnConversationSelected={handleOnConversationSelected} http={http} isAssistantEnabled={isAssistantEnabled} + isLoading={isInitialLoad} isSettingsModalVisible={isSettingsModalVisible} isWelcomeSetup={isWelcomeSetup} refetchCurrentUserConversations={refetchCurrentUserConversations} diff --git a/x-pack/packages/kbn-elastic-assistant/impl/connectorland/connector_selector/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/connectorland/connector_selector/index.tsx index 12cb0a30c0c9c..db48adce0db61 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/connectorland/connector_selector/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/connectorland/connector_selector/index.tsx @@ -78,6 +78,7 @@ export const ConnectorSelector: React.FC = React.memo( @@ -91,7 +92,7 @@ export const ConnectorSelector: React.FC = React.memo( ), }; - }, []); + }, [localIsDisabled]); const connectorOptions = useMemo( () => @@ -188,6 +189,7 @@ export const ConnectorSelector: React.FC = React.memo( setIsConnectorModalVisible(true)} >