quickblox-react-ui-kit 0.2.0 → 0.2.1

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 (108) hide show
  1. package/dist/Data/DefaultConfigurations.d.ts +11 -0
  2. package/dist/Data/Stubs.d.ts +1 -1
  3. package/dist/Data/source/AISource.d.ts +13 -0
  4. package/dist/Domain/entity/MessageEntity.d.ts +1 -1
  5. package/dist/Presentation/Views/Base/BaseViewModel.d.ts +10 -6
  6. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIMessageWidget.d.ts +16 -0
  7. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIWidgetActions/AIWidgetActions.d.ts +14 -0
  8. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/SliderMenu.d.ts +23 -0
  9. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/Tone.d.ts +15 -0
  10. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidget.d.ts +10 -0
  11. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidget.d.ts +10 -0
  12. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidget.d.ts +10 -0
  13. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/useDefaultVoiceInputWidget.d.ts +2 -2
  14. package/dist/Presentation/components/UI/Dialogs/MessagesView/ContextMenu.d.ts +2 -1
  15. package/dist/Presentation/components/UI/Dialogs/MessagesView/DropDownMenu/DropDownMenu.d.ts +26 -0
  16. package/dist/Presentation/components/UI/Dialogs/MessagesView/DropDownMenu/ItemDropDownMenu/ItemDropDownMenu.d.ts +11 -0
  17. package/dist/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/AvatarContentIncomingUser/AvatarContentIncomingUser.d.ts +3 -0
  18. package/dist/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/InComingMessage.d.ts +15 -0
  19. package/dist/Presentation/components/UI/Dialogs/MessagesView/MessagesView.d.ts +5 -5
  20. package/dist/Presentation/components/UI/Dialogs/MessagesView/OutGoingMessage/OutGoingMessage.d.ts +9 -0
  21. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/BookIcon/BookIcon.d.ts +3 -0
  22. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/HammerIcon/index.d.ts +3 -0
  23. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/HandshakeIcon/index.d.ts +3 -0
  24. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/MuscleIcon/index.d.ts +3 -0
  25. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/NecktieIcon/index.d.ts +3 -0
  26. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/NeutralFaceIcon/index.d.ts +3 -0
  27. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/PalmsUpTogetherIcon/index.d.ts +3 -0
  28. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/PerformingArtsIcon/index.d.ts +3 -0
  29. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/PointUpIcon/index.d.ts +3 -0
  30. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/SmileyIcon/index.d.ts +3 -0
  31. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/SmirkIcon/index.d.ts +3 -0
  32. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/WhiteCheckMarkIcon/index.d.ts +3 -0
  33. package/dist/Presentation/components/UI/svgs/Icons/Actions/AssistAnswer/index.d.ts +4 -0
  34. package/dist/Presentation/components/UI/svgs/Icons/Actions/Summarize/index.d.ts +4 -0
  35. package/dist/Presentation/components/UI/svgs/Icons/Actions/Tone/index.d.ts +4 -0
  36. package/dist/Presentation/components/UI/svgs/Icons/Media/Translate/index.d.ts +4 -0
  37. package/dist/Presentation/components/layouts/Desktop/QuickBloxUIKitDesktopLayout.d.ts +5 -5
  38. package/dist/QBconfig.d.ts +22 -0
  39. package/dist/index-ui.d.ts +5 -1
  40. package/dist/index-ui.js +360 -41
  41. package/package.json +1 -1
  42. package/src/App.tsx +14 -1
  43. package/src/Data/DefaultConfigurations.ts +128 -0
  44. package/src/Data/Stubs.ts +15 -15
  45. package/src/Data/mapper/MessageLocalDTOMapper.ts +3 -2
  46. package/src/Data/mapper/MessageRemoteDTOMapper.ts +3 -2
  47. package/src/Data/source/AISource.ts +133 -0
  48. package/src/Data/source/remote/Mapper/MessageDTOMapper.ts +1 -1
  49. package/src/Domain/entity/MessageEntity.ts +1 -1
  50. package/src/Presentation/Views/Base/BaseViewModel.ts +9 -4
  51. package/src/Presentation/Views/Dialogs/Dialogs.tsx +37 -21
  52. package/src/Presentation/components/UI/Dialogs/HeaderDialogs/HeaderDialogs.scss +2 -2
  53. package/src/Presentation/components/UI/Dialogs/HeaderDialogs/HeaderDialogs.tsx +5 -5
  54. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/{AIWidget.ts → AIMessageWidget.ts} +14 -3
  55. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIWidgetActions/AIWidgetActions.scss +55 -0
  56. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIWidgetActions/AIWidgetActions.tsx +116 -0
  57. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/SliderMenu.tsx +172 -0
  58. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/Tone.ts +21 -0
  59. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidget.tsx +99 -0
  60. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidget.tsx +105 -0
  61. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidget.tsx +106 -0
  62. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/useDefaultVoiceInputWidget.tsx +7 -6
  63. package/src/Presentation/components/UI/Dialogs/MessagesView/ContextMenu.tsx +5 -6
  64. package/src/Presentation/components/UI/Dialogs/MessagesView/DropDownMenu/DropDownMenu.scss +84 -0
  65. package/src/Presentation/components/UI/Dialogs/MessagesView/DropDownMenu/DropDownMenu.tsx +105 -0
  66. package/src/Presentation/components/UI/Dialogs/MessagesView/DropDownMenu/ItemDropDownMenu/ItemDropDownMenu.scss +50 -0
  67. package/src/Presentation/components/UI/Dialogs/MessagesView/DropDownMenu/ItemDropDownMenu/ItemDropDownMenu.tsx +43 -0
  68. package/src/Presentation/components/UI/Dialogs/MessagesView/HeaderMessages/HeaderMessages.tsx +14 -11
  69. package/src/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/AvatarContentIncomingUser/AvatarContentIncomingUser.scss +39 -0
  70. package/src/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/AvatarContentIncomingUser/AvatarContentIncomingUser.tsx +26 -0
  71. package/src/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/InComingMessage.scss +394 -0
  72. package/src/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/InComingMessage.tsx +747 -0
  73. package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesView.scss +88 -4
  74. package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesView.tsx +589 -246
  75. package/src/Presentation/components/UI/Dialogs/MessagesView/OutGoingMessage/OutGoingMessage.scss +7 -0
  76. package/src/Presentation/components/UI/Dialogs/MessagesView/OutGoingMessage/OutGoingMessage.tsx +99 -0
  77. package/src/Presentation/components/UI/Dialogs/MessagesView/useMessagesViewModel.ts +2 -2
  78. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/BookIcon/BookIcon.tsx +7 -0
  79. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/HammerIcon/index.tsx +7 -0
  80. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/HandshakeIcon/index.tsx +7 -0
  81. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/MuscleIcon/index.tsx +7 -0
  82. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/NecktieIcon/index.tsx +7 -0
  83. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/NeutralFaceIcon/index.tsx +7 -0
  84. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/PalmsUpTogetherIcon/index.tsx +7 -0
  85. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/PerformingArtsIcon/index.tsx +7 -0
  86. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/PointUpIcon/index.tsx +7 -0
  87. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/SmileyIcon/index.tsx +20 -0
  88. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/SmirkIcon/index.tsx +7 -0
  89. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/WhiteCheckMarkIcon/index.tsx +7 -0
  90. package/src/Presentation/components/UI/svgs/Icons/Actions/AssistAnswer/AssistAnswer.svg +3 -0
  91. package/src/Presentation/components/UI/svgs/Icons/Actions/AssistAnswer/index.tsx +93 -0
  92. package/src/Presentation/components/UI/svgs/Icons/Actions/Summarize/Summarize.svg +6 -0
  93. package/src/Presentation/components/UI/svgs/Icons/Actions/Summarize/index.tsx +58 -0
  94. package/src/Presentation/components/UI/svgs/Icons/Actions/Tone/Tone.svg +3 -0
  95. package/src/Presentation/components/UI/svgs/Icons/Actions/Tone/index.tsx +34 -0
  96. package/src/Presentation/components/UI/svgs/Icons/Media/Translate/Translate.svg +3 -0
  97. package/src/Presentation/components/UI/svgs/Icons/Media/Translate/index.tsx +35 -0
  98. package/src/Presentation/components/layouts/Desktop/QuickBloxUIKitDesktopLayout.tsx +110 -29
  99. package/src/QBconfig.ts +32 -3
  100. package/src/index-ui.ts +9 -0
  101. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIWidget.d.ts +0 -8
  102. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidgetWithProxy.d.ts +0 -9
  103. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultTextInputWidget.d.ts +0 -2
  104. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidgetWithProxy.tsx +0 -136
  105. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultTextInputWidget.tsx +0 -60
  106. /package/dist/Presentation/components/UI/svgs/Icons/{Media → AIWidgets}/AIWidget/index.d.ts +0 -0
  107. /package/src/Presentation/components/UI/svgs/Icons/{Media → AIWidgets}/AIWidget/Send.svg +0 -0
  108. /package/src/Presentation/components/UI/svgs/Icons/{Media → AIWidgets}/AIWidget/index.tsx +0 -0
@@ -0,0 +1,747 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import './InComingMessage.scss';
3
+ import UiKitTheme from '../../../../../assets/UiKitTheme';
4
+ import { MessageEntity } from '../../../../../../Domain/entity/MessageEntity';
5
+ import { getTimeShort24hFormat } from '../../../../../../utils/DateTimeFormatter';
6
+ import ChatMessageAttachmentEntity from '../../../../../../Domain/entity/ChatMessageAttachmentEntity';
7
+ import { FileType } from '../../../../../../Domain/entity/FileTypes';
8
+ import VideoAttachmentComponent from '../VideoAttachmentComponent/VideoAttachmentComponent';
9
+ import ImagePlay from '../../../svgs/Icons/Toggle/ImagePlay';
10
+ import AudioAttachmentComponent from '../AudioAttachmentComponent/AudioAttachmentComponent';
11
+ import AudioFile from '../../../svgs/Icons/Media/AudioFile';
12
+ import ImageAttachmentComponent from '../ImageAttachmentComponent/ImageAttachmentComponent';
13
+ import ImageEmpty from '../../../svgs/Icons/Media/ImageEmpty';
14
+ import ImageFile from '../../../svgs/Icons/Media/ImageFile';
15
+ import ColumnContainer from '../../../../containers/ColumnContainer/ColumnContainer';
16
+ import { HighLightLink, messageHasUrls } from '../HighLightLink/HighLightLink';
17
+ import { AIMessageWidget } from '../AIWidgets/AIMessageWidget';
18
+ import { loopToLimitTokens } from '../../../../../../utils/utils';
19
+ import LoaderComponent from '../../../Placeholders/LoaderComponent/LoaderComponent';
20
+ import { IChatMessage } from '../../../../../../Data/source/AISource';
21
+ import AssistAnswer from '../../../svgs/Icons/Actions/AssistAnswer';
22
+ import AIWidgetActions from '../AIWidgets/AIWidgetActions/AIWidgetActions';
23
+ import TranslateIcon from '../../../svgs/Icons/Media/Translate';
24
+ import AvatarContentIncomingUser from './AvatarContentIncomingUser/AvatarContentIncomingUser';
25
+ import { DefaultConfigurations } from '../../../../../../Data/DefaultConfigurations';
26
+
27
+ export function InComingMessage(props: {
28
+ theme: UiKitTheme | undefined;
29
+ senderName: string | undefined;
30
+ message: MessageEntity;
31
+ // element: JSX.Element;
32
+ onLoader: () => void;
33
+ // renderWidget: JSX.Element | undefined;
34
+ currentUserId?: number;
35
+ messagesToView: MessageEntity[];
36
+ AITranslation?: AIMessageWidget;
37
+ AIAnswerToMessage?: AIMessageWidget;
38
+ // index?: number;
39
+ // updateData?: (index: number, text: string) => void;
40
+ // translationDATA?: Record<number, string>;
41
+ }) {
42
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
43
+ const [haveHover, setHaveHover] = useState(false);
44
+ // const [openMenu, setOpenMenu] = useState(false);
45
+ const [waitAIWidget, setWaitAIWidget] = useState<boolean>(false);
46
+ const [waitAITranslateWidget, setWaitAITranslateWidget] =
47
+ useState<boolean>(false);
48
+ const [widgetTextContent, setWidgetTextContent] = useState<string>('');
49
+ const [originalTextMessage, setOriginalTextMessage] = useState<boolean>(true);
50
+ // const [errorAITranslate, setErrorAITranslate] = useState<boolean>(false);
51
+
52
+ // useEffect(() => {
53
+ // setWaitAIWidget(false);
54
+ // if (
55
+ // props.AIRephraseMessage?.textToContent &&
56
+ // props.AIRephraseMessage?.textToContent.length > 0
57
+ // ) {
58
+ // setMessageTextState(props.AIRephraseMessage?.textToContent);
59
+ // setWidgetTextContent(props.AIRephraseMessage?.textToContent);
60
+ // setTimeout(() => {
61
+ // setWidgetTextContent('');
62
+ // }, 45 * 1000);
63
+ // }
64
+ // }, [props.AIRephraseMessage?.textToContent]);
65
+
66
+ useEffect(() => {
67
+ setWaitAIWidget(false);
68
+ }, [props.AITranslation?.textToContent]);
69
+ //
70
+ useEffect(() => {
71
+ setWaitAIWidget(false);
72
+ // if (
73
+ // props.AIAnswerToMessage?.textToContent &&
74
+ // props.AIAnswerToMessage?.textToContent.length > 0
75
+ // ) {
76
+ // // setMessageTextState(props.AIAnswerToMessage?.textToContent);
77
+ // setWidgetTextContent(props.AIAnswerToMessage?.textToContent);
78
+ // setTimeout(() => {
79
+ // setWidgetTextContent('');
80
+ // }, 45 * 1000);
81
+ // }
82
+ }, [props.AIAnswerToMessage?.textToContent]);
83
+
84
+ const messageContentRender = (
85
+ mc: MessageEntity,
86
+ translateText: string,
87
+ theme: UiKitTheme | undefined,
88
+ ) => {
89
+ const messageText = (
90
+ <div>
91
+ {!originalTextMessage ? (
92
+ <div>{widgetTextContent}</div>
93
+ ) : (
94
+ <div>{mc.message}</div>
95
+ )}
96
+ </div>
97
+ );
98
+ let messageContent: JSX.Element = messageText;
99
+
100
+ const attachmentContentRender = (att: ChatMessageAttachmentEntity) => {
101
+ let contentPlaceHolder: JSX.Element = <div>{att.type.toString()}</div>;
102
+
103
+ if (att.type.toString().includes(FileType.video)) {
104
+ contentPlaceHolder = att.file ? (
105
+ <VideoAttachmentComponent videoFile={att.file} />
106
+ ) : (
107
+ <ImagePlay />
108
+ );
109
+ }
110
+ if (att.type.toString().includes(FileType.audio)) {
111
+ contentPlaceHolder = att.file ? (
112
+ <AudioAttachmentComponent audioFile={att.file} />
113
+ ) : (
114
+ <AudioFile />
115
+ );
116
+ }
117
+ if (att.type.toString().includes(FileType.image)) {
118
+ contentPlaceHolder = att.file ? (
119
+ <ImageAttachmentComponent imageFile={att.file} />
120
+ ) : (
121
+ <ImageEmpty />
122
+ );
123
+ }
124
+ if (att.type.toString().includes(FileType.text)) {
125
+ contentPlaceHolder = att.file ? (
126
+ <div>TEXT</div>
127
+ ) : (
128
+ <ImageFile applyZoom />
129
+ );
130
+ }
131
+ let contentResult: JSX.Element = (
132
+ <div className="message-view-container--message-content-wrapper">
133
+ {contentPlaceHolder}
134
+ </div>
135
+ );
136
+
137
+ if (att.type === FileType.text) {
138
+ contentResult = (
139
+ <div className="message-view-container--file-message-content-wrapper">
140
+ <div
141
+ style={theme ? { backgroundColor: theme.caption() } : {}}
142
+ className="message-view-container__file-message-icon"
143
+ >
144
+ {contentPlaceHolder}
145
+ </div>
146
+ <div>{att.name || 'file'}</div>
147
+ </div>
148
+ );
149
+ }
150
+
151
+ return contentResult;
152
+ };
153
+
154
+ if (mc.attachments && mc.attachments.length > 0) {
155
+ messageContent = (
156
+ <ColumnContainer maxWidth="100%">
157
+ {mc.attachments.map((attachment) =>
158
+ attachmentContentRender(attachment),
159
+ )}
160
+ {messageText}
161
+ </ColumnContainer>
162
+ );
163
+ }
164
+
165
+ if (
166
+ messageHasUrls(mc.message) &&
167
+ !(mc.attachments && mc.attachments.length > 0)
168
+ ) {
169
+ return <HighLightLink messageText={mc.message} />;
170
+ }
171
+
172
+ return messageContent;
173
+ };
174
+
175
+ const messageEntitiesToIChatMessageCollection = (
176
+ messageEntities: MessageEntity[],
177
+ currentUserId?: number,
178
+ ): IChatMessage[] => {
179
+ const MAX_TOKENS = 3584;
180
+ const items = messageEntities.filter(
181
+ (it) =>
182
+ !it.notification_type ||
183
+ (it.notification_type && it.notification_type.length === 0),
184
+ );
185
+ const messages = loopToLimitTokens(
186
+ MAX_TOKENS,
187
+ items,
188
+ ({ message }) => message || '',
189
+ ).reverse();
190
+ const chatCompletionMessages: IChatMessage[] = messages.map(
191
+ ({ message, sender_id }) => ({
192
+ role: sender_id === currentUserId ? 'user' : 'assistant',
193
+ content: message,
194
+ }),
195
+ );
196
+
197
+ //
198
+ return chatCompletionMessages;
199
+ };
200
+
201
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
202
+ async function sendMessageToTranslate(
203
+ message: MessageEntity,
204
+ messagesToView: MessageEntity[],
205
+ currentUserId?: number,
206
+ AITranslation?: AIMessageWidget,
207
+ selectedLanguage?: string,
208
+ ) {
209
+ // setErrorAITranslate(false);
210
+ if (!waitAITranslateWidget) {
211
+ setWaitAITranslateWidget(true);
212
+ await AITranslation?.textToWidget(
213
+ message.message,
214
+ messageEntitiesToIChatMessageCollection(messagesToView, currentUserId),
215
+ {
216
+ language:
217
+ selectedLanguage ||
218
+ DefaultConfigurations.getDefaultLanguageForAITranslate(),
219
+ // language: DefaultConfigurations.getDefaultLanguageForAITranslate()
220
+ // selectedLanguage ||
221
+ // QBConfig.configAIApi.AITranslateWidgetConfig.defaultLanguage ||
222
+ // 'English',
223
+ },
224
+ )
225
+ .then((textTranslate) => {
226
+ // eslint-disable-next-line promise/always-return
227
+ setWidgetTextContent(textTranslate || '');
228
+ setWaitAITranslateWidget(false);
229
+ setOriginalTextMessage(false);
230
+ })
231
+ .catch(() => {
232
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
233
+ // setErrorAITranslate(true);
234
+ setWaitAITranslateWidget(false);
235
+ setOriginalTextMessage(true);
236
+ });
237
+
238
+ // setWidgetTextContent(textTranslate || '');
239
+ // setWaitAITranslateWidget(false);
240
+ // setOriginalTextMessage(false);
241
+ }
242
+ }
243
+
244
+ function sendMessageToAIAssistAnswer(
245
+ message: MessageEntity,
246
+ messagesToView: MessageEntity[],
247
+ currentUserId?: number,
248
+ AIAnswerToMessage?: AIMessageWidget,
249
+ ) {
250
+ if (!waitAIWidget) {
251
+ setWaitAIWidget(true);
252
+ props.onLoader();
253
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
254
+ AIAnswerToMessage?.textToWidget(
255
+ message.message,
256
+ messageEntitiesToIChatMessageCollection(messagesToView, currentUserId),
257
+ );
258
+ }
259
+ }
260
+
261
+ const renderWidgetAITranslate = (
262
+ mc: MessageEntity,
263
+ messagesToView: MessageEntity[],
264
+ currentUserId?: number,
265
+ AITranslate?: AIMessageWidget,
266
+ ) => {
267
+ return (
268
+ AITranslate && (
269
+ <div className="translate">
270
+ <div className="caption2">
271
+ <div
272
+ className="ai-translate-action"
273
+ onClick={() => {
274
+ if (originalTextMessage) {
275
+ sendMessageToTranslate(
276
+ mc,
277
+ messagesToView,
278
+ currentUserId,
279
+ AITranslate,
280
+ );
281
+ } else {
282
+ setOriginalTextMessage(true);
283
+ setWidgetTextContent('');
284
+ }
285
+ }}
286
+ >
287
+ {originalTextMessage ? 'Show translation' : 'Show original'}
288
+ </div>
289
+ </div>
290
+ <AIWidgetActions
291
+ widgetToRender={
292
+ <div className="icon">
293
+ <TranslateIcon
294
+ width="16"
295
+ height="16"
296
+ applyZoom
297
+ color="var(--tertiary-elements)"
298
+ />
299
+ </div>
300
+ }
301
+ items={DefaultConfigurations.getAdditionalLanguagesForAITranslate().map(
302
+ (item) => {
303
+ return {
304
+ title: item,
305
+ action: () => {
306
+ sendMessageToTranslate(
307
+ mc,
308
+ messagesToView,
309
+ currentUserId,
310
+ AITranslate,
311
+ item,
312
+ );
313
+ },
314
+ };
315
+ },
316
+ )}
317
+ // items={[
318
+ // {
319
+ // title: 'English',
320
+ // // eslint-disable-next-line @typescript-eslint/no-empty-function
321
+ // action: () => {
322
+ // sendMessageToTranslate(
323
+ // mc,
324
+ // messagesToView,
325
+ // currentUserId,
326
+ // AITranslation,
327
+ // 'English',
328
+ // );
329
+ // },
330
+ // },
331
+ // {
332
+ // title: 'Ukrainian',
333
+ // action: () => {
334
+ // sendMessageToTranslate(
335
+ // mc,
336
+ // messagesToView,
337
+ // currentUserId,
338
+ // AITranslation,
339
+ // 'Ukrainian',
340
+ // );
341
+ // },
342
+ // },
343
+ // {
344
+ // title: 'Spanish',
345
+ // action: () => {
346
+ // sendMessageToTranslate(
347
+ // mc,
348
+ // messagesToView,
349
+ // currentUserId,
350
+ // AITranslation,
351
+ // 'Spanish',
352
+ // );
353
+ // },
354
+ // },
355
+ // {
356
+ // title: 'Portuguese',
357
+ // action: () => {
358
+ // sendMessageToTranslate(
359
+ // mc,
360
+ // messagesToView,
361
+ // currentUserId,
362
+ // AITranslation,
363
+ // 'Portuguese',
364
+ // );
365
+ // },
366
+ // },
367
+ // {
368
+ // title: 'French',
369
+ // action: () => {
370
+ // sendMessageToTranslate(
371
+ // mc,
372
+ // messagesToView,
373
+ // currentUserId,
374
+ // AITranslation,
375
+ // 'French',
376
+ // );
377
+ // },
378
+ // },
379
+ // // {
380
+ // // title: 'German',
381
+ // // action: () => {},
382
+ // // },
383
+ // ]}
384
+ />
385
+ </div>
386
+ // <div className="widget-ai-translate-with-choice-languages-container">
387
+ // <div
388
+ // className="widget-ai-translate-with-choice-languages-container--default-language"
389
+ // onClick={() => {
390
+ // if (originalTextMessage) {
391
+ // sendMessageToTranslate(
392
+ // mc,
393
+ // messagesToView,
394
+ // currentUserId,
395
+ // AITranslation,
396
+ // );
397
+ // } else {
398
+ // setOriginalTextMessage(true);
399
+ // setWidgetTextContent('');
400
+ // }
401
+ // }}
402
+ // >
403
+ // {originalTextMessage ? 'Show translation' : 'Show original'}
404
+ // </div>
405
+ // <div className="widget-ai-translate-with-choice-languages-container--separator">
406
+ // {' '}
407
+ // </div>
408
+ // <div className="widget-ai-translate-with-choice-languages-container--select-language">
409
+ // <AIWidgetActions
410
+ // widgetToRender={
411
+ // <AIWidgetIcon
412
+ // applyZoom
413
+ // color="var(--main-elements)"
414
+ // width="16"
415
+ // height="16"
416
+ // />
417
+ // }
418
+ // items={[
419
+ // {
420
+ // title: 'English',
421
+ // // eslint-disable-next-line @typescript-eslint/no-empty-function
422
+ // action: () => {
423
+ // sendMessageToTranslate(
424
+ // mc,
425
+ // messagesToView,
426
+ // currentUserId,
427
+ // AITranslation,
428
+ // 'English',
429
+ // );
430
+ // },
431
+ // },
432
+ // {
433
+ // title: 'Ukrainian',
434
+ // action: () => {
435
+ // sendMessageToTranslate(
436
+ // mc,
437
+ // messagesToView,
438
+ // currentUserId,
439
+ // AITranslation,
440
+ // 'Ukrainian',
441
+ // );
442
+ // },
443
+ // },
444
+ // {
445
+ // title: 'Spanish',
446
+ // action: () => {
447
+ // sendMessageToTranslate(
448
+ // mc,
449
+ // messagesToView,
450
+ // currentUserId,
451
+ // AITranslation,
452
+ // 'Spanish',
453
+ // );
454
+ // },
455
+ // },
456
+ // {
457
+ // title: 'Portuguese',
458
+ // action: () => {
459
+ // sendMessageToTranslate(
460
+ // mc,
461
+ // messagesToView,
462
+ // currentUserId,
463
+ // AITranslation,
464
+ // 'Portuguese',
465
+ // );
466
+ // },
467
+ // },
468
+ // {
469
+ // title: 'French',
470
+ // action: () => {
471
+ // sendMessageToTranslate(
472
+ // mc,
473
+ // messagesToView,
474
+ // currentUserId,
475
+ // AITranslation,
476
+ // 'French',
477
+ // );
478
+ // },
479
+ // },
480
+ // // {
481
+ // // title: 'German',
482
+ // // action: () => {},
483
+ // // },
484
+ // ]}
485
+ // />
486
+ // </div>
487
+ // {waitAITranslateWidget && (
488
+ // <div
489
+ // className="widget-ai-translate-with-choice-languages-container--separator"
490
+ // style={{
491
+ // height: '16px',
492
+ // width: '16px',
493
+ // }}
494
+ // >
495
+ // <LoaderComponent
496
+ // width="16"
497
+ // height="16"
498
+ // color="var(--color-background-info)"
499
+ // />
500
+ // </div>
501
+ // )}
502
+ // {errorAITranslate && (
503
+ // <div className="widget-ai-translate-with-choice-languages-container--separator">
504
+ // <ErrorMessageIcon
505
+ // errorMessageText="OpenAI server does not response"
506
+ // errorsDescriptions={[]}
507
+ // />
508
+ // </div>
509
+ // )}
510
+ // </div>
511
+ )
512
+ );
513
+ };
514
+
515
+ const renderWidgetAIAssist = (
516
+ mc: MessageEntity,
517
+ messagesToView: MessageEntity[],
518
+ currentUserId?: number,
519
+ AIAnswer?: AIMessageWidget,
520
+ ) => {
521
+ return (
522
+ AIAnswer && (
523
+ <div className="assist-answer">
524
+ <div
525
+ className="icon"
526
+ onClick={() =>
527
+ sendMessageToAIAssistAnswer(
528
+ mc,
529
+ messagesToView,
530
+ currentUserId,
531
+ AIAnswer,
532
+ )
533
+ }
534
+ >
535
+ <div
536
+ style={{
537
+ padding: '5px 3px 5px 3px',
538
+ alignSelf: 'stretch',
539
+ flex: '1',
540
+ position: 'relative',
541
+ overflow: 'visible',
542
+ }}
543
+ >
544
+ <AssistAnswer
545
+ width="24"
546
+ height="24"
547
+ applyZoom
548
+ color="var(--main-elements)"
549
+ />
550
+ </div>
551
+ </div>
552
+ </div>
553
+ )
554
+ );
555
+ };
556
+
557
+ return (
558
+ <div
559
+ className="incoming-text-message"
560
+ onMouseEnter={() => setHaveHover(true)}
561
+ onMouseLeave={() => setHaveHover(false)}
562
+ >
563
+ <AvatarContentIncomingUser />
564
+ <div className="incoming">
565
+ <div className="name">
566
+ <div className="caption">
567
+ <div className="name2">
568
+ {props.senderName || props.message.sender_id.toString()}
569
+ </div>
570
+ </div>
571
+ </div>
572
+ <div className="message">
573
+ <div className="bubble">
574
+ <div className="chat-bubble-background">
575
+ {/* <div className="message-in-a-single-line"> */}
576
+ {/* </div> */}
577
+ {messageContentRender(
578
+ props.message,
579
+ widgetTextContent,
580
+ props.theme,
581
+ )}
582
+ </div>
583
+ {renderWidgetAITranslate(
584
+ props.message,
585
+ props.messagesToView,
586
+ props.currentUserId,
587
+ props.AITranslation,
588
+ )}
589
+ </div>
590
+ {waitAITranslateWidget ? (
591
+ <div className="assist-answer">
592
+ <div className="icon">
593
+ <div
594
+ style={{
595
+ padding: '5px 3px 5px 3px',
596
+ alignSelf: 'stretch',
597
+ flex: '1',
598
+ position: 'relative',
599
+ overflow: 'visible',
600
+ }}
601
+ >
602
+ <LoaderComponent
603
+ width="24"
604
+ height="24"
605
+ applyZoom
606
+ color="var(--caption)"
607
+ />
608
+ </div>
609
+ </div>
610
+ </div>
611
+ ) : null}
612
+ {/* {haveHover && !waitAIWidget && !waitAITranslateWidget */}
613
+ {!waitAITranslateWidget
614
+ ? renderWidgetAIAssist(
615
+ props.message,
616
+ props.messagesToView,
617
+ props.currentUserId,
618
+ props.AIAnswerToMessage,
619
+ )
620
+ : null}
621
+ <div className="caption3">
622
+ <div className="time">
623
+ {getTimeShort24hFormat(props.message.date_sent)}
624
+ </div>
625
+ </div>
626
+ </div>
627
+ </div>
628
+ </div>
629
+ // <div
630
+ // className="message-view-container--incoming-message-wrapper"
631
+ // onMouseEnter={() => setHaveHover(true)}
632
+ // onMouseLeave={() => setHaveHover(false)}
633
+ // >
634
+ // <div className="message-view-container--incoming-message-wrapper__message">
635
+ // <div className="message-view-container--incoming-message-wrapper__avatar">
636
+ // <div
637
+ // style={
638
+ // props.theme
639
+ // ? { backgroundColor: props.theme.disabledElements() }
640
+ // : {}
641
+ // }
642
+ // className="message-view-container__sender-avatar"
643
+ // >
644
+ // <User
645
+ // width="24"
646
+ // height="24"
647
+ // applyZoom
648
+ // color="var(--secondary-text)"
649
+ // />
650
+ // </div>
651
+ // </div>
652
+ // <div className="message-view-container--incoming-message-container">
653
+ // <div
654
+ // style={props.theme ? { color: props.theme.secondaryText() } : {}}
655
+ // className="message-view-container__sender-name"
656
+ // >
657
+ // {props.senderName || props.message.sender_id.toString()}
658
+ // </div>
659
+ // <div
660
+ // style={
661
+ // props.theme
662
+ // ? {
663
+ // color: props.theme.mainText(),
664
+ // backgroundColor: props.theme.incomingBackground(),
665
+ // }
666
+ // : {}
667
+ // }
668
+ // className="message-view-container__sender-message"
669
+ // >
670
+ // {/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */}
671
+ // {messageContentRender(
672
+ // props.message,
673
+ // widgetTextContent,
674
+ // props.theme,
675
+ // )}
676
+ // </div>
677
+ // </div>
678
+ // {haveHover || openMenu ? (
679
+ // <div
680
+ // className="message-view-container--incoming-message-wrapper--context-menu"
681
+ // onClick={() => {
682
+ // setOpenMenu(!openMenu);
683
+ // }}
684
+ // >
685
+ // <EditDots
686
+ // color={
687
+ // props.theme
688
+ // ? props.theme.secondaryText()
689
+ // : 'var(--secondary-text)'
690
+ // }
691
+ // />
692
+ // {/* {openMenu ? ( */}
693
+ // {/* <DropDownMenu */}
694
+ // {/* items={contextMessageMenu} */}
695
+ // {/* itemsAI={contextMessageMenuAI} */}
696
+ // {/* /> */}
697
+ // {/* ) : null} */}
698
+ // </div>
699
+ // ) : (
700
+ // <div
701
+ // style={props.theme ? { color: props.theme.mainText() } : {}}
702
+ // className="message-view-container__incoming-time"
703
+ // >
704
+ // {getTimeShort24hFormat(props.message.date_sent)}
705
+ // </div>
706
+ // )}
707
+ //
708
+ // <div
709
+ // className="message-view-container__incoming-time"
710
+ // onClick={props.onClick}
711
+ // >
712
+ // {/* {props.renderWidget} */}
713
+ // {renderWidgetAIAssist(
714
+ // props.message,
715
+ // props.messagesToView,
716
+ // props.currentUserId,
717
+ // props.AITranslation,
718
+ // props.AIAnswerToMessage,
719
+ // )}
720
+ // </div>
721
+ // {waitAIWidget && (
722
+ // <div
723
+ // className="message-view-container__incoming-time"
724
+ // style={{
725
+ // height: '24px',
726
+ // width: '24px',
727
+ // }}
728
+ // >
729
+ // <LoaderComponent
730
+ // width="24"
731
+ // height="24"
732
+ // color="var(--color-background-info)"
733
+ // />
734
+ // </div>
735
+ // )}
736
+ // </div>
737
+ // <div className="message-view-container__widget-ai-translate">
738
+ // {renderWidgetAITranslate(
739
+ // props.message,
740
+ // props.messagesToView,
741
+ // props.currentUserId,
742
+ // props.AITranslation,
743
+ // )}
744
+ // </div>
745
+ // </div>
746
+ );
747
+ }