quickblox-react-ui-kit 0.2.2 → 0.2.4

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 (85) hide show
  1. package/dist/CommonTypes/FunctionResult.d.ts +5 -1
  2. package/dist/Data/DefaultConfigurations.d.ts +2 -2
  3. package/dist/Data/source/remote/Mapper/MessageDTOMapper.d.ts +3 -1
  4. package/dist/Domain/use_cases/ai/AIAnswerAssistUseCase.d.ts +13 -0
  5. package/dist/Domain/use_cases/ai/AIAnswerAssistWithProxyUseCase.d.ts +13 -0
  6. package/dist/Domain/use_cases/ai/AIRephraseUseCase.d.ts +15 -0
  7. package/dist/Domain/use_cases/ai/AIRephraseWithProxyUseCase.d.ts +15 -0
  8. package/dist/Domain/use_cases/ai/AITranslateUseCase.d.ts +14 -0
  9. package/dist/Domain/use_cases/ai/AITranslateWithProxyUseCase.d.ts +14 -0
  10. package/dist/Presentation/Views/Base/BaseViewModel.d.ts +2 -0
  11. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIMessageWidget.d.ts +10 -1
  12. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIWidgetActions/AIWidgetActions.d.ts +3 -2
  13. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/Tone.d.ts +5 -13
  14. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidget.d.ts +2 -10
  15. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidgetWithProxy.d.ts +2 -0
  16. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidget.d.ts +2 -10
  17. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidgetWithProxy.d.ts +2 -0
  18. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidget.d.ts +2 -10
  19. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidgetWithProxy.d.ts +2 -0
  20. package/dist/Presentation/components/UI/Dialogs/MessagesView/DefaultAttachmentComponent/DefaultAttachmentComponent.d.ts +7 -0
  21. package/dist/Presentation/components/UI/Dialogs/MessagesView/ErrorToast/ErrorToast.d.ts +7 -0
  22. package/dist/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/InComingMessage.d.ts +3 -1
  23. package/dist/Presentation/components/UI/Dialogs/PreviewDialog/PreviewAudioFile/PreviewAudioFile.d.ts +7 -0
  24. package/dist/Presentation/components/UI/Dialogs/PreviewDialog/PreviewDefaultFile/PreviewDefaultFile.d.ts +7 -0
  25. package/dist/Presentation/components/UI/Dialogs/PreviewDialog/PreviewImageFile/PreviewImageFile.d.ts +8 -0
  26. package/dist/Presentation/components/UI/Dialogs/PreviewDialog/PreviewVideoFile/PreviewVideoFile.d.ts +7 -0
  27. package/dist/Presentation/components/UI/svgs/Icons/AIWidgets/BotIcon/BotIcon.d.ts +4 -0
  28. package/dist/QBconfig.d.ts +14 -3
  29. package/dist/index-ui.js +384 -35
  30. package/dist/utils/utils.d.ts +9 -0
  31. package/global.d.ts +12 -4
  32. package/package.json +5 -1
  33. package/src/App.tsx +3 -1
  34. package/src/CommonTypes/FunctionResult.ts +6 -1
  35. package/src/Data/DefaultConfigurations.ts +155 -19
  36. package/src/Data/source/remote/Mapper/DialogDTOMapper.ts +3 -0
  37. package/src/Data/source/remote/Mapper/MessageDTOMapper.ts +55 -2
  38. package/src/Data/source/remote/RemoteDataSource.ts +2 -1
  39. package/src/Domain/use_cases/ai/AIAnswerAssistUseCase.ts +69 -0
  40. package/src/Domain/use_cases/ai/AIAnswerAssistWithProxyUseCase.ts +71 -0
  41. package/src/Domain/use_cases/ai/AIRephraseUseCase.ts +89 -0
  42. package/src/Domain/use_cases/ai/AIRephraseWithProxyUseCase.ts +75 -0
  43. package/src/Domain/use_cases/ai/AITranslateUseCase.ts +76 -0
  44. package/src/Domain/use_cases/ai/AITranslateWithProxyUseCase.ts +79 -0
  45. package/src/Presentation/Views/Base/BaseViewModel.ts +2 -0
  46. package/src/Presentation/Views/Dialogs/Dialogs.tsx +2 -2
  47. package/src/Presentation/Views/Dialogs/useDialogsViewModel.ts +4 -1
  48. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIMessageWidget.ts +18 -2
  49. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIWidgetActions/AIWidgetActions.tsx +10 -4
  50. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/Tone.ts +29 -15
  51. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidget.tsx +24 -40
  52. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidgetWithProxy.tsx +83 -0
  53. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidget.tsx +40 -41
  54. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidgetWithProxy.tsx +102 -0
  55. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidget.tsx +27 -44
  56. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidgetWithProxy.tsx +89 -0
  57. package/src/Presentation/components/UI/Dialogs/MessagesView/DefaultAttachmentComponent/DefaultAttachmentComponent.scss +76 -0
  58. package/src/Presentation/components/UI/Dialogs/MessagesView/DefaultAttachmentComponent/DefaultAttachmentComponent.tsx +34 -0
  59. package/src/Presentation/components/UI/Dialogs/MessagesView/ErrorToast/ErrorToast.scss +26 -0
  60. package/src/Presentation/components/UI/Dialogs/MessagesView/ErrorToast/ErrorToast.tsx +25 -0
  61. package/src/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/InComingMessage.scss +4 -6
  62. package/src/Presentation/components/UI/Dialogs/MessagesView/InComingMessage/InComingMessage.tsx +93 -405
  63. package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesView.scss +2 -3
  64. package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesView.tsx +578 -415
  65. package/src/Presentation/components/UI/Dialogs/MessagesView/VideoAttachmentComponent/VideoAttachmentComponent.scss +6 -2
  66. package/src/Presentation/components/UI/Dialogs/MessagesView/useMessagesViewModel.ts +13 -3
  67. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewAudioFile/PreviewAudioFile.scss +62 -0
  68. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewAudioFile/PreviewAudioFile.tsx +25 -0
  69. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewDefaultFile/PreviewDefaultFile.scss +61 -0
  70. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewDefaultFile/PreviewDefaultFile.tsx +32 -0
  71. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewDialog.scss +2 -2
  72. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewDialog.tsx +50 -2
  73. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewImageFile/PreviewImageFile.scss +40 -0
  74. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewImageFile/PreviewImageFile.tsx +26 -0
  75. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewVideoFile/PreviewVideoFile.scss +62 -0
  76. package/src/Presentation/components/UI/Dialogs/PreviewDialog/PreviewVideoFile/PreviewVideoFile.tsx +25 -0
  77. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/BotIcon/BotIcon.svg +5 -0
  78. package/src/Presentation/components/UI/svgs/Icons/AIWidgets/BotIcon/BotIcon.tsx +50 -0
  79. package/src/Presentation/components/layouts/Desktop/QuickBloxUIKitDesktopLayout.tsx +41 -42
  80. package/src/Presentation/components/providers/QuickBloxUIKitProvider/QuickBloxUIKitProvider.tsx +1 -1
  81. package/src/Presentation/components/providers/QuickBloxUIKitProvider/useQbInitializedDataContext.ts +15 -14
  82. package/src/QBconfig.ts +156 -10
  83. package/src/package_artan_react_ui.json +13 -9
  84. package/src/package_original.json +5 -1
  85. package/src/utils/utils.ts +63 -0
@@ -1,5 +1,7 @@
1
1
  import React, { useEffect, useRef, useState } from 'react';
2
2
  import './MessagesView.scss';
3
+ import { QBAIRephrase } from 'qb-ai-rephrase';
4
+ import { Tone } from 'qb-ai-rephrase/src/Tone';
3
5
  import { DialogEntity } from '../../../../../Domain/entity/DialogEntity';
4
6
  import useQBConnection from '../../../providers/QuickBloxUIKitProvider/useQBConnection';
5
7
  import ScrollableContainer from '../../../containers/ScrollableContainer/ScrollableContainer';
@@ -44,10 +46,8 @@ import UiKitTheme from '../../../../assets/UiKitTheme';
44
46
  import { AIMessageWidget } from './AIWidgets/AIMessageWidget';
45
47
  import { DialogsViewModel } from '../../../../Views/Dialogs/DialogViewModel';
46
48
  import { HighLightLink, messageHasUrls } from './HighLightLink/HighLightLink';
47
- import { loopToLimitTokens } from '../../../../../utils/utils';
48
49
  import { OutGoingMessage } from './OutGoingMessage/OutGoingMessage';
49
50
  import { InComingMessage } from './InComingMessage/InComingMessage';
50
- import { Tone } from './AIWidgets/Tone';
51
51
  import NecktieIcon from '../../svgs/Icons/AIWidgets/NecktieIcon';
52
52
  import HandshakeIcon from '../../svgs/Icons/AIWidgets/HandshakeIcon';
53
53
  import WhiteCheckMarkIcon from '../../svgs/Icons/AIWidgets/WhiteCheckMarkIcon';
@@ -60,9 +60,13 @@ import PointUpIcon from '../../svgs/Icons/AIWidgets/PointUpIcon';
60
60
  import SmirkIcon from '../../svgs/Icons/AIWidgets/SmirkIcon';
61
61
  import PerformingArtsIcon from '../../svgs/Icons/AIWidgets/PerformingArtsIcon';
62
62
  import { FunctionTypeVoidToVoid } from '../../../../Views/Base/BaseViewModel';
63
- import { IChatMessage } from '../../../../../Data/source/AISource';
64
- // import ToneIcon from '../../svgs/Icons/Actions/Tone';
65
- // import AIWidgetActions from './AIWidgets/AIWidgetActions/AIWidgetActions';
63
+ import AIWidgetActions, {
64
+ MenuItem,
65
+ } from './AIWidgets/AIWidgetActions/AIWidgetActions';
66
+ import ToneIcon from '../../svgs/Icons/Actions/Tone';
67
+ import DefaultAttachmentComponent from './DefaultAttachmentComponent/DefaultAttachmentComponent';
68
+ import { AIUtils } from '../../../../../utils/utils';
69
+ import { ErrorToast } from './ErrorToast/ErrorToast';
66
70
 
67
71
  type HeaderDialogsMessagesProps = {
68
72
  AIRephrase?: AIMessageWidget;
@@ -112,32 +116,18 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
112
116
  const [messagesToView, setMessagesToView] = React.useState<MessageEntity[]>(
113
117
  [],
114
118
  );
119
+ const [showErrorToast, setShowErrorToast] = useState<boolean>(true);
120
+ const [messageErrorToast, setMessageErrorToast] = useState<string>('');
115
121
 
116
122
  const [waitAIWidget, setWaitAIWidget] = useState<boolean>(false);
117
- const messageEntitiesToIChatMessageCollection = (
118
- messageEntities: MessageEntity[],
119
- ): IChatMessage[] => {
120
- const MAX_TOKENS = 3584;
121
- const items = messageEntities.filter(
122
- (it) =>
123
- !it.notification_type ||
124
- (it.notification_type && it.notification_type.length === 0),
125
- );
126
- const messages = loopToLimitTokens(
127
- MAX_TOKENS,
128
- items,
129
- ({ message }) => message || '',
130
- ).reverse();
131
- const chatCompletionMessages: IChatMessage[] = messages.map(
132
- ({ message, sender_id }) => ({
133
- role: sender_id === currentUserId ? 'user' : 'assistant',
134
- content: message,
135
- }),
136
- );
123
+ const [prevTextMessage, setPrevTextMessage] = useState<string>('');
137
124
 
138
- //
139
- return chatCompletionMessages;
140
- };
125
+ const maxTokensForAIRephrase =
126
+ currentContext.InitParams.qbConfig.configAIApi.AIRephraseWidgetConfig
127
+ .maxTokens;
128
+
129
+ const rephraseTones: Tone[] =
130
+ currentContext.InitParams.qbConfig.configAIApi.AIRephraseWidgetConfig.Tones;
141
131
 
142
132
  const messagesViewModel: MessagesViewModel = useMessagesViewModel(
143
133
  dialogsViewModel.entity?.type,
@@ -146,6 +136,15 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
146
136
 
147
137
  const { maxFileSize } = currentContext.InitParams;
148
138
 
139
+ useEffect(() => {
140
+ if (showErrorToast) {
141
+ setTimeout(() => {
142
+ setShowErrorToast(false);
143
+ setMessageErrorToast('');
144
+ }, 1800);
145
+ }
146
+ }, [showErrorToast]);
147
+
149
148
  useEffect(() => {
150
149
  console.log('HAVE NEW DIALOG');
151
150
  // messagesViewModel.getMessages(new Pagination());
@@ -280,7 +279,11 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
280
279
  let messageContent: JSX.Element = messageText;
281
280
 
282
281
  const attachmentContentRender = (att: ChatMessageAttachmentEntity) => {
283
- let contentPlaceHolder: JSX.Element = <div>{att.type.toString()}</div>;
282
+ // let contentPlaceHolder: JSX.Element = <div>{att.type.toString()}</div>;
283
+
284
+ let contentPlaceHolder: JSX.Element = (
285
+ <DefaultAttachmentComponent fileName={att.file?.name || ''} />
286
+ );
284
287
 
285
288
  if (att.type.toString().includes(FileType.video)) {
286
289
  contentPlaceHolder = att.file ? (
@@ -305,9 +308,10 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
305
308
  }
306
309
  if (att.type.toString().includes(FileType.text)) {
307
310
  contentPlaceHolder = att.file ? (
308
- <div>TEXT</div>
311
+ // <div>TEXT</div>
312
+ <DefaultAttachmentComponent fileName={att.file.name || ''} />
309
313
  ) : (
310
- <ImageFile applyZoom />
314
+ <ImageFile width="24" height="24" applyZoom />
311
315
  );
312
316
  }
313
317
  let contentResult: JSX.Element = (
@@ -378,10 +382,16 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
378
382
  senderName={getSenderName(message.sender)}
379
383
  message={message}
380
384
  // element={messageContentRender(message)}
381
- onLoader={() => {
382
- // sendMessageToTranslate(message);
385
+ onStartLoader={() => {
383
386
  setWaitAIWidget(true);
384
387
  }}
388
+ onStopLoader={() => {
389
+ setWaitAIWidget(false);
390
+ }}
391
+ onErrorToast={(messageError) => {
392
+ setShowErrorToast(true);
393
+ setMessageErrorToast(messageError);
394
+ }}
385
395
  // renderWidget={
386
396
  // <ContextMenu
387
397
  // widgetToRender={
@@ -537,31 +547,29 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
537
547
  // eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/require-await
538
548
  const startRecording = async () => {
539
549
  if (!stream) return;
540
- // const mimeTypes = [
541
- // 'audio/aac',
542
- // 'audio/mp4',
543
- // 'audio/mpeg',
544
- // 'audio/ogg',
545
- // 'audio/wav',
546
- // 'audio/webm',
547
- // 'audio/3gpp',
548
- // 'audio/flac',
549
- // 'audio/x-aiff',
550
- // 'audio/x-m4a',
551
- // ];
552
- //
553
- // console.log('MIME TYPES: ');
554
- // mimeTypes.forEach((mimeType) => {
555
- // if (MediaRecorder.isTypeSupported(mimeType)) {
556
- // console.log(`${mimeType} is supported`);
557
- // } else {
558
- // console.log(`${mimeType} is not supported`);
559
- // }
560
- // });
550
+ const mimeTypes = [
551
+ 'audio/aac',
552
+ 'audio/mp4',
553
+ 'audio/mpeg',
554
+ 'audio/ogg',
555
+ 'audio/wav',
556
+ 'audio/webm',
557
+ 'audio/3gpp',
558
+ 'audio/flac',
559
+ 'audio/x-aiff',
560
+ 'audio/x-m4a',
561
+ ];
562
+
563
+ console.log('MIME TYPES: ');
564
+ mimeTypes.forEach((mType) => {
565
+ if (MediaRecorder.isTypeSupported(mimeType)) {
566
+ console.log(`${mType} is supported`);
567
+ } else {
568
+ console.log(`${mType} is not supported`);
569
+ }
570
+ });
561
571
  // audio/mp4;codecs=mp4a audio/webm;codecs=opus audio/webm;codecs=vp9,opus
562
- const mimeContent = window.MediaRecorder.isTypeSupported(
563
- 'audio/mp4;codecs=mp4a',
564
- )
572
+ const mimeContent = window.MediaRecorder.isTypeSupported('audio/mp4')
565
573
  ? 'audio/mp4;codecs=mp4a'
566
574
  : 'audio/webm;codecs=opus';
567
575
 
@@ -602,7 +610,8 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
602
610
  // const mp4Blob = new Blob(recordedChunks, { type: 'video/mp4' });
603
611
 
604
612
  // const audioBlob = new Blob(audioChunks, { type: 'video/mp4' }); // mimeType
605
- const audioBlob = new Blob(audioChunks, { type: 'audio/mp4' }); // mimeType
613
+ // const audioBlob = new Blob(audioChunks, { type: 'audio/mp4' }); // mimeType
614
+ const audioBlob = new Blob(audioChunks, { type: 'audio/mp4' });
606
615
 
607
616
  setResultAudioBlob(audioBlob);
608
617
 
@@ -752,163 +761,493 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
752
761
  const useUpContent = upHeaderContent || false;
753
762
 
754
763
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
764
+ // function getAIEditingMessagesItems() {
765
+ // return [
766
+ // {
767
+ // title: 'Professional Tone',
768
+ // icon: <NecktieIcon />,
769
+ // action: () => {
770
+ // if (messageText && messageText.length > 0 && !waitAIWidget) {
771
+ // setWaitAIWidget(true);
772
+ // AIRephrase?.textToWidget(
773
+ // messageText,
774
+ // AIUtils.messageEntitiesToIChatMessageCollection(
775
+ // messagesToView,
776
+ // currentUserId,
777
+ // maxTokensForAIRephrase,
778
+ // ),
779
+ // {
780
+ // tone: QBAIRephrase.defaultTones()[0],
781
+ // // tone: {
782
+ // // name: 'Professional Tone',
783
+ // // description: '',
784
+ // // iconEmoji: '',
785
+ // // },
786
+ // },
787
+ // )
788
+ // .then((answerText) => {
789
+ // // eslint-disable-next-line promise/always-return
790
+ // if (answerText === 'Rephrase failed.') {
791
+ // setMessageErrorToast('Rephrase failed.');
792
+ // setShowErrorToast(true);
793
+ // }
794
+ // setWaitAIWidget(false);
795
+ // })
796
+ // .catch(() => {
797
+ // setMessageErrorToast('Rephrase failed.');
798
+ // setShowErrorToast(true);
799
+ // setWaitAIWidget(false);
800
+ // });
801
+ // }
802
+ // },
803
+ // },
804
+ // {
805
+ // title: 'Friendly Tone',
806
+ // icon: <HandshakeIcon />,
807
+ // action: () => {
808
+ // if (messageText && messageText.length > 0 && !waitAIWidget) {
809
+ // setWaitAIWidget(true);
810
+ // AIRephrase?.textToWidget(
811
+ // messageText,
812
+ // AIUtils.messageEntitiesToIChatMessageCollection(
813
+ // messagesToView,
814
+ // currentUserId,
815
+ // maxTokensForAIRephrase,
816
+ // ),
817
+ // {
818
+ // // tone: { name: 'Friendly Tone', description: '', iconEmoji: '' },
819
+ // tone: QBAIRephrase.defaultTones()[1],
820
+ // },
821
+ // )
822
+ // .then((answerText) => {
823
+ // // eslint-disable-next-line promise/always-return
824
+ // if (answerText === 'Rephrase failed.') {
825
+ // setMessageErrorToast('Rephrase failed.');
826
+ // setShowErrorToast(true);
827
+ // }
828
+ // setWaitAIWidget(false);
829
+ // })
830
+ // .catch(() => {
831
+ // setMessageErrorToast('Rephrase failed.');
832
+ // setShowErrorToast(true);
833
+ // setWaitAIWidget(false);
834
+ // });
835
+ // }
836
+ // },
837
+ // },
838
+ // {
839
+ // title: 'Encouraging Tone',
840
+ // icon: <MuscleIcon />,
841
+ // action: () => {
842
+ // if (messageText && messageText.length > 0 && !waitAIWidget) {
843
+ // setWaitAIWidget(true);
844
+ // AIRephrase?.textToWidget(
845
+ // messageText,
846
+ // AIUtils.messageEntitiesToIChatMessageCollection(
847
+ // messagesToView,
848
+ // currentUserId,
849
+ // maxTokensForAIRephrase,
850
+ // ),
851
+ // {
852
+ // tone: QBAIRephrase.defaultTones()[2],
853
+ // // tone: {
854
+ // // name: 'Encouraging Tone',
855
+ // // description: '',
856
+ // // iconEmoji: '',
857
+ // // },
858
+ // },
859
+ // )
860
+ // .then((answerText) => {
861
+ // // eslint-disable-next-line promise/always-return
862
+ // if (answerText === 'Rephrase failed.') {
863
+ // setMessageErrorToast('Rephrase failed.');
864
+ // setShowErrorToast(true);
865
+ // }
866
+ // setWaitAIWidget(false);
867
+ // })
868
+ // .catch(() => {
869
+ // setMessageErrorToast('Rephrase failed.');
870
+ // setShowErrorToast(true);
871
+ // setWaitAIWidget(false);
872
+ // });
873
+ // }
874
+ // },
875
+ // },
876
+ // {
877
+ // title: 'Empathetic Tone',
878
+ // icon: <PalmsUpTogetherIcon />,
879
+ // action: () => {
880
+ // if (messageText && messageText.length > 0 && !waitAIWidget) {
881
+ // setWaitAIWidget(true);
882
+ // AIRephrase?.textToWidget(
883
+ // messageText,
884
+ // AIUtils.messageEntitiesToIChatMessageCollection(
885
+ // messagesToView,
886
+ // currentUserId,
887
+ // maxTokensForAIRephrase,
888
+ // ),
889
+ // {
890
+ // tone: QBAIRephrase.defaultTones()[3],
891
+ // // tone: {
892
+ // // name: 'Empathetic Tone',
893
+ // // description: '',
894
+ // // iconEmoji: '',
895
+ // // },
896
+ // },
897
+ // )
898
+ // .then((answerText) => {
899
+ // // eslint-disable-next-line promise/always-return
900
+ // if (answerText === 'Rephrase failed.') {
901
+ // setMessageErrorToast('Rephrase failed.');
902
+ // setShowErrorToast(true);
903
+ // }
904
+ // setWaitAIWidget(false);
905
+ // })
906
+ // .catch(() => {
907
+ // setMessageErrorToast('Rephrase failed.');
908
+ // setShowErrorToast(true);
909
+ // setWaitAIWidget(false);
910
+ // });
911
+ // }
912
+ // },
913
+ // },
914
+ // {
915
+ // title: 'Neutral Tone',
916
+ // icon: <NeutralFaceIcon />,
917
+ // action: () => {
918
+ // if (messageText && messageText.length > 0 && !waitAIWidget) {
919
+ // setWaitAIWidget(true);
920
+ // AIRephrase?.textToWidget(
921
+ // messageText,
922
+ // AIUtils.messageEntitiesToIChatMessageCollection(
923
+ // messagesToView,
924
+ // currentUserId,
925
+ // maxTokensForAIRephrase,
926
+ // ),
927
+ // {
928
+ // // tone: { name: 'Neutral Tone', description: '', iconEmoji: '' },
929
+ // tone: QBAIRephrase.defaultTones()[4],
930
+ // },
931
+ // )
932
+ // .then((answerText) => {
933
+ // // eslint-disable-next-line promise/always-return
934
+ // if (answerText === 'Rephrase failed.') {
935
+ // setMessageErrorToast('Rephrase failed.');
936
+ // setShowErrorToast(true);
937
+ // }
938
+ // setWaitAIWidget(false);
939
+ // })
940
+ // .catch(() => {
941
+ // setMessageErrorToast('Rephrase failed.');
942
+ // setShowErrorToast(true);
943
+ // setWaitAIWidget(false);
944
+ // });
945
+ // }
946
+ // },
947
+ // },
948
+ // {
949
+ // title: 'Assertive Tone',
950
+ // icon: <HammerIcon />,
951
+ // action: () => {
952
+ // if (messageText && messageText.length > 0 && !waitAIWidget) {
953
+ // setWaitAIWidget(true);
954
+ // AIRephrase?.textToWidget(
955
+ // messageText,
956
+ // AIUtils.messageEntitiesToIChatMessageCollection(
957
+ // messagesToView,
958
+ // currentUserId,
959
+ // maxTokensForAIRephrase,
960
+ // ),
961
+ // {
962
+ // tone: QBAIRephrase.defaultTones()[5],
963
+ // // tone: {
964
+ // // name: 'Assertive Tone',
965
+ // // description: '',
966
+ // // iconEmoji: '',
967
+ // // },
968
+ // },
969
+ // )
970
+ // .then((answerText) => {
971
+ // // eslint-disable-next-line promise/always-return
972
+ // if (answerText === 'Rephrase failed.') {
973
+ // setMessageErrorToast('Rephrase failed.');
974
+ // setShowErrorToast(true);
975
+ // }
976
+ // setWaitAIWidget(false);
977
+ // })
978
+ // .catch(() => {
979
+ // setMessageErrorToast('Rephrase failed.');
980
+ // setShowErrorToast(true);
981
+ // setWaitAIWidget(false);
982
+ // });
983
+ // }
984
+ // },
985
+ // },
986
+ // {
987
+ // title: 'Instructive Tone',
988
+ // icon: <BookIcon />,
989
+ // action: () => {
990
+ // if (messageText && messageText.length > 0 && !waitAIWidget) {
991
+ // setWaitAIWidget(true);
992
+ // AIRephrase?.textToWidget(
993
+ // messageText,
994
+ // AIUtils.messageEntitiesToIChatMessageCollection(
995
+ // messagesToView,
996
+ // currentUserId,
997
+ // maxTokensForAIRephrase,
998
+ // ),
999
+ // {
1000
+ // tone: QBAIRephrase.defaultTones()[6],
1001
+ // // tone: {
1002
+ // // name: 'Instructive Tone',
1003
+ // // description: '',
1004
+ // // iconEmoji: '',
1005
+ // // },
1006
+ // },
1007
+ // )
1008
+ // .then((answerText) => {
1009
+ // // eslint-disable-next-line promise/always-return
1010
+ // if (answerText === 'Rephrase failed.') {
1011
+ // setMessageErrorToast('Rephrase failed.');
1012
+ // setShowErrorToast(true);
1013
+ // }
1014
+ // setWaitAIWidget(false);
1015
+ // })
1016
+ // .catch(() => {
1017
+ // setMessageErrorToast('Rephrase failed.');
1018
+ // setShowErrorToast(true);
1019
+ // setWaitAIWidget(false);
1020
+ // });
1021
+ // }
1022
+ // },
1023
+ // },
1024
+ // {
1025
+ // title: 'Persuasive Tone',
1026
+ // icon: <PointUpIcon />,
1027
+ // action: () => {
1028
+ // if (messageText && messageText.length > 0 && !waitAIWidget) {
1029
+ // setWaitAIWidget(true);
1030
+ // AIRephrase?.textToWidget(
1031
+ // messageText,
1032
+ // AIUtils.messageEntitiesToIChatMessageCollection(
1033
+ // messagesToView,
1034
+ // currentUserId,
1035
+ // maxTokensForAIRephrase,
1036
+ // ),
1037
+ // {
1038
+ // tone: QBAIRephrase.defaultTones()[7],
1039
+ // // tone: {
1040
+ // // name: 'Persuasive Tone',
1041
+ // // description: '',
1042
+ // // iconEmoji: '',
1043
+ // // },
1044
+ // },
1045
+ // )
1046
+ // .then((answerText) => {
1047
+ // // eslint-disable-next-line promise/always-return
1048
+ // if (answerText === 'Rephrase failed.') {
1049
+ // setMessageErrorToast('Rephrase failed.');
1050
+ // setShowErrorToast(true);
1051
+ // }
1052
+ // setWaitAIWidget(false);
1053
+ // })
1054
+ // .catch(() => {
1055
+ // setMessageErrorToast('Rephrase failed.');
1056
+ // setShowErrorToast(true);
1057
+ // setWaitAIWidget(false);
1058
+ // });
1059
+ // }
1060
+ // },
1061
+ // },
1062
+ // {
1063
+ // title: 'Sarcastic/Ironic Tone',
1064
+ // icon: <SmirkIcon />,
1065
+ // action: () => {
1066
+ // if (messageText && messageText.length > 0 && !waitAIWidget) {
1067
+ // setWaitAIWidget(true);
1068
+ // AIRephrase?.textToWidget(
1069
+ // messageText,
1070
+ // AIUtils.messageEntitiesToIChatMessageCollection(
1071
+ // messagesToView,
1072
+ // currentUserId,
1073
+ // maxTokensForAIRephrase,
1074
+ // ),
1075
+ // {
1076
+ // tone: QBAIRephrase.defaultTones()[8],
1077
+ // // tone: {
1078
+ // // name: 'Sarcastic/Ironic Tone',
1079
+ // // description: '',
1080
+ // // iconEmoji: '',
1081
+ // // },
1082
+ // },
1083
+ // )
1084
+ // .then((answerText) => {
1085
+ // // eslint-disable-next-line promise/always-return
1086
+ // if (answerText === 'Rephrase failed.') {
1087
+ // setMessageErrorToast('Rephrase failed.');
1088
+ // setShowErrorToast(true);
1089
+ // }
1090
+ // setWaitAIWidget(false);
1091
+ // })
1092
+ // .catch(() => {
1093
+ // setMessageErrorToast('Rephrase failed.');
1094
+ // setShowErrorToast(true);
1095
+ // setWaitAIWidget(false);
1096
+ // });
1097
+ // }
1098
+ // },
1099
+ // },
1100
+ // {
1101
+ // title: 'Poetic Tone',
1102
+ // icon: <PerformingArtsIcon />,
1103
+ // action: () => {
1104
+ // if (messageText && messageText.length > 0 && !waitAIWidget) {
1105
+ // setWaitAIWidget(true);
1106
+ // AIRephrase?.textToWidget(
1107
+ // messageText,
1108
+ // AIUtils.messageEntitiesToIChatMessageCollection(
1109
+ // messagesToView,
1110
+ // currentUserId,
1111
+ // maxTokensForAIRephrase,
1112
+ // ),
1113
+ // {
1114
+ // tone: QBAIRephrase.defaultTones()[9],
1115
+ // // tone: { name: 'Poetic Tone', description: '', iconEmoji: '' }
1116
+ // },
1117
+ // )
1118
+ // .then((answerText) => {
1119
+ // // eslint-disable-next-line promise/always-return
1120
+ // if (answerText === 'Rephrase failed.') {
1121
+ // setMessageErrorToast('Rephrase failed.');
1122
+ // setShowErrorToast(true);
1123
+ // }
1124
+ // setWaitAIWidget(false);
1125
+ // })
1126
+ // .catch(() => {
1127
+ // setMessageErrorToast('Rephrase failed.');
1128
+ // setShowErrorToast(true);
1129
+ // setWaitAIWidget(false);
1130
+ // });
1131
+ // }
1132
+ // },
1133
+ // },
1134
+ // {
1135
+ // title: 'Back to original text',
1136
+ // icon: <WhiteCheckMarkIcon />,
1137
+ // action: () => {
1138
+ // if (messageText && messageText.length > 0 && !waitAIWidget) {
1139
+ // setWaitAIWidget(true);
1140
+ // AIRephrase?.textToWidget(
1141
+ // messageText,
1142
+ // AIUtils.messageEntitiesToIChatMessageCollection(
1143
+ // messagesToView,
1144
+ // currentUserId,
1145
+ // maxTokensForAIRephrase,
1146
+ // ),
1147
+ // {
1148
+ // tone: {
1149
+ // name: 'Unchanged',
1150
+ // description: 'Unchanged',
1151
+ // iconEmoji: '',
1152
+ // },
1153
+ // },
1154
+ // )
1155
+ // .then((answerText) => {
1156
+ // // eslint-disable-next-line promise/always-return
1157
+ // if (answerText === 'Rephrase failed.') {
1158
+ // setMessageErrorToast('Rephrase failed.');
1159
+ // setShowErrorToast(true);
1160
+ // }
1161
+ // setWaitAIWidget(false);
1162
+ // })
1163
+ // .catch(() => {
1164
+ // setMessageErrorToast('Rephrase failed.');
1165
+ // setShowErrorToast(true);
1166
+ // setWaitAIWidget(false);
1167
+ // });
1168
+ // }
1169
+ // },
1170
+ // },
1171
+ // ];
1172
+ // }
1173
+
1174
+ function getDefaultIcon(index: number) {
1175
+ const defaultIcons = [
1176
+ <NecktieIcon />,
1177
+ <HandshakeIcon />,
1178
+ <MuscleIcon />,
1179
+ <PalmsUpTogetherIcon />,
1180
+ <NeutralFaceIcon />,
1181
+ <HammerIcon />,
1182
+ <BookIcon />,
1183
+ <PointUpIcon />,
1184
+ <SmirkIcon />,
1185
+ <PerformingArtsIcon />,
1186
+ ];
1187
+
1188
+ return defaultIcons[index] || <NeutralFaceIcon />;
1189
+ }
1190
+
755
1191
  function getAIEditingMessagesItems() {
756
- return [
757
- {
758
- title: 'Professional Tone',
759
- icon: <NecktieIcon />,
760
- action: () => {
761
- if (messageText && messageText.length > 0 && !waitAIWidget) {
762
- setWaitAIWidget(true);
763
- AIRephrase?.textToWidget(
764
- messageText,
765
- messageEntitiesToIChatMessageCollection(messagesToView),
766
- { tone: Tone.Professional },
767
- );
768
- }
769
- },
770
- },
771
- {
772
- title: 'Friendly Tone',
773
- icon: <HandshakeIcon />,
774
- action: () => {
775
- if (messageText && messageText.length > 0 && !waitAIWidget) {
776
- setWaitAIWidget(true);
777
- AIRephrase?.textToWidget(
778
- messageText,
779
- messageEntitiesToIChatMessageCollection(messagesToView),
780
- { tone: Tone.Friendly },
781
- );
782
- }
783
- },
784
- },
785
- {
786
- title: 'Encouraging Tone',
787
- icon: <MuscleIcon />,
788
- action: () => {
789
- if (messageText && messageText.length > 0 && !waitAIWidget) {
790
- setWaitAIWidget(true);
791
- AIRephrase?.textToWidget(
792
- messageText,
793
- messageEntitiesToIChatMessageCollection(messagesToView),
794
- { tone: Tone.Encouraging },
795
- );
796
- }
797
- },
798
- },
799
- {
800
- title: 'Empathetic Tone',
801
- icon: <PalmsUpTogetherIcon />,
802
- action: () => {
803
- if (messageText && messageText.length > 0 && !waitAIWidget) {
804
- setWaitAIWidget(true);
805
- AIRephrase?.textToWidget(
806
- messageText,
807
- messageEntitiesToIChatMessageCollection(messagesToView),
808
- { tone: Tone.Empathetic },
809
- );
810
- }
811
- },
812
- },
813
- {
814
- title: 'Neutral Tone',
815
- icon: <NeutralFaceIcon />,
816
- action: () => {
817
- if (messageText && messageText.length > 0 && !waitAIWidget) {
818
- setWaitAIWidget(true);
819
- AIRephrase?.textToWidget(
820
- messageText,
821
- messageEntitiesToIChatMessageCollection(messagesToView),
822
- { tone: Tone.Neutral },
823
- );
824
- }
825
- },
826
- },
827
- {
828
- title: 'Assertive Tone',
829
- icon: <HammerIcon />,
830
- action: () => {
831
- if (messageText && messageText.length > 0 && !waitAIWidget) {
832
- setWaitAIWidget(true);
833
- AIRephrase?.textToWidget(
834
- messageText,
835
- messageEntitiesToIChatMessageCollection(messagesToView),
836
- { tone: Tone.Assertive },
837
- );
838
- }
839
- },
840
- },
841
- {
842
- title: 'Instructive Tone',
843
- icon: <BookIcon />,
844
- action: () => {
845
- if (messageText && messageText.length > 0 && !waitAIWidget) {
846
- setWaitAIWidget(true);
847
- AIRephrase?.textToWidget(
848
- messageText,
849
- messageEntitiesToIChatMessageCollection(messagesToView),
850
- { tone: Tone.Instructive },
851
- );
852
- }
853
- },
854
- },
855
- {
856
- title: 'Persuasive Tone',
857
- icon: <PointUpIcon />,
858
- action: () => {
859
- if (messageText && messageText.length > 0 && !waitAIWidget) {
860
- setWaitAIWidget(true);
861
- AIRephrase?.textToWidget(
862
- messageText,
863
- messageEntitiesToIChatMessageCollection(messagesToView),
864
- { tone: Tone.Persuasive },
865
- );
866
- }
867
- },
868
- },
869
- {
870
- title: 'Sarcastic/Ironic Tone',
871
- icon: <SmirkIcon />,
872
- action: () => {
873
- if (messageText && messageText.length > 0 && !waitAIWidget) {
874
- setWaitAIWidget(true);
875
- AIRephrase?.textToWidget(
876
- messageText,
877
- messageEntitiesToIChatMessageCollection(messagesToView),
878
- { tone: Tone.Sarcastic },
879
- );
880
- }
881
- },
882
- },
883
- {
884
- title: 'Poetic Tone',
885
- icon: <PerformingArtsIcon />,
886
- action: () => {
887
- if (messageText && messageText.length > 0 && !waitAIWidget) {
888
- setWaitAIWidget(true);
889
- AIRephrase?.textToWidget(
890
- messageText,
891
- messageEntitiesToIChatMessageCollection(messagesToView),
892
- { tone: Tone.Poetic },
893
- );
894
- }
895
- },
896
- },
897
- {
898
- title: 'Back to original text',
899
- icon: <WhiteCheckMarkIcon />,
900
- action: () => {
901
- if (messageText && messageText.length > 0 && !waitAIWidget) {
902
- setWaitAIWidget(true);
903
- AIRephrase?.textToWidget(
904
- messageText,
905
- messageEntitiesToIChatMessageCollection(messagesToView),
906
- { tone: Tone.Unchanged },
907
- );
908
- }
909
- },
1192
+ const items: MenuItem[] = [];
1193
+
1194
+ const tones = rephraseTones || QBAIRephrase.defaultTones();
1195
+
1196
+ for (let i = 0; i < tones.length; i += 1) {
1197
+ const tone = tones[i];
1198
+ const title = tone.name;
1199
+ const icon = getDefaultIcon(i) || <NeutralFaceIcon />;
1200
+
1201
+ const action = () => {
1202
+ if (messageText && messageText.length > 0 && !waitAIWidget) {
1203
+ setWaitAIWidget(true);
1204
+ setPrevTextMessage(messageText);
1205
+ AIRephrase?.textToWidget(
1206
+ messageText,
1207
+ AIUtils.messageEntitiesToIChatMessageCollection(
1208
+ messagesToView,
1209
+ currentUserId,
1210
+ maxTokensForAIRephrase,
1211
+ ),
1212
+ {
1213
+ tone,
1214
+ },
1215
+ )
1216
+ .then((answerText) => {
1217
+ // eslint-disable-next-line promise/always-return
1218
+ if (answerText === 'Rephrase failed.') {
1219
+ setMessageErrorToast('Rephrase failed.');
1220
+ setShowErrorToast(true);
1221
+ }
1222
+ setWaitAIWidget(false);
1223
+ })
1224
+ .catch(() => {
1225
+ setMessageErrorToast('Rephrase failed.');
1226
+ setShowErrorToast(true);
1227
+ setWaitAIWidget(false);
1228
+ });
1229
+ }
1230
+ };
1231
+
1232
+ items.push({
1233
+ title,
1234
+ icon,
1235
+ action,
1236
+ });
1237
+ }
1238
+ //
1239
+ items.push({
1240
+ title: 'Back to prev.',
1241
+ icon: <WhiteCheckMarkIcon />,
1242
+ action: () => {
1243
+ if (messageText && messageText.length > 0 && !waitAIWidget) {
1244
+ setMessageText(prevTextMessage);
1245
+ }
910
1246
  },
911
- ];
1247
+ });
1248
+
1249
+ //
1250
+ return items;
912
1251
  }
913
1252
 
914
1253
  return (
@@ -941,6 +1280,10 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
941
1280
  />
942
1281
  {useSubContent && subHeaderContent}
943
1282
  </div>
1283
+ {showErrorToast && !messagesViewModel?.loading ? (
1284
+ <ErrorToast messageText={messageErrorToast} />
1285
+ ) : null}
1286
+
944
1287
  {/* <div */}
945
1288
  {/* style={{ */}
946
1289
  {/* flexGrow: `1`, */}
@@ -1183,23 +1526,28 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
1183
1526
  placeholder="enter text to send"
1184
1527
  />
1185
1528
  </div>
1186
- {/* <div className="right"> */}
1187
- {/* {AIRephrase && ( */}
1188
- {/* <div className="icon"> */}
1189
- {/* <AIWidgetActions */}
1190
- {/* widgetToRender={ */}
1191
- {/* <ToneIcon */}
1192
- {/* width="24" */}
1193
- {/* height="24" */}
1194
- {/* applyZoom */}
1195
- {/* color={theme ? theme.mainText() : 'var(--main-text)'} */}
1196
- {/* /> */}
1197
- {/* } */}
1198
- {/* items={getAIEditingMessagesItems()} */}
1199
- {/* /> */}
1200
- {/* </div> */}
1201
- {/* )} */}
1202
- {/* </div> */}
1529
+ <div className="right">
1530
+ {AIRephrase && (
1531
+ <div
1532
+ className="icon"
1533
+ style={{
1534
+ cursor: !waitAIWidget ? 'pointer' : '',
1535
+ }}
1536
+ >
1537
+ <AIWidgetActions
1538
+ widgetToRender={
1539
+ <ToneIcon
1540
+ width="24"
1541
+ height="24"
1542
+ applyZoom
1543
+ color={theme ? theme.mainText() : 'var(--main-text)'}
1544
+ />
1545
+ }
1546
+ items={getAIEditingMessagesItems()}
1547
+ />
1548
+ </div>
1549
+ )}
1550
+ </div>
1203
1551
  </div>
1204
1552
  )}
1205
1553
 
@@ -1219,191 +1567,6 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
1219
1567
  }}
1220
1568
  />
1221
1569
  )}
1222
- {/* {AIRephrase && ( */}
1223
- {/* <div> */}
1224
- {/* /!* <ContextMenu *!/ */}
1225
- {/* /!* widgetToRender={ *!/ */}
1226
- {/* /!* <AIWidgetIcon *!/ */}
1227
- {/* /!* applyZoom *!/ */}
1228
- {/* /!* color="var(--main-elements)" *!/ */}
1229
- {/* /!* width="24" *!/ */}
1230
- {/* /!* height="24" *!/ */}
1231
- {/* /!* /> *!/ */}
1232
- {/* /!* } *!/ */}
1233
- {/* /!* items={[ *!/ */}
1234
- {/* /!* // { *!/ */}
1235
- {/* /!* // title: 'AI Chat Summary', *!/ */}
1236
- {/* /!* // // eslint-disable-next-line @typescript-eslint/no-empty-function *!/ */}
1237
- {/* /!* // action: () => {}, *!/ */}
1238
- {/* /!* // }, *!/ */}
1239
- {/* /!* { *!/ */}
1240
- {/* /!* title: 'AI Translate', *!/ */}
1241
- {/* /!* action: () => { *!/ */}
1242
- {/* /!* if ( *!/ */}
1243
- {/* /!* messageText && *!/ */}
1244
- {/* /!* messageText.length > 0 && *!/ */}
1245
- {/* /!* !waitAIWidget *!/ */}
1246
- {/* /!* ) { *!/ */}
1247
- {/* /!* setWaitAIWidget(true); *!/ */}
1248
- {/* /!* AITranslation?.textToWidget( *!/ */}
1249
- {/* /!* messageText, *!/ */}
1250
- {/* /!* messageEntitiesToIChatMessageCollection(messagesToView), *!/ */}
1251
- {/* /!* ); *!/ */}
1252
- {/* /!* } *!/ */}
1253
- {/* /!* }, *!/ */}
1254
- {/* /!* }, *!/ */}
1255
- {/* /!* ]} *!/ */}
1256
- {/* /!* /> *!/ */}
1257
- {/* /!* <AIWidgetActions *!/ */}
1258
- {/* /!* widgetToRender={ *!/ */}
1259
- {/* /!* <AIWidgetIcon *!/ */}
1260
- {/* /!* applyZoom *!/ */}
1261
- {/* /!* color="var(--main-elements)" *!/ */}
1262
- {/* /!* width="16" *!/ */}
1263
- {/* /!* height="16" *!/ */}
1264
- {/* /!* /> *!/ */}
1265
- {/* /!* } *!/ */}
1266
- {/* /!* items={[ *!/ */}
1267
- {/* /!* { *!/ */}
1268
- {/* /!* title: 'English', *!/ */}
1269
- {/* /!* // eslint-disable-next-line @typescript-eslint/no-empty-function,@typescript-eslint/no-misused-promises *!/ */}
1270
- {/* /!* action: async () => { *!/ */}
1271
- {/* /!* if ( *!/ */}
1272
- {/* /!* messageText && *!/ */}
1273
- {/* /!* messageText.length > 0 && *!/ */}
1274
- {/* /!* !waitAIWidget *!/ */}
1275
- {/* /!* ) { *!/ */}
1276
- {/* /!* setWaitAIWidget(true); *!/ */}
1277
- {/* /!* const translation = await AITranslation?.textToWidget( *!/ */}
1278
- {/* /!* messageText, *!/ */}
1279
- {/* /!* messageEntitiesToIChatMessageCollection(messagesToView), *!/ */}
1280
- {/* /!* { *!/ */}
1281
- {/* /!* language: *!/ */}
1282
- {/* /!* 'English' || *!/ */}
1283
- {/* /!* QBConfig.configAIApi.AITranslateWidgetConfig *!/ */}
1284
- {/* /!* .defaultLanguage, *!/ */}
1285
- {/* /!* }, *!/ */}
1286
- {/* /!* ); *!/ */}
1287
-
1288
- {/* /!* setMessageText(translation || ''); *!/ */}
1289
- {/* /!* } *!/ */}
1290
- {/* /!* }, *!/ */}
1291
- {/* /!* }, *!/ */}
1292
- {/* /!* { *!/ */}
1293
- {/* /!* title: 'Ukrainian', *!/ */}
1294
- {/* /!* // eslint-disable-next-line @typescript-eslint/no-misused-promises *!/ */}
1295
- {/* /!* action: async () => { *!/ */}
1296
- {/* /!* if ( *!/ */}
1297
- {/* /!* messageText && *!/ */}
1298
- {/* /!* messageText.length > 0 && *!/ */}
1299
- {/* /!* !waitAIWidget *!/ */}
1300
- {/* /!* ) { *!/ */}
1301
- {/* /!* setWaitAIWidget(true); *!/ */}
1302
- {/* /!* const translation = await AITranslation?.textToWidget( *!/ */}
1303
- {/* /!* messageText, *!/ */}
1304
- {/* /!* messageEntitiesToIChatMessageCollection(messagesToView), *!/ */}
1305
- {/* /!* { *!/ */}
1306
- {/* /!* language: *!/ */}
1307
- {/* /!* 'Ukrainian' || *!/ */}
1308
- {/* /!* QBConfig.configAIApi.AITranslateWidgetConfig *!/ */}
1309
- {/* /!* .defaultLanguage, *!/ */}
1310
- {/* /!* }, *!/ */}
1311
- {/* /!* ); *!/ */}
1312
-
1313
- {/* /!* setMessageText(translation || ''); *!/ */}
1314
- {/* /!* } *!/ */}
1315
- {/* /!* }, *!/ */}
1316
- {/* /!* }, *!/ */}
1317
- {/* /!* { *!/ */}
1318
- {/* /!* title: 'Spanish', *!/ */}
1319
- {/* /!* // eslint-disable-next-line @typescript-eslint/no-misused-promises *!/ */}
1320
- {/* /!* action: async () => { *!/ */}
1321
- {/* /!* if ( *!/ */}
1322
- {/* /!* messageText && *!/ */}
1323
- {/* /!* messageText.length > 0 && *!/ */}
1324
- {/* /!* !waitAIWidget *!/ */}
1325
- {/* /!* ) { *!/ */}
1326
- {/* /!* setWaitAIWidget(true); *!/ */}
1327
- {/* /!* const translation = await AITranslation?.textToWidget( *!/ */}
1328
- {/* /!* messageText, *!/ */}
1329
- {/* /!* messageEntitiesToIChatMessageCollection(messagesToView), *!/ */}
1330
- {/* /!* { *!/ */}
1331
- {/* /!* language: *!/ */}
1332
- {/* /!* 'Spanish' || *!/ */}
1333
- {/* /!* QBConfig.configAIApi.AITranslateWidgetConfig *!/ */}
1334
- {/* /!* .defaultLanguage, *!/ */}
1335
- {/* /!* }, *!/ */}
1336
- {/* /!* ); *!/ */}
1337
-
1338
- {/* /!* setMessageText(translation || ''); *!/ */}
1339
- {/* /!* } *!/ */}
1340
- {/* /!* }, *!/ */}
1341
- {/* /!* }, *!/ */}
1342
- {/* /!* { *!/ */}
1343
- {/* /!* title: 'Portuguese', *!/ */}
1344
- {/* /!* // eslint-disable-next-line @typescript-eslint/no-misused-promises *!/ */}
1345
- {/* /!* action: async () => { *!/ */}
1346
- {/* /!* if ( *!/ */}
1347
- {/* /!* messageText && *!/ */}
1348
- {/* /!* messageText.length > 0 && *!/ */}
1349
- {/* /!* !waitAIWidget *!/ */}
1350
- {/* /!* ) { *!/ */}
1351
- {/* /!* setWaitAIWidget(true); *!/ */}
1352
- {/* /!* const translation = await AITranslation?.textToWidget( *!/ */}
1353
- {/* /!* messageText, *!/ */}
1354
- {/* /!* messageEntitiesToIChatMessageCollection(messagesToView), *!/ */}
1355
- {/* /!* { *!/ */}
1356
- {/* /!* language: *!/ */}
1357
- {/* /!* 'Portuguese' || *!/ */}
1358
- {/* /!* QBConfig.configAIApi.AITranslateWidgetConfig *!/ */}
1359
- {/* /!* .defaultLanguage, *!/ */}
1360
- {/* /!* }, *!/ */}
1361
- {/* /!* ); *!/ */}
1362
-
1363
- {/* /!* setMessageText(translation || ''); *!/ */}
1364
- {/* /!* } *!/ */}
1365
- {/* /!* }, *!/ */}
1366
- {/* /!* }, *!/ */}
1367
- {/* /!* { *!/ */}
1368
- {/* /!* title: 'French', *!/ */}
1369
- {/* /!* // eslint-disable-next-line @typescript-eslint/no-misused-promises *!/ */}
1370
- {/* /!* action: async () => { *!/ */}
1371
- {/* /!* if ( *!/ */}
1372
- {/* /!* messageText && *!/ */}
1373
- {/* /!* messageText.length > 0 && *!/ */}
1374
- {/* /!* !waitAIWidget *!/ */}
1375
- {/* /!* ) { *!/ */}
1376
- {/* /!* setWaitAIWidget(true); *!/ */}
1377
- {/* /!* const translation = await AITranslation?.textToWidget( *!/ */}
1378
- {/* /!* messageText, *!/ */}
1379
- {/* /!* messageEntitiesToIChatMessageCollection(messagesToView), *!/ */}
1380
- {/* /!* { *!/ */}
1381
- {/* /!* language: *!/ */}
1382
- {/* /!* 'French' || *!/ */}
1383
- {/* /!* QBConfig.configAIApi.AITranslateWidgetConfig *!/ */}
1384
- {/* /!* .defaultLanguage, *!/ */}
1385
- {/* /!* }, *!/ */}
1386
- {/* /!* ); *!/ */}
1387
-
1388
- {/* /!* setMessageText(translation || ''); *!/ */}
1389
- {/* /!* } *!/ */}
1390
- {/* /!* }, *!/ */}
1391
- {/* /!* }, *!/ */}
1392
- {/* /!* // { *!/ */}
1393
- {/* /!* // title: 'German', *!/ */}
1394
- {/* /!* // action: () => {}, *!/ */}
1395
- {/* /!* // }, *!/ */}
1396
- {/* /!* ]} *!/ */}
1397
- {/* /!* /> *!/ */}
1398
- {/* <AIWidgetActions */}
1399
- {/* title="AI Rephrase Message" */}
1400
- {/* widgetToRender={ */}
1401
- {/* <AIWidgetIcon applyZoom color="blue" width="24" height="24" /> */}
1402
- {/* } */}
1403
- {/* items={getAIEditingMessagesItems()} */}
1404
- {/* /> */}
1405
- {/* </div> */}
1406
- {/* )} */}
1407
1570
  {!isVoiceMessage && !waitAIWidget && (
1408
1571
  <div>
1409
1572
  <ActiveSvg