quickblox-react-ui-kit 0.1.7 → 0.2.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 (48) hide show
  1. package/dist/Presentation/Views/Base/BaseViewModel.d.ts +8 -0
  2. package/dist/Presentation/Views/Dialogs/Dialogs.d.ts +3 -1
  3. package/dist/Presentation/components/UI/Dialogs/DialogInformation/DialogInformation.d.ts +3 -1
  4. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIWidget.d.ts +8 -0
  5. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/ErrorMessageIcon.d.ts +11 -0
  6. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidgetWithProxy.d.ts +9 -0
  7. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultTextInputWidget.d.ts +2 -0
  8. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/useDefaultVoiceInputWidget.d.ts +2 -0
  9. package/dist/Presentation/components/UI/Dialogs/MessagesView/ContextMenu.d.ts +10 -0
  10. package/dist/Presentation/components/UI/Dialogs/MessagesView/MessagesView.d.ts +7 -1
  11. package/dist/Presentation/components/UI/svgs/Icons/Media/AIWidget/index.d.ts +4 -0
  12. package/dist/Presentation/components/layouts/Desktop/QuickBloxUIKitDesktopLayout.d.ts +9 -0
  13. package/dist/Presentation/components/layouts/TestStage/CompanyLogo/CompanyLogo.d.ts +3 -0
  14. package/dist/Presentation/components/providers/QuickBloxUIKitProvider/useQbInitializedDataContext.d.ts +3 -0
  15. package/dist/Presentation/components/providers/QuickBloxUIKitProvider/useQbUIKitDataContext.d.ts +3 -0
  16. package/dist/QBconfig.d.ts +12 -0
  17. package/dist/index-ui.d.ts +3 -2
  18. package/dist/index-ui.js +72 -17
  19. package/dist/utils/utils.d.ts +3 -0
  20. package/package.json +1 -1
  21. package/src/App.tsx +21 -19
  22. package/src/Presentation/Views/Base/BaseViewModel.ts +17 -1
  23. package/src/Presentation/Views/Dialogs/Dialogs.tsx +14 -9
  24. package/src/Presentation/Views/Dialogs/useDialogsViewModel.ts +1 -1
  25. package/src/Presentation/components/UI/Dialogs/DialogInformation/DialogInformation.tsx +17 -8
  26. package/src/Presentation/components/UI/Dialogs/DialogInformation/UsersList/useUsersListViewModel.ts +2 -2
  27. package/src/Presentation/components/UI/Dialogs/EditDialog/EditDialog.tsx +2 -2
  28. package/src/Presentation/components/UI/Dialogs/InviteMembers/useInviteMembersViewModel.ts +2 -2
  29. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIWidget.ts +13 -0
  30. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/ErrorMessageIcon.tsx +98 -0
  31. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidgetWithProxy.tsx +136 -0
  32. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultTextInputWidget.tsx +60 -0
  33. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/useDefaultVoiceInputWidget.tsx +86 -0
  34. package/src/Presentation/components/UI/Dialogs/MessagesView/ContextMenu.tsx +96 -0
  35. package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesView.tsx +275 -51
  36. package/src/Presentation/components/UI/Dialogs/MessagesView/useMessagesViewModel.ts +2 -2
  37. package/src/Presentation/components/UI/svgs/Icons/Media/AIWidget/Send.svg +3 -0
  38. package/src/Presentation/components/UI/svgs/Icons/Media/AIWidget/index.tsx +39 -0
  39. package/src/Presentation/components/layouts/Desktop/QuickBloxUIKitDesktopLayout.tsx +83 -8
  40. package/src/Presentation/components/layouts/TestStage/CompanyLogo/CompanyLogo.tsx +27 -0
  41. package/src/Presentation/components/layouts/TestStage/LoginView/Login.tsx +2 -2
  42. package/src/Presentation/components/providers/QuickBloxUIKitProvider/useEventMessagesRepository.ts +2 -2
  43. package/src/Presentation/components/providers/QuickBloxUIKitProvider/{useQbDataContext.ts → useQbInitializedDataContext.ts} +2 -2
  44. package/src/Presentation/components/providers/QuickBloxUIKitProvider/useQbUIKitDataContext.ts +11 -0
  45. package/src/QBconfig.ts +12 -0
  46. package/src/index-ui.ts +4 -2
  47. package/src/utils/utils.ts +39 -0
  48. package/dist/Presentation/components/providers/QuickBloxUIKitProvider/useQbDataContext.d.ts +0 -3
@@ -15,14 +15,17 @@ import useMessagesViewModel from './useMessagesViewModel';
15
15
  import LoaderComponent from '../../Placeholders/LoaderComponent/LoaderComponent';
16
16
  import ErrorComponent from '../../Placeholders/ErrorComponent/ErrorComponent';
17
17
  import HeaderMessages from './HeaderMessages/HeaderMessages';
18
- import { FunctionTypeVoidToVoid } from '../../../../Views/Base/BaseViewModel';
18
+ import {
19
+ FunctionTypeVoidToVoid,
20
+ IChatMessage,
21
+ } from '../../../../Views/Base/BaseViewModel';
19
22
  import VideoAttachmentComponent from './VideoAttachmentComponent/VideoAttachmentComponent';
20
23
  import ImageAttachmentComponent from './ImageAttachmentComponent/ImageAttachmentComponent';
21
24
  import { DialogType } from '../../../../../Domain/entity/DialogTypes';
22
25
  import { GroupDialogEntity } from '../../../../../Domain/entity/GroupDialogEntity';
23
26
  import { PrivateDialogEntity } from '../../../../../Domain/entity/PrivateDialogEntity';
24
27
  import { UserEntity } from '../../../../../Domain/entity/UserEntity';
25
- import useQbDataContext from '../../../providers/QuickBloxUIKitProvider/useQbDataContext';
28
+ import useQbInitializedDataContext from '../../../providers/QuickBloxUIKitProvider/useQbInitializedDataContext';
26
29
  import { Pagination } from '../../../../../Domain/repository/Pagination';
27
30
  import {
28
31
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -45,35 +48,51 @@ import ViewedDelivered from '../../svgs/Icons/Status/ViewedDelivered';
45
48
  import { stringifyError } from '../../../../../utils/parse';
46
49
  import VoiceRecordingProgress from './VoiceRecordingProgress/VoiceRecordingProgress';
47
50
  import UiKitTheme from '../../../../assets/UiKitTheme';
51
+ import { AIWidget } from './AIWidgets/AIWidget';
48
52
  import { DialogsViewModel } from '../../../../Views/Dialogs/DialogViewModel';
49
53
  import { HighLightLink, messageHasUrls } from './HighLightLink/HighLightLink';
54
+ import { loopToLimitTokens } from '../../../../../utils/utils';
50
55
 
51
56
  type HeaderDialogsMessagesProps = {
57
+ AIEditMessage?: AIWidget;
58
+ AITranslation?: AIWidget;
59
+ AIAnswerToMessage?: AIWidget;
52
60
  dialogsViewModel: DialogsViewModel;
53
- InformationHandler?: FunctionTypeVoidToVoid;
61
+ onDialogInformationHandler?: FunctionTypeVoidToVoid;
54
62
  maxWidthToResize?: string;
55
63
  theme?: UiKitTheme;
64
+ subHeaderContent?: React.ReactNode;
65
+ upHeaderContent?: React.ReactNode;
56
66
  };
57
67
 
58
68
  // eslint-disable-next-line react/function-component-definition
59
69
  const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
70
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
71
+ AIEditMessage,
72
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
73
+ AITranslation,
74
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
75
+ AIAnswerToMessage,
60
76
  dialogsViewModel,
61
- InformationHandler,
77
+ onDialogInformationHandler,
62
78
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
63
79
  maxWidthToResize = undefined,
64
80
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
65
81
  theme = undefined,
82
+ subHeaderContent = undefined,
83
+ upHeaderContent = undefined,
66
84
  }: HeaderDialogsMessagesProps) => {
67
85
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
68
86
  const maxWidthToResizing =
69
87
  maxWidthToResize || '$message-view-container-wrapper-min-width';
70
88
  // const maxWidthToResizing = '720px'; // $message-view-container-wrapper-min-width:
71
89
 
72
- const currentContext = useQbDataContext();
90
+ const currentContext = useQbInitializedDataContext();
73
91
  const currentUserId =
74
92
  currentContext.storage.REMOTE_DATA_SOURCE.authInformation?.userId;
75
93
  const currentUserName =
76
94
  currentContext.storage.REMOTE_DATA_SOURCE.authInformation?.userName;
95
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
77
96
  const { connectionRepository, browserOnline } = useQBConnection();
78
97
  const [dialogMessagesCount, setDialogMessageCount] = useState(100);
79
98
  const [hasMore, setHasMore] = React.useState(true);
@@ -81,6 +100,32 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
81
100
  const [messagesToView, setMessagesToView] = React.useState<MessageEntity[]>(
82
101
  [],
83
102
  );
103
+ const [waitAIWidget, setWaitAIWidget] = useState<boolean>(false);
104
+
105
+ const messageEntitiesToIChatMessageCollection = (
106
+ messageEntities: MessageEntity[],
107
+ ): IChatMessage[] => {
108
+ const MAX_TOKENS = 3584;
109
+ const items = messageEntities.filter(
110
+ (it) =>
111
+ !it.notification_type ||
112
+ (it.notification_type && it.notification_type.length === 0),
113
+ );
114
+ const messages = loopToLimitTokens(
115
+ MAX_TOKENS,
116
+ items,
117
+ ({ message }) => message || '',
118
+ ).reverse();
119
+ const chatCompletionMessages: IChatMessage[] = messages.map(
120
+ ({ message, sender_id }) => ({
121
+ role: sender_id === currentUserId ? 'user' : 'assistant',
122
+ content: message,
123
+ }),
124
+ );
125
+
126
+ //
127
+ return chatCompletionMessages;
128
+ };
84
129
 
85
130
  const messagesViewModel: MessagesViewModel = useMessagesViewModel(
86
131
  dialogsViewModel.entity?.type,
@@ -166,6 +211,23 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
166
211
  }
167
212
  }, [dialogMessagesCount]);
168
213
  //
214
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
215
+ const menuItems = [
216
+ {
217
+ title: 'Item 1',
218
+ action: () => {
219
+ console.log('Clicked on Item 1');
220
+ },
221
+ },
222
+ {
223
+ title: 'Item 2',
224
+ action: () => {
225
+ console.log('Clicked on Item 2');
226
+ },
227
+ },
228
+ // ... добавьте дополнительные элементы меню
229
+ ];
230
+ //
169
231
 
170
232
  const getSenderName = (sender?: UserEntity): string | undefined => {
171
233
  if (!sender) return undefined;
@@ -339,6 +401,21 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
339
401
  >
340
402
  {getTimeShort24hFormat(message.date_sent)}
341
403
  </div>
404
+ <div
405
+ className="message-view-container__incoming-time"
406
+ onClick={() => {
407
+ if (!waitAIWidget) {
408
+ setWaitAIWidget(true);
409
+ AIAnswerToMessage?.textToWidget(
410
+ message.message,
411
+ messageEntitiesToIChatMessageCollection(messagesToView),
412
+ );
413
+ }
414
+ }}
415
+ >
416
+ {AIAnswerToMessage?.renderWidget()}
417
+ </div>
418
+ {/* <ContextMenu items={menuItems} /> */}
342
419
  </div>
343
420
  );
344
421
  } else {
@@ -410,6 +487,8 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
410
487
  const [fileToSend, setFileToSend] = useState<File | null>(null);
411
488
  const [messageText, setMessageText] = useState<string>('');
412
489
  const [warningErrorText, setWarningErrorText] = useState<string>('');
490
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
491
+ const [widgetTextContent, setWidgetTextContent] = useState<string>('');
413
492
 
414
493
  useEffect(() => {
415
494
  setWarningErrorText(messagesViewModel.typingText);
@@ -465,6 +544,7 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
465
544
 
466
545
  const [audioChunks, setAudioChunks] = useState<Array<Blob>>([]);
467
546
 
547
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
468
548
  const mimeType = 'audio/webm;codecs=opus'; // audio/ogg audio/mpeg audio/webm audio/x-wav audio/mp4
469
549
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
470
550
  const getMicrophonePermission = async () => {
@@ -499,16 +579,34 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
499
579
  // eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/require-await
500
580
  const startRecording = async () => {
501
581
  if (!stream) return;
502
- // setRecordingStatus('recording');
582
+ // const mimeTypes = [
583
+ // 'audio/aac',
584
+ // 'audio/mp4',
585
+ // 'audio/mpeg',
586
+ // 'audio/ogg',
587
+ // 'audio/wav',
588
+ // 'audio/webm',
589
+ // 'audio/3gpp',
590
+ // 'audio/flac',
591
+ // 'audio/x-aiff',
592
+ // 'audio/x-m4a',
593
+ // ];
594
+ //
595
+ // console.log('MIME TYPES: ');
596
+ // mimeTypes.forEach((mimeType) => {
597
+ // if (MediaRecorder.isTypeSupported(mimeType)) {
598
+ // console.log(`${mimeType} is supported`);
599
+ // } else {
600
+ // console.log(`${mimeType} is not supported`);
601
+ // }
602
+ // });
503
603
  // audio/mp4;codecs=mp4a audio/webm;codecs=opus audio/webm;codecs=vp9,opus
504
604
  const mimeContent = window.MediaRecorder.isTypeSupported(
505
605
  'audio/mp4;codecs=mp4a',
506
606
  )
507
607
  ? 'audio/mp4;codecs=mp4a'
508
608
  : 'audio/webm;codecs=opus';
509
- /*
510
- this.mediaRecorder = new MediaRecorder(window.stream, {mimeType: mimeContent});
511
- */
609
+
512
610
  const media = new MediaRecorder(stream, { mimeType: mimeContent });
513
611
 
514
612
  mediaRecorder.current = media;
@@ -536,7 +634,17 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
536
634
  mediaRecorder.current.stop();
537
635
 
538
636
  mediaRecorder.current.onstop = () => {
539
- const audioBlob = new Blob(audioChunks, { type: mimeType });
637
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
638
+ const mimeContent = window.MediaRecorder.isTypeSupported(
639
+ 'audio/mp4;codecs=mp4a',
640
+ )
641
+ ? 'audio/mp4;codecs=mp4a'
642
+ : 'audio/webm;codecs=opus';
643
+ // const audioBlob = new Blob(audioChunks, { type: mimeContent }); // mimeType
644
+ // const mp4Blob = new Blob(recordedChunks, { type: 'video/mp4' });
645
+
646
+ // const audioBlob = new Blob(audioChunks, { type: 'video/mp4' }); // mimeType
647
+ const audioBlob = new Blob(audioChunks, { type: 'audio/mp4' }); // mimeType
540
648
 
541
649
  setResultAudioBlob(audioBlob);
542
650
 
@@ -564,14 +672,26 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
564
672
  return resultFile;
565
673
  };
566
674
 
675
+ const [useAudioWidget, setUseAudioWidget] = useState<boolean>(false);
676
+
567
677
  useEffect(() => {
678
+ const fileExt = 'mp4';
679
+
568
680
  if (resultAudioBlob) {
569
681
  const voiceMessage = blobToFile(
570
682
  resultAudioBlob,
571
- `${currentUserName || ''}_voice_message.webm`,
683
+ `${currentUserName || ''}_voice_message.${fileExt}`,
572
684
  );
573
685
 
574
686
  setFileToSend(voiceMessage);
687
+ if (useAudioWidget) {
688
+ setUseAudioWidget(false);
689
+ AITranslation?.fileToWidget(
690
+ voiceMessage,
691
+ messageEntitiesToIChatMessageCollection(messagesToView),
692
+ );
693
+ }
694
+ //
575
695
  }
576
696
  }, [resultAudioBlob]);
577
697
  // test component version
@@ -634,6 +754,49 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
634
754
  }
635
755
  }
636
756
 
757
+ useEffect(() => {
758
+ if (
759
+ AIEditMessage?.textToContent &&
760
+ AIEditMessage?.textToContent.length > 0
761
+ ) {
762
+ setMessageText(AIEditMessage?.textToContent);
763
+ setWidgetTextContent(AIEditMessage?.textToContent);
764
+ setTimeout(() => {
765
+ setWidgetTextContent('');
766
+ }, 45 * 1000);
767
+ }
768
+ }, [AIEditMessage?.textToContent]);
769
+
770
+ useEffect(() => {
771
+ if (
772
+ AITranslation?.textToContent &&
773
+ AITranslation?.textToContent.length > 0
774
+ ) {
775
+ setMessageText(AITranslation?.textToContent);
776
+ setWidgetTextContent(AITranslation?.textToContent);
777
+ setTimeout(() => {
778
+ setWidgetTextContent('');
779
+ }, 45 * 1000);
780
+ }
781
+ }, [AITranslation?.textToContent]);
782
+
783
+ useEffect(() => {
784
+ setWaitAIWidget(false);
785
+ if (
786
+ AIAnswerToMessage?.textToContent &&
787
+ AIAnswerToMessage?.textToContent.length > 0
788
+ ) {
789
+ setMessageText(AIAnswerToMessage?.textToContent);
790
+ setWidgetTextContent(AIAnswerToMessage?.textToContent);
791
+ setTimeout(() => {
792
+ setWidgetTextContent('');
793
+ }, 45 * 1000);
794
+ }
795
+ }, [AIAnswerToMessage?.textToContent]);
796
+
797
+ const useSubContent = subHeaderContent || false;
798
+ const useUpContent = upHeaderContent || false;
799
+
637
800
  return (
638
801
  <div
639
802
  style={
@@ -656,46 +819,75 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
656
819
  }}
657
820
  className="message-view-container--header"
658
821
  >
822
+ {useUpContent && upHeaderContent}
659
823
  <HeaderMessages
660
824
  dialog={messagesViewModel.entity}
661
- InformationHandler={InformationHandler}
825
+ InformationHandler={onDialogInformationHandler}
662
826
  countMembers={getCountDialogMembers(dialogsViewModel.entity)}
663
827
  />
828
+ {useSubContent && subHeaderContent}
664
829
  </div>
665
- <div
666
- style={
667
- theme
668
- ? {
669
- flexGrow: `1`,
670
- flexShrink: `1`,
671
- flexBasis: `${maxWidthToResizing}`,
672
- backgroundColor: theme.mainElements(),
673
- }
674
- : {
675
- flexGrow: `1`,
676
- flexShrink: `1`,
677
- flexBasis: `${maxWidthToResizing}`,
678
- }
679
- }
680
- className="message-view-container--information"
681
- >
682
- <div>
683
- connection status:
684
- {browserOnline ? 'online ' : 'offline '}
685
- {/* eslint-disable-next-line no-nested-ternary */}
686
- {connectionRepository.isChatConnected() === undefined
687
- ? 'unexpected undefined'
688
- : connectionRepository.isChatConnected()
689
- ? 'connected'
690
- : 'disconnected'}
691
- </div>
692
- {hasMore && (
693
- <div style={{ color: 'red' }}>
694
- unread: {dialogMessagesCount - messagesToView.length}
695
- </div>
696
- )}
697
- <div>{` current user id: ${currentUserId || 'no user'}`}</div>
698
- </div>
830
+ {/* <div */}
831
+ {/* style={{ */}
832
+ {/* flexGrow: `1`, */}
833
+ {/* flexShrink: `1`, */}
834
+ {/* flexBasis: `${maxWidthToResizing}`, */}
835
+ {/* }} */}
836
+ {/* className="message-view-container--information" */}
837
+ {/* > */}
838
+ {/* <div> */}
839
+ {/* connection status: */}
840
+ {/* {browserOnline ? 'online ' : 'offline '} */}
841
+ {/* /!* eslint-disable-next-line no-nested-ternary *!/ */}
842
+ {/* {connectionRepository.isChatConnected() === undefined */}
843
+ {/* ? 'unexpected undefined' */}
844
+ {/* : connectionRepository.isChatConnected() */}
845
+ {/* ? 'connected' */}
846
+ {/* : 'disconnected'} */}
847
+ {/* </div> */}
848
+ {/* {hasMore && ( */}
849
+ {/* <div style={{ color: 'red' }}> */}
850
+ {/* unread: {dialogMessagesCount - messagesToView.length} */}
851
+ {/* </div> */}
852
+ {/* )} */}
853
+ {/* <div>{` current user id: ${currentUserId || 'no user'}`}</div> */}
854
+ {/* </div> */}
855
+ {/* version 2 start */}
856
+ {/* <div */}
857
+ {/* style={ */}
858
+ {/* theme */}
859
+ {/* ? { */}
860
+ {/* flexGrow: `1`, */}
861
+ {/* flexShrink: `1`, */}
862
+ {/* flexBasis: `${maxWidthToResizing}`, */}
863
+ {/* backgroundColor: theme.mainElements(), */}
864
+ {/* } */}
865
+ {/* : { */}
866
+ {/* flexGrow: `1`, */}
867
+ {/* flexShrink: `1`, */}
868
+ {/* flexBasis: `${maxWidthToResizing}`, */}
869
+ {/* } */}
870
+ {/* } */}
871
+ {/* className="message-view-container--information" */}
872
+ {/* > */}
873
+ {/* <div> */}
874
+ {/* connection status: */}
875
+ {/* {browserOnline ? 'online ' : 'offline '} */}
876
+ {/* /!* eslint-disable-next-line no-nested-ternary *!/ */}
877
+ {/* {connectionRepository.isChatConnected() === undefined */}
878
+ {/* ? 'unexpected undefined' */}
879
+ {/* : connectionRepository.isChatConnected() */}
880
+ {/* ? 'connected' */}
881
+ {/* : 'disconnected'} */}
882
+ {/* </div> */}
883
+ {/* {hasMore && ( */}
884
+ {/* <div style={{ color: 'red' }}> */}
885
+ {/* unread: {dialogMessagesCount - messagesToView.length} */}
886
+ {/* </div> */}
887
+ {/* )} */}
888
+ {/* <div>{` current user id: ${currentUserId || 'no user'}`}</div> */}
889
+ {/* </div> */}
890
+ {/* version 2 end */}
699
891
  <div
700
892
  style={
701
893
  theme
@@ -713,7 +905,7 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
713
905
  }
714
906
  className="message-view-container--messages"
715
907
  >
716
- {messagesViewModel?.error && (
908
+ {messagesViewModel?.error && !messagesViewModel.loading && (
717
909
  <ErrorComponent
718
910
  title={messagesViewModel?.error}
719
911
  ClickActionHandler={() => {
@@ -735,7 +927,7 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
735
927
  autoScrollToBottom={scrollUpToDown}
736
928
  />
737
929
  )}
738
- {messagesViewModel?.loading && (
930
+ {(messagesViewModel?.loading || waitAIWidget) && (
739
931
  <div
740
932
  style={{
741
933
  height: '44px',
@@ -804,7 +996,24 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
804
996
  }}
805
997
  />
806
998
  </label>
807
-
999
+ {/* start AITranslation */}
1000
+ {/* {AITranslation && ( */}
1001
+ {/* <div> */}
1002
+ {/* <ActiveSvg */}
1003
+ {/* content={AITranslation.renderWidget()} */}
1004
+ {/* clickAction={() => { */}
1005
+ {/* console.log('click left place golder widget'); */}
1006
+ {/* if (messagesViewModel?.loading) return; */}
1007
+ {/* setIsRecording(!isRecording); */}
1008
+ {/* setUseAudioWidget(true); */}
1009
+ {/* }} */}
1010
+ {/* touchAction={() => { */}
1011
+ {/* console.log('touch left place golder widget'); */}
1012
+ {/* }} */}
1013
+ {/* /> */}
1014
+ {/* </div> */}
1015
+ {/* )} */}
1016
+ {/* end AITranslation */}
808
1017
  {!isRecording && (
809
1018
  <textarea
810
1019
  style={theme ? { backgroundColor: theme.chatInput() } : {}}
@@ -849,7 +1058,22 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
849
1058
  }}
850
1059
  />
851
1060
  )}
852
-
1061
+ {/* AITranslation start AIEditMessage */}
1062
+ {/* {AIEditMessage && ( */}
1063
+ {/* <div> */}
1064
+ {/* <ActiveSvg */}
1065
+ {/* content={AIEditMessage.renderWidget()} */}
1066
+ {/* clickAction={() => { */}
1067
+ {/* console.log('click left place golder widget'); */}
1068
+ {/* AIEditMessage?.textToWidget(messageText); */}
1069
+ {/* }} */}
1070
+ {/* touchAction={() => { */}
1071
+ {/* console.log('touch left place golder widget'); */}
1072
+ {/* }} */}
1073
+ {/* /> */}
1074
+ {/* </div> */}
1075
+ {/* )} */}
1076
+ {/* end InputWidgetLeftPlaceHolder */}
853
1077
  {!isVoiceMessage && (
854
1078
  <div>
855
1079
  <ActiveSvg
@@ -897,7 +1121,7 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
897
1121
  )}
898
1122
  </div>
899
1123
  {/* <div className="message-view-container--warning-error"> */}
900
- {/* {warningErrorText} */}
1124
+ {/* {widgetTextContent} */}
901
1125
  {/* </div> */}
902
1126
  </div>
903
1127
  );
@@ -1,6 +1,6 @@
1
1
  import { useState } from 'react';
2
2
  import { DialogType } from '../../../../../Domain/entity/DialogTypes';
3
- import useQbDataContext from '../../../providers/QuickBloxUIKitProvider/useQbDataContext';
3
+ import useQbInitializedDataContext from '../../../providers/QuickBloxUIKitProvider/useQbInitializedDataContext';
4
4
  import { DialogEntity } from '../../../../../Domain/entity/DialogEntity';
5
5
  import { MessagesViewModel } from './MessagesViewModel';
6
6
  import { MessageEntity } from '../../../../../Domain/entity/MessageEntity';
@@ -42,7 +42,7 @@ export default function useMessagesViewModel(
42
42
  const [dialog, setDialog] = useState<DialogEntity>(dialogEntity);
43
43
  // const [dialogsParticipants, setDialogsParticipants] = useState<number[]>([]);
44
44
 
45
- const currentContext = useQbDataContext();
45
+ const currentContext = useQbInitializedDataContext();
46
46
  const eventMessaging = useEventMessagesRepository();
47
47
 
48
48
  const subscribeToDialogEventsUseCase: SubscribeToDialogEventsUseCase =
@@ -0,0 +1,3 @@
1
+ <svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M2.76833 38.5L41.25 22L2.76833 5.5L2.75 18.3333L30.25 22L2.75 25.6667L2.76833 38.5Z" fill="#0B121B"/>
3
+ </svg>
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { IconTheme } from '../../IconsCommonTypes';
3
+
4
+ function AIWidgetIcon(theme: IconTheme | undefined = undefined) {
5
+ return !theme?.applyZoom ? (
6
+ <svg
7
+ width={theme && theme.width ? theme.width : '44'}
8
+ height={theme && theme.height ? theme.height : '44'}
9
+ viewBox="0 0 44 44"
10
+ fill="none"
11
+ xmlns="http://www.w3.org/2000/svg"
12
+ >
13
+ <path
14
+ d="M2.76833 38.5L41.25 22L2.76833 5.5L2.75 18.3333L30.25 22L2.75 25.6667L2.76833 38.5Z"
15
+ id="SendB"
16
+ fill={theme && theme.color ? theme.color : 'var(--color-icon)'}
17
+ />
18
+ </svg>
19
+ ) : (
20
+ <svg
21
+ width={theme && theme.width ? theme.width : '28'}
22
+ height={theme && theme.height ? theme.height : '28'}
23
+ viewBox="0 0 22 18"
24
+ fill="none"
25
+ xmlns="http://www.w3.org/2000/svg"
26
+ >
27
+ <path
28
+ d="M18,6 C20.209139,6 22,7.790861 22,10 L22,18 C22,19.9255253 20.6753401,21.786149 18.0260203,23.581871 C18.5654117,21.193957 18.3975027,20 17.5222933,20 L10,20 C7.790861,20 6,18.209139 6,16 L6,10 C6,7.790861 7.790861,6 10,6 L18,6 Z M18,10 L10,10 C9.44771525,10 9,10.4477153 9,11 L9,14 C9,14.5522847 9.44771525,15 10,15 L18,15 C18.5522847,15 19,14.5522847 19,14 L19,11 C19,10.4477153 18.5522847,10 18,10 Z M12,11 C12.5522847,11 13,11.4477153 13,12 L13,13 C13,13.5522847 12.5522847,14 12,14 C11.4477153,14 11,13.5522847 11,13 L11,12 C11,11.4477153 11.4477153,11 12,11 Z M16,11 C16.5522847,11 17,11.4477153 17,12 L17,13 C17,13.5522847 16.5522847,14 16,14 C15.4477153,14 15,13.5522847 15,13 L15,12 C15,11.4477153 15.4477153,11 16,11 Z M4,10 L5,10 L5,10 L5,16 L4,16 C3.44771525,16 3,15.5522847 3,15 L3,11 C3,10.4477153 3.44771525,10 4,10 Z M23,10 L24,10 C24.5522847,10 25,10.4477153 25,11 L25,15 C25,15.5522847 24.5522847,16 24,16 L23,16 L23,16 L23,10 Z"
29
+ id="AIWidget"
30
+ fill={theme && theme.color ? theme.color : 'var(--color-icon)'}
31
+ />
32
+ </svg>
33
+ );
34
+ }
35
+ /*
36
+
37
+
38
+ */
39
+ export default AIWidgetIcon;