@gravity-ui/markdown-editor 13.17.1 → 13.18.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 (193) hide show
  1. package/README.md +2 -0
  2. package/build/cjs/bundle/config/action-names.d.ts +1 -1
  3. package/build/cjs/bundle/config/action-names.js +1 -0
  4. package/build/cjs/bundle/config/icons.d.ts +1 -1
  5. package/build/cjs/bundle/config/icons.js +3 -0
  6. package/build/cjs/bundle/config/wysiwyg.d.ts +1 -0
  7. package/build/cjs/bundle/config/wysiwyg.js +13 -1
  8. package/build/cjs/extensions/markdown/Table/actions/innerActions.d.ts +1 -1
  9. package/build/cjs/extensions/yfm/GPT/ErrorScreen/ErrorScreen.css +18 -0
  10. package/build/cjs/extensions/yfm/GPT/ErrorScreen/ErrorScreen.d.ts +8 -0
  11. package/build/cjs/extensions/yfm/GPT/ErrorScreen/ErrorScreen.js +21 -0
  12. package/build/cjs/extensions/yfm/GPT/ErrorScreen/types.d.ts +14 -0
  13. package/build/cjs/extensions/yfm/GPT/ErrorScreen/types.js +2 -0
  14. package/build/cjs/extensions/yfm/GPT/GptDialog/GptDialog.css +75 -0
  15. package/build/cjs/extensions/yfm/GPT/GptDialog/GptDialog.d.ts +28 -0
  16. package/build/cjs/extensions/yfm/GPT/GptDialog/GptDialog.js +102 -0
  17. package/build/cjs/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.css +22 -0
  18. package/build/cjs/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.d.ts +3 -0
  19. package/build/cjs/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.js +21 -0
  20. package/build/cjs/extensions/yfm/GPT/IconRefuge/IconRefuge.classname.d.ts +1 -0
  21. package/build/cjs/extensions/yfm/GPT/IconRefuge/IconRefuge.classname.js +5 -0
  22. package/build/cjs/extensions/yfm/GPT/IconRefuge/IconRefuge.css +8 -0
  23. package/build/cjs/extensions/yfm/GPT/IconRefuge/IconRefuge.d.ts +14 -0
  24. package/build/cjs/extensions/yfm/GPT/IconRefuge/IconRefuge.js +28 -0
  25. package/build/cjs/extensions/yfm/GPT/IconRefuge/index.d.ts +2 -0
  26. package/build/cjs/extensions/yfm/GPT/IconRefuge/index.js +5 -0
  27. package/build/cjs/extensions/yfm/GPT/PresetList/PresetList.d.ts +9 -0
  28. package/build/cjs/extensions/yfm/GPT/PresetList/PresetList.js +29 -0
  29. package/build/cjs/extensions/yfm/GPT/PresetList/Presetlist.css +6 -0
  30. package/build/cjs/extensions/yfm/GPT/actions.d.ts +2 -0
  31. package/build/cjs/extensions/yfm/GPT/actions.js +14 -0
  32. package/build/cjs/extensions/yfm/GPT/commands.d.ts +2 -0
  33. package/build/cjs/extensions/yfm/GPT/commands.js +13 -0
  34. package/build/cjs/extensions/yfm/GPT/constants.d.ts +13 -0
  35. package/build/cjs/extensions/yfm/GPT/constants.js +15 -0
  36. package/build/cjs/extensions/yfm/GPT/gptExtension/gptExtension.d.ts +13 -0
  37. package/build/cjs/extensions/yfm/GPT/gptExtension/gptExtension.js +18 -0
  38. package/build/cjs/extensions/yfm/GPT/gptExtension/view.css +17 -0
  39. package/build/cjs/extensions/yfm/GPT/gptExtension/view.d.ts +36 -0
  40. package/build/cjs/extensions/yfm/GPT/gptExtension/view.js +171 -0
  41. package/build/cjs/extensions/yfm/GPT/hooks/useGpt.d.ts +27 -0
  42. package/build/cjs/extensions/yfm/GPT/hooks/useGpt.js +148 -0
  43. package/build/cjs/extensions/yfm/GPT/hooks/useGptHotKeys.d.ts +2 -0
  44. package/build/cjs/extensions/yfm/GPT/hooks/useGptHotKeys.js +8 -0
  45. package/build/cjs/extensions/yfm/GPT/hooks/useOverflowingHorizontalItems.d.ts +13 -0
  46. package/build/cjs/extensions/yfm/GPT/hooks/useOverflowingHorizontalItems.js +70 -0
  47. package/build/cjs/extensions/yfm/GPT/hooks/usePresetList.d.ts +14 -0
  48. package/build/cjs/extensions/yfm/GPT/hooks/usePresetList.js +36 -0
  49. package/build/cjs/extensions/yfm/GPT/index.d.ts +2 -0
  50. package/build/cjs/extensions/yfm/GPT/index.js +5 -0
  51. package/build/cjs/extensions/yfm/GPT/plugin.d.ts +13 -0
  52. package/build/cjs/extensions/yfm/GPT/plugin.js +47 -0
  53. package/build/cjs/extensions/yfm/GPT/toolbar.d.ts +3 -0
  54. package/build/cjs/extensions/yfm/GPT/toolbar.js +22 -0
  55. package/build/cjs/extensions/yfm/GPT/utils.d.ts +13 -0
  56. package/build/cjs/extensions/yfm/GPT/utils.js +31 -0
  57. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/actions.d.ts +1 -1
  58. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/actions.js +0 -8
  59. package/build/cjs/extensions/yfm/index.d.ts +1 -0
  60. package/build/cjs/extensions/yfm/index.js +1 -0
  61. package/build/cjs/i18n/gpt/dialog/en.json +16 -0
  62. package/build/cjs/i18n/gpt/dialog/index.d.ts +19 -0
  63. package/build/cjs/i18n/gpt/dialog/index.js +8 -0
  64. package/build/cjs/i18n/gpt/dialog/ru.json +16 -0
  65. package/build/cjs/i18n/gpt/errors/en.json +5 -0
  66. package/build/cjs/i18n/gpt/errors/index.d.ts +8 -0
  67. package/build/cjs/i18n/gpt/errors/index.js +8 -0
  68. package/build/cjs/i18n/gpt/errors/ru.json +5 -0
  69. package/build/cjs/i18n/gpt/extension/en.json +6 -0
  70. package/build/cjs/i18n/gpt/extension/index.d.ts +9 -0
  71. package/build/cjs/i18n/gpt/extension/index.js +8 -0
  72. package/build/cjs/i18n/gpt/extension/ru.json +6 -0
  73. package/build/cjs/i18n/gpt/loading/en.json +3 -0
  74. package/build/cjs/i18n/gpt/loading/index.d.ts +6 -0
  75. package/build/cjs/i18n/gpt/loading/index.js +8 -0
  76. package/build/cjs/i18n/gpt/loading/ru.json +3 -0
  77. package/build/cjs/i18n/menubar/en.json +1 -0
  78. package/build/cjs/i18n/menubar/index.d.ts +2 -1
  79. package/build/cjs/i18n/menubar/ru.json +1 -0
  80. package/build/cjs/icons/GPT.d.ts +2 -0
  81. package/build/cjs/icons/GPT.js +22 -0
  82. package/build/cjs/icons/GPTLoading.d.ts +2 -0
  83. package/build/cjs/icons/GPTLoading.js +12 -0
  84. package/build/cjs/icons/index.d.ts +3 -1
  85. package/build/cjs/icons/index.js +5 -1
  86. package/build/cjs/react-utils/useAutoFocus.d.ts +1 -1
  87. package/build/cjs/react-utils/useAutoFocus.js +2 -2
  88. package/build/cjs/table-utils/commands/appendColumn.js +42 -33
  89. package/build/cjs/table-utils/commands/appendRow.js +40 -22
  90. package/build/cjs/table-utils/commands/removeColumn.js +18 -20
  91. package/build/cjs/table-utils/commands/removeRow.js +12 -9
  92. package/build/cjs/table-utils/table-desc.d.ts +53 -0
  93. package/build/cjs/table-utils/table-desc.js +149 -0
  94. package/build/cjs/table-utils/utils.d.ts +1 -1
  95. package/build/cjs/table-utils/utils.js +19 -12
  96. package/build/cjs/version.js +1 -1
  97. package/build/esm/bundle/config/action-names.d.ts +1 -1
  98. package/build/esm/bundle/config/action-names.js +1 -0
  99. package/build/esm/bundle/config/icons.d.ts +1 -1
  100. package/build/esm/bundle/config/icons.js +2 -0
  101. package/build/esm/bundle/config/wysiwyg.d.ts +1 -0
  102. package/build/esm/bundle/config/wysiwyg.js +12 -0
  103. package/build/esm/extensions/markdown/Table/actions/innerActions.d.ts +1 -1
  104. package/build/esm/extensions/yfm/GPT/ErrorScreen/ErrorScreen.css +18 -0
  105. package/build/esm/extensions/yfm/GPT/ErrorScreen/ErrorScreen.d.ts +9 -0
  106. package/build/esm/extensions/yfm/GPT/ErrorScreen/ErrorScreen.js +17 -0
  107. package/build/esm/extensions/yfm/GPT/ErrorScreen/types.d.ts +14 -0
  108. package/build/esm/extensions/yfm/GPT/ErrorScreen/types.js +1 -0
  109. package/build/esm/extensions/yfm/GPT/GptDialog/GptDialog.css +75 -0
  110. package/build/esm/extensions/yfm/GPT/GptDialog/GptDialog.d.ts +29 -0
  111. package/build/esm/extensions/yfm/GPT/GptDialog/GptDialog.js +98 -0
  112. package/build/esm/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.css +22 -0
  113. package/build/esm/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.d.ts +4 -0
  114. package/build/esm/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.js +17 -0
  115. package/build/esm/extensions/yfm/GPT/IconRefuge/IconRefuge.classname.d.ts +1 -0
  116. package/build/esm/extensions/yfm/GPT/IconRefuge/IconRefuge.classname.js +2 -0
  117. package/build/esm/extensions/yfm/GPT/IconRefuge/IconRefuge.css +8 -0
  118. package/build/esm/extensions/yfm/GPT/IconRefuge/IconRefuge.d.ts +15 -0
  119. package/build/esm/extensions/yfm/GPT/IconRefuge/IconRefuge.js +25 -0
  120. package/build/esm/extensions/yfm/GPT/IconRefuge/index.d.ts +2 -0
  121. package/build/esm/extensions/yfm/GPT/IconRefuge/index.js +1 -0
  122. package/build/esm/extensions/yfm/GPT/PresetList/PresetList.d.ts +10 -0
  123. package/build/esm/extensions/yfm/GPT/PresetList/PresetList.js +25 -0
  124. package/build/esm/extensions/yfm/GPT/PresetList/Presetlist.css +6 -0
  125. package/build/esm/extensions/yfm/GPT/actions.d.ts +2 -0
  126. package/build/esm/extensions/yfm/GPT/actions.js +10 -0
  127. package/build/esm/extensions/yfm/GPT/commands.d.ts +2 -0
  128. package/build/esm/extensions/yfm/GPT/commands.js +9 -0
  129. package/build/esm/extensions/yfm/GPT/constants.d.ts +13 -0
  130. package/build/esm/extensions/yfm/GPT/constants.js +12 -0
  131. package/build/esm/extensions/yfm/GPT/gptExtension/gptExtension.d.ts +13 -0
  132. package/build/esm/extensions/yfm/GPT/gptExtension/gptExtension.js +14 -0
  133. package/build/esm/extensions/yfm/GPT/gptExtension/view.css +17 -0
  134. package/build/esm/extensions/yfm/GPT/gptExtension/view.d.ts +37 -0
  135. package/build/esm/extensions/yfm/GPT/gptExtension/view.js +167 -0
  136. package/build/esm/extensions/yfm/GPT/hooks/useGpt.d.ts +27 -0
  137. package/build/esm/extensions/yfm/GPT/hooks/useGpt.js +144 -0
  138. package/build/esm/extensions/yfm/GPT/hooks/useGptHotKeys.d.ts +2 -0
  139. package/build/esm/extensions/yfm/GPT/hooks/useGptHotKeys.js +4 -0
  140. package/build/esm/extensions/yfm/GPT/hooks/useOverflowingHorizontalItems.d.ts +13 -0
  141. package/build/esm/extensions/yfm/GPT/hooks/useOverflowingHorizontalItems.js +65 -0
  142. package/build/esm/extensions/yfm/GPT/hooks/usePresetList.d.ts +14 -0
  143. package/build/esm/extensions/yfm/GPT/hooks/usePresetList.js +32 -0
  144. package/build/esm/extensions/yfm/GPT/index.d.ts +2 -0
  145. package/build/esm/extensions/yfm/GPT/index.js +2 -0
  146. package/build/esm/extensions/yfm/GPT/plugin.d.ts +13 -0
  147. package/build/esm/extensions/yfm/GPT/plugin.js +43 -0
  148. package/build/esm/extensions/yfm/GPT/toolbar.d.ts +3 -0
  149. package/build/esm/extensions/yfm/GPT/toolbar.js +18 -0
  150. package/build/esm/extensions/yfm/GPT/utils.d.ts +13 -0
  151. package/build/esm/extensions/yfm/GPT/utils.js +23 -0
  152. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/actions.d.ts +1 -1
  153. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/actions.js +1 -9
  154. package/build/esm/extensions/yfm/index.d.ts +1 -0
  155. package/build/esm/extensions/yfm/index.js +1 -0
  156. package/build/esm/i18n/gpt/dialog/en.json +16 -0
  157. package/build/esm/i18n/gpt/dialog/index.d.ts +19 -0
  158. package/build/esm/i18n/gpt/dialog/index.js +4 -0
  159. package/build/esm/i18n/gpt/dialog/ru.json +16 -0
  160. package/build/esm/i18n/gpt/errors/en.json +5 -0
  161. package/build/esm/i18n/gpt/errors/index.d.ts +8 -0
  162. package/build/esm/i18n/gpt/errors/index.js +4 -0
  163. package/build/esm/i18n/gpt/errors/ru.json +5 -0
  164. package/build/esm/i18n/gpt/extension/en.json +6 -0
  165. package/build/esm/i18n/gpt/extension/index.d.ts +9 -0
  166. package/build/esm/i18n/gpt/extension/index.js +4 -0
  167. package/build/esm/i18n/gpt/extension/ru.json +6 -0
  168. package/build/esm/i18n/gpt/loading/en.json +3 -0
  169. package/build/esm/i18n/gpt/loading/index.d.ts +6 -0
  170. package/build/esm/i18n/gpt/loading/index.js +4 -0
  171. package/build/esm/i18n/gpt/loading/ru.json +3 -0
  172. package/build/esm/i18n/menubar/en.json +1 -0
  173. package/build/esm/i18n/menubar/index.d.ts +2 -1
  174. package/build/esm/i18n/menubar/ru.json +1 -0
  175. package/build/esm/icons/GPT.d.ts +2 -0
  176. package/build/esm/icons/GPT.js +19 -0
  177. package/build/esm/icons/GPTLoading.d.ts +2 -0
  178. package/build/esm/icons/GPTLoading.js +9 -0
  179. package/build/esm/icons/index.d.ts +3 -1
  180. package/build/esm/icons/index.js +3 -1
  181. package/build/esm/react-utils/useAutoFocus.d.ts +1 -1
  182. package/build/esm/react-utils/useAutoFocus.js +2 -2
  183. package/build/esm/table-utils/commands/appendColumn.js +44 -35
  184. package/build/esm/table-utils/commands/appendRow.js +42 -24
  185. package/build/esm/table-utils/commands/removeColumn.js +18 -20
  186. package/build/esm/table-utils/commands/removeRow.js +14 -11
  187. package/build/esm/table-utils/table-desc.d.ts +53 -0
  188. package/build/esm/table-utils/table-desc.js +144 -0
  189. package/build/esm/table-utils/utils.d.ts +1 -1
  190. package/build/esm/table-utils/utils.js +18 -12
  191. package/build/esm/version.js +1 -1
  192. package/build/styles.css +146 -0
  193. package/package.json +2 -1
@@ -0,0 +1,98 @@
1
+ import React, { useCallback, useRef, useState } from 'react';
2
+ import { ArrowRight, ArrowRotateLeft, ThumbsDown, ThumbsUp } from '@gravity-ui/icons';
3
+ import { ActionTooltip, Alert, Button, Icon, TextInput } from '@gravity-ui/uikit';
4
+ import { cn } from '../../../../classname';
5
+ import { i18n } from '../../../../i18n/gpt/dialog';
6
+ import gptIcon from '../../../../icons/GPT';
7
+ import { useAutoFocus } from '../../../../react-utils/useAutoFocus';
8
+ import { ErrorScreen } from '../ErrorScreen/ErrorScreen';
9
+ import { IconRefuge } from '../IconRefuge/IconRefuge';
10
+ import { PresetList } from '../PresetList/PresetList';
11
+ import { gptHotKeys } from '../constants';
12
+ import { useGpt } from '../hooks/useGpt';
13
+ import { useGptHotKeys } from '../hooks/useGptHotKeys';
14
+ import { getAlertGptInfo, getDisableReplaceButtonText, getInputPlaceHolder } from '../utils';
15
+ import { LoadingScreen } from './LoadingScreen/LoadingScreen';
16
+ import './GptDialog.css';
17
+ export const cnGptDialog = cn('gpt-dialog');
18
+ export const GptDialog = ({ markup, answerRender, promptPresets, disablePromptPresets, customPromptPlaceholder, disabledPromptPlaceholder, onCustomPromptApply, onPromptPresetClick, onTryAgain, onApplyResult, onClose, onLike, onDislike, onUpdate, gptAlertProps, }) => {
19
+ const { answer, customPrompt, loading, mode, feedbackType, feedbackTypeLoading, handleLike, handleDislike, handleCustomPromptUpdate, handleCustomPromptKeyPress, handleCustomPromptApply, handlePresetClick, handleTryAgain, handleFreshStart, handleApplyResult, showAnswer, showError, showAnswerActions, showTryAgainButton, } = useGpt({
20
+ markup,
21
+ promptPresets,
22
+ onLike,
23
+ onDislike,
24
+ onCustomPromptApply,
25
+ onPromptPresetClick,
26
+ onTryAgain,
27
+ onApplyResult,
28
+ onUpdate,
29
+ });
30
+ const gptAlert = gptAlertProps;
31
+ const customPromptContainerRef = useRef(null);
32
+ const [showedGptAlert, setShowedGptAlert] = useState(gptAlert === null || gptAlert === void 0 ? void 0 : gptAlert.showedGptAlert);
33
+ const { alertMessage, alertTheme, alertClassName } = getAlertGptInfo(gptAlert);
34
+ const onCloseAlert = useCallback(() => {
35
+ var _a;
36
+ if (gptAlert) {
37
+ gptAlert.showedGptAlert = false;
38
+ }
39
+ (_a = gptAlert === null || gptAlert === void 0 ? void 0 : gptAlert.onCloseGptAlert) === null || _a === void 0 ? void 0 : _a.call(gptAlert);
40
+ setShowedGptAlert(false);
41
+ }, [gptAlert]);
42
+ useAutoFocus(customPromptContainerRef, [showAnswer]);
43
+ useGptHotKeys(gptHotKeys.tryAgainGpt, handleTryAgain);
44
+ useGptHotKeys(gptHotKeys.freshStartGpt, handleFreshStart);
45
+ useGptHotKeys(gptHotKeys.applyResultGpt, handleApplyResult);
46
+ const replaceButtonText = getDisableReplaceButtonText(disablePromptPresets);
47
+ const inputPlaceholderText = getInputPlaceHolder(disablePromptPresets, disabledPromptPlaceholder, customPromptPlaceholder);
48
+ const tryAgainButton = (React.createElement(ActionTooltip, { hotkey: gptHotKeys.tryAgainGpt, title: i18n('try-again') },
49
+ React.createElement(Button, { className: cnGptDialog('try-again-button'), view: "normal", size: "m", onClick: handleTryAgain },
50
+ React.createElement(Icon, { data: ArrowRotateLeft, size: 16 }),
51
+ i18n('try-again'))));
52
+ let content = null;
53
+ if (loading) {
54
+ content = React.createElement(LoadingScreen, null);
55
+ }
56
+ else if (showError) {
57
+ content = React.createElement(ErrorScreen, { onRetry: handleTryAgain, onStartAgain: handleFreshStart });
58
+ }
59
+ else {
60
+ content = (React.createElement(React.Fragment, null,
61
+ React.createElement("div", { className: cnGptDialog('header') },
62
+ React.createElement("div", { className: cnGptDialog('header-top') },
63
+ React.createElement(IconRefuge, { containerClassName: cnGptDialog('gpt-icon'), data: gptIcon, refugeSize: 28, size: 16 }),
64
+ (mode === 'only-custom' || mode === 'custom-and-presets') &&
65
+ (showAnswer ? (React.createElement("span", { className: cnGptDialog('answer-title') }, i18n('answer-title'))) : (React.createElement("div", { className: cnGptDialog('custom-prompt') },
66
+ React.createElement(TextInput, { controlRef: customPromptContainerRef, view: "clear", size: "m", className: cnGptDialog('custom-prompt-input'), placeholder: inputPlaceholderText, onKeyPress: handleCustomPromptKeyPress, onUpdate: handleCustomPromptUpdate }),
67
+ React.createElement(Button, { className: cnGptDialog('custom-prompt-ask-button'), view: "normal", size: "s", disabled: !customPrompt, onClick: handleCustomPromptApply },
68
+ React.createElement(Icon, { data: ArrowRight, size: 16 }))))),
69
+ mode === 'only-presets' && (React.createElement("div", { className: cnGptDialog('alone-presets') },
70
+ React.createElement("span", { className: cnGptDialog('alone-presets-text') }, i18n('only-presets-title'))))),
71
+ (mode === 'custom-and-presets' || mode === 'only-presets') &&
72
+ ((showTryAgainButton && (React.createElement("div", { className: cnGptDialog('header-bottom') },
73
+ tryAgainButton,
74
+ React.createElement(ActionTooltip, { title: i18n('fresh-start-button'), hotkey: gptHotKeys.freshStartGpt },
75
+ React.createElement(Button, { className: cnGptDialog('back-to-start'), view: "normal", size: "m", onClick: handleFreshStart }, i18n('fresh-start-button')))))) ||
76
+ (!disablePromptPresets && (React.createElement("div", { className: cnGptDialog('header-bottom') },
77
+ React.createElement(PresetList, { disablePromptPresets: disablePromptPresets, promptPresets: promptPresets, onPresetClick: handlePresetClick })))) ||
78
+ (disablePromptPresets && showedGptAlert && (React.createElement(Alert, { theme: alertTheme, message: alertMessage, align: "center", className: cnGptDialog('description-alert', alertClassName), onClose: onCloseAlert }))))),
79
+ showAnswer && (React.createElement(React.Fragment, null,
80
+ React.createElement("div", { className: cnGptDialog('body') },
81
+ React.createElement("div", { className: cnGptDialog('answer') }, answerRender(answer))),
82
+ React.createElement("div", { className: cnGptDialog('footer') },
83
+ showAnswerActions && (React.createElement("div", { className: cnGptDialog('answer-actions') },
84
+ React.createElement(Button, { className: cnGptDialog('like-button'), view: "normal", size: "m", onClick: handleLike, selected: feedbackType === 'like', loading: feedbackTypeLoading === 'like' },
85
+ React.createElement(Icon, { data: ThumbsUp, size: 16 })),
86
+ React.createElement(Button, { className: cnGptDialog('dislike-button'), view: "normal", size: "m", onClick: handleDislike, selected: feedbackType === 'dislike', loading: feedbackTypeLoading === 'dislike' },
87
+ React.createElement(Icon, { data: ThumbsDown, size: 16 })),
88
+ feedbackType && (React.createElement("span", { className: cnGptDialog('feedback-message') }, i18n('feedback-message'))))),
89
+ React.createElement(ActionTooltip, { title: i18n('close-button'), hotkey: gptHotKeys.closeGpt },
90
+ React.createElement(Button, { className: cnGptDialog('close-button'), view: "flat", size: "m", onClick: onClose }, i18n('close-button'))),
91
+ React.createElement(ActionTooltip, { title: replaceButtonText, hotkey: gptHotKeys.applyResultGpt },
92
+ React.createElement(Button, { className: cnGptDialog('apply-button'), view: "action", size: "m", onClick: handleApplyResult }, replaceButtonText)))))));
93
+ }
94
+ return React.createElement("div", { className: cnGptDialog() },
95
+ " ",
96
+ content,
97
+ " ");
98
+ };
@@ -0,0 +1,22 @@
1
+ .g-md-gpt-dialog-loading-screen__header {
2
+ display: flex;
3
+ align-items: center;
4
+ margin-bottom: 8px;
5
+ }
6
+ .g-md-gpt-dialog-loading-screen__icon {
7
+ margin-right: 4px;
8
+ }
9
+ .g-md-gpt-dialog-loading-screen__text {
10
+ margin-right: 8px;
11
+ font-size: var(--g-text-body-2-font-size);
12
+ font-weight: 500;
13
+ }
14
+ .g-md-gpt-dialog-loading-screen__skeleton-small-button {
15
+ width: 90px;
16
+ height: 28px;
17
+ margin-right: 8px;
18
+ }
19
+ .g-md-gpt-dialog-loading-screen__skeleton-medium-button {
20
+ width: 120px;
21
+ height: 28px;
22
+ }
@@ -0,0 +1,4 @@
1
+ import type { FC } from 'react';
2
+ import './LoadingScreen.css';
3
+ export declare const cnGptDialogLoadingScreen: import("@bem-react/classname").ClassNameFormatter;
4
+ export declare const LoadingScreen: FC;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { cn } from '@bem-react/classname';
3
+ import { Skeleton } from '@gravity-ui/uikit';
4
+ import { i18n } from '../../../../../i18n/gpt/loading';
5
+ import GPTLoading from '../../../../../icons/GPTLoading';
6
+ import { IconRefuge } from '../../IconRefuge/IconRefuge';
7
+ import './LoadingScreen.css';
8
+ export const cnGptDialogLoadingScreen = cn('gpt-dialog-loading-screen');
9
+ export const LoadingScreen = () => {
10
+ return (React.createElement("div", { className: cnGptDialogLoadingScreen() },
11
+ React.createElement("div", { className: cnGptDialogLoadingScreen('header') },
12
+ React.createElement(IconRefuge, { containerClassName: cnGptDialogLoadingScreen('icon'), data: GPTLoading, refugeSize: 28, size: 20 }),
13
+ React.createElement("span", { className: cnGptDialogLoadingScreen('text') }, i18n('loading-text'))),
14
+ React.createElement("div", { className: cnGptDialogLoadingScreen('skeleton') },
15
+ React.createElement(Skeleton, { className: cnGptDialogLoadingScreen('skeleton-small-button') }),
16
+ React.createElement(Skeleton, { className: cnGptDialogLoadingScreen('skeleton-medium-button') }))));
17
+ };
@@ -0,0 +1 @@
1
+ export declare const cnIconRefuge: import("@bem-react/classname").ClassNameFormatter;
@@ -0,0 +1,2 @@
1
+ import { cn } from '@bem-react/classname';
2
+ export const cnIconRefuge = cn('icon-refuge');
@@ -0,0 +1,8 @@
1
+ .icon-refuge {
2
+ display: inline-flex;
3
+ justify-content: center;
4
+ align-items: center;
5
+ }
6
+ .icon-refuge_inline {
7
+ display: inline-flex;
8
+ }
@@ -0,0 +1,15 @@
1
+ import type { FC } from 'react';
2
+ import type { IconRefugeProps } from './IconRefuge.types';
3
+ import './IconRefuge.css';
4
+ /**
5
+ * Creates a div wrapper above the icon, which sets the min-width and min-height
6
+ * equal to its refugeSize prop, puts the original icon in the middle and
7
+ * proxies the rest of the propses to it.
8
+ *
9
+ * The component is made in order to add margins to icons that have
10
+ * margins are indented, but their svg exactly wrap around the edges of the image
11
+ *
12
+ * It seems that all icons will be square, if not, then you can simply add
13
+ * refugeWidth and refugeHeight
14
+ */
15
+ export declare const IconRefuge: FC<IconRefugeProps>;
@@ -0,0 +1,25 @@
1
+ import { __rest } from "tslib";
2
+ import React from 'react';
3
+ import { Icon } from '@gravity-ui/uikit';
4
+ import { cnIconRefuge } from './IconRefuge.classname';
5
+ import './IconRefuge.css';
6
+ /**
7
+ * Creates a div wrapper above the icon, which sets the min-width and min-height
8
+ * equal to its refugeSize prop, puts the original icon in the middle and
9
+ * proxies the rest of the propses to it.
10
+ *
11
+ * The component is made in order to add margins to icons that have
12
+ * margins are indented, but their svg exactly wrap around the edges of the image
13
+ *
14
+ * It seems that all icons will be square, if not, then you can simply add
15
+ * refugeWidth and refugeHeight
16
+ */
17
+ export const IconRefuge = (_a) => {
18
+ var { refugeSize, containerClassName, containerStyle, widthOnly, inlineIcon, title, 'aria-label': ariaLabel } = _a, props = __rest(_a, ["refugeSize", "containerClassName", "containerStyle", "widthOnly", "inlineIcon", "title", 'aria-label']);
19
+ if (props.size === refugeSize && !title && !ariaLabel && !containerStyle) {
20
+ return React.createElement(Icon, Object.assign({}, props));
21
+ }
22
+ return (React.createElement("div", { className: cnIconRefuge({ inline: inlineIcon }, containerClassName), title: title, "aria-label": ariaLabel, style: Object.assign({ minWidth: refugeSize, minHeight: widthOnly ? undefined : refugeSize }, containerStyle) },
23
+ React.createElement(Icon, Object.assign({ size: refugeSize }, props))));
24
+ };
25
+ IconRefuge.displayName = 'Icon';
@@ -0,0 +1,2 @@
1
+ export { IconRefuge } from './IconRefuge';
2
+ export type { IconRefugeProps } from './IconRefuge.types';
@@ -0,0 +1 @@
1
+ export { IconRefuge } from './IconRefuge';
@@ -0,0 +1,10 @@
1
+ import type { FC } from 'react';
2
+ import type { GptDialogProps } from '../GptDialog/GptDialog';
3
+ import './Presetlist.css';
4
+ export declare type PresetListProps<PromptData extends unknown = unknown> = {
5
+ disablePromptPresets: GptDialogProps['disablePromptPresets'];
6
+ promptPresets: GptDialogProps['promptPresets'];
7
+ onPresetClick: (data: PromptData) => void;
8
+ };
9
+ export declare const cnGptDialogPresetList: import("@bem-react/classname").ClassNameFormatter;
10
+ export declare const PresetList: FC<PresetListProps>;
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { ActionTooltip, Button, DropdownMenu } from '@gravity-ui/uikit';
3
+ import { cn } from '../../../../classname';
4
+ import { i18n } from '../../../../i18n/gpt/dialog';
5
+ import { gptHotKeys } from '../constants';
6
+ import { useGptHotKeys } from '../hooks/useGptHotKeys';
7
+ import { usePresetList } from '../hooks/usePresetList';
8
+ import './Presetlist.css';
9
+ export const cnGptDialogPresetList = cn('gpt-dialog-preset-list');
10
+ const PresetItem = ({ preset, onPresetClick, disablePromptPresets, hotKey }) => {
11
+ useGptHotKeys(hotKey, () => {
12
+ onPresetClick(preset.data);
13
+ }, { enableOnFormTags: true });
14
+ return (React.createElement(ActionTooltip, { title: preset.display, hotkey: hotKey },
15
+ React.createElement(Button, { className: cnGptDialogPresetList('preset'), view: "normal", size: "m", disabled: disablePromptPresets, onClick: () => onPresetClick(preset.data) }, preset.display)));
16
+ };
17
+ export const PresetList = ({ disablePromptPresets, promptPresets, onPresetClick, }) => {
18
+ const { presetsContainerRef, visiblePresets, hiddenPresets, showMoreButton, measured } = usePresetList({
19
+ promptPresets,
20
+ onPresetClick,
21
+ });
22
+ return (React.createElement("div", { className: cnGptDialogPresetList({ measured }), ref: presetsContainerRef },
23
+ visiblePresets.map((preset, index) => (React.createElement(PresetItem, { preset: preset, key: preset.display, hotKey: preset.hotKey || gptHotKeys.presetsKey(String(index + 1)), disablePromptPresets: disablePromptPresets, onPresetClick: onPresetClick }))),
24
+ showMoreButton && (React.createElement(DropdownMenu, { switcherWrapperClassName: cnGptDialogPresetList('more-button-wrapper'), switcher: React.createElement(Button, { className: cnGptDialogPresetList('more-button'), view: "normal", size: "m" }, i18n('more')), items: hiddenPresets }))));
25
+ };
@@ -0,0 +1,6 @@
1
+ .g-md-gpt-dialog-preset-list__preset + .g-md-gpt-dialog-preset-list__preset {
2
+ margin-left: var(--g-spacing-2);
3
+ }
4
+ .g-md-gpt-dialog-preset-list__more-button-wrapper {
5
+ margin-left: var(--g-spacing-2);
6
+ }
@@ -0,0 +1,2 @@
1
+ import type { ActionSpec, ExtensionDeps } from 'src/core';
2
+ export declare const showGptWidget: (deps: ExtensionDeps) => ActionSpec;
@@ -0,0 +1,10 @@
1
+ import { runGpt } from './commands';
2
+ export const showGptWidget = (_deps) => ({
3
+ isActive() {
4
+ return false;
5
+ },
6
+ isEnable() {
7
+ return true;
8
+ },
9
+ run: runGpt,
10
+ });
@@ -0,0 +1,2 @@
1
+ import { Command } from 'prosemirror-state';
2
+ export declare const runGpt: Command;
@@ -0,0 +1,9 @@
1
+ import { TextSelection } from 'prosemirror-state';
2
+ import { pluginKey } from './plugin';
3
+ export const runGpt = (state, dispatch) => {
4
+ const { selection: sel } = state;
5
+ const meta = { action: 'show', from: sel.from, to: sel.to };
6
+ const tr = state.tr.setMeta(pluginKey, meta);
7
+ dispatch === null || dispatch === void 0 ? void 0 : dispatch(tr.setSelection(TextSelection.create(tr.doc, sel.to)));
8
+ return true;
9
+ };
@@ -0,0 +1,13 @@
1
+ import type { PopupProps } from '@gravity-ui/uikit/build/esm/components/Popup/Popup';
2
+ export declare const WIDGET_DECO_CLASS_NAME = "g-md-gpt-widget-deco";
3
+ export declare const WIDGET_DECO_SPEC_FLAG = "gpt_widget_deco";
4
+ export declare const gptPopupPlacement: PopupProps['placement'];
5
+ export declare const gptHotKeys: {
6
+ openGptKey: string;
7
+ openGptKeyTooltip: string;
8
+ presetsKey: (key: string) => string;
9
+ tryAgainGpt: string;
10
+ freshStartGpt: string;
11
+ applyResultGpt: string;
12
+ closeGpt: string;
13
+ };
@@ -0,0 +1,12 @@
1
+ export const WIDGET_DECO_CLASS_NAME = 'g-md-gpt-widget-deco';
2
+ export const WIDGET_DECO_SPEC_FLAG = 'gpt_widget_deco';
3
+ export const gptPopupPlacement = ['bottom-start', 'top-start'];
4
+ export const gptHotKeys = {
5
+ openGptKey: 'Mod-h',
6
+ openGptKeyTooltip: 'Mod+h',
7
+ presetsKey: (key) => `Control+${key}`,
8
+ tryAgainGpt: 'Control+t',
9
+ freshStartGpt: 'Control+r',
10
+ applyResultGpt: 'Enter',
11
+ closeGpt: 'Escape',
12
+ };
@@ -0,0 +1,13 @@
1
+ import { Action, ExtensionWithOptions } from 'src/core';
2
+ import type { CommonAnswer } from '../ErrorScreen/types';
3
+ import type { GptWidgetDecoViewParams } from './view';
4
+ export declare const gptActionName = "addGptWidget";
5
+ export declare type GptWidgetOptions<AnswerData extends CommonAnswer = CommonAnswer, PromptData extends unknown = unknown> = Pick<GptWidgetDecoViewParams<AnswerData, PromptData>, 'gptPopupContainer' | 'answerRender' | 'onApplyResult' | 'promptPresets' | 'customPromptPlaceholder' | 'disabledPromptPlaceholder' | 'onCustomPromptApply' | 'onPromptPresetClick' | 'onTryAgain' | 'onLike' | 'onDislike' | 'onClose' | 'onUpdate' | 'gptAlertProps'>;
6
+ export declare const gptExtension: ExtensionWithOptions<GptWidgetOptions>;
7
+ declare global {
8
+ namespace WysiwygEditor {
9
+ interface Actions {
10
+ [gptActionName]: Action<{}>;
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,14 @@
1
+ import { showGptWidget } from '../actions';
2
+ import { runGpt } from '../commands';
3
+ import { gptHotKeys } from '../constants';
4
+ import { gptWidgetPlugin } from '../plugin';
5
+ export const gptActionName = 'addGptWidget';
6
+ export const gptExtension = (builder, options) => {
7
+ builder.addAction(gptActionName, showGptWidget);
8
+ builder.addPlugin(({ serializer, markupParser }) => {
9
+ return gptWidgetPlugin(Object.assign(Object.assign({}, options), { serializer, parser: markupParser }));
10
+ });
11
+ builder.addKeymap(() => ({
12
+ [gptHotKeys.openGptKey]: runGpt,
13
+ }), builder.Priority.VeryLow);
14
+ };
@@ -0,0 +1,17 @@
1
+ .g-md-gpt-widget-deco {
2
+ background-color: var(--g-color-base-info-light-hover);
3
+ }
4
+
5
+ .g-md-gpt-popup {
6
+ --layer-navigation-bar: 900;
7
+ pointer-events: initial;
8
+ }
9
+ .g-md-gpt-popup[class] {
10
+ border-radius: var(--g-spacing-2);
11
+ }
12
+ .g-md-gpt-popup__content {
13
+ width: 720px;
14
+ padding: var(--g-spacing-3);
15
+ pointer-events: all;
16
+ box-shadow: -8px 2px 16px -4px var(--g-color-private-purple-150), 8px 2px 16px -4px var(--g-color-private-blue-150);
17
+ }
@@ -0,0 +1,37 @@
1
+ import type { PopupProps } from '@gravity-ui/uikit';
2
+ import type { EditorState, PluginView } from 'prosemirror-state';
3
+ import { EditorView } from 'prosemirror-view';
4
+ import { Parser, Serializer } from 'src/core';
5
+ import type { CommonAnswer } from '../ErrorScreen/types';
6
+ import type { GptDialogProps } from '../GptDialog/GptDialog';
7
+ import './view.css';
8
+ export declare const cnGptPopup: import("@bem-react/classname").ClassNameFormatter;
9
+ export declare type GptWidgetDecoViewParams<AnswerData extends CommonAnswer = CommonAnswer, PromptData extends unknown = unknown> = Omit<GptDialogProps<AnswerData, PromptData>, 'markup' | 'onApplyResult'> & {
10
+ serializer: Serializer;
11
+ parser: Parser;
12
+ } & {
13
+ onApplyResult?: GptDialogProps['onApplyResult'];
14
+ gptPopupContainer?: PopupProps['container'];
15
+ };
16
+ export declare class GptWidgetDecoView implements Required<PluginView> {
17
+ private readonly _view;
18
+ private readonly _renderer;
19
+ private _decoElem;
20
+ private _params;
21
+ private _serializer;
22
+ private _parser;
23
+ private _confirmOpen;
24
+ constructor(view: EditorView, params: GptWidgetDecoViewParams);
25
+ update(view: EditorView, prevState: EditorState): void;
26
+ destroy(): void;
27
+ private _resetState;
28
+ private _onConfirmCancel;
29
+ private _onConfirmOk;
30
+ private _render;
31
+ private _onGptAnswerUpdate;
32
+ private _onSubmit;
33
+ private _onClose;
34
+ private _getContentOfDecoration;
35
+ private _getCurrentDecoration;
36
+ private _getPluginState;
37
+ }
@@ -0,0 +1,167 @@
1
+ import React, { useCallback, useEffect } from 'react';
2
+ import { Popup } from '@gravity-ui/uikit';
3
+ import { Slice } from 'prosemirror-model';
4
+ import { TextSelection } from 'prosemirror-state';
5
+ import { useMount } from 'react-use';
6
+ import { cn } from '../../../../classname';
7
+ import { getReactRendererFromState } from '../../../behavior';
8
+ import { GptDialog } from '../GptDialog/GptDialog';
9
+ import { WIDGET_DECO_CLASS_NAME, WIDGET_DECO_SPEC_FLAG, gptPopupPlacement } from '../constants';
10
+ import { pluginKey } from '../plugin';
11
+ import './view.css';
12
+ export const cnGptPopup = cn('gpt-popup');
13
+ export class GptWidgetDecoView {
14
+ constructor(view, params) {
15
+ this._decoElem = null;
16
+ this._onConfirmCancel = () => {
17
+ this._confirmOpen = false;
18
+ this._renderer.rerender();
19
+ };
20
+ this._onConfirmOk = () => {
21
+ this._onClose();
22
+ };
23
+ this._onGptAnswerUpdate = (answer) => {
24
+ var _a, _b;
25
+ (_b = (_a = this._params).onUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, answer);
26
+ };
27
+ this._onSubmit = (answer) => {
28
+ var _a, _b;
29
+ const deco = this._getCurrentDecoration();
30
+ if (!deco)
31
+ return;
32
+ const { from, to } = deco;
33
+ const answerNode = this._parser.parse(answer);
34
+ const tr = this._view.state.tr;
35
+ const meta = { action: 'hide' };
36
+ tr.setMeta(pluginKey, meta);
37
+ tr.replace(from, to, new Slice(answerNode.content, 1, 1));
38
+ tr.setSelection(TextSelection.create(tr.doc, tr.mapping.map(to)));
39
+ this._view.dispatch(tr);
40
+ setTimeout(() => {
41
+ this._view.focus();
42
+ }, 0);
43
+ (_b = (_a = this._params).onApplyResult) === null || _b === void 0 ? void 0 : _b.call(_a, answer);
44
+ this._resetState();
45
+ };
46
+ this._onClose = () => {
47
+ var _a, _b;
48
+ const deco = this._getCurrentDecoration();
49
+ if (!deco) {
50
+ return;
51
+ }
52
+ const tr = this._view.state.tr;
53
+ const meta = { action: 'hide' };
54
+ tr.setSelection(TextSelection.create(tr.doc, deco.from, deco.to));
55
+ tr.setMeta(pluginKey, meta);
56
+ this._view.dispatch(tr);
57
+ setTimeout(() => {
58
+ this._view.focus();
59
+ }, 0);
60
+ (_b = (_a = this._params).onClose) === null || _b === void 0 ? void 0 : _b.call(_a);
61
+ this._resetState();
62
+ };
63
+ this._view = view;
64
+ this._params = params;
65
+ this._serializer = params.serializer;
66
+ this._parser = params.parser;
67
+ this._confirmOpen = false;
68
+ this._renderer = getReactRendererFromState(view.state).createItem('gpt-widget-view', this._render.bind(this));
69
+ }
70
+ update(view, prevState) {
71
+ var _a;
72
+ const { state, dispatch } = view;
73
+ if (this._decoElem && !state.selection.eq(prevState.selection)) {
74
+ const transaction = state.tr;
75
+ const meta = { action: 'hide' };
76
+ dispatch(transaction.setMeta(pluginKey, meta));
77
+ this._view.focus();
78
+ return;
79
+ }
80
+ const decoElements = Array.from(view.dom.querySelectorAll(`.${WIDGET_DECO_CLASS_NAME}`));
81
+ this._decoElem = (_a = decoElements.at(-1)) !== null && _a !== void 0 ? _a : null;
82
+ this._renderer.rerender();
83
+ }
84
+ destroy() {
85
+ this._resetState();
86
+ this._renderer.remove();
87
+ }
88
+ _resetState() {
89
+ this._decoElem = null;
90
+ this._confirmOpen = false;
91
+ }
92
+ _render() {
93
+ if (!this._decoElem)
94
+ return null;
95
+ const markup = this._getContentOfDecoration();
96
+ if (markup === undefined) {
97
+ return null;
98
+ }
99
+ return (React.createElement(Widget, { markup: markup, anchorRef: { current: this._decoElem }, answerRender: this._params.answerRender, promptPresets: this._params.promptPresets, disablePromptPresets: this._params.disablePromptPresets, customPromptPlaceholder: this._params.customPromptPlaceholder, disabledPromptPlaceholder: this._params.disabledPromptPlaceholder, gptAlertProps: this._params.gptAlertProps,
100
+ /* eslint-disable-next-line react/jsx-handler-names */
101
+ onApplyResult: this._onSubmit,
102
+ /* eslint-disable-next-line react/jsx-handler-names */
103
+ onCustomPromptApply: this._params.onCustomPromptApply,
104
+ /* eslint-disable-next-line react/jsx-handler-names */
105
+ onPromptPresetClick: this._params.onPromptPresetClick,
106
+ /* eslint-disable-next-line react/jsx-handler-names */
107
+ onTryAgain: this._params.onTryAgain,
108
+ /* eslint-disable-next-line react/jsx-handler-names */
109
+ onLike: this._params.onLike,
110
+ /* eslint-disable-next-line react/jsx-handler-names */
111
+ onDislike: this._params.onDislike,
112
+ /* eslint-disable-next-line react/jsx-handler-names */
113
+ onClose: this._onClose,
114
+ /* eslint-disable-next-line react/jsx-handler-names */
115
+ onUpdate: this._onGptAnswerUpdate,
116
+ /* eslint-disable-next-line react/jsx-handler-names */
117
+ confirmOpen: this._confirmOpen,
118
+ /* eslint-disable-next-line react/jsx-handler-names */
119
+ onConfirmOk: this._onConfirmOk,
120
+ /* eslint-disable-next-line react/jsx-handler-names */
121
+ onConfirmCancel: this._onConfirmCancel, container: this._params.gptPopupContainer }));
122
+ }
123
+ _getContentOfDecoration() {
124
+ const deco = this._getCurrentDecoration();
125
+ if (!deco)
126
+ return undefined;
127
+ const { from, to } = deco;
128
+ try {
129
+ const fragment = this._view.state.doc.slice(from, to, true).content;
130
+ const yfmMarkup = this._serializer.serialize(fragment);
131
+ return yfmMarkup;
132
+ }
133
+ catch (error) {
134
+ console.error(error);
135
+ return this._view.state.doc.textBetween(from, to, '\n', '');
136
+ }
137
+ }
138
+ _getCurrentDecoration() {
139
+ var _a;
140
+ return (_a = this._getPluginState()) === null || _a === void 0 ? void 0 : _a.find(undefined, undefined,
141
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return
142
+ (spec) => spec[WIDGET_DECO_SPEC_FLAG])[0];
143
+ }
144
+ _getPluginState() {
145
+ return pluginKey.getState(this._view.state);
146
+ }
147
+ }
148
+ function Widget({ markup, anchorRef, answerRender, promptPresets, disablePromptPresets, customPromptPlaceholder, disabledPromptPlaceholder, onCustomPromptApply, onApplyResult, onPromptPresetClick, onTryAgain, onLike, onDislike, onClose, onUpdate, container, gptAlertProps, }) {
149
+ useEffect(() => {
150
+ // rerender the popup
151
+ window.dispatchEvent(new CustomEvent('scroll'));
152
+ }, [anchorRef]);
153
+ useMount(() => {
154
+ if ((anchorRef === null || anchorRef === void 0 ? void 0 : anchorRef.current) && 'scrollIntoView' in anchorRef.current) {
155
+ anchorRef.current.scrollIntoView({
156
+ behavior: 'smooth',
157
+ block: 'center',
158
+ });
159
+ }
160
+ });
161
+ const handleUpdate = useCallback((result) => {
162
+ onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(result);
163
+ }, [onUpdate]);
164
+ return (React.createElement(React.Fragment, null,
165
+ React.createElement(Popup, { className: cnGptPopup(), contentClassName: cnGptPopup('content'), open: true, anchorRef: anchorRef, placement: gptPopupPlacement, onOutsideClick: onClose, focusTrap: true, strategy: "absolute", container: container, onEscapeKeyDown: onClose },
166
+ React.createElement(GptDialog, { markup: markup, answerRender: answerRender, promptPresets: promptPresets, disablePromptPresets: disablePromptPresets, customPromptPlaceholder: customPromptPlaceholder, disabledPromptPlaceholder: disabledPromptPlaceholder, onApplyResult: onApplyResult, onCustomPromptApply: onCustomPromptApply, onPromptPresetClick: onPromptPresetClick, onTryAgain: onTryAgain, onLike: onLike, onDislike: onDislike, onClose: onClose, onUpdate: handleUpdate, gptAlertProps: gptAlertProps }))));
167
+ }
@@ -0,0 +1,27 @@
1
+ import type { CommonAnswer, GptRequestData } from '../ErrorScreen/types';
2
+ import type { GptDialogProps } from '../GptDialog/GptDialog';
3
+ declare type UseGptProps<AnswerData extends CommonAnswer = CommonAnswer, PromptData extends unknown = unknown> = Pick<GptDialogProps<AnswerData, PromptData>, 'markup' | 'promptPresets' | 'onCustomPromptApply' | 'onPromptPresetClick' | 'onTryAgain' | 'onLike' | 'onDislike' | 'onApplyResult' | 'onUpdate'>;
4
+ export declare const useGpt: <AnswerData extends CommonAnswer = CommonAnswer, PromptData extends unknown = unknown>({ markup, promptPresets, onCustomPromptApply, onPromptPresetClick, onTryAgain, onLike, onDislike, onApplyResult, onUpdate, }: UseGptProps<AnswerData, PromptData>) => {
5
+ answer: AnswerData | undefined;
6
+ customPrompt: string;
7
+ lastRequestData: GptRequestData<PromptData> | undefined;
8
+ loading: boolean;
9
+ error: boolean;
10
+ mode: "custom-and-presets" | "only-custom" | "only-presets";
11
+ feedbackType: "dislike" | "like" | undefined;
12
+ feedbackTypeLoading: "dislike" | "like" | undefined;
13
+ handleLike: () => Promise<void>;
14
+ handleDislike: () => Promise<void>;
15
+ handleCustomPromptUpdate: import("react").Dispatch<import("react").SetStateAction<string>>;
16
+ handleCustomPromptKeyPress: import("react").KeyboardEventHandler<HTMLInputElement>;
17
+ handleCustomPromptApply: () => Promise<void>;
18
+ handlePresetClick: (data: PromptData) => void;
19
+ handleTryAgain: () => Promise<void>;
20
+ handleFreshStart: () => void;
21
+ handleApplyResult: () => void;
22
+ showTryAgainButton: boolean;
23
+ showAnswer: boolean;
24
+ showError: boolean;
25
+ showAnswerActions: boolean | undefined;
26
+ };
27
+ export {};