"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ChatBody = ChatBody; var _react = _interopRequireWildcard(require("react")); var _lodash = require("lodash"); var _eui = require("@elastic/eui"); var _css = require("@emotion/css"); var _uiTheme = require("@kbn/ui-theme"); var _use_timeline = require("../../hooks/use_timeline"); var _use_license = require("../../hooks/use_license"); var _use_observability_ai_assistant_chat_service = require("../../hooks/use_observability_ai_assistant_chat_service"); var _experimental_feature_banner = require("./experimental_feature_banner"); var _initial_setup_panel = require("./initial_setup_panel"); var _incorrect_license_panel = require("./incorrect_license_panel"); var _chat_header = require("./chat_header"); var _chat_prompt_editor = require("./chat_prompt_editor"); var _chat_timeline = require("./chat_timeline"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ const timelineClassName = (0, _css.css)` overflow-y: auto; `; const loadingSpinnerContainerClassName = (0, _css.css)` align-self: center; `; const incorrectLicenseContainer = (0, _css.css)` height: 100%; padding: ${_uiTheme.euiThemeVars.euiPanelPaddingModifiers.paddingMedium}; `; function ChatBody({ title, loading, messages, connectors, knowledgeBase, connectorsManagementHref, modelsManagementHref, conversationId, currentUser, startedFrom, onChatUpdate, onChatComplete, onSaveTitle }) { var _last, _connectors$connector; const license = (0, _use_license.useLicense)(); const hasCorrectLicense = license === null || license === void 0 ? void 0 : license.hasAtLeast('enterprise'); const chatService = (0, _use_observability_ai_assistant_chat_service.useObservabilityAIAssistantChatService)(); const timeline = (0, _use_timeline.useTimeline)({ chatService, connectors, currentUser, messages, startedFrom, onChatUpdate, onChatComplete }); const timelineContainerRef = (0, _react.useRef)(null); let footer; const isLoading = Boolean(connectors.loading || knowledgeBase.status.loading || ((_last = (0, _lodash.last)(timeline.items)) === null || _last === void 0 ? void 0 : _last.loading)); const containerClassName = (0, _css.css)` max-height: 100%; max-width: ${startedFrom === 'conversationView' ? 1200 - 250 + 'px' // page template max width - conversation list width. : '100%'}; `; const [stickToBottom, setStickToBottom] = (0, _react.useState)(true); const isAtBottom = parent => parent.scrollTop + parent.clientHeight >= parent.scrollHeight; (0, _react.useEffect)(() => { var _timelineContainerRef; const parent = (_timelineContainerRef = timelineContainerRef.current) === null || _timelineContainerRef === void 0 ? void 0 : _timelineContainerRef.parentElement; if (!parent) { return; } function onScroll() { setStickToBottom(isAtBottom(parent)); } parent.addEventListener('scroll', onScroll); return () => { parent.removeEventListener('scroll', onScroll); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [timelineContainerRef.current]); (0, _react.useEffect)(() => { var _timelineContainerRef2; const parent = (_timelineContainerRef2 = timelineContainerRef.current) === null || _timelineContainerRef2 === void 0 ? void 0 : _timelineContainerRef2.parentElement; if (!parent) { return; } if (stickToBottom) { parent.scrollTop = parent.scrollHeight; } }); const handleCopyConversation = () => { var _navigator$clipboard; const content = JSON.stringify({ title, messages }); (_navigator$clipboard = navigator.clipboard) === null || _navigator$clipboard === void 0 ? void 0 : _navigator$clipboard.writeText(content || ''); }; if (!hasCorrectLicense && !conversationId) { footer = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: true, className: incorrectLicenseContainer }, /*#__PURE__*/_react.default.createElement(_incorrect_license_panel.IncorrectLicensePanel, null)), /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: false }, /*#__PURE__*/_react.default.createElement(_eui.EuiHorizontalRule, { margin: "none" })), /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: false }, /*#__PURE__*/_react.default.createElement(_eui.EuiPanel, { hasBorder: false, hasShadow: false, paddingSize: "m" }, /*#__PURE__*/_react.default.createElement(_chat_prompt_editor.ChatPromptEditor, { loading: isLoading, disabled: true, onSubmit: timeline.onSubmit }), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "s" })))); } else if (connectors.loading || knowledgeBase.status.loading) { footer = /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { className: loadingSpinnerContainerClassName }, /*#__PURE__*/_react.default.createElement(_eui.EuiLoadingSpinner, null)); } else if (((_connectors$connector = connectors.connectors) === null || _connectors$connector === void 0 ? void 0 : _connectors$connector.length) === 0 && !conversationId) { footer = /*#__PURE__*/_react.default.createElement(_initial_setup_panel.InitialSetupPanel, { connectors: connectors, connectorsManagementHref: connectorsManagementHref, knowledgeBase: knowledgeBase, startedFrom: startedFrom }); } else { footer = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: true, className: timelineClassName }, /*#__PURE__*/_react.default.createElement("div", { ref: timelineContainerRef }, /*#__PURE__*/_react.default.createElement(_eui.EuiPanel, { hasBorder: false, hasShadow: false, paddingSize: "m" }, /*#__PURE__*/_react.default.createElement(_chat_timeline.ChatTimeline, { items: timeline.items, knowledgeBase: knowledgeBase, onEdit: timeline.onEdit, onFeedback: timeline.onFeedback, onRegenerate: timeline.onRegenerate, onStopGenerating: timeline.onStopGenerating })))), /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: false }, /*#__PURE__*/_react.default.createElement(_eui.EuiHorizontalRule, { margin: "none" })), /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: false }, /*#__PURE__*/_react.default.createElement(_eui.EuiPanel, { hasBorder: false, hasShadow: false, paddingSize: "m" }, /*#__PURE__*/_react.default.createElement(_chat_prompt_editor.ChatPromptEditor, { loading: isLoading, disabled: !connectors.selectedConnector || !hasCorrectLicense, onSubmit: message => { setStickToBottom(true); return timeline.onSubmit(message); } }), /*#__PURE__*/_react.default.createElement(_eui.EuiSpacer, { size: "s" })))); } return /*#__PURE__*/_react.default.createElement(_eui.EuiFlexGroup, { direction: "column", gutterSize: "none", className: containerClassName }, connectors.selectedConnector ? /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: false }, /*#__PURE__*/_react.default.createElement(_experimental_feature_banner.ExperimentalFeatureBanner, null)) : null, /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: false }, /*#__PURE__*/_react.default.createElement(_chat_header.ChatHeader, { connectors: connectors, conversationId: conversationId, connectorsManagementHref: connectorsManagementHref, modelsManagementHref: modelsManagementHref, knowledgeBase: knowledgeBase, licenseInvalid: !hasCorrectLicense && !conversationId, loading: loading, startedFrom: startedFrom, title: title, onCopyConversation: handleCopyConversation, onSaveTitle: onSaveTitle })), /*#__PURE__*/_react.default.createElement(_eui.EuiFlexItem, { grow: false }, /*#__PURE__*/_react.default.createElement(_eui.EuiHorizontalRule, { margin: "none" })), footer); }