@gravity-ui/aikit 2.24.1-beta.883c85d04b93d8521b2733baa3e86da20249b4e7.0 → 2.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/components/molecules/PromptInputBody/PromptInputBody.d.ts +1 -0
- package/build/cjs/components/molecules/PromptInputBody/PromptInputBody.js +2 -8
- package/build/cjs/components/molecules/PromptInputBody/PromptInputBody.js.map +1 -1
- package/build/cjs/components/organisms/PromptInput/PromptInput.css +37 -0
- package/build/cjs/components/organisms/PromptInput/PromptInput.d.ts +13 -2
- package/build/cjs/components/organisms/PromptInput/PromptInput.js +64 -3
- package/build/cjs/components/organisms/PromptInput/PromptInput.js.map +1 -1
- package/build/cjs/components/organisms/PromptInput/PromptInputCommands.d.ts +9 -0
- package/build/cjs/components/organisms/PromptInput/PromptInputCommands.js +39 -0
- package/build/cjs/components/organisms/PromptInput/PromptInputCommands.js.map +1 -0
- package/build/cjs/components/organisms/PromptInput/PromptInputFull.d.ts +2 -0
- package/build/cjs/components/organisms/PromptInput/PromptInputFull.js +4 -4
- package/build/cjs/components/organisms/PromptInput/PromptInputFull.js.map +1 -1
- package/build/cjs/components/organisms/PromptInput/PromptInputSimple.d.ts +2 -0
- package/build/cjs/components/organisms/PromptInput/PromptInputSimple.js +3 -3
- package/build/cjs/components/organisms/PromptInput/PromptInputSimple.js.map +1 -1
- package/build/cjs/components/organisms/PromptInput/commandUtils.d.ts +13 -0
- package/build/cjs/components/organisms/PromptInput/commandUtils.js +27 -0
- package/build/cjs/components/organisms/PromptInput/commandUtils.js.map +1 -0
- package/build/cjs/components/organisms/PromptInput/i18n/en.json +8 -0
- package/build/cjs/components/organisms/PromptInput/i18n/index.d.ts +13 -0
- package/build/cjs/components/organisms/PromptInput/i18n/index.js +10 -0
- package/build/cjs/components/organisms/PromptInput/i18n/index.js.map +1 -0
- package/build/cjs/components/organisms/PromptInput/i18n/ru.json +8 -0
- package/build/cjs/components/organisms/PromptInput/index.d.ts +2 -1
- package/build/cjs/components/organisms/PromptInput/index.js.map +1 -1
- package/build/cjs/components/organisms/PromptInput/types.d.ts +1 -0
- package/build/cjs/components/organisms/PromptInput/types.js.map +1 -1
- package/build/cjs/components/organisms/PromptInput/usePromptCommands.d.ts +41 -0
- package/build/cjs/components/organisms/PromptInput/usePromptCommands.js +222 -0
- package/build/cjs/components/organisms/PromptInput/usePromptCommands.js.map +1 -0
- package/build/cjs/components/organisms/PromptInput/usePromptInput.d.ts +10 -1
- package/build/cjs/components/organisms/PromptInput/usePromptInput.js +100 -11
- package/build/cjs/components/organisms/PromptInput/usePromptInput.js.map +1 -1
- package/build/cjs/components/pages/AIStudioChat/AIStudioChat.js +139 -52
- package/build/cjs/components/pages/AIStudioChat/AIStudioChat.js.map +1 -1
- package/build/cjs/components/pages/AIStudioChat/request.d.ts +4 -0
- package/build/cjs/components/pages/AIStudioChat/request.js +11 -0
- package/build/cjs/components/pages/AIStudioChat/request.js.map +1 -0
- package/build/cjs/components/pages/AIStudioChat/types.d.ts +5 -5
- package/build/cjs/components/pages/AIStudioChat/types.js.map +1 -1
- package/build/cjs/components/pages/ChatContainer/ChatContainer.js +10 -4
- package/build/cjs/components/pages/ChatContainer/ChatContainer.js.map +1 -1
- package/build/cjs/components/pages/ChatContainer/types.d.ts +1 -1
- package/build/cjs/components/pages/ChatContainer/types.js.map +1 -1
- package/build/cjs/components/pages/ChatContainer/useChatContainer.d.ts +1 -0
- package/build/cjs/components/pages/ChatContainer/useChatContainer.js +5 -1
- package/build/cjs/components/pages/ChatContainer/useChatContainer.js.map +1 -1
- package/build/cjs/package.json +1 -1
- package/build/cjs/types/index.d.ts +1 -0
- package/build/cjs/types/index.js +1 -0
- package/build/cjs/types/index.js.map +1 -1
- package/build/cjs/types/messages.d.ts +3 -0
- package/build/cjs/types/messages.js.map +1 -1
- package/build/cjs/types/promptCommands.d.ts +44 -0
- package/build/cjs/types/promptCommands.js +3 -0
- package/build/cjs/types/promptCommands.js.map +1 -0
- package/build/docs/components/molecules/PromptInputBody.md +16 -15
- package/build/docs/components/organisms/PromptInput.md +151 -0
- package/build/docs/components/pages/AIStudioChat.md +38 -0
- package/build/esm/components/molecules/PromptInputBody/PromptInputBody.d.ts +1 -0
- package/build/esm/components/molecules/PromptInputBody/PromptInputBody.js +2 -8
- package/build/esm/components/molecules/PromptInputBody/PromptInputBody.js.map +1 -1
- package/build/esm/components/organisms/PromptInput/PromptInput.css +37 -0
- package/build/esm/components/organisms/PromptInput/PromptInput.d.ts +13 -2
- package/build/esm/components/organisms/PromptInput/PromptInput.js +65 -4
- package/build/esm/components/organisms/PromptInput/PromptInput.js.map +1 -1
- package/build/esm/components/organisms/PromptInput/PromptInputCommands.d.ts +9 -0
- package/build/esm/components/organisms/PromptInput/PromptInputCommands.js +36 -0
- package/build/esm/components/organisms/PromptInput/PromptInputCommands.js.map +1 -0
- package/build/esm/components/organisms/PromptInput/PromptInputFull.d.ts +2 -0
- package/build/esm/components/organisms/PromptInput/PromptInputFull.js +4 -4
- package/build/esm/components/organisms/PromptInput/PromptInputFull.js.map +1 -1
- package/build/esm/components/organisms/PromptInput/PromptInputSimple.d.ts +2 -0
- package/build/esm/components/organisms/PromptInput/PromptInputSimple.js +3 -3
- package/build/esm/components/organisms/PromptInput/PromptInputSimple.js.map +1 -1
- package/build/esm/components/organisms/PromptInput/commandUtils.d.ts +13 -0
- package/build/esm/components/organisms/PromptInput/commandUtils.js +23 -0
- package/build/esm/components/organisms/PromptInput/commandUtils.js.map +1 -0
- package/build/esm/components/organisms/PromptInput/i18n/en.json +8 -0
- package/build/esm/components/organisms/PromptInput/i18n/index.d.ts +13 -0
- package/build/esm/components/organisms/PromptInput/i18n/index.js +6 -0
- package/build/esm/components/organisms/PromptInput/i18n/index.js.map +1 -0
- package/build/esm/components/organisms/PromptInput/i18n/ru.json +8 -0
- package/build/esm/components/organisms/PromptInput/index.d.ts +2 -1
- package/build/esm/components/organisms/PromptInput/index.js.map +1 -1
- package/build/esm/components/organisms/PromptInput/types.d.ts +1 -0
- package/build/esm/components/organisms/PromptInput/types.js.map +1 -1
- package/build/esm/components/organisms/PromptInput/usePromptCommands.d.ts +41 -0
- package/build/esm/components/organisms/PromptInput/usePromptCommands.js +219 -0
- package/build/esm/components/organisms/PromptInput/usePromptCommands.js.map +1 -0
- package/build/esm/components/organisms/PromptInput/usePromptInput.d.ts +10 -1
- package/build/esm/components/organisms/PromptInput/usePromptInput.js +101 -12
- package/build/esm/components/organisms/PromptInput/usePromptInput.js.map +1 -1
- package/build/esm/components/pages/AIStudioChat/AIStudioChat.js +139 -52
- package/build/esm/components/pages/AIStudioChat/AIStudioChat.js.map +1 -1
- package/build/esm/components/pages/AIStudioChat/request.d.ts +4 -0
- package/build/esm/components/pages/AIStudioChat/request.js +8 -0
- package/build/esm/components/pages/AIStudioChat/request.js.map +1 -0
- package/build/esm/components/pages/AIStudioChat/types.d.ts +5 -5
- package/build/esm/components/pages/AIStudioChat/types.js.map +1 -1
- package/build/esm/components/pages/ChatContainer/ChatContainer.js +12 -6
- package/build/esm/components/pages/ChatContainer/ChatContainer.js.map +1 -1
- package/build/esm/components/pages/ChatContainer/types.d.ts +1 -1
- package/build/esm/components/pages/ChatContainer/types.js.map +1 -1
- package/build/esm/components/pages/ChatContainer/useChatContainer.d.ts +1 -0
- package/build/esm/components/pages/ChatContainer/useChatContainer.js +5 -1
- package/build/esm/components/pages/ChatContainer/useChatContainer.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/types/index.d.ts +1 -0
- package/build/esm/types/index.js +1 -0
- package/build/esm/types/index.js.map +1 -1
- package/build/esm/types/messages.d.ts +3 -0
- package/build/esm/types/messages.js.map +1 -1
- package/build/esm/types/promptCommands.d.ts +44 -0
- package/build/esm/types/promptCommands.js +2 -0
- package/build/esm/types/promptCommands.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { __rest } from "tslib";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Fragment, useCallback, useMemo, useRef } from 'react';
|
|
4
|
-
import { MobileProvider, useMobile } from '@gravity-ui/uikit';
|
|
4
|
+
import { MobileProvider, useForkRef, useMobile } from '@gravity-ui/uikit';
|
|
5
5
|
import { getMascotAnimationType, useKeyboardViewportFit } from "../../../hooks/index.js";
|
|
6
6
|
import { block } from "../../../utils/cn.js";
|
|
7
7
|
import { getMascotNode, resolveMascotAssets, resolveMascotCollection } from "../../../utils/mascot.js";
|
|
8
8
|
import { Disclaimer } from "../../atoms/Disclaimer/index.js";
|
|
9
9
|
import { Header, HeaderAction } from "../../organisms/Header/index.js";
|
|
10
|
-
import { PromptInput } from "../../organisms/PromptInput/index.js";
|
|
10
|
+
import { PromptInput, } from "../../organisms/PromptInput/index.js";
|
|
11
11
|
import { ChatContent } from "../../templates/ChatContent/index.js";
|
|
12
12
|
import { History } from "../../templates/History/index.js";
|
|
13
13
|
import { defaultGravityMascots } from "./GravityMascot.js";
|
|
@@ -49,11 +49,11 @@ function buildFinalPromptInputHeaderProps(args) {
|
|
|
49
49
|
}
|
|
50
50
|
function buildFinalPromptInputProps(args) {
|
|
51
51
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
|
|
52
|
-
const { promptInputProps, onSendMessage, onCancel, status, contextItems, showContextIndicator, contextIndicatorProps, texts: textsArg, promptInputKey, qaMap, onValueChange, } = args;
|
|
52
|
+
const { promptInputProps, onSendMessage, onCancel, status, contextItems, showContextIndicator, contextIndicatorProps, texts: textsArg, promptInputKey, commandsResetKey, qaMap, onValueChange, } = args;
|
|
53
53
|
const texts = textsArg !== null && textsArg !== void 0 ? textsArg : {};
|
|
54
54
|
const _s = (_a = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.bodyProps) !== null && _a !== void 0 ? _a : {}, { autoFocusOnNewChat: _autoFocusOnNewChat, autoFocusOnChatSelect: _autoFocusOnChatSelect } = _s, restBodyProps = __rest(_s, ["autoFocusOnNewChat", "autoFocusOnChatSelect"]);
|
|
55
55
|
const suggestionsProps = mergePromptInputSuggestionsProps(promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.suggestionsProps, texts.promptSuggestTitle);
|
|
56
|
-
return Object.assign(Object.assign({}, promptInputProps), { onValueChange: onValueChange || (promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.onValueChange)
|
|
56
|
+
return Object.assign(Object.assign({}, promptInputProps), { commandsResetKey, onValueChange: onValueChange || (promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.onValueChange)
|
|
57
57
|
? (value) => {
|
|
58
58
|
var _a;
|
|
59
59
|
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(value);
|
|
@@ -110,6 +110,8 @@ export function ChatContainer(props) {
|
|
|
110
110
|
activeChatId: (_a = hookState.activeChat) === null || _a === void 0 ? void 0 : _a.id,
|
|
111
111
|
promptInputKey: hookState.promptInputKey,
|
|
112
112
|
});
|
|
113
|
+
const promptApiRef = useRef(null);
|
|
114
|
+
const mergedPromptApiRef = useForkRef(promptApiRef, promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.apiRef);
|
|
113
115
|
const wrappedOnSendMessage = useCallback(async (...args) => {
|
|
114
116
|
mascotState.notifyActivity();
|
|
115
117
|
return onSendMessage(...args);
|
|
@@ -234,8 +236,9 @@ export function ChatContainer(props) {
|
|
|
234
236
|
((_l = welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.alignment) === null || _l === void 0 ? void 0 : _l.hero) === undefined
|
|
235
237
|
? { hero: 'center' }
|
|
236
238
|
: {})), heroContent: (_m = emptyContainerProps.heroContent) !== null && _m !== void 0 ? _m : (mascotView === 'hero' ? mascotNode : undefined), layout: (_o = welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.layout) !== null && _o !== void 0 ? _o : emptyContainerProps.layout, wrapText: (_p = welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.wrapText) !== null && _p !== void 0 ? _p : emptyContainerProps.wrapText, showMore: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.showMore, showMoreText: (_s = (_r = (_q = texts.emptyStateShowMoreText) !== null && _q !== void 0 ? _q : welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.showMoreText) !== null && _r !== void 0 ? _r : emptyContainerProps.showMoreText) !== null && _s !== void 0 ? _s : i18n('empty-state-show-more'), onSuggestionClick: async (content, suggestionId, suggestionData) => {
|
|
239
|
+
var _a;
|
|
237
240
|
const suggestion = toSuggestionContext(suggestionId, suggestionData);
|
|
238
|
-
await
|
|
241
|
+
await ((_a = promptApiRef.current) === null || _a === void 0 ? void 0 : _a.submit(Object.assign({ content }, (suggestion && { suggestion }))));
|
|
239
242
|
} });
|
|
240
243
|
}, [
|
|
241
244
|
welcomeConfig,
|
|
@@ -279,7 +282,7 @@ export function ChatContainer(props) {
|
|
|
279
282
|
]);
|
|
280
283
|
// Build props for PromptInput
|
|
281
284
|
const finalPromptInputProps = useMemo(() => buildFinalPromptInputProps({
|
|
282
|
-
promptInputProps,
|
|
285
|
+
promptInputProps: Object.assign(Object.assign({}, promptInputProps), { apiRef: mergedPromptApiRef }),
|
|
283
286
|
onSendMessage: wrappedOnSendMessage,
|
|
284
287
|
onCancel: wrappedOnCancel,
|
|
285
288
|
status,
|
|
@@ -288,6 +291,7 @@ export function ChatContainer(props) {
|
|
|
288
291
|
contextIndicatorProps,
|
|
289
292
|
texts,
|
|
290
293
|
promptInputKey: hookState.promptInputKey,
|
|
294
|
+
commandsResetKey: hookState.commandsResetKey,
|
|
291
295
|
qaMap,
|
|
292
296
|
onValueChange: mascotConfig ? mascotState.handleValueChange : undefined,
|
|
293
297
|
}), [
|
|
@@ -298,7 +302,9 @@ export function ChatContainer(props) {
|
|
|
298
302
|
showContextIndicator,
|
|
299
303
|
contextIndicatorProps,
|
|
300
304
|
promptInputProps,
|
|
305
|
+
mergedPromptApiRef,
|
|
301
306
|
hookState.promptInputKey,
|
|
307
|
+
hookState.commandsResetKey,
|
|
302
308
|
qaMap,
|
|
303
309
|
texts.promptPlaceholder,
|
|
304
310
|
texts.promptSuggestTitle,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatContainer.js","sourceRoot":"../../../../../src","sources":["components/pages/ChatContainer/ChatContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type CSSProperties, Fragment, type ReactNode, useCallback, useMemo, useRef} from 'react';\n\nimport {MobileProvider, useMobile} from '@gravity-ui/uikit';\n\nimport {getMascotAnimationType, useKeyboardViewportFit} from '../../../hooks';\nimport type {TSuggestionContext} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {getMascotNode, resolveMascotAssets, resolveMascotCollection} from '../../../utils/mascot';\nimport {Disclaimer} from '../../atoms/Disclaimer';\nimport {Header, HeaderAction, type HeaderProps} from '../../organisms/Header';\nimport {PromptInput, type PromptInputProps} from '../../organisms/PromptInput';\nimport {ChatContent} from '../../templates/ChatContent';\nimport {History} from '../../templates/History';\n\nimport {defaultGravityMascots} from './GravityMascot';\nimport {\n normalizeChatContainerQa,\n resolveChatContainerQa,\n resolveChatContainerRootQa,\n resolveHeaderMenuItemQa,\n} from './chatContainerQa';\nimport {i18n} from './i18n';\nimport type {ChatContainerProps, ChatContainerTexts, MascotConfig} from './types';\nimport {useChatContainer} from './useChatContainer';\nimport {useChatContainerMascot} from './useChatContainerMascot';\nimport {useKeyboardLayoutFit} from './useKeyboardLayoutFit';\n\nimport './ChatContainer.scss';\n\nconst b = block('chat-container');\nconst DEFAULT_MASCOT_CONFIG: MascotConfig = {};\n\ntype NormalizedChatContainerQa = ReturnType<typeof normalizeChatContainerQa>;\n\nfunction toSuggestionContext(\n id?: string,\n data?: Record<string, unknown>,\n): TSuggestionContext | undefined {\n if (!id && !data) {\n return undefined;\n }\n\n return {\n ...(id && {id}),\n ...(data && {data}),\n };\n}\n\nfunction mergePromptInputSuggestionsProps(\n fromProps: PromptInputProps['suggestionsProps'] | undefined,\n textsSuggestTitle: ReactNode | undefined,\n): PromptInputProps['suggestionsProps'] | undefined {\n const hasSuggestionsFromProps = Boolean(fromProps);\n const hasSuggestTitleFromTexts = textsSuggestTitle !== undefined;\n if (!hasSuggestionsFromProps && !hasSuggestTitleFromTexts) {\n return undefined;\n }\n return {\n ...fromProps,\n suggestTitle: textsSuggestTitle ?? fromProps?.suggestTitle,\n };\n}\n\nfunction buildFinalPromptInputHeaderProps(args: {\n headerProps: NonNullable<ChatContainerProps['promptInputProps']>['headerProps'];\n contextItems: ChatContainerProps['contextItems'];\n showContextIndicator: ChatContainerProps['showContextIndicator'];\n contextIndicatorProps: ChatContainerProps['contextIndicatorProps'];\n qa: string | undefined;\n}): NonNullable<ChatContainerProps['promptInputProps']>['headerProps'] {\n const {headerProps, contextItems, showContextIndicator, contextIndicatorProps, qa} = args;\n\n // topContent replaces the default header entirely, so context-related\n // props are not allowed (and would be ignored) alongside it\n if (headerProps?.topContent) {\n return {topContent: headerProps.topContent, qa};\n }\n\n return {\n contextItems,\n showContextIndicator: showContextIndicator ?? headerProps?.showContextIndicator,\n contextIndicatorProps: contextIndicatorProps ?? headerProps?.contextIndicatorProps,\n qa,\n };\n}\n\nfunction buildFinalPromptInputProps(args: {\n promptInputProps: ChatContainerProps['promptInputProps'];\n onSendMessage: ChatContainerProps['onSendMessage'];\n onCancel: ChatContainerProps['onCancel'];\n status: ChatContainerProps['status'];\n contextItems: ChatContainerProps['contextItems'];\n showContextIndicator: ChatContainerProps['showContextIndicator'];\n contextIndicatorProps: ChatContainerProps['contextIndicatorProps'];\n texts: ChatContainerTexts;\n promptInputKey: number;\n qaMap: NormalizedChatContainerQa;\n onValueChange?: (value: string) => void;\n}) {\n const {\n promptInputProps,\n onSendMessage,\n onCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts: textsArg,\n promptInputKey,\n qaMap,\n onValueChange,\n } = args;\n\n const texts = textsArg ?? {};\n\n const {\n autoFocusOnNewChat: _autoFocusOnNewChat,\n autoFocusOnChatSelect: _autoFocusOnChatSelect,\n ...restBodyProps\n } = promptInputProps?.bodyProps ?? {};\n\n const suggestionsProps = mergePromptInputSuggestionsProps(\n promptInputProps?.suggestionsProps,\n texts.promptSuggestTitle,\n );\n\n return {\n ...promptInputProps,\n onValueChange:\n onValueChange || promptInputProps?.onValueChange\n ? (value: string) => {\n onValueChange?.(value);\n promptInputProps?.onValueChange?.(value);\n }\n : undefined,\n qa: resolveChatContainerQa(qaMap, 'promptInput', 'prompt-input') ?? promptInputProps?.qa,\n onSend: onSendMessage,\n onCancel,\n status,\n suggestionsProps,\n headerProps: buildFinalPromptInputHeaderProps({\n headerProps: promptInputProps?.headerProps,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputHeader', 'prompt-input-header') ??\n promptInputProps?.headerProps?.qa,\n }),\n bodyProps: {\n ...restBodyProps,\n placeholder:\n texts.promptPlaceholder || restBodyProps?.placeholder || i18n('prompt-placeholder'),\n // The remount that clears the draft on a new or a freshly picked chat also puts the\n // cursor in the field. On a touch device that raises the keyboard over half the\n // screen, so a consumer that asked for no auto focus is taken at its word and keeps\n // the clearing without the cursor.\n autoFocus: restBodyProps?.autoFocus ?? promptInputKey > 0,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputBody', 'prompt-input-body') ??\n restBodyProps?.qa,\n },\n footerProps: {\n ...promptInputProps?.footerProps,\n submitButtonTooltipSend:\n texts?.submitSendTooltip ?? promptInputProps?.footerProps?.submitButtonTooltipSend,\n submitButtonTooltipCancel:\n texts?.submitCancelTooltip ??\n promptInputProps?.footerProps?.submitButtonTooltipCancel,\n submitButtonCancelableText:\n texts?.submitButtonCancelableText ??\n promptInputProps?.footerProps?.submitButtonCancelableText,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputFooter', 'prompt-input-footer') ??\n promptInputProps?.footerProps?.qa,\n submitButtonQa:\n resolveChatContainerQa(qaMap, 'submitButton', 'submit-button') ??\n promptInputProps?.footerProps?.submitButtonQa,\n },\n };\n}\n\n/**\n * ChatContainer - fully assembled chat component, the main exportable component of the library.\n * Integrates Header, ChatContent, History and manages their state.\n *\n * @param props - component props\n * @returns React component\n */\nexport function ChatContainer(props: ChatContainerProps) {\n const {\n chats = [],\n messages = [],\n onSendMessage,\n onDeleteChat,\n onCancel,\n onRetry,\n status = 'ready',\n error = null,\n showActionsOnHover = false,\n contextItems = [],\n showContextIndicator,\n contextIndicatorProps,\n transformOptions,\n shouldParseIncompleteMarkdown,\n mermaidOptions,\n openMarkdownLinksInNewTab,\n mdxProps,\n messageListConfig,\n showMascot = false,\n mascotConfig: customMascotConfig,\n headerProps = {},\n contentProps = {},\n emptyContainerProps = {},\n promptInputProps = {},\n disclaimerProps = {},\n historyProps = {},\n welcomeConfig,\n texts = {},\n hideTitleOnEmptyChat = false,\n isMobile: isMobileProp,\n adjustToKeyboard = true,\n floatingHeader = false,\n className,\n headerClassName,\n contentClassName,\n footerClassName,\n qa,\n } = props;\n\n const isMobileContext = useMobile();\n const isMobile = isMobileProp ?? isMobileContext;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLDivElement>(null);\n const footerRef = useRef<HTMLDivElement>(null);\n const viewportProbeRef = useRef<HTMLDivElement>(null);\n const isKeyboardTracked = isMobile && adjustToKeyboard;\n // Keeps the footer (prompt input + disclaimer) above the on-screen keyboard on iOS Safari,\n // where the layout viewport stays full-height while the keyboard is open.\n const {isKeyboardOpen, maxHeight} = useKeyboardViewportFit(rootRef, isKeyboardTracked, {\n viewportProbeRef,\n });\n // Measured at all times, not only while the keyboard is open: otherwise the field grows by\n // its own row counter while the keyboard is away, and by the next time it comes back the\n // field is already taller than the space left, with the cap long gone.\n const {promptInputMaxHeight, isHeroFitting} = useKeyboardLayoutFit(\n rootRef,\n headerRef,\n footerRef,\n isKeyboardTracked,\n );\n\n const hookState = useChatContainer(props);\n\n const mascotConfig = customMascotConfig ?? (showMascot ? DEFAULT_MASCOT_CONFIG : undefined);\n const mascotState = useChatContainerMascot({\n config: mascotConfig,\n view: hookState.chatContentView === 'empty' ? 'hero' : 'chat',\n status,\n messagesCount: messages.length,\n activeChatId: hookState.activeChat?.id,\n promptInputKey: hookState.promptInputKey,\n });\n\n const wrappedOnSendMessage = useCallback(\n async (...args: Parameters<typeof onSendMessage>) => {\n mascotState.notifyActivity();\n return onSendMessage(...args);\n },\n [mascotState.notifyActivity, onSendMessage],\n );\n const wrappedOnCancel = useMemo(() => {\n if (!onCancel) {\n return undefined;\n }\n return async () => {\n await onCancel();\n mascotState.handleCancelResolved();\n };\n }, [mascotState.handleCancelResolved, onCancel]);\n const wrappedOnRetry = useMemo(() => {\n if (!onRetry) {\n return undefined;\n }\n return () => {\n mascotState.notifyActivity();\n onRetry();\n };\n }, [mascotState.notifyActivity, onRetry]);\n\n const resolvedMascotAssets = useMemo(\n () => resolveMascotAssets(mascotConfig?.defaultAssets, mascotConfig?.assets),\n [mascotConfig?.assets, mascotConfig?.defaultAssets],\n );\n const resolvedMascots = useMemo(\n () =>\n resolveMascotCollection(\n resolveMascotCollection(\n showMascot ? defaultGravityMascots : undefined,\n mascotConfig?.defaultMascots,\n ),\n mascotConfig?.mascots,\n ),\n [showMascot, mascotConfig?.defaultMascots, mascotConfig?.mascots],\n );\n const mascotView = hookState.chatContentView === 'empty' ? 'hero' : 'chat';\n const mascotNode = useMemo(() => {\n if (!mascotConfig) {\n return undefined;\n }\n if (mascotView === 'hero' && mascotConfig.showOnWelcome === false) {\n return undefined;\n }\n if (mascotView === 'chat' && mascotConfig.showInChat === false) {\n return undefined;\n }\n const node = mascotConfig.renderMascot\n ? mascotConfig.renderMascot({\n view: mascotView,\n state: mascotState.state,\n animationType: getMascotAnimationType(mascotState.state),\n assets: resolvedMascotAssets,\n })\n : getMascotNode(resolvedMascots, mascotView, mascotState.state);\n if (node === undefined || node === null) {\n return undefined;\n }\n return <div className={b('mascot', {view: mascotView})}>{node}</div>;\n }, [mascotConfig, mascotState.state, mascotView, resolvedMascotAssets, resolvedMascots]);\n\n const qaMap = useMemo(() => normalizeChatContainerQa(qa), [qa]);\n\n // Collect i18n texts with overrides\n const headerTitle = useMemo(\n () =>\n texts.headerTitle ||\n headerProps.title ||\n hookState.activeChat?.name ||\n i18n('header-default-title'),\n [texts.headerTitle, headerProps.title, hookState.activeChat?.name],\n );\n\n // Determine if chat is empty\n const isChatEmpty = hookState.chatContentView === 'empty';\n\n // Calculate showTitle based on hideTitleOnEmptyChat option\n const showTitle = useMemo(() => {\n // If explicit showTitle is provided in headerProps, use it\n if (headerProps.showTitle !== undefined) {\n return headerProps.showTitle;\n }\n // If hideTitleOnEmptyChat is enabled, show title only when chat has messages\n if (hideTitleOnEmptyChat && isChatEmpty) {\n return false;\n }\n return true;\n }, [hideTitleOnEmptyChat, isChatEmpty, headerProps.showTitle]);\n\n // Build props for Header\n const finalHeaderProps = useMemo(() => {\n const actionQa: Partial<Record<HeaderAction, string>> = {\n ...headerProps.actionQa,\n };\n const setHeaderActionQa = (\n action: HeaderAction,\n key: 'headerNewChat' | 'headerHistory' | 'headerFolding' | 'headerClose',\n suffix: string,\n ) => {\n const resolved = resolveChatContainerQa(qaMap, key, suffix);\n if (resolved !== undefined) {\n actionQa[action] = resolved;\n }\n };\n setHeaderActionQa(HeaderAction.NewChat, 'headerNewChat', 'header-action-newChat');\n setHeaderActionQa(HeaderAction.History, 'headerHistory', 'header-action-history');\n setHeaderActionQa(HeaderAction.Folding, 'headerFolding', 'header-action-folding');\n setHeaderActionQa(HeaderAction.Close, 'headerClose', 'header-action-close');\n\n const actionTooltipTexts: NonNullable<HeaderProps['actionTooltipTexts']> = {\n [HeaderAction.NewChat]:\n texts.headerNewChatTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.NewChat],\n [HeaderAction.History]:\n texts.headerHistoryTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.History],\n [HeaderAction.Close]:\n texts.headerCloseTooltip ?? headerProps.actionTooltipTexts?.[HeaderAction.Close],\n [HeaderAction.Folding]: {\n collapsed:\n texts.headerFoldingCollapsedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.collapsed,\n opened:\n texts.headerFoldingOpenedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.opened,\n },\n };\n\n return {\n ...headerProps,\n title: headerTitle,\n showTitle,\n baseActions: hookState.baseActions,\n handleNewChat: hookState.handleNewChat,\n handleHistoryToggle: hookState.handleHistoryToggle,\n handleFolding: hookState.handleFolding,\n handleClose: hookState.handleClose,\n historyButtonRef: hookState.historyButtonRef,\n qa: resolveChatContainerQa(qaMap, 'header', 'header') ?? headerProps.qa,\n actionQa,\n actionTooltipTexts,\n menuButtonQa:\n resolveChatContainerQa(qaMap, 'headerMenuButton', 'header-menu-button') ??\n headerProps.menuButtonQa,\n menuButtonTooltip: texts.headerMenuTooltip ?? headerProps.menuButtonTooltip,\n menuItemQa: resolveHeaderMenuItemQa(\n qaMap,\n headerProps.menuItems,\n headerProps.menuItemQa,\n ),\n };\n }, [\n headerTitle,\n showTitle,\n hookState.baseActions,\n hookState.handleNewChat,\n hookState.handleHistoryToggle,\n hookState.handleFolding,\n hookState.handleClose,\n hookState.historyButtonRef,\n headerProps,\n qaMap,\n texts.headerNewChatTooltip,\n texts.headerHistoryTooltip,\n texts.headerCloseTooltip,\n texts.headerFoldingCollapsedTooltip,\n texts.headerFoldingOpenedTooltip,\n texts.headerMenuTooltip,\n ]);\n\n // Build props for EmptyContainer\n const finalEmptyContainerProps = useMemo(() => {\n const {showDefaultTitle = true, showDefaultDescription = true} = welcomeConfig || {};\n\n return {\n ...emptyContainerProps,\n qa:\n resolveChatContainerQa(qaMap, 'emptyState', 'empty-state') ??\n emptyContainerProps.qa,\n image: welcomeConfig?.image,\n title:\n texts.emptyStateTitle ??\n welcomeConfig?.title ??\n emptyContainerProps.title ??\n (showDefaultTitle ? i18n('empty-state-title') : undefined),\n description:\n texts.emptyStateDescription ??\n welcomeConfig?.description ??\n emptyContainerProps.description ??\n (showDefaultDescription ? i18n('empty-state-description') : undefined),\n suggestionTitle:\n texts.emptyStateSuggestionsTitle ??\n welcomeConfig?.suggestionTitle ??\n emptyContainerProps.suggestionTitle,\n suggestions: welcomeConfig?.suggestions,\n alignment: {\n ...emptyContainerProps.alignment,\n ...welcomeConfig?.alignment,\n ...(mascotView === 'hero' &&\n mascotNode &&\n emptyContainerProps.alignment?.hero === undefined &&\n welcomeConfig?.alignment?.hero === undefined\n ? {hero: 'center' as const}\n : {}),\n },\n heroContent:\n emptyContainerProps.heroContent ?? (mascotView === 'hero' ? mascotNode : undefined),\n layout: welcomeConfig?.layout ?? emptyContainerProps.layout,\n wrapText: welcomeConfig?.wrapText ?? emptyContainerProps.wrapText,\n showMore: welcomeConfig?.showMore,\n showMoreText:\n texts.emptyStateShowMoreText ??\n welcomeConfig?.showMoreText ??\n emptyContainerProps.showMoreText ??\n i18n('empty-state-show-more'),\n onSuggestionClick: async (\n content: string,\n suggestionId?: string,\n suggestionData?: Record<string, unknown>,\n ) => {\n const suggestion = toSuggestionContext(suggestionId, suggestionData);\n\n await wrappedOnSendMessage({\n content,\n ...(suggestion && {suggestion}),\n });\n },\n };\n }, [\n welcomeConfig,\n emptyContainerProps,\n wrappedOnSendMessage,\n qaMap,\n texts.emptyStateTitle,\n texts.emptyStateDescription,\n texts.emptyStateSuggestionsTitle,\n texts.emptyStateShowMoreText,\n mascotNode,\n mascotView,\n ]);\n\n // Build props for MessageList\n const messageListProps = useMemo(\n () => ({\n ...messageListConfig,\n messages,\n status,\n errorMessage: texts.errorText\n ? {...(messageListConfig?.errorMessage ?? {}), text: texts.errorText}\n : messageListConfig?.errorMessage || (error ? {text: error.message} : undefined),\n onRetry: wrappedOnRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n mermaidOptions,\n openMarkdownLinksInNewTab,\n mdxProps,\n qa:\n resolveChatContainerQa(qaMap, 'messageList', 'message-list') ??\n messageListConfig?.qa,\n actionPopupProps: {\n ...messageListConfig?.actionPopupProps,\n qa:\n resolveChatContainerQa(qaMap, 'actionPopup', 'action-popup') ??\n messageListConfig?.actionPopupProps?.qa,\n },\n footerContent:\n mascotView === 'chat' && mascotNode !== undefined && mascotNode !== null ? (\n <Fragment>\n {messageListConfig?.footerContent}\n {mascotNode}\n </Fragment>\n ) : (\n messageListConfig?.footerContent\n ),\n }),\n [\n messages,\n status,\n error,\n wrappedOnRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n mermaidOptions,\n openMarkdownLinksInNewTab,\n mdxProps,\n messageListConfig,\n qaMap,\n texts.errorText,\n mascotNode,\n mascotView,\n ],\n );\n\n // Build props for PromptInput\n const finalPromptInputProps = useMemo(\n () =>\n buildFinalPromptInputProps({\n promptInputProps,\n onSendMessage: wrappedOnSendMessage,\n onCancel: wrappedOnCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts,\n promptInputKey: hookState.promptInputKey,\n qaMap,\n onValueChange: mascotConfig ? mascotState.handleValueChange : undefined,\n }),\n [\n wrappedOnSendMessage,\n wrappedOnCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n promptInputProps,\n hookState.promptInputKey,\n qaMap,\n texts.promptPlaceholder,\n texts.promptSuggestTitle,\n texts.submitSendTooltip,\n texts.submitCancelTooltip,\n texts.submitButtonCancelableText,\n mascotState.handleValueChange,\n mascotConfig,\n ],\n );\n\n // Build props for Disclaimer\n const finalDisclaimerProps = useMemo(() => {\n const disclaimerText =\n texts.disclaimerText ?? disclaimerProps.text ?? i18n('disclaimer-text');\n\n return {\n ...disclaimerProps,\n text: disclaimerText,\n qa: resolveChatContainerQa(qaMap, 'disclaimer', 'disclaimer') ?? disclaimerProps.qa,\n };\n }, [disclaimerProps, qaMap, texts.disclaimerText]);\n\n // Build props for ChatContent\n const finalContentProps = useMemo(\n () => ({\n ...contentProps,\n qa: resolveChatContainerQa(qaMap, 'content', 'content') ?? contentProps.qa,\n view: hookState.chatContentView as 'empty' | 'chat',\n emptyContainerProps: finalEmptyContainerProps,\n messageListProps,\n }),\n [\n hookState.chatContentView,\n finalEmptyContainerProps,\n messageListProps,\n contentProps,\n qaMap,\n ],\n );\n\n // Build props for History\n const finalHistoryProps = useMemo(\n () => ({\n ...historyProps,\n qa: resolveChatContainerQa(qaMap, 'history', 'history') ?? historyProps.qa,\n chats,\n selectedChat: hookState.activeChat,\n onSelectChat: hookState.handleSelectChat,\n onDeleteChat,\n open: hookState.isHistoryOpen,\n onOpenChange: (open: boolean) => {\n historyProps.onOpenChange?.(open);\n hookState.handleHistoryOpenChange(open);\n },\n anchorElement: hookState.historyButtonRef.current,\n emptyPlaceholder:\n texts.historyEmptyPlaceholder ??\n historyProps.emptyPlaceholder ??\n i18n('history-empty'),\n emptyFilteredPlaceholder:\n texts.historyEmptyFilteredPlaceholder ??\n historyProps.emptyFilteredPlaceholder ??\n i18n('history-empty-filtered'),\n searchPlaceholder: texts.historySearchPlaceholder ?? historyProps.searchPlaceholder,\n }),\n [\n chats,\n hookState.activeChat,\n hookState.handleSelectChat,\n onDeleteChat,\n hookState.isHistoryOpen,\n hookState.handleHistoryOpenChange,\n hookState.historyButtonRef,\n historyProps,\n qaMap,\n texts.historyEmptyPlaceholder,\n texts.historyEmptyFilteredPlaceholder,\n texts.historySearchPlaceholder,\n ],\n );\n\n const showFooter = finalPromptInputProps || finalDisclaimerProps;\n\n const rootStyle = useMemo<CSSProperties | undefined>(() => {\n if (maxHeight === undefined && promptInputMaxHeight === undefined && isHeroFitting) {\n return undefined;\n }\n\n return {\n ...(maxHeight === undefined ? undefined : {maxHeight}),\n ...(promptInputMaxHeight === undefined\n ? undefined\n : {\n '--g-aikit-prompt-input-body-textarea-max-height': `${promptInputMaxHeight}px`,\n }),\n ...(isHeroFitting\n ? undefined\n : {'--g-aikit-empty-container-hero-visibility': 'hidden'}),\n } as CSSProperties;\n }, [maxHeight, promptInputMaxHeight, isHeroFitting]);\n\n return (\n <MobileProvider mobile={isMobile}>\n <div\n ref={rootRef}\n className={b(\n {\n mobile: isMobile,\n 'keyboard-open': isKeyboardOpen,\n 'floating-header': floatingHeader,\n },\n className,\n )}\n style={rootStyle}\n data-qa={resolveChatContainerRootQa(qaMap)}\n >\n {isKeyboardTracked && (\n <div className={b('viewport-probe')} ref={viewportProbeRef} aria-hidden />\n )}\n <div className={b('header', headerClassName)} ref={headerRef}>\n <Header {...finalHeaderProps} />\n </div>\n <div className={b('content', {view: hookState.chatContentView}, contentClassName)}>\n <ChatContent {...finalContentProps} />\n </div>\n {showFooter && (\n <div\n className={b('footer', {view: hookState.chatContentView}, footerClassName)}\n ref={footerRef}\n >\n {finalPromptInputProps && (\n <PromptInput\n key={hookState.promptInputKey}\n {...finalPromptInputProps}\n />\n )}\n {finalDisclaimerProps && <Disclaimer {...finalDisclaimerProps} />}\n </div>\n )}\n {/* History is integrated via popup anchored to button in Header */}\n <History {...finalHistoryProps} />\n </div>\n </MobileProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ChatContainer.js","sourceRoot":"../../../../../src","sources":["components/pages/ChatContainer/ChatContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type CSSProperties, Fragment, type ReactNode, useCallback, useMemo, useRef} from 'react';\n\nimport {MobileProvider, useForkRef, useMobile} from '@gravity-ui/uikit';\n\nimport {getMascotAnimationType, useKeyboardViewportFit} from '../../../hooks';\nimport type {TSuggestionContext} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {getMascotNode, resolveMascotAssets, resolveMascotCollection} from '../../../utils/mascot';\nimport {Disclaimer} from '../../atoms/Disclaimer';\nimport {Header, HeaderAction, type HeaderProps} from '../../organisms/Header';\nimport {\n PromptInput,\n type PromptInputHandle,\n type PromptInputProps,\n} from '../../organisms/PromptInput';\nimport {ChatContent} from '../../templates/ChatContent';\nimport {History} from '../../templates/History';\n\nimport {defaultGravityMascots} from './GravityMascot';\nimport {\n normalizeChatContainerQa,\n resolveChatContainerQa,\n resolveChatContainerRootQa,\n resolveHeaderMenuItemQa,\n} from './chatContainerQa';\nimport {i18n} from './i18n';\nimport type {ChatContainerProps, ChatContainerTexts, MascotConfig} from './types';\nimport {useChatContainer} from './useChatContainer';\nimport {useChatContainerMascot} from './useChatContainerMascot';\nimport {useKeyboardLayoutFit} from './useKeyboardLayoutFit';\n\nimport './ChatContainer.scss';\n\nconst b = block('chat-container');\nconst DEFAULT_MASCOT_CONFIG: MascotConfig = {};\n\ntype NormalizedChatContainerQa = ReturnType<typeof normalizeChatContainerQa>;\n\nfunction toSuggestionContext(\n id?: string,\n data?: Record<string, unknown>,\n): TSuggestionContext | undefined {\n if (!id && !data) {\n return undefined;\n }\n\n return {\n ...(id && {id}),\n ...(data && {data}),\n };\n}\n\nfunction mergePromptInputSuggestionsProps(\n fromProps: PromptInputProps['suggestionsProps'] | undefined,\n textsSuggestTitle: ReactNode | undefined,\n): PromptInputProps['suggestionsProps'] | undefined {\n const hasSuggestionsFromProps = Boolean(fromProps);\n const hasSuggestTitleFromTexts = textsSuggestTitle !== undefined;\n if (!hasSuggestionsFromProps && !hasSuggestTitleFromTexts) {\n return undefined;\n }\n return {\n ...fromProps,\n suggestTitle: textsSuggestTitle ?? fromProps?.suggestTitle,\n };\n}\n\nfunction buildFinalPromptInputHeaderProps(args: {\n headerProps: NonNullable<ChatContainerProps['promptInputProps']>['headerProps'];\n contextItems: ChatContainerProps['contextItems'];\n showContextIndicator: ChatContainerProps['showContextIndicator'];\n contextIndicatorProps: ChatContainerProps['contextIndicatorProps'];\n qa: string | undefined;\n}): NonNullable<ChatContainerProps['promptInputProps']>['headerProps'] {\n const {headerProps, contextItems, showContextIndicator, contextIndicatorProps, qa} = args;\n\n // topContent replaces the default header entirely, so context-related\n // props are not allowed (and would be ignored) alongside it\n if (headerProps?.topContent) {\n return {topContent: headerProps.topContent, qa};\n }\n\n return {\n contextItems,\n showContextIndicator: showContextIndicator ?? headerProps?.showContextIndicator,\n contextIndicatorProps: contextIndicatorProps ?? headerProps?.contextIndicatorProps,\n qa,\n };\n}\n\nfunction buildFinalPromptInputProps(args: {\n promptInputProps: ChatContainerProps['promptInputProps'];\n onSendMessage: ChatContainerProps['onSendMessage'];\n onCancel: ChatContainerProps['onCancel'];\n status: ChatContainerProps['status'];\n contextItems: ChatContainerProps['contextItems'];\n showContextIndicator: ChatContainerProps['showContextIndicator'];\n contextIndicatorProps: ChatContainerProps['contextIndicatorProps'];\n texts: ChatContainerTexts;\n promptInputKey: number;\n commandsResetKey: string | number;\n qaMap: NormalizedChatContainerQa;\n onValueChange?: (value: string) => void;\n}) {\n const {\n promptInputProps,\n onSendMessage,\n onCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts: textsArg,\n promptInputKey,\n commandsResetKey,\n qaMap,\n onValueChange,\n } = args;\n\n const texts = textsArg ?? {};\n\n const {\n autoFocusOnNewChat: _autoFocusOnNewChat,\n autoFocusOnChatSelect: _autoFocusOnChatSelect,\n ...restBodyProps\n } = promptInputProps?.bodyProps ?? {};\n\n const suggestionsProps = mergePromptInputSuggestionsProps(\n promptInputProps?.suggestionsProps,\n texts.promptSuggestTitle,\n );\n\n return {\n ...promptInputProps,\n commandsResetKey,\n onValueChange:\n onValueChange || promptInputProps?.onValueChange\n ? (value: string) => {\n onValueChange?.(value);\n promptInputProps?.onValueChange?.(value);\n }\n : undefined,\n qa: resolveChatContainerQa(qaMap, 'promptInput', 'prompt-input') ?? promptInputProps?.qa,\n onSend: onSendMessage,\n onCancel,\n status,\n suggestionsProps,\n headerProps: buildFinalPromptInputHeaderProps({\n headerProps: promptInputProps?.headerProps,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputHeader', 'prompt-input-header') ??\n promptInputProps?.headerProps?.qa,\n }),\n bodyProps: {\n ...restBodyProps,\n placeholder:\n texts.promptPlaceholder || restBodyProps?.placeholder || i18n('prompt-placeholder'),\n // The remount that clears the draft on a new or a freshly picked chat also puts the\n // cursor in the field. On a touch device that raises the keyboard over half the\n // screen, so a consumer that asked for no auto focus is taken at its word and keeps\n // the clearing without the cursor.\n autoFocus: restBodyProps?.autoFocus ?? promptInputKey > 0,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputBody', 'prompt-input-body') ??\n restBodyProps?.qa,\n },\n footerProps: {\n ...promptInputProps?.footerProps,\n submitButtonTooltipSend:\n texts?.submitSendTooltip ?? promptInputProps?.footerProps?.submitButtonTooltipSend,\n submitButtonTooltipCancel:\n texts?.submitCancelTooltip ??\n promptInputProps?.footerProps?.submitButtonTooltipCancel,\n submitButtonCancelableText:\n texts?.submitButtonCancelableText ??\n promptInputProps?.footerProps?.submitButtonCancelableText,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputFooter', 'prompt-input-footer') ??\n promptInputProps?.footerProps?.qa,\n submitButtonQa:\n resolveChatContainerQa(qaMap, 'submitButton', 'submit-button') ??\n promptInputProps?.footerProps?.submitButtonQa,\n },\n };\n}\n\n/**\n * ChatContainer - fully assembled chat component, the main exportable component of the library.\n * Integrates Header, ChatContent, History and manages their state.\n *\n * @param props - component props\n * @returns React component\n */\nexport function ChatContainer(props: ChatContainerProps) {\n const {\n chats = [],\n messages = [],\n onSendMessage,\n onDeleteChat,\n onCancel,\n onRetry,\n status = 'ready',\n error = null,\n showActionsOnHover = false,\n contextItems = [],\n showContextIndicator,\n contextIndicatorProps,\n transformOptions,\n shouldParseIncompleteMarkdown,\n mermaidOptions,\n openMarkdownLinksInNewTab,\n mdxProps,\n messageListConfig,\n showMascot = false,\n mascotConfig: customMascotConfig,\n headerProps = {},\n contentProps = {},\n emptyContainerProps = {},\n promptInputProps = {},\n disclaimerProps = {},\n historyProps = {},\n welcomeConfig,\n texts = {},\n hideTitleOnEmptyChat = false,\n isMobile: isMobileProp,\n adjustToKeyboard = true,\n floatingHeader = false,\n className,\n headerClassName,\n contentClassName,\n footerClassName,\n qa,\n } = props;\n\n const isMobileContext = useMobile();\n const isMobile = isMobileProp ?? isMobileContext;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLDivElement>(null);\n const footerRef = useRef<HTMLDivElement>(null);\n const viewportProbeRef = useRef<HTMLDivElement>(null);\n const isKeyboardTracked = isMobile && adjustToKeyboard;\n // Keeps the footer (prompt input + disclaimer) above the on-screen keyboard on iOS Safari,\n // where the layout viewport stays full-height while the keyboard is open.\n const {isKeyboardOpen, maxHeight} = useKeyboardViewportFit(rootRef, isKeyboardTracked, {\n viewportProbeRef,\n });\n // Measured at all times, not only while the keyboard is open: otherwise the field grows by\n // its own row counter while the keyboard is away, and by the next time it comes back the\n // field is already taller than the space left, with the cap long gone.\n const {promptInputMaxHeight, isHeroFitting} = useKeyboardLayoutFit(\n rootRef,\n headerRef,\n footerRef,\n isKeyboardTracked,\n );\n\n const hookState = useChatContainer(props);\n\n const mascotConfig = customMascotConfig ?? (showMascot ? DEFAULT_MASCOT_CONFIG : undefined);\n const mascotState = useChatContainerMascot({\n config: mascotConfig,\n view: hookState.chatContentView === 'empty' ? 'hero' : 'chat',\n status,\n messagesCount: messages.length,\n activeChatId: hookState.activeChat?.id,\n promptInputKey: hookState.promptInputKey,\n });\n\n const promptApiRef = useRef<PromptInputHandle>(null);\n const mergedPromptApiRef = useForkRef(promptApiRef, promptInputProps?.apiRef);\n\n const wrappedOnSendMessage = useCallback(\n async (...args: Parameters<typeof onSendMessage>) => {\n mascotState.notifyActivity();\n return onSendMessage(...args);\n },\n [mascotState.notifyActivity, onSendMessage],\n );\n const wrappedOnCancel = useMemo(() => {\n if (!onCancel) {\n return undefined;\n }\n return async () => {\n await onCancel();\n mascotState.handleCancelResolved();\n };\n }, [mascotState.handleCancelResolved, onCancel]);\n const wrappedOnRetry = useMemo(() => {\n if (!onRetry) {\n return undefined;\n }\n return () => {\n mascotState.notifyActivity();\n onRetry();\n };\n }, [mascotState.notifyActivity, onRetry]);\n\n const resolvedMascotAssets = useMemo(\n () => resolveMascotAssets(mascotConfig?.defaultAssets, mascotConfig?.assets),\n [mascotConfig?.assets, mascotConfig?.defaultAssets],\n );\n const resolvedMascots = useMemo(\n () =>\n resolveMascotCollection(\n resolveMascotCollection(\n showMascot ? defaultGravityMascots : undefined,\n mascotConfig?.defaultMascots,\n ),\n mascotConfig?.mascots,\n ),\n [showMascot, mascotConfig?.defaultMascots, mascotConfig?.mascots],\n );\n const mascotView = hookState.chatContentView === 'empty' ? 'hero' : 'chat';\n const mascotNode = useMemo(() => {\n if (!mascotConfig) {\n return undefined;\n }\n if (mascotView === 'hero' && mascotConfig.showOnWelcome === false) {\n return undefined;\n }\n if (mascotView === 'chat' && mascotConfig.showInChat === false) {\n return undefined;\n }\n const node = mascotConfig.renderMascot\n ? mascotConfig.renderMascot({\n view: mascotView,\n state: mascotState.state,\n animationType: getMascotAnimationType(mascotState.state),\n assets: resolvedMascotAssets,\n })\n : getMascotNode(resolvedMascots, mascotView, mascotState.state);\n if (node === undefined || node === null) {\n return undefined;\n }\n return <div className={b('mascot', {view: mascotView})}>{node}</div>;\n }, [mascotConfig, mascotState.state, mascotView, resolvedMascotAssets, resolvedMascots]);\n\n const qaMap = useMemo(() => normalizeChatContainerQa(qa), [qa]);\n\n // Collect i18n texts with overrides\n const headerTitle = useMemo(\n () =>\n texts.headerTitle ||\n headerProps.title ||\n hookState.activeChat?.name ||\n i18n('header-default-title'),\n [texts.headerTitle, headerProps.title, hookState.activeChat?.name],\n );\n\n // Determine if chat is empty\n const isChatEmpty = hookState.chatContentView === 'empty';\n\n // Calculate showTitle based on hideTitleOnEmptyChat option\n const showTitle = useMemo(() => {\n // If explicit showTitle is provided in headerProps, use it\n if (headerProps.showTitle !== undefined) {\n return headerProps.showTitle;\n }\n // If hideTitleOnEmptyChat is enabled, show title only when chat has messages\n if (hideTitleOnEmptyChat && isChatEmpty) {\n return false;\n }\n return true;\n }, [hideTitleOnEmptyChat, isChatEmpty, headerProps.showTitle]);\n\n // Build props for Header\n const finalHeaderProps = useMemo(() => {\n const actionQa: Partial<Record<HeaderAction, string>> = {\n ...headerProps.actionQa,\n };\n const setHeaderActionQa = (\n action: HeaderAction,\n key: 'headerNewChat' | 'headerHistory' | 'headerFolding' | 'headerClose',\n suffix: string,\n ) => {\n const resolved = resolveChatContainerQa(qaMap, key, suffix);\n if (resolved !== undefined) {\n actionQa[action] = resolved;\n }\n };\n setHeaderActionQa(HeaderAction.NewChat, 'headerNewChat', 'header-action-newChat');\n setHeaderActionQa(HeaderAction.History, 'headerHistory', 'header-action-history');\n setHeaderActionQa(HeaderAction.Folding, 'headerFolding', 'header-action-folding');\n setHeaderActionQa(HeaderAction.Close, 'headerClose', 'header-action-close');\n\n const actionTooltipTexts: NonNullable<HeaderProps['actionTooltipTexts']> = {\n [HeaderAction.NewChat]:\n texts.headerNewChatTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.NewChat],\n [HeaderAction.History]:\n texts.headerHistoryTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.History],\n [HeaderAction.Close]:\n texts.headerCloseTooltip ?? headerProps.actionTooltipTexts?.[HeaderAction.Close],\n [HeaderAction.Folding]: {\n collapsed:\n texts.headerFoldingCollapsedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.collapsed,\n opened:\n texts.headerFoldingOpenedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.opened,\n },\n };\n\n return {\n ...headerProps,\n title: headerTitle,\n showTitle,\n baseActions: hookState.baseActions,\n handleNewChat: hookState.handleNewChat,\n handleHistoryToggle: hookState.handleHistoryToggle,\n handleFolding: hookState.handleFolding,\n handleClose: hookState.handleClose,\n historyButtonRef: hookState.historyButtonRef,\n qa: resolveChatContainerQa(qaMap, 'header', 'header') ?? headerProps.qa,\n actionQa,\n actionTooltipTexts,\n menuButtonQa:\n resolveChatContainerQa(qaMap, 'headerMenuButton', 'header-menu-button') ??\n headerProps.menuButtonQa,\n menuButtonTooltip: texts.headerMenuTooltip ?? headerProps.menuButtonTooltip,\n menuItemQa: resolveHeaderMenuItemQa(\n qaMap,\n headerProps.menuItems,\n headerProps.menuItemQa,\n ),\n };\n }, [\n headerTitle,\n showTitle,\n hookState.baseActions,\n hookState.handleNewChat,\n hookState.handleHistoryToggle,\n hookState.handleFolding,\n hookState.handleClose,\n hookState.historyButtonRef,\n headerProps,\n qaMap,\n texts.headerNewChatTooltip,\n texts.headerHistoryTooltip,\n texts.headerCloseTooltip,\n texts.headerFoldingCollapsedTooltip,\n texts.headerFoldingOpenedTooltip,\n texts.headerMenuTooltip,\n ]);\n\n // Build props for EmptyContainer\n const finalEmptyContainerProps = useMemo(() => {\n const {showDefaultTitle = true, showDefaultDescription = true} = welcomeConfig || {};\n\n return {\n ...emptyContainerProps,\n qa:\n resolveChatContainerQa(qaMap, 'emptyState', 'empty-state') ??\n emptyContainerProps.qa,\n image: welcomeConfig?.image,\n title:\n texts.emptyStateTitle ??\n welcomeConfig?.title ??\n emptyContainerProps.title ??\n (showDefaultTitle ? i18n('empty-state-title') : undefined),\n description:\n texts.emptyStateDescription ??\n welcomeConfig?.description ??\n emptyContainerProps.description ??\n (showDefaultDescription ? i18n('empty-state-description') : undefined),\n suggestionTitle:\n texts.emptyStateSuggestionsTitle ??\n welcomeConfig?.suggestionTitle ??\n emptyContainerProps.suggestionTitle,\n suggestions: welcomeConfig?.suggestions,\n alignment: {\n ...emptyContainerProps.alignment,\n ...welcomeConfig?.alignment,\n ...(mascotView === 'hero' &&\n mascotNode &&\n emptyContainerProps.alignment?.hero === undefined &&\n welcomeConfig?.alignment?.hero === undefined\n ? {hero: 'center' as const}\n : {}),\n },\n heroContent:\n emptyContainerProps.heroContent ?? (mascotView === 'hero' ? mascotNode : undefined),\n layout: welcomeConfig?.layout ?? emptyContainerProps.layout,\n wrapText: welcomeConfig?.wrapText ?? emptyContainerProps.wrapText,\n showMore: welcomeConfig?.showMore,\n showMoreText:\n texts.emptyStateShowMoreText ??\n welcomeConfig?.showMoreText ??\n emptyContainerProps.showMoreText ??\n i18n('empty-state-show-more'),\n onSuggestionClick: async (\n content: string,\n suggestionId?: string,\n suggestionData?: Record<string, unknown>,\n ) => {\n const suggestion = toSuggestionContext(suggestionId, suggestionData);\n\n await promptApiRef.current?.submit({\n content,\n ...(suggestion && {suggestion}),\n });\n },\n };\n }, [\n welcomeConfig,\n emptyContainerProps,\n wrappedOnSendMessage,\n qaMap,\n texts.emptyStateTitle,\n texts.emptyStateDescription,\n texts.emptyStateSuggestionsTitle,\n texts.emptyStateShowMoreText,\n mascotNode,\n mascotView,\n ]);\n\n // Build props for MessageList\n const messageListProps = useMemo(\n () => ({\n ...messageListConfig,\n messages,\n status,\n errorMessage: texts.errorText\n ? {...(messageListConfig?.errorMessage ?? {}), text: texts.errorText}\n : messageListConfig?.errorMessage || (error ? {text: error.message} : undefined),\n onRetry: wrappedOnRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n mermaidOptions,\n openMarkdownLinksInNewTab,\n mdxProps,\n qa:\n resolveChatContainerQa(qaMap, 'messageList', 'message-list') ??\n messageListConfig?.qa,\n actionPopupProps: {\n ...messageListConfig?.actionPopupProps,\n qa:\n resolveChatContainerQa(qaMap, 'actionPopup', 'action-popup') ??\n messageListConfig?.actionPopupProps?.qa,\n },\n footerContent:\n mascotView === 'chat' && mascotNode !== undefined && mascotNode !== null ? (\n <Fragment>\n {messageListConfig?.footerContent}\n {mascotNode}\n </Fragment>\n ) : (\n messageListConfig?.footerContent\n ),\n }),\n [\n messages,\n status,\n error,\n wrappedOnRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n mermaidOptions,\n openMarkdownLinksInNewTab,\n mdxProps,\n messageListConfig,\n qaMap,\n texts.errorText,\n mascotNode,\n mascotView,\n ],\n );\n\n // Build props for PromptInput\n const finalPromptInputProps = useMemo(\n () =>\n buildFinalPromptInputProps({\n promptInputProps: {...promptInputProps, apiRef: mergedPromptApiRef},\n onSendMessage: wrappedOnSendMessage,\n onCancel: wrappedOnCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts,\n promptInputKey: hookState.promptInputKey,\n commandsResetKey: hookState.commandsResetKey,\n qaMap,\n onValueChange: mascotConfig ? mascotState.handleValueChange : undefined,\n }),\n [\n wrappedOnSendMessage,\n wrappedOnCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n promptInputProps,\n mergedPromptApiRef,\n hookState.promptInputKey,\n hookState.commandsResetKey,\n qaMap,\n texts.promptPlaceholder,\n texts.promptSuggestTitle,\n texts.submitSendTooltip,\n texts.submitCancelTooltip,\n texts.submitButtonCancelableText,\n mascotState.handleValueChange,\n mascotConfig,\n ],\n );\n\n // Build props for Disclaimer\n const finalDisclaimerProps = useMemo(() => {\n const disclaimerText =\n texts.disclaimerText ?? disclaimerProps.text ?? i18n('disclaimer-text');\n\n return {\n ...disclaimerProps,\n text: disclaimerText,\n qa: resolveChatContainerQa(qaMap, 'disclaimer', 'disclaimer') ?? disclaimerProps.qa,\n };\n }, [disclaimerProps, qaMap, texts.disclaimerText]);\n\n // Build props for ChatContent\n const finalContentProps = useMemo(\n () => ({\n ...contentProps,\n qa: resolveChatContainerQa(qaMap, 'content', 'content') ?? contentProps.qa,\n view: hookState.chatContentView as 'empty' | 'chat',\n emptyContainerProps: finalEmptyContainerProps,\n messageListProps,\n }),\n [\n hookState.chatContentView,\n finalEmptyContainerProps,\n messageListProps,\n contentProps,\n qaMap,\n ],\n );\n\n // Build props for History\n const finalHistoryProps = useMemo(\n () => ({\n ...historyProps,\n qa: resolveChatContainerQa(qaMap, 'history', 'history') ?? historyProps.qa,\n chats,\n selectedChat: hookState.activeChat,\n onSelectChat: hookState.handleSelectChat,\n onDeleteChat,\n open: hookState.isHistoryOpen,\n onOpenChange: (open: boolean) => {\n historyProps.onOpenChange?.(open);\n hookState.handleHistoryOpenChange(open);\n },\n anchorElement: hookState.historyButtonRef.current,\n emptyPlaceholder:\n texts.historyEmptyPlaceholder ??\n historyProps.emptyPlaceholder ??\n i18n('history-empty'),\n emptyFilteredPlaceholder:\n texts.historyEmptyFilteredPlaceholder ??\n historyProps.emptyFilteredPlaceholder ??\n i18n('history-empty-filtered'),\n searchPlaceholder: texts.historySearchPlaceholder ?? historyProps.searchPlaceholder,\n }),\n [\n chats,\n hookState.activeChat,\n hookState.handleSelectChat,\n onDeleteChat,\n hookState.isHistoryOpen,\n hookState.handleHistoryOpenChange,\n hookState.historyButtonRef,\n historyProps,\n qaMap,\n texts.historyEmptyPlaceholder,\n texts.historyEmptyFilteredPlaceholder,\n texts.historySearchPlaceholder,\n ],\n );\n\n const showFooter = finalPromptInputProps || finalDisclaimerProps;\n\n const rootStyle = useMemo<CSSProperties | undefined>(() => {\n if (maxHeight === undefined && promptInputMaxHeight === undefined && isHeroFitting) {\n return undefined;\n }\n\n return {\n ...(maxHeight === undefined ? undefined : {maxHeight}),\n ...(promptInputMaxHeight === undefined\n ? undefined\n : {\n '--g-aikit-prompt-input-body-textarea-max-height': `${promptInputMaxHeight}px`,\n }),\n ...(isHeroFitting\n ? undefined\n : {'--g-aikit-empty-container-hero-visibility': 'hidden'}),\n } as CSSProperties;\n }, [maxHeight, promptInputMaxHeight, isHeroFitting]);\n\n return (\n <MobileProvider mobile={isMobile}>\n <div\n ref={rootRef}\n className={b(\n {\n mobile: isMobile,\n 'keyboard-open': isKeyboardOpen,\n 'floating-header': floatingHeader,\n },\n className,\n )}\n style={rootStyle}\n data-qa={resolveChatContainerRootQa(qaMap)}\n >\n {isKeyboardTracked && (\n <div className={b('viewport-probe')} ref={viewportProbeRef} aria-hidden />\n )}\n <div className={b('header', headerClassName)} ref={headerRef}>\n <Header {...finalHeaderProps} />\n </div>\n <div className={b('content', {view: hookState.chatContentView}, contentClassName)}>\n <ChatContent {...finalContentProps} />\n </div>\n {showFooter && (\n <div\n className={b('footer', {view: hookState.chatContentView}, footerClassName)}\n ref={footerRef}\n >\n {finalPromptInputProps && (\n <PromptInput\n key={hookState.promptInputKey}\n {...finalPromptInputProps}\n />\n )}\n {finalDisclaimerProps && <Disclaimer {...finalDisclaimerProps} />}\n </div>\n )}\n {/* History is integrated via popup anchored to button in Header */}\n <History {...finalHistoryProps} />\n </div>\n </MobileProvider>\n );\n}\n"]}
|
|
@@ -166,7 +166,7 @@ export interface ChatContainerProps {
|
|
|
166
166
|
/** Array of messages in current chat */
|
|
167
167
|
messages?: TChatMessage[];
|
|
168
168
|
/** Callback when user sends a message */
|
|
169
|
-
onSendMessage: (data: TSubmitData) => Promise<void>;
|
|
169
|
+
onSendMessage: (data: TSubmitData) => Promise<void | false>;
|
|
170
170
|
/** Callback when user selects a chat from history */
|
|
171
171
|
onSelectChat?: (chat: ChatType) => void;
|
|
172
172
|
/** Callback when user creates a new chat */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["components/pages/ChatContainer/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport {MdxProps, MessageListProps} from 'src/components/organisms/MessageList';\n\nimport type {\n ChatStatus,\n ChatType,\n MascotAssets,\n MascotCollection,\n MascotRenderContext,\n MascotState,\n TChatMessage,\n TSubmitData,\n} from '../../../types';\nimport type {SuggestionsItem} from '../../../types/common';\nimport type {ContextIndicatorProps} from '../../atoms/ContextIndicator';\nimport type {DisclaimerProps} from '../../atoms/Disclaimer';\nimport type {MermaidOptions} from '../../atoms/MarkdownRenderer';\nimport type {ContextItemConfig} from '../../molecules/PromptInputHeader';\nimport type {HeaderProps} from '../../organisms/Header';\nimport type {PromptInputProps} from '../../organisms/PromptInput';\nimport type {ChatContentProps} from '../../templates/ChatContent';\nimport type {AlignmentConfig, EmptyContainerProps} from '../../templates/EmptyContainer';\nimport type {HistoryProps} from '../../templates/History';\n\n/**\n * Welcome screen configuration\n */\nexport interface WelcomeConfig {\n /** Image or icon to display */\n image?: React.ReactNode;\n /** Title text or custom React element */\n title?: React.ReactNode;\n /** Description text or custom React element */\n description?: React.ReactNode;\n /** Suggestions section title - can be string or custom React element */\n suggestionTitle?: React.ReactNode;\n /** Array of suggestions (title will be used as message content) */\n suggestions?: SuggestionsItem[];\n /** Alignment configuration for image, title, and description */\n alignment?: AlignmentConfig;\n /** Layout orientation for suggestions: 'grid' for horizontal, 'list' for vertical */\n layout?: 'grid' | 'list';\n /** Enable text wrapping inside suggestion buttons instead of ellipsis */\n wrapText?: boolean;\n /** Show default title when neither title nor `texts.emptyStateTitle` / `emptyContainerProps.title` are provided */\n showDefaultTitle?: boolean;\n /** Show default description when neither description nor `texts.emptyStateDescription` / `emptyContainerProps.description` are provided */\n showDefaultDescription?: boolean;\n /** Show more suggestions callback */\n showMore?: () => void;\n /** Show more button text */\n showMoreText?: string;\n}\n\nexport interface MascotConfig<TAsset = string> {\n /** External state override, primarily for audio states or full consumer control. */\n stateOverride?: MascotState;\n assets?: MascotAssets<TAsset>;\n defaultAssets?: MascotAssets<TAsset>;\n /** Ready-to-render animated mascots grouped by welcome/chat surface and state. */\n mascots?: MascotCollection;\n /** Product-wide fallback mascots merged underneath `mascots`. */\n defaultMascots?: MascotCollection;\n /** Advanced renderer. Takes precedence over `mascots` when provided. */\n renderMascot?: (context: MascotRenderContext<TAsset>) => React.ReactNode;\n showOnWelcome?: boolean;\n showInChat?: boolean;\n sleepDelayMs?: number | null;\n onceDurations?: Partial<Record<'reveal' | 'done' | 'error' | 'stopped', number>>;\n onStateChange?: (state: MascotState) => void;\n}\n\n/**\n * MessageList configuration\n */\nexport type MessageListConfig = Omit<\n MessageListProps,\n | 'messages'\n | 'status'\n | 'onRetry'\n | 'showActionsOnHover'\n | 'transformOptions'\n | 'openMarkdownLinksInNewTab'\n | 'mermaidOptions'\n | 'mdxProps'\n>;\n\n/**\n * Unified visible strings for ChatContainer and its subtree.\n *\n * `texts.*` always wins. Below that, each area uses `welcomeConfig`, per-section `*Props` text fields,\n * then built-in defaults from `i18n()`.\n */\nexport interface ChatContainerTexts {\n /** Default header title when not using `headerProps.title` or active chat name */\n headerTitle?: string;\n /** Tooltip for the \"new chat\" header button */\n headerNewChatTooltip?: string;\n /** Tooltip for the \"history\" header button */\n headerHistoryTooltip?: string;\n /** Tooltip for the \"close\" header button */\n headerCloseTooltip?: string;\n /** Tooltip for the folding header button when collapsed (expand action) */\n headerFoldingCollapsedTooltip?: string;\n /** Tooltip for the folding header button when opened (collapse action) */\n headerFoldingOpenedTooltip?: string;\n /** Tooltip for the header menu button */\n headerMenuTooltip?: string;\n /** Empty state / welcome title */\n emptyStateTitle?: React.ReactNode;\n /** Empty state / welcome description */\n emptyStateDescription?: React.ReactNode;\n /** Title above suggestions on welcome screen */\n emptyStateSuggestionsTitle?: React.ReactNode;\n /** \"Show more\" button label on welcome screen */\n emptyStateShowMoreText?: string;\n /** Prompt textarea placeholder */\n promptPlaceholder?: string;\n /** Title above suggestions rendered inside PromptInput (`promptInputProps.suggestionsProps.suggestTitle`) */\n promptSuggestTitle?: React.ReactNode;\n /** Submit button tooltip (send / ready state) */\n submitSendTooltip?: string;\n /** Submit button tooltip (cancel / streaming state) */\n submitCancelTooltip?: string;\n /** Label rendered next to the submit button in cancelable state (`submitButtonCancelableText`) */\n submitButtonCancelableText?: string;\n /** Message list error alert main text */\n errorText?: string;\n /** History search/filter placeholder */\n historySearchPlaceholder?: string;\n /** History panel empty state when there are no chats */\n historyEmptyPlaceholder?: React.ReactNode;\n /** History panel empty state when search has no results */\n historyEmptyFilteredPlaceholder?: React.ReactNode;\n /** Disclaimer body text (must be a string; use `disclaimerProps.children` for custom nodes) */\n disclaimerText?: string;\n}\n\n/**\n * Unified test identifiers (`data-qa`) for ChatContainer and its subtree.\n *\n * - Pass a **string** for backward compatibility: only the root container gets `data-qa`.\n * - Pass **`{ prefix: 'x' }`** to opt in to `${prefix}-${suffix}` for every slot below (see README).\n * - Pass **explicit keys** to override individual elements; they win over `prefix` and nested `*Props.qa`.\n */\nexport interface ChatContainerQa {\n /** Applied to child slots when explicit keys are omitted; also used as root if `root` is omitted */\n prefix?: string;\n /** Root chat container */\n root?: string;\n /** Header root */\n header?: string;\n /** Overrides default `header-action-newChat` */\n headerNewChat?: string;\n /** Overrides default `header-action-history` */\n headerHistory?: string;\n /** Overrides default `header-action-folding` */\n headerFolding?: string;\n /** Overrides default `header-action-close` */\n headerClose?: string;\n /** Overrides default `header-menu-button` */\n headerMenuButton?: string;\n /** ChatContent root */\n content?: string;\n /** Empty state (EmptyContainer) */\n emptyState?: string;\n /** MessageList scroll area */\n messageList?: string;\n /** Action popup in MessageList */\n actionPopup?: string;\n /** PromptInput root */\n promptInput?: string;\n promptInputHeader?: string;\n promptInputBody?: string;\n promptInputFooter?: string;\n /** Submit button in prompt footer */\n submitButton?: string;\n /** Disclaimer text block */\n disclaimer?: string;\n /** History list (inside popup) */\n history?: string;\n}\n\n/**\n * Props for ChatContainer component\n */\nexport interface ChatContainerProps {\n // Chat data\n /** Array of chats for history */\n chats?: ChatType[];\n /** Currently active chat */\n activeChat?: ChatType | null;\n /** Array of messages in current chat */\n messages?: TChatMessage[];\n\n // Main callbacks\n /** Callback when user sends a message */\n onSendMessage: (data: TSubmitData) => Promise<void>;\n /** Callback when user selects a chat from history */\n onSelectChat?: (chat: ChatType) => void;\n /** Callback when user creates a new chat */\n onCreateChat?: () => void;\n /** Callback when user deletes a chat */\n onDeleteChat?: (chat: ChatType) => Promise<void>;\n /** Callback when user deletes all chats */\n onDeleteAllChats?: () => Promise<void>;\n /** Callback when user folds or unfolds the chat */\n onFold?: (value: 'collapsed' | 'opened') => void;\n /** Callback when user closes the chat */\n onClose?: () => void;\n /** Callback when user cancels streaming */\n onCancel?: () => Promise<void>;\n\n // Layout\n /**\n * Enables mobile mode for the chat and all inner components.\n * When omitted, falls back to the `useMobile()` value from the\n * `@gravity-ui/uikit` `MobileProvider` context.\n */\n isMobile?: boolean;\n /**\n * In mobile mode, shrinks the container to the visible part of the viewport while the\n * on-screen keyboard is open, so the prompt input and the disclaimer stay above it.\n * Set to `false` when the host application handles the keyboard itself.\n *\n * @default true\n */\n adjustToKeyboard?: boolean;\n /**\n * Renders the header above the content instead of stacking it on top: the message list and\n * the welcome screen scroll underneath. The header is taken out of the flow, so the content\n * has to be offset by its height manually — the offset depends on the layout. Set an explicit\n * height first: `--g-aikit-chat-container-header-height` is `auto` by default and\n * `--g-aikit-chat-container-mobile-header-height` is `60px` in mobile mode. Pair it with a\n * transparent `--g-aikit-chat-container-header-background` to let the content show through.\n *\n * @example\n * .my-chat {\n * --g-aikit-chat-container-header-height: 60px;\n * --g-aikit-chat-container-header-background: transparent;\n * }\n * .my-chat .g-aikit-chat-container__content {\n * padding-top: var(--g-aikit-chat-container-header-height);\n * }\n */\n floatingHeader?: boolean;\n\n // States\n /** Chat status: submitted, streaming, ready, error */\n status?: ChatStatus;\n /** Error state */\n error?: Error | null;\n /** Show message actions on hover */\n showActionsOnHover?: boolean;\n /** Callback to retry after error */\n onRetry?: () => void;\n\n // Context\n /** Array of context items to display in prompt input header */\n contextItems?: ContextItemConfig[];\n /** Show context indicator in prompt input header */\n showContextIndicator?: boolean;\n /** Props for the context indicator */\n contextIndicatorProps?: ContextIndicatorProps;\n /** Transform options for markdown rendering */\n transformOptions?: OptionsType;\n /** Should parse incomplete markdown (e.g., during streaming) */\n shouldParseIncompleteMarkdown?: boolean;\n /** Enables Mermaid diagrams with an application-provided lazy loader. */\n mermaidOptions?: MermaidOptions;\n /** Open all markdown links rendered by the default message renderers in a new tab */\n openMarkdownLinksInNewTab?: boolean;\n /**\n * Grouped MDX/markdown rendering props forwarded to the message list:\n * `mdxOptions`, `getMarkdownExtraProps` and `getMdxContext`.\n */\n mdxProps?: MdxProps;\n\n // Configuration\n /** MessageList configuration for actions and loader behavior */\n messageListConfig?: MessageListConfig;\n /** Enable the built-in Gravity mascot. Custom mascot configuration takes precedence. */\n showMascot?: boolean;\n /** Mascot renderer, assets and lifecycle configuration. Enables custom mascots independently of `showMascot`. */\n mascotConfig?: MascotConfig;\n\n // Component props overrides\n /** Props override for Header component */\n headerProps?: Partial<\n Omit<HeaderProps, 'handleNewChat' | 'handleHistoryToggle' | 'handleFolding' | 'handleClose'>\n >;\n /** Props override for ChatContent component */\n contentProps?: Partial<Omit<ChatContentProps, 'view' | 'messageListProps'>>;\n /** Props override for EmptyContainer (welcome screen) */\n emptyContainerProps?: Partial<EmptyContainerProps>;\n /** Props override for PromptInput component */\n promptInputProps?: Partial<Omit<PromptInputProps, 'onSend' | 'onCancel'>>;\n /** Props override for Disclaimer component */\n disclaimerProps?: Partial<DisclaimerProps>;\n /** Props override for History component */\n historyProps?: Partial<\n Omit<\n HistoryProps,\n 'chats' | 'selectedChat' | 'onSelectChat' | 'onDeleteChat' | 'anchorElement'\n >\n >;\n\n // Configuration\n /** Welcome screen configuration for empty state */\n welcomeConfig?: WelcomeConfig;\n /** Unified flat text overrides for ChatContainer subtree */\n texts?: ChatContainerTexts;\n /** Show chat history feature */\n showHistory?: boolean;\n /** Show new chat button */\n showNewChat?: boolean;\n /** Show folding button */\n showFolding?: boolean;\n /** Show close button */\n showClose?: boolean;\n /** Hide header title when chat is empty */\n hideTitleOnEmptyChat?: boolean;\n\n // Styling\n /** Additional CSS class */\n className?: string;\n /** Additional CSS class for header section */\n headerClassName?: string;\n /** Additional CSS class for content section */\n contentClassName?: string;\n /** Additional CSS class for footer section */\n footerClassName?: string;\n /**\n * QA/test identifiers. A string sets only the root `data-qa`. Use {@link ChatContainerQa} for a full map or `prefix`.\n */\n qa?: string | ChatContainerQa;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["components/pages/ChatContainer/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport {MdxProps, MessageListProps} from 'src/components/organisms/MessageList';\n\nimport type {\n ChatStatus,\n ChatType,\n MascotAssets,\n MascotCollection,\n MascotRenderContext,\n MascotState,\n TChatMessage,\n TSubmitData,\n} from '../../../types';\nimport type {SuggestionsItem} from '../../../types/common';\nimport type {ContextIndicatorProps} from '../../atoms/ContextIndicator';\nimport type {DisclaimerProps} from '../../atoms/Disclaimer';\nimport type {MermaidOptions} from '../../atoms/MarkdownRenderer';\nimport type {ContextItemConfig} from '../../molecules/PromptInputHeader';\nimport type {HeaderProps} from '../../organisms/Header';\nimport type {PromptInputProps} from '../../organisms/PromptInput';\nimport type {ChatContentProps} from '../../templates/ChatContent';\nimport type {AlignmentConfig, EmptyContainerProps} from '../../templates/EmptyContainer';\nimport type {HistoryProps} from '../../templates/History';\n\n/**\n * Welcome screen configuration\n */\nexport interface WelcomeConfig {\n /** Image or icon to display */\n image?: React.ReactNode;\n /** Title text or custom React element */\n title?: React.ReactNode;\n /** Description text or custom React element */\n description?: React.ReactNode;\n /** Suggestions section title - can be string or custom React element */\n suggestionTitle?: React.ReactNode;\n /** Array of suggestions (title will be used as message content) */\n suggestions?: SuggestionsItem[];\n /** Alignment configuration for image, title, and description */\n alignment?: AlignmentConfig;\n /** Layout orientation for suggestions: 'grid' for horizontal, 'list' for vertical */\n layout?: 'grid' | 'list';\n /** Enable text wrapping inside suggestion buttons instead of ellipsis */\n wrapText?: boolean;\n /** Show default title when neither title nor `texts.emptyStateTitle` / `emptyContainerProps.title` are provided */\n showDefaultTitle?: boolean;\n /** Show default description when neither description nor `texts.emptyStateDescription` / `emptyContainerProps.description` are provided */\n showDefaultDescription?: boolean;\n /** Show more suggestions callback */\n showMore?: () => void;\n /** Show more button text */\n showMoreText?: string;\n}\n\nexport interface MascotConfig<TAsset = string> {\n /** External state override, primarily for audio states or full consumer control. */\n stateOverride?: MascotState;\n assets?: MascotAssets<TAsset>;\n defaultAssets?: MascotAssets<TAsset>;\n /** Ready-to-render animated mascots grouped by welcome/chat surface and state. */\n mascots?: MascotCollection;\n /** Product-wide fallback mascots merged underneath `mascots`. */\n defaultMascots?: MascotCollection;\n /** Advanced renderer. Takes precedence over `mascots` when provided. */\n renderMascot?: (context: MascotRenderContext<TAsset>) => React.ReactNode;\n showOnWelcome?: boolean;\n showInChat?: boolean;\n sleepDelayMs?: number | null;\n onceDurations?: Partial<Record<'reveal' | 'done' | 'error' | 'stopped', number>>;\n onStateChange?: (state: MascotState) => void;\n}\n\n/**\n * MessageList configuration\n */\nexport type MessageListConfig = Omit<\n MessageListProps,\n | 'messages'\n | 'status'\n | 'onRetry'\n | 'showActionsOnHover'\n | 'transformOptions'\n | 'openMarkdownLinksInNewTab'\n | 'mermaidOptions'\n | 'mdxProps'\n>;\n\n/**\n * Unified visible strings for ChatContainer and its subtree.\n *\n * `texts.*` always wins. Below that, each area uses `welcomeConfig`, per-section `*Props` text fields,\n * then built-in defaults from `i18n()`.\n */\nexport interface ChatContainerTexts {\n /** Default header title when not using `headerProps.title` or active chat name */\n headerTitle?: string;\n /** Tooltip for the \"new chat\" header button */\n headerNewChatTooltip?: string;\n /** Tooltip for the \"history\" header button */\n headerHistoryTooltip?: string;\n /** Tooltip for the \"close\" header button */\n headerCloseTooltip?: string;\n /** Tooltip for the folding header button when collapsed (expand action) */\n headerFoldingCollapsedTooltip?: string;\n /** Tooltip for the folding header button when opened (collapse action) */\n headerFoldingOpenedTooltip?: string;\n /** Tooltip for the header menu button */\n headerMenuTooltip?: string;\n /** Empty state / welcome title */\n emptyStateTitle?: React.ReactNode;\n /** Empty state / welcome description */\n emptyStateDescription?: React.ReactNode;\n /** Title above suggestions on welcome screen */\n emptyStateSuggestionsTitle?: React.ReactNode;\n /** \"Show more\" button label on welcome screen */\n emptyStateShowMoreText?: string;\n /** Prompt textarea placeholder */\n promptPlaceholder?: string;\n /** Title above suggestions rendered inside PromptInput (`promptInputProps.suggestionsProps.suggestTitle`) */\n promptSuggestTitle?: React.ReactNode;\n /** Submit button tooltip (send / ready state) */\n submitSendTooltip?: string;\n /** Submit button tooltip (cancel / streaming state) */\n submitCancelTooltip?: string;\n /** Label rendered next to the submit button in cancelable state (`submitButtonCancelableText`) */\n submitButtonCancelableText?: string;\n /** Message list error alert main text */\n errorText?: string;\n /** History search/filter placeholder */\n historySearchPlaceholder?: string;\n /** History panel empty state when there are no chats */\n historyEmptyPlaceholder?: React.ReactNode;\n /** History panel empty state when search has no results */\n historyEmptyFilteredPlaceholder?: React.ReactNode;\n /** Disclaimer body text (must be a string; use `disclaimerProps.children` for custom nodes) */\n disclaimerText?: string;\n}\n\n/**\n * Unified test identifiers (`data-qa`) for ChatContainer and its subtree.\n *\n * - Pass a **string** for backward compatibility: only the root container gets `data-qa`.\n * - Pass **`{ prefix: 'x' }`** to opt in to `${prefix}-${suffix}` for every slot below (see README).\n * - Pass **explicit keys** to override individual elements; they win over `prefix` and nested `*Props.qa`.\n */\nexport interface ChatContainerQa {\n /** Applied to child slots when explicit keys are omitted; also used as root if `root` is omitted */\n prefix?: string;\n /** Root chat container */\n root?: string;\n /** Header root */\n header?: string;\n /** Overrides default `header-action-newChat` */\n headerNewChat?: string;\n /** Overrides default `header-action-history` */\n headerHistory?: string;\n /** Overrides default `header-action-folding` */\n headerFolding?: string;\n /** Overrides default `header-action-close` */\n headerClose?: string;\n /** Overrides default `header-menu-button` */\n headerMenuButton?: string;\n /** ChatContent root */\n content?: string;\n /** Empty state (EmptyContainer) */\n emptyState?: string;\n /** MessageList scroll area */\n messageList?: string;\n /** Action popup in MessageList */\n actionPopup?: string;\n /** PromptInput root */\n promptInput?: string;\n promptInputHeader?: string;\n promptInputBody?: string;\n promptInputFooter?: string;\n /** Submit button in prompt footer */\n submitButton?: string;\n /** Disclaimer text block */\n disclaimer?: string;\n /** History list (inside popup) */\n history?: string;\n}\n\n/**\n * Props for ChatContainer component\n */\nexport interface ChatContainerProps {\n // Chat data\n /** Array of chats for history */\n chats?: ChatType[];\n /** Currently active chat */\n activeChat?: ChatType | null;\n /** Array of messages in current chat */\n messages?: TChatMessage[];\n\n // Main callbacks\n /** Callback when user sends a message */\n onSendMessage: (data: TSubmitData) => Promise<void | false>;\n /** Callback when user selects a chat from history */\n onSelectChat?: (chat: ChatType) => void;\n /** Callback when user creates a new chat */\n onCreateChat?: () => void;\n /** Callback when user deletes a chat */\n onDeleteChat?: (chat: ChatType) => Promise<void>;\n /** Callback when user deletes all chats */\n onDeleteAllChats?: () => Promise<void>;\n /** Callback when user folds or unfolds the chat */\n onFold?: (value: 'collapsed' | 'opened') => void;\n /** Callback when user closes the chat */\n onClose?: () => void;\n /** Callback when user cancels streaming */\n onCancel?: () => Promise<void>;\n\n // Layout\n /**\n * Enables mobile mode for the chat and all inner components.\n * When omitted, falls back to the `useMobile()` value from the\n * `@gravity-ui/uikit` `MobileProvider` context.\n */\n isMobile?: boolean;\n /**\n * In mobile mode, shrinks the container to the visible part of the viewport while the\n * on-screen keyboard is open, so the prompt input and the disclaimer stay above it.\n * Set to `false` when the host application handles the keyboard itself.\n *\n * @default true\n */\n adjustToKeyboard?: boolean;\n /**\n * Renders the header above the content instead of stacking it on top: the message list and\n * the welcome screen scroll underneath. The header is taken out of the flow, so the content\n * has to be offset by its height manually — the offset depends on the layout. Set an explicit\n * height first: `--g-aikit-chat-container-header-height` is `auto` by default and\n * `--g-aikit-chat-container-mobile-header-height` is `60px` in mobile mode. Pair it with a\n * transparent `--g-aikit-chat-container-header-background` to let the content show through.\n *\n * @example\n * .my-chat {\n * --g-aikit-chat-container-header-height: 60px;\n * --g-aikit-chat-container-header-background: transparent;\n * }\n * .my-chat .g-aikit-chat-container__content {\n * padding-top: var(--g-aikit-chat-container-header-height);\n * }\n */\n floatingHeader?: boolean;\n\n // States\n /** Chat status: submitted, streaming, ready, error */\n status?: ChatStatus;\n /** Error state */\n error?: Error | null;\n /** Show message actions on hover */\n showActionsOnHover?: boolean;\n /** Callback to retry after error */\n onRetry?: () => void;\n\n // Context\n /** Array of context items to display in prompt input header */\n contextItems?: ContextItemConfig[];\n /** Show context indicator in prompt input header */\n showContextIndicator?: boolean;\n /** Props for the context indicator */\n contextIndicatorProps?: ContextIndicatorProps;\n /** Transform options for markdown rendering */\n transformOptions?: OptionsType;\n /** Should parse incomplete markdown (e.g., during streaming) */\n shouldParseIncompleteMarkdown?: boolean;\n /** Enables Mermaid diagrams with an application-provided lazy loader. */\n mermaidOptions?: MermaidOptions;\n /** Open all markdown links rendered by the default message renderers in a new tab */\n openMarkdownLinksInNewTab?: boolean;\n /**\n * Grouped MDX/markdown rendering props forwarded to the message list:\n * `mdxOptions`, `getMarkdownExtraProps` and `getMdxContext`.\n */\n mdxProps?: MdxProps;\n\n // Configuration\n /** MessageList configuration for actions and loader behavior */\n messageListConfig?: MessageListConfig;\n /** Enable the built-in Gravity mascot. Custom mascot configuration takes precedence. */\n showMascot?: boolean;\n /** Mascot renderer, assets and lifecycle configuration. Enables custom mascots independently of `showMascot`. */\n mascotConfig?: MascotConfig;\n\n // Component props overrides\n /** Props override for Header component */\n headerProps?: Partial<\n Omit<HeaderProps, 'handleNewChat' | 'handleHistoryToggle' | 'handleFolding' | 'handleClose'>\n >;\n /** Props override for ChatContent component */\n contentProps?: Partial<Omit<ChatContentProps, 'view' | 'messageListProps'>>;\n /** Props override for EmptyContainer (welcome screen) */\n emptyContainerProps?: Partial<EmptyContainerProps>;\n /** Props override for PromptInput component */\n promptInputProps?: Partial<Omit<PromptInputProps, 'onSend' | 'onCancel'>>;\n /** Props override for Disclaimer component */\n disclaimerProps?: Partial<DisclaimerProps>;\n /** Props override for History component */\n historyProps?: Partial<\n Omit<\n HistoryProps,\n 'chats' | 'selectedChat' | 'onSelectChat' | 'onDeleteChat' | 'anchorElement'\n >\n >;\n\n // Configuration\n /** Welcome screen configuration for empty state */\n welcomeConfig?: WelcomeConfig;\n /** Unified flat text overrides for ChatContainer subtree */\n texts?: ChatContainerTexts;\n /** Show chat history feature */\n showHistory?: boolean;\n /** Show new chat button */\n showNewChat?: boolean;\n /** Show folding button */\n showFolding?: boolean;\n /** Show close button */\n showClose?: boolean;\n /** Hide header title when chat is empty */\n hideTitleOnEmptyChat?: boolean;\n\n // Styling\n /** Additional CSS class */\n className?: string;\n /** Additional CSS class for header section */\n headerClassName?: string;\n /** Additional CSS class for content section */\n contentClassName?: string;\n /** Additional CSS class for footer section */\n footerClassName?: string;\n /**\n * QA/test identifiers. A string sets only the root `data-qa`. Use {@link ChatContainerQa} for a full map or `prefix`.\n */\n qa?: string | ChatContainerQa;\n}\n"]}
|
|
@@ -11,6 +11,7 @@ export declare function useChatContainer(props: ChatContainerProps): {
|
|
|
11
11
|
isHistoryOpen: boolean;
|
|
12
12
|
activeChat: import("../../../index.js").ChatType | null | undefined;
|
|
13
13
|
promptInputKey: number;
|
|
14
|
+
commandsResetKey: string | number;
|
|
14
15
|
historyButtonRef: import("react").RefObject<HTMLElement>;
|
|
15
16
|
handleNewChat: () => void;
|
|
16
17
|
handleHistoryToggle: () => void;
|
|
@@ -7,7 +7,7 @@ import { HeaderAction } from "../../organisms/Header/index.js";
|
|
|
7
7
|
* @returns object with state and handlers
|
|
8
8
|
*/
|
|
9
9
|
export function useChatContainer(props) {
|
|
10
|
-
var _a, _b, _c, _d;
|
|
10
|
+
var _a, _b, _c, _d, _e;
|
|
11
11
|
const { messages = [], activeChat, onCreateChat, onClose, onFold, onSelectChat, showHistory = true, showNewChat = true, showFolding = false, showClose = false, promptInputProps, headerProps, } = props;
|
|
12
12
|
const onHistoryToggle = headerProps === null || headerProps === void 0 ? void 0 : headerProps.onHistoryToggle;
|
|
13
13
|
const autoFocusOnNewChat = (_b = (_a = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.bodyProps) === null || _a === void 0 ? void 0 : _a.autoFocusOnNewChat) !== null && _b !== void 0 ? _b : true;
|
|
@@ -23,6 +23,7 @@ export function useChatContainer(props) {
|
|
|
23
23
|
}, []);
|
|
24
24
|
// Key incremented on each new chat to remount PromptInput with autofocus
|
|
25
25
|
const [promptInputKey, setPromptInputKey] = useState(0);
|
|
26
|
+
const [commandsRevision, setCommandsRevision] = useState(0);
|
|
26
27
|
// Determine view for ChatContent (empty or chat)
|
|
27
28
|
const chatContentView = useMemo(() => {
|
|
28
29
|
// If there is an active chat (selected from history), show chat view
|
|
@@ -36,6 +37,7 @@ export function useChatContainer(props) {
|
|
|
36
37
|
// Handler for creating new chat
|
|
37
38
|
const handleNewChat = useCallback(() => {
|
|
38
39
|
onCreateChat === null || onCreateChat === void 0 ? void 0 : onCreateChat();
|
|
40
|
+
setCommandsRevision((revision) => revision + 1);
|
|
39
41
|
if (autoFocusOnNewChat) {
|
|
40
42
|
setPromptInputKey((prev) => prev + 1);
|
|
41
43
|
}
|
|
@@ -57,6 +59,7 @@ export function useChatContainer(props) {
|
|
|
57
59
|
const handleSelectChat = useCallback((chat) => {
|
|
58
60
|
if (chat) {
|
|
59
61
|
onSelectChat === null || onSelectChat === void 0 ? void 0 : onSelectChat(chat);
|
|
62
|
+
setCommandsRevision((revision) => revision + 1);
|
|
60
63
|
setIsHistoryOpen(false);
|
|
61
64
|
if (autoFocusOnChatSelect) {
|
|
62
65
|
setPromptInputKey((prev) => prev + 1);
|
|
@@ -90,6 +93,7 @@ export function useChatContainer(props) {
|
|
|
90
93
|
isHistoryOpen,
|
|
91
94
|
activeChat,
|
|
92
95
|
promptInputKey,
|
|
96
|
+
commandsResetKey: (_e = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.commandsResetKey) !== null && _e !== void 0 ? _e : JSON.stringify([activeChat === null || activeChat === void 0 ? void 0 : activeChat.id, commandsRevision]),
|
|
93
97
|
// Refs
|
|
94
98
|
historyButtonRef,
|
|
95
99
|
// Handlers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatContainer.js","sourceRoot":"../../../../../src","sources":["components/pages/ChatContainer/useChatContainer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE7D,OAAO,EAAC,YAAY,EAAC,wCAA+B;AAIpD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAyB;;IACtD,MAAM,EACF,QAAQ,GAAG,EAAE,EACb,UAAU,EACV,YAAY,EACZ,OAAO,EACP,MAAM,EACN,YAAY,EACZ,WAAW,GAAG,IAAI,EAClB,WAAW,GAAG,IAAI,EAClB,WAAW,GAAG,KAAK,EACnB,SAAS,GAAG,KAAK,EACjB,gBAAgB,EAChB,WAAW,GACd,GAAG,KAAK,CAAC;IAEV,MAAM,eAAe,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,CAAC;IAErD,MAAM,kBAAkB,GAAG,MAAA,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,SAAS,0CAAE,kBAAkB,mCAAI,IAAI,CAAC;IACnF,MAAM,qBAAqB,GAAG,MAAA,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,SAAS,0CAAE,qBAAqB,mCAAI,IAAI,CAAC;IAEzF,2CAA2C;IAC3C,MAAM,gBAAgB,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,aAAa,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/D,oGAAoG;IACpG,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvC,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,IAAa,EAAE,EAAE;QACnD,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;QAChC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,yEAAyE;IACzE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"useChatContainer.js","sourceRoot":"../../../../../src","sources":["components/pages/ChatContainer/useChatContainer.ts"],"names":[],"mappings":"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","sourcesContent":["import {useCallback, useMemo, useRef, useState} from 'react';\n\nimport {HeaderAction} from '../../organisms/Header';\n\nimport type {ChatContainerProps} from './types';\n\n/**\n * Hook for managing ChatContainer state\n *\n * @param props - ChatContainer component props\n * @returns object with state and handlers\n */\nexport function useChatContainer(props: ChatContainerProps) {\n const {\n messages = [],\n activeChat,\n onCreateChat,\n onClose,\n onFold,\n onSelectChat,\n showHistory = true,\n showNewChat = true,\n showFolding = false,\n showClose = false,\n promptInputProps,\n headerProps,\n } = props;\n\n const onHistoryToggle = headerProps?.onHistoryToggle;\n\n const autoFocusOnNewChat = promptInputProps?.bodyProps?.autoFocusOnNewChat ?? true;\n const autoFocusOnChatSelect = promptInputProps?.bodyProps?.autoFocusOnChatSelect ?? true;\n\n // Refs for History integration with Header\n const historyButtonRef = useRef<HTMLElement>(null);\n const [isHistoryOpen, setIsHistoryOpenState] = useState(false);\n // Mirror of `isHistoryOpen` for synchronous reads between renders (e.g. back-to-back toggle clicks)\n const isHistoryOpenRef = useRef(false);\n\n const setIsHistoryOpen = useCallback((open: boolean) => {\n isHistoryOpenRef.current = open;\n setIsHistoryOpenState(open);\n }, []);\n\n // Key incremented on each new chat to remount PromptInput with autofocus\n const [promptInputKey, setPromptInputKey] = useState(0);\n const [commandsRevision, setCommandsRevision] = useState(0);\n\n // Determine view for ChatContent (empty or chat)\n const chatContentView = useMemo(() => {\n // If there is an active chat (selected from history), show chat view\n // even if there are no messages yet\n if (activeChat) {\n return 'chat';\n }\n // If no active chat, determine by the presence of messages\n return messages.length === 0 ? 'empty' : 'chat';\n }, [messages.length, activeChat]);\n\n // Handler for creating new chat\n const handleNewChat = useCallback(() => {\n onCreateChat?.();\n setCommandsRevision((revision) => revision + 1);\n if (autoFocusOnNewChat) {\n setPromptInputKey((prev) => prev + 1);\n }\n }, [onCreateChat, autoFocusOnNewChat]);\n\n // Handler for toggling history\n const handleHistoryToggle = useCallback(() => {\n const next = !isHistoryOpenRef.current;\n setIsHistoryOpen(next);\n onHistoryToggle?.(next);\n }, [setIsHistoryOpen, onHistoryToggle]);\n\n const handleFolding = useCallback(\n (value: 'collapsed' | 'opened') => {\n onFold?.(value);\n },\n [onFold],\n );\n\n // Handler for closing\n const handleClose = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n // Handler for selecting chat from history\n const handleSelectChat = useCallback(\n (chat: ChatContainerProps['activeChat']) => {\n if (chat) {\n onSelectChat?.(chat);\n setCommandsRevision((revision) => revision + 1);\n setIsHistoryOpen(false);\n if (autoFocusOnChatSelect) {\n setPromptInputKey((prev) => prev + 1);\n }\n }\n },\n [onSelectChat, autoFocusOnChatSelect],\n );\n\n // Handler for history popup state changes\n const handleHistoryOpenChange = useCallback((open: boolean) => {\n setIsHistoryOpen(open);\n }, []);\n\n // Build baseActions for Header\n const baseActions = useMemo(() => {\n const actions: HeaderAction[] = [];\n\n if (showNewChat && chatContentView !== 'empty') {\n actions.push(HeaderAction.NewChat);\n }\n\n if (showHistory) {\n actions.push(HeaderAction.History);\n }\n\n if (showFolding) {\n actions.push(HeaderAction.Folding);\n }\n\n if (showClose) {\n actions.push(HeaderAction.Close);\n }\n\n return actions;\n }, [showNewChat, showHistory, showFolding, showClose, chatContentView]);\n\n return {\n // State\n chatContentView,\n isHistoryOpen,\n activeChat,\n promptInputKey,\n commandsResetKey:\n promptInputProps?.commandsResetKey ??\n JSON.stringify([activeChat?.id, commandsRevision]),\n\n // Refs\n historyButtonRef,\n\n // Handlers\n handleNewChat,\n handleHistoryToggle,\n handleFolding,\n handleClose,\n handleSelectChat,\n handleHistoryOpenChange,\n\n // Configuration\n baseActions,\n };\n}\n"]}
|
package/build/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"2.
|
|
1
|
+
{"version":"2.25.0","type":"module","sideEffects":["*.css","*.scss"]}
|
package/build/esm/types/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["types/index.ts"],"names":[],"mappings":"AAAA,8BAA2B;AAC3B,0BAAuB;AACvB,0BAAuB;AACvB,4BAAyB;AACzB,4BAAyB","sourcesContent":["export * from './messages';\nexport * from './chat';\nexport * from './tool';\nexport * from './common';\nexport * from './mascot';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["types/index.ts"],"names":[],"mappings":"AAAA,8BAA2B;AAC3B,oCAAiC;AACjC,0BAAuB;AACvB,0BAAuB;AACvB,4BAAyB;AACzB,4BAAyB","sourcesContent":["export * from './messages';\nexport * from './promptCommands';\nexport * from './chat';\nexport * from './tool';\nexport * from './common';\nexport * from './mascot';\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
2
|
import type { ButtonView, PopupPlacement } from '@gravity-ui/uikit';
|
|
3
3
|
import { ActionConfig } from "./common.js";
|
|
4
|
+
import type { PromptSelection } from "./promptCommands.js";
|
|
4
5
|
import { ToolMessageProps } from "./tool.js";
|
|
5
6
|
/**
|
|
6
7
|
* Context object passed to popup content generator function
|
|
@@ -96,6 +97,8 @@ export type TSuggestionContext = {
|
|
|
96
97
|
data?: Record<string, unknown>;
|
|
97
98
|
};
|
|
98
99
|
export type TSubmitData = {
|
|
100
|
+
/** Snapshot of commands and context selected for this message. */
|
|
101
|
+
selections?: PromptSelection[];
|
|
99
102
|
content: string;
|
|
100
103
|
attachments?: File[];
|
|
101
104
|
metadata?: TMessageMetadata;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"../../../src","sources":["types/messages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"../../../src","sources":["types/messages.ts"],"names":[],"mappings":"AAoDA,MAAM,CAAN,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC7B,sCAAa,CAAA;IACb,sCAAa,CAAA;IACb,wCAAe,CAAA;IACf,sCAAa,CAAA;IACb,4CAAmB,CAAA;IACnB,0CAAiB,CAAA;AACrB,CAAC,EAPW,qBAAqB,KAArB,qBAAqB,QAOhC","sourcesContent":["import type React from 'react';\n\nimport type {ButtonView, PopupPlacement} from '@gravity-ui/uikit';\n\nimport {ActionConfig} from './common';\nimport type {PromptSelection} from './promptCommands';\nimport {ToolMessageProps} from './tool';\n\n/**\n * Context object passed to popup content generator function\n */\nexport interface ActionPopupContext {\n /** Update popup content without closing it */\n setContent: (content: React.ReactNode) => void;\n /** Update popup title dynamically */\n setTitle: (title: string | undefined) => void;\n /** Update popup subtitle dynamically */\n setSubtitle: (subtitle: string | undefined) => void;\n /** Programmatically close the popup */\n closePopup: () => void;\n}\n\n/**\n * Configuration for action popup\n */\nexport interface ActionPopupConfig<TMessage> {\n /** Function that generates popup content */\n getContent: (message: TMessage, context: ActionPopupContext) => React.ReactNode;\n /** Optional popup title (can be overridden by actionPopupProps) */\n title?: string;\n /** Optional popup subtitle (can be overridden by actionPopupProps) */\n subtitle?: string;\n /** Optional popup placement (can be overridden by actionPopupProps) */\n placement?: PopupPlacement;\n}\n\nexport type BaseMessageActionConfig<TMessage = unknown> = ActionConfig & {\n /** Optional popup configuration for this action */\n popup?: ActionPopupConfig<TMessage>;\n};\n\n/**\n * BaseMessage action can be either:\n * - BaseMessageActionConfig object with properties (including type for default icons)\n * - React.ReactNode for fully custom content\n */\nexport type BaseMessageAction<TMessage = unknown> =\n | BaseMessageActionConfig<TMessage>\n | React.ReactNode;\n\nexport type UserRating = 'like' | 'dislike';\n\nexport enum BaseMessageActionType {\n Copy = 'copy',\n Edit = 'edit',\n Retry = 'retry',\n Like = 'like',\n Dislike = 'dislike',\n Delete = 'delete',\n}\n\n/**\n * Default action descriptor for message action buttons.\n * Generic over the message type to provide typed onClick handler.\n */\nexport type DefaultMessageAction<TMessage> = {\n type?: string;\n onClick: (message: TMessage) => void;\n icon?: React.ReactNode;\n /**\n * Arbitrary button content (text, badges, or any ReactNode).\n * Takes precedence over `icon` when both are provided.\n * Can be a static ReactNode or a render function that receives the message,\n * allowing dynamic content based on message data (e.g. token count from metadata).\n */\n children?: React.ReactNode | ((message: TMessage) => React.ReactNode);\n label?: string;\n view?: ButtonView;\n /** Optional popup configuration for this action */\n popup?: ActionPopupConfig<TMessage>;\n};\n\n/**\n * React component used to render extra contextual info for a message\n * (e.g. token count, latency). Receives the message as a `message` prop.\n */\nexport type MessageExtraInfoComponent<TMessage> = React.ComponentType<{message: TMessage}>;\n\nexport type BaseMessageProps<TMessage = unknown> = {\n children: React.ReactNode;\n role: TMessageRole;\n actions?: BaseMessageAction<TMessage>[];\n /** Extra info node rendered alongside the action buttons (e.g. token count). */\n extraInfo?: React.ReactNode;\n userRating?: UserRating;\n timestamp?: string;\n showTimestamp?: boolean;\n showActionsOnHover?: boolean;\n className?: string;\n qa?: string;\n /** Callback when action with popup config is clicked */\n onActionPopup?: (action: BaseMessageActionConfig<TMessage>, anchorElement: HTMLElement) => void;\n};\n\nexport type TMessageMetadata = Record<string, unknown>;\n\n/** Context passed when a message is sent via suggestion click */\nexport type TSuggestionContext = {\n id?: string;\n data?: Record<string, unknown>;\n};\n\nexport type TSubmitData = {\n /** Snapshot of commands and context selected for this message. */\n selections?: PromptSelection[];\n content: string;\n attachments?: File[];\n metadata?: TMessageMetadata;\n /** Set when the message is sent by clicking a suggestion */\n suggestion?: TSuggestionContext;\n};\n\nexport type TMessageRole = 'user' | 'assistant' | 'system';\n\nexport type TMessageContent<Type extends string = string, Data = unknown> = {\n id?: string;\n type: Type;\n data: Data;\n};\n\nexport type TextMessageContentData = {\n text: string;\n};\n\nexport type TextMessageContent = TMessageContent<'text', TextMessageContentData>;\n\nexport type ThinkingMessageContentData = {\n title?: string;\n content: string | string[];\n status: 'thinking' | 'thought';\n defaultExpanded?: boolean;\n showStatusIndicator?: boolean;\n onCopyClick?: () => void;\n enabledCopy?: boolean;\n className?: string;\n qa?: string;\n};\n\nexport type ThinkingMessageContent = TMessageContent<'thinking', ThinkingMessageContentData>;\n\nexport type ToolMessageContentData = ToolMessageProps & {\n /** MCP arguments, pretty-printed JSON. Read by AIStudioChat's tool renderer. */\n mcpRequest?: string;\n /** MCP output (or error), pretty-printed JSON. Read by AIStudioChat's tool renderer. */\n mcpResponse?: string;\n};\n\nexport type ToolMessageContent = TMessageContent<'tool', ToolMessageContentData>;\n\nexport type TDefaultMessageContent =\n | TextMessageContent\n | ThinkingMessageContent\n | ToolMessageContent;\n\nexport type TMessageContentUnion<TCustomMessageContent extends TMessageContent = never> =\n | TDefaultMessageContent\n | TCustomMessageContent;\n\nexport type TAssistantMessageContent<TCustomMessageContent extends TMessageContent = never> =\n | string\n | TMessageContentUnion<TCustomMessageContent>\n | TMessageContentUnion<TCustomMessageContent>[];\n\nexport type TBaseMessage<Metadata = TMessageMetadata> = Pick<\n BaseMessageProps,\n 'actions' | 'timestamp'\n> & {\n id?: string;\n error?: unknown;\n metadata?: Metadata;\n};\n\nexport type FileAttachment = {\n id: string;\n name: string;\n mimeType?: string;\n};\n\nexport type TUserMessage<Metadata = TMessageMetadata> = TBaseMessage<Metadata> & {\n role: 'user';\n content: string;\n format?: 'plain' | 'markdown';\n avatarUrl?: string;\n /** Base64 data URLs or regular image URLs attached to the message */\n images?: string[];\n /** File attachments sent with this message */\n fileAttachments?: FileAttachment[];\n};\n\nexport type TAssistantMessage<\n TCustomMessageContent extends TMessageContent = never,\n Metadata = TMessageMetadata,\n> = TBaseMessage<Metadata> & {\n role: 'assistant';\n content: TAssistantMessageContent<TCustomMessageContent>;\n userRating?: UserRating;\n};\n\nexport type TChatMessage<\n TCustomMessageContent extends TMessageContent = never,\n Metadata = TMessageMetadata,\n> = TUserMessage<Metadata> | TAssistantMessage<TCustomMessageContent, Metadata>;\n"]}
|