@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.
Files changed (118) hide show
  1. package/build/cjs/components/molecules/PromptInputBody/PromptInputBody.d.ts +1 -0
  2. package/build/cjs/components/molecules/PromptInputBody/PromptInputBody.js +2 -8
  3. package/build/cjs/components/molecules/PromptInputBody/PromptInputBody.js.map +1 -1
  4. package/build/cjs/components/organisms/PromptInput/PromptInput.css +37 -0
  5. package/build/cjs/components/organisms/PromptInput/PromptInput.d.ts +13 -2
  6. package/build/cjs/components/organisms/PromptInput/PromptInput.js +64 -3
  7. package/build/cjs/components/organisms/PromptInput/PromptInput.js.map +1 -1
  8. package/build/cjs/components/organisms/PromptInput/PromptInputCommands.d.ts +9 -0
  9. package/build/cjs/components/organisms/PromptInput/PromptInputCommands.js +39 -0
  10. package/build/cjs/components/organisms/PromptInput/PromptInputCommands.js.map +1 -0
  11. package/build/cjs/components/organisms/PromptInput/PromptInputFull.d.ts +2 -0
  12. package/build/cjs/components/organisms/PromptInput/PromptInputFull.js +4 -4
  13. package/build/cjs/components/organisms/PromptInput/PromptInputFull.js.map +1 -1
  14. package/build/cjs/components/organisms/PromptInput/PromptInputSimple.d.ts +2 -0
  15. package/build/cjs/components/organisms/PromptInput/PromptInputSimple.js +3 -3
  16. package/build/cjs/components/organisms/PromptInput/PromptInputSimple.js.map +1 -1
  17. package/build/cjs/components/organisms/PromptInput/commandUtils.d.ts +13 -0
  18. package/build/cjs/components/organisms/PromptInput/commandUtils.js +27 -0
  19. package/build/cjs/components/organisms/PromptInput/commandUtils.js.map +1 -0
  20. package/build/cjs/components/organisms/PromptInput/i18n/en.json +8 -0
  21. package/build/cjs/components/organisms/PromptInput/i18n/index.d.ts +13 -0
  22. package/build/cjs/components/organisms/PromptInput/i18n/index.js +10 -0
  23. package/build/cjs/components/organisms/PromptInput/i18n/index.js.map +1 -0
  24. package/build/cjs/components/organisms/PromptInput/i18n/ru.json +8 -0
  25. package/build/cjs/components/organisms/PromptInput/index.d.ts +2 -1
  26. package/build/cjs/components/organisms/PromptInput/index.js.map +1 -1
  27. package/build/cjs/components/organisms/PromptInput/types.d.ts +1 -0
  28. package/build/cjs/components/organisms/PromptInput/types.js.map +1 -1
  29. package/build/cjs/components/organisms/PromptInput/usePromptCommands.d.ts +41 -0
  30. package/build/cjs/components/organisms/PromptInput/usePromptCommands.js +222 -0
  31. package/build/cjs/components/organisms/PromptInput/usePromptCommands.js.map +1 -0
  32. package/build/cjs/components/organisms/PromptInput/usePromptInput.d.ts +10 -1
  33. package/build/cjs/components/organisms/PromptInput/usePromptInput.js +100 -11
  34. package/build/cjs/components/organisms/PromptInput/usePromptInput.js.map +1 -1
  35. package/build/cjs/components/pages/AIStudioChat/AIStudioChat.js +139 -52
  36. package/build/cjs/components/pages/AIStudioChat/AIStudioChat.js.map +1 -1
  37. package/build/cjs/components/pages/AIStudioChat/request.d.ts +4 -0
  38. package/build/cjs/components/pages/AIStudioChat/request.js +11 -0
  39. package/build/cjs/components/pages/AIStudioChat/request.js.map +1 -0
  40. package/build/cjs/components/pages/AIStudioChat/types.d.ts +5 -5
  41. package/build/cjs/components/pages/AIStudioChat/types.js.map +1 -1
  42. package/build/cjs/components/pages/ChatContainer/ChatContainer.js +10 -4
  43. package/build/cjs/components/pages/ChatContainer/ChatContainer.js.map +1 -1
  44. package/build/cjs/components/pages/ChatContainer/types.d.ts +1 -1
  45. package/build/cjs/components/pages/ChatContainer/types.js.map +1 -1
  46. package/build/cjs/components/pages/ChatContainer/useChatContainer.d.ts +1 -0
  47. package/build/cjs/components/pages/ChatContainer/useChatContainer.js +5 -1
  48. package/build/cjs/components/pages/ChatContainer/useChatContainer.js.map +1 -1
  49. package/build/cjs/package.json +1 -1
  50. package/build/cjs/types/index.d.ts +1 -0
  51. package/build/cjs/types/index.js +1 -0
  52. package/build/cjs/types/index.js.map +1 -1
  53. package/build/cjs/types/messages.d.ts +3 -0
  54. package/build/cjs/types/messages.js.map +1 -1
  55. package/build/cjs/types/promptCommands.d.ts +44 -0
  56. package/build/cjs/types/promptCommands.js +3 -0
  57. package/build/cjs/types/promptCommands.js.map +1 -0
  58. package/build/docs/components/molecules/PromptInputBody.md +16 -15
  59. package/build/docs/components/organisms/PromptInput.md +151 -0
  60. package/build/docs/components/pages/AIStudioChat.md +38 -0
  61. package/build/esm/components/molecules/PromptInputBody/PromptInputBody.d.ts +1 -0
  62. package/build/esm/components/molecules/PromptInputBody/PromptInputBody.js +2 -8
  63. package/build/esm/components/molecules/PromptInputBody/PromptInputBody.js.map +1 -1
  64. package/build/esm/components/organisms/PromptInput/PromptInput.css +37 -0
  65. package/build/esm/components/organisms/PromptInput/PromptInput.d.ts +13 -2
  66. package/build/esm/components/organisms/PromptInput/PromptInput.js +65 -4
  67. package/build/esm/components/organisms/PromptInput/PromptInput.js.map +1 -1
  68. package/build/esm/components/organisms/PromptInput/PromptInputCommands.d.ts +9 -0
  69. package/build/esm/components/organisms/PromptInput/PromptInputCommands.js +36 -0
  70. package/build/esm/components/organisms/PromptInput/PromptInputCommands.js.map +1 -0
  71. package/build/esm/components/organisms/PromptInput/PromptInputFull.d.ts +2 -0
  72. package/build/esm/components/organisms/PromptInput/PromptInputFull.js +4 -4
  73. package/build/esm/components/organisms/PromptInput/PromptInputFull.js.map +1 -1
  74. package/build/esm/components/organisms/PromptInput/PromptInputSimple.d.ts +2 -0
  75. package/build/esm/components/organisms/PromptInput/PromptInputSimple.js +3 -3
  76. package/build/esm/components/organisms/PromptInput/PromptInputSimple.js.map +1 -1
  77. package/build/esm/components/organisms/PromptInput/commandUtils.d.ts +13 -0
  78. package/build/esm/components/organisms/PromptInput/commandUtils.js +23 -0
  79. package/build/esm/components/organisms/PromptInput/commandUtils.js.map +1 -0
  80. package/build/esm/components/organisms/PromptInput/i18n/en.json +8 -0
  81. package/build/esm/components/organisms/PromptInput/i18n/index.d.ts +13 -0
  82. package/build/esm/components/organisms/PromptInput/i18n/index.js +6 -0
  83. package/build/esm/components/organisms/PromptInput/i18n/index.js.map +1 -0
  84. package/build/esm/components/organisms/PromptInput/i18n/ru.json +8 -0
  85. package/build/esm/components/organisms/PromptInput/index.d.ts +2 -1
  86. package/build/esm/components/organisms/PromptInput/index.js.map +1 -1
  87. package/build/esm/components/organisms/PromptInput/types.d.ts +1 -0
  88. package/build/esm/components/organisms/PromptInput/types.js.map +1 -1
  89. package/build/esm/components/organisms/PromptInput/usePromptCommands.d.ts +41 -0
  90. package/build/esm/components/organisms/PromptInput/usePromptCommands.js +219 -0
  91. package/build/esm/components/organisms/PromptInput/usePromptCommands.js.map +1 -0
  92. package/build/esm/components/organisms/PromptInput/usePromptInput.d.ts +10 -1
  93. package/build/esm/components/organisms/PromptInput/usePromptInput.js +101 -12
  94. package/build/esm/components/organisms/PromptInput/usePromptInput.js.map +1 -1
  95. package/build/esm/components/pages/AIStudioChat/AIStudioChat.js +139 -52
  96. package/build/esm/components/pages/AIStudioChat/AIStudioChat.js.map +1 -1
  97. package/build/esm/components/pages/AIStudioChat/request.d.ts +4 -0
  98. package/build/esm/components/pages/AIStudioChat/request.js +8 -0
  99. package/build/esm/components/pages/AIStudioChat/request.js.map +1 -0
  100. package/build/esm/components/pages/AIStudioChat/types.d.ts +5 -5
  101. package/build/esm/components/pages/AIStudioChat/types.js.map +1 -1
  102. package/build/esm/components/pages/ChatContainer/ChatContainer.js +12 -6
  103. package/build/esm/components/pages/ChatContainer/ChatContainer.js.map +1 -1
  104. package/build/esm/components/pages/ChatContainer/types.d.ts +1 -1
  105. package/build/esm/components/pages/ChatContainer/types.js.map +1 -1
  106. package/build/esm/components/pages/ChatContainer/useChatContainer.d.ts +1 -0
  107. package/build/esm/components/pages/ChatContainer/useChatContainer.js +5 -1
  108. package/build/esm/components/pages/ChatContainer/useChatContainer.js.map +1 -1
  109. package/build/esm/package.json +1 -1
  110. package/build/esm/types/index.d.ts +1 -0
  111. package/build/esm/types/index.js +1 -0
  112. package/build/esm/types/index.js.map +1 -1
  113. package/build/esm/types/messages.d.ts +3 -0
  114. package/build/esm/types/messages.js.map +1 -1
  115. package/build/esm/types/promptCommands.d.ts +44 -0
  116. package/build/esm/types/promptCommands.js +2 -0
  117. package/build/esm/types/promptCommands.js.map +1 -0
  118. package/package.json +1 -1
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeChatRequest = serializeChatRequest;
4
+ /** Resolve application mapping once and keep a serialized snapshot for retries. */
5
+ async function serializeChatRequest(request, data, transform, retryBody) {
6
+ if (retryBody !== undefined)
7
+ return retryBody;
8
+ const mapped = transform ? await transform(request, data) : request;
9
+ return mapped === false ? false : JSON.stringify(mapped);
10
+ }
11
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"../../../../../src","sources":["components/pages/AIStudioChat/request.ts"],"names":[],"mappings":";;AAKA,oDASC;AAVD,mFAAmF;AAC5E,KAAK,UAAU,oBAAoB,CACtC,OAAgC,EAChC,IAAiB,EACjB,SAAgD,EAChD,SAAkB;IAElB,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACpE,OAAO,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC7D,CAAC","sourcesContent":["import type {TSubmitData} from '../../../types';\n\nimport type {AIStudioChatProps} from './types';\n\n/** Resolve application mapping once and keep a serialized snapshot for retries. */\nexport async function serializeChatRequest(\n request: Record<string, unknown>,\n data: TSubmitData,\n transform: AIStudioChatProps['transformRequest'],\n retryBody?: string,\n): Promise<string | false> {\n if (retryBody !== undefined) return retryBody;\n const mapped = transform ? await transform(request, data) : request;\n return mapped === false ? false : JSON.stringify(mapped);\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { UseFileUploadStoreOptions } from "../../../hooks/useFileUploadStore.js";
2
- import type { TChatMessage } from "../../../types/index.js";
2
+ import type { TChatMessage, TSubmitData } from "../../../types/index.js";
3
3
  import type { InputContextMeta } from "../../molecules/InputContext/index.js";
4
4
  import type { ChatContainerProps } from "../ChatContainer/index.js";
5
5
  /**
@@ -36,11 +36,11 @@ export interface AIStudioChatProps extends Omit<ChatContainerProps, ManagedChatC
36
36
  /**
37
37
  * Called before each API request is made.
38
38
  * Return an object to merge into the request body for this specific send.
39
- * Return false/null/undefined to cancel the send entirely.
39
+ * Return false/null to cancel the send entirely.
40
40
  */
41
- onBeforeSend?: (params: {
42
- content: string;
43
- }) => Promise<Record<string, unknown> | false | null | void>;
41
+ onBeforeSend?: (params: TSubmitData) => Promise<Record<string, unknown> | false | null | void>;
42
+ /** Final request mapping, after file parameters. Return false to keep the draft. */
43
+ transformRequest?: (request: Record<string, unknown>, data: TSubmitData) => Record<string, unknown> | false | Promise<Record<string, unknown> | false>;
44
44
  /**
45
45
  * File upload options for prompt `InputContext` (`useFileUploadStore`).
46
46
  * The consumer fully owns the upload pipeline — no default is provided.
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["components/pages/AIStudioChat/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {UseFileUploadStoreOptions} from '../../../hooks/useFileUploadStore';\nimport type {TChatMessage} from '../../../types';\nimport type {InputContextMeta} from '../../molecules/InputContext';\nimport type {ChatContainerProps} from '../ChatContainer';\n\n/**\n * Props managed internally by AIStudioChat that are omitted from ChatContainerProps\n */\ntype ManagedChatContainerProps =\n | 'messages'\n | 'status'\n | 'error'\n | 'onSendMessage'\n | 'onCancel'\n | 'onRetry'\n | 'chats'\n | 'activeChat'\n | 'onSelectChat'\n | 'onCreateChat'\n | 'onDeleteChat'\n | 'onDeleteAllChats'\n | 'showHistory'\n | 'showNewChat';\n\n/**\n * Props for AIStudioChat component\n */\nexport interface AIStudioChatProps extends Omit<ChatContainerProps, ManagedChatContainerProps> {\n /** URL of the OpenAI-compatible streaming API endpoint */\n apiUrl: string;\n\n /** Initial messages to pre-populate the chat (e.g., for restoring a session) */\n initialMessages?: TChatMessage[];\n\n /** Enable multi-chat history panel (default: false) */\n showHistory?: boolean;\n\n /** Show new chat button in header (defaults to the value of showHistory) */\n showNewChat?: boolean;\n\n /** System prompt sent with every request */\n systemPrompt?: string;\n\n /** Additional fetch options applied to every API request (e.g., auth headers) */\n requestInit?: Omit<RequestInit, 'body' | 'method' | 'signal'>;\n\n /**\n * Extra fields merged into the request body on every send.\n * Use for assistantId, promptVariables, conversationId, etc.\n * Per-request overrides take precedence (returned from onBeforeSend).\n */\n extraRequestParams?: Record<string, unknown>;\n\n /**\n * Enable token usage tracking in stream responses (default: true).\n * Set to false to disable tracking and reduce payload size.\n */\n trackTokenUsage?: boolean;\n\n /**\n * Called before each API request is made.\n * Return an object to merge into the request body for this specific send.\n * Return false/null/undefined to cancel the send entirely.\n */\n onBeforeSend?: (params: {\n content: string;\n }) => Promise<Record<string, unknown> | false | null | void>;\n\n /**\n * File upload options for prompt `InputContext` (`useFileUploadStore`).\n * The consumer fully owns the upload pipeline — no default is provided.\n */\n fileUpload: UseFileUploadStoreOptions<InputContextMeta>;\n\n /** Title of the attachment file dialog (`InputContextProvider`). */\n fileDialogTitle?: string;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["components/pages/AIStudioChat/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {UseFileUploadStoreOptions} from '../../../hooks/useFileUploadStore';\nimport type {TChatMessage, TSubmitData} from '../../../types';\nimport type {InputContextMeta} from '../../molecules/InputContext';\nimport type {ChatContainerProps} from '../ChatContainer';\n\n/**\n * Props managed internally by AIStudioChat that are omitted from ChatContainerProps\n */\ntype ManagedChatContainerProps =\n | 'messages'\n | 'status'\n | 'error'\n | 'onSendMessage'\n | 'onCancel'\n | 'onRetry'\n | 'chats'\n | 'activeChat'\n | 'onSelectChat'\n | 'onCreateChat'\n | 'onDeleteChat'\n | 'onDeleteAllChats'\n | 'showHistory'\n | 'showNewChat';\n\n/**\n * Props for AIStudioChat component\n */\nexport interface AIStudioChatProps extends Omit<ChatContainerProps, ManagedChatContainerProps> {\n /** URL of the OpenAI-compatible streaming API endpoint */\n apiUrl: string;\n\n /** Initial messages to pre-populate the chat (e.g., for restoring a session) */\n initialMessages?: TChatMessage[];\n\n /** Enable multi-chat history panel (default: false) */\n showHistory?: boolean;\n\n /** Show new chat button in header (defaults to the value of showHistory) */\n showNewChat?: boolean;\n\n /** System prompt sent with every request */\n systemPrompt?: string;\n\n /** Additional fetch options applied to every API request (e.g., auth headers) */\n requestInit?: Omit<RequestInit, 'body' | 'method' | 'signal'>;\n\n /**\n * Extra fields merged into the request body on every send.\n * Use for assistantId, promptVariables, conversationId, etc.\n * Per-request overrides take precedence (returned from onBeforeSend).\n */\n extraRequestParams?: Record<string, unknown>;\n\n /**\n * Enable token usage tracking in stream responses (default: true).\n * Set to false to disable tracking and reduce payload size.\n */\n trackTokenUsage?: boolean;\n\n /**\n * Called before each API request is made.\n * Return an object to merge into the request body for this specific send.\n * Return false/null to cancel the send entirely.\n */\n onBeforeSend?: (params: TSubmitData) => Promise<Record<string, unknown> | false | null | void>;\n\n /** Final request mapping, after file parameters. Return false to keep the draft. */\n transformRequest?: (\n request: Record<string, unknown>,\n data: TSubmitData,\n ) => Record<string, unknown> | false | Promise<Record<string, unknown> | false>;\n\n /**\n * File upload options for prompt `InputContext` (`useFileUploadStore`).\n * The consumer fully owns the upload pipeline — no default is provided.\n */\n fileUpload: UseFileUploadStoreOptions<InputContextMeta>;\n\n /** Title of the attachment file dialog (`InputContextProvider`). */\n fileDialogTitle?: string;\n}\n"]}
@@ -52,11 +52,11 @@ function buildFinalPromptInputHeaderProps(args) {
52
52
  }
53
53
  function buildFinalPromptInputProps(args) {
54
54
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
55
- const { promptInputProps, onSendMessage, onCancel, status, contextItems, showContextIndicator, contextIndicatorProps, texts: textsArg, promptInputKey, qaMap, onValueChange, } = args;
55
+ const { promptInputProps, onSendMessage, onCancel, status, contextItems, showContextIndicator, contextIndicatorProps, texts: textsArg, promptInputKey, commandsResetKey, qaMap, onValueChange, } = args;
56
56
  const texts = textsArg !== null && textsArg !== void 0 ? textsArg : {};
57
57
  const _s = (_a = promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.bodyProps) !== null && _a !== void 0 ? _a : {}, { autoFocusOnNewChat: _autoFocusOnNewChat, autoFocusOnChatSelect: _autoFocusOnChatSelect } = _s, restBodyProps = tslib_1.__rest(_s, ["autoFocusOnNewChat", "autoFocusOnChatSelect"]);
58
58
  const suggestionsProps = mergePromptInputSuggestionsProps(promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.suggestionsProps, texts.promptSuggestTitle);
59
- return Object.assign(Object.assign({}, promptInputProps), { onValueChange: onValueChange || (promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.onValueChange)
59
+ return Object.assign(Object.assign({}, promptInputProps), { commandsResetKey, onValueChange: onValueChange || (promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.onValueChange)
60
60
  ? (value) => {
61
61
  var _a;
62
62
  onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(value);
@@ -113,6 +113,8 @@ function ChatContainer(props) {
113
113
  activeChatId: (_a = hookState.activeChat) === null || _a === void 0 ? void 0 : _a.id,
114
114
  promptInputKey: hookState.promptInputKey,
115
115
  });
116
+ const promptApiRef = (0, react_1.useRef)(null);
117
+ const mergedPromptApiRef = (0, uikit_1.useForkRef)(promptApiRef, promptInputProps === null || promptInputProps === void 0 ? void 0 : promptInputProps.apiRef);
116
118
  const wrappedOnSendMessage = (0, react_1.useCallback)(async (...args) => {
117
119
  mascotState.notifyActivity();
118
120
  return onSendMessage(...args);
@@ -237,8 +239,9 @@ function ChatContainer(props) {
237
239
  ((_l = welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.alignment) === null || _l === void 0 ? void 0 : _l.hero) === undefined
238
240
  ? { hero: 'center' }
239
241
  : {})), 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 : (0, i18n_1.i18n)('empty-state-show-more'), onSuggestionClick: async (content, suggestionId, suggestionData) => {
242
+ var _a;
240
243
  const suggestion = toSuggestionContext(suggestionId, suggestionData);
241
- await wrappedOnSendMessage(Object.assign({ content }, (suggestion && { suggestion })));
244
+ await ((_a = promptApiRef.current) === null || _a === void 0 ? void 0 : _a.submit(Object.assign({ content }, (suggestion && { suggestion }))));
242
245
  } });
243
246
  }, [
244
247
  welcomeConfig,
@@ -282,7 +285,7 @@ function ChatContainer(props) {
282
285
  ]);
283
286
  // Build props for PromptInput
284
287
  const finalPromptInputProps = (0, react_1.useMemo)(() => buildFinalPromptInputProps({
285
- promptInputProps,
288
+ promptInputProps: Object.assign(Object.assign({}, promptInputProps), { apiRef: mergedPromptApiRef }),
286
289
  onSendMessage: wrappedOnSendMessage,
287
290
  onCancel: wrappedOnCancel,
288
291
  status,
@@ -291,6 +294,7 @@ function ChatContainer(props) {
291
294
  contextIndicatorProps,
292
295
  texts,
293
296
  promptInputKey: hookState.promptInputKey,
297
+ commandsResetKey: hookState.commandsResetKey,
294
298
  qaMap,
295
299
  onValueChange: mascotConfig ? mascotState.handleValueChange : undefined,
296
300
  }), [
@@ -301,7 +305,9 @@ function ChatContainer(props) {
301
305
  showContextIndicator,
302
306
  contextIndicatorProps,
303
307
  promptInputProps,
308
+ mergedPromptApiRef,
304
309
  hookState.promptInputKey,
310
+ hookState.commandsResetKey,
305
311
  qaMap,
306
312
  texts.promptPlaceholder,
307
313
  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;
@@ -10,7 +10,7 @@ const Header_1 = require("../../organisms/Header/index.js");
10
10
  * @returns object with state and handlers
11
11
  */
12
12
  function useChatContainer(props) {
13
- var _a, _b, _c, _d;
13
+ var _a, _b, _c, _d, _e;
14
14
  const { messages = [], activeChat, onCreateChat, onClose, onFold, onSelectChat, showHistory = true, showNewChat = true, showFolding = false, showClose = false, promptInputProps, headerProps, } = props;
15
15
  const onHistoryToggle = headerProps === null || headerProps === void 0 ? void 0 : headerProps.onHistoryToggle;
16
16
  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;
@@ -26,6 +26,7 @@ function useChatContainer(props) {
26
26
  }, []);
27
27
  // Key incremented on each new chat to remount PromptInput with autofocus
28
28
  const [promptInputKey, setPromptInputKey] = (0, react_1.useState)(0);
29
+ const [commandsRevision, setCommandsRevision] = (0, react_1.useState)(0);
29
30
  // Determine view for ChatContent (empty or chat)
30
31
  const chatContentView = (0, react_1.useMemo)(() => {
31
32
  // If there is an active chat (selected from history), show chat view
@@ -39,6 +40,7 @@ function useChatContainer(props) {
39
40
  // Handler for creating new chat
40
41
  const handleNewChat = (0, react_1.useCallback)(() => {
41
42
  onCreateChat === null || onCreateChat === void 0 ? void 0 : onCreateChat();
43
+ setCommandsRevision((revision) => revision + 1);
42
44
  if (autoFocusOnNewChat) {
43
45
  setPromptInputKey((prev) => prev + 1);
44
46
  }
@@ -60,6 +62,7 @@ function useChatContainer(props) {
60
62
  const handleSelectChat = (0, react_1.useCallback)((chat) => {
61
63
  if (chat) {
62
64
  onSelectChat === null || onSelectChat === void 0 ? void 0 : onSelectChat(chat);
65
+ setCommandsRevision((revision) => revision + 1);
63
66
  setIsHistoryOpen(false);
64
67
  if (autoFocusOnChatSelect) {
65
68
  setPromptInputKey((prev) => prev + 1);
@@ -93,6 +96,7 @@ function useChatContainer(props) {
93
96
  isHistoryOpen,
94
97
  activeChat,
95
98
  promptInputKey,
99
+ 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]),
96
100
  // Refs
97
101
  historyButtonRef,
98
102
  // Handlers
@@ -1 +1 @@
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\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 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 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\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"]}
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"]}
@@ -1 +1 @@
1
- {"version":"2.24.1-beta.883c85d04b93d8521b2733baa3e86da20249b4e7.0","type":"commonjs","sideEffects":["*.css","*.scss"]}
1
+ {"version":"2.25.0","type":"commonjs","sideEffects":["*.css","*.scss"]}
@@ -1,4 +1,5 @@
1
1
  export * from "./messages.js";
2
+ export * from "./promptCommands.js";
2
3
  export * from "./chat.js";
3
4
  export * from "./tool.js";
4
5
  export * from "./common.js";
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./messages.js"), exports);
5
+ tslib_1.__exportStar(require("./promptCommands.js"), exports);
5
6
  tslib_1.__exportStar(require("./chat.js"), exports);
6
7
  tslib_1.__exportStar(require("./tool.js"), exports);
7
8
  tslib_1.__exportStar(require("./common.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["types/index.ts"],"names":[],"mappings":";;;AAAA,wDAA2B;AAC3B,oDAAuB;AACvB,oDAAuB;AACvB,sDAAyB;AACzB,sDAAyB","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,wDAA2B;AAC3B,8DAAiC;AACjC,oDAAuB;AACvB,oDAAuB;AACvB,sDAAyB;AACzB,sDAAyB","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;