quickblox-react-ui-kit 0.1.7 → 0.1.8

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 (39) hide show
  1. package/dist/Presentation/Views/Base/BaseViewModel.d.ts +7 -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/InputWidget/InputWidget.d.ts +8 -0
  5. package/dist/Presentation/components/UI/Dialogs/MessagesView/InputWidget/UseDefaultTextInputWidget.d.ts +2 -0
  6. package/dist/Presentation/components/UI/Dialogs/MessagesView/InputWidget/useDefaultVoiceInputWidget.d.ts +2 -0
  7. package/dist/Presentation/components/UI/Dialogs/MessagesView/MessagesView.d.ts +3 -1
  8. package/dist/Presentation/components/UI/svgs/Icons/Media/AIWidget/index.d.ts +4 -0
  9. package/dist/Presentation/components/layouts/TestStage/CompanyLogo/CompanyLogo.d.ts +3 -0
  10. package/dist/Presentation/components/providers/QuickBloxUIKitProvider/useQbInitializedDataContext.d.ts +3 -0
  11. package/dist/Presentation/components/providers/QuickBloxUIKitProvider/useQbUIKitDataContext.d.ts +3 -0
  12. package/dist/QBconfig.d.ts +12 -0
  13. package/dist/index-ui.d.ts +3 -2
  14. package/dist/index-ui.js +28 -17
  15. package/package.json +1 -1
  16. package/src/App.tsx +39 -18
  17. package/src/Presentation/Views/Base/BaseViewModel.ts +9 -1
  18. package/src/Presentation/Views/Dialogs/Dialogs.tsx +14 -8
  19. package/src/Presentation/Views/Dialogs/useDialogsViewModel.ts +1 -1
  20. package/src/Presentation/components/UI/Dialogs/DialogInformation/DialogInformation.tsx +17 -8
  21. package/src/Presentation/components/UI/Dialogs/DialogInformation/UsersList/useUsersListViewModel.ts +2 -2
  22. package/src/Presentation/components/UI/Dialogs/EditDialog/EditDialog.tsx +2 -2
  23. package/src/Presentation/components/UI/Dialogs/InviteMembers/useInviteMembersViewModel.ts +2 -2
  24. package/src/Presentation/components/UI/Dialogs/MessagesView/InputWidget/InputWidget.ts +15 -0
  25. package/src/Presentation/components/UI/Dialogs/MessagesView/InputWidget/UseDefaultTextInputWidget.tsx +60 -0
  26. package/src/Presentation/components/UI/Dialogs/MessagesView/InputWidget/useDefaultVoiceInputWidget.tsx +86 -0
  27. package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesView.tsx +217 -48
  28. package/src/Presentation/components/UI/Dialogs/MessagesView/useMessagesViewModel.ts +2 -2
  29. package/src/Presentation/components/UI/svgs/Icons/Media/AIWidget/Send.svg +3 -0
  30. package/src/Presentation/components/UI/svgs/Icons/Media/AIWidget/index.tsx +39 -0
  31. package/src/Presentation/components/layouts/Desktop/QuickBloxUIKitDesktopLayout.tsx +50 -7
  32. package/src/Presentation/components/layouts/TestStage/CompanyLogo/CompanyLogo.tsx +27 -0
  33. package/src/Presentation/components/layouts/TestStage/LoginView/Login.tsx +2 -2
  34. package/src/Presentation/components/providers/QuickBloxUIKitProvider/useEventMessagesRepository.ts +2 -2
  35. package/src/Presentation/components/providers/QuickBloxUIKitProvider/{useQbDataContext.ts → useQbInitializedDataContext.ts} +2 -2
  36. package/src/Presentation/components/providers/QuickBloxUIKitProvider/useQbUIKitDataContext.ts +11 -0
  37. package/src/QBconfig.ts +13 -0
  38. package/src/index-ui.ts +4 -2
  39. package/dist/Presentation/components/providers/QuickBloxUIKitProvider/useQbDataContext.d.ts +0 -3
@@ -22,7 +22,7 @@ import { DialogType } from '../../../../../Domain/entity/DialogTypes';
22
22
  import { GroupDialogEntity } from '../../../../../Domain/entity/GroupDialogEntity';
23
23
  import { PrivateDialogEntity } from '../../../../../Domain/entity/PrivateDialogEntity';
24
24
  import { UserEntity } from '../../../../../Domain/entity/UserEntity';
25
- import useQbDataContext from '../../../providers/QuickBloxUIKitProvider/useQbDataContext';
25
+ import useQbInitializedDataContext from '../../../providers/QuickBloxUIKitProvider/useQbInitializedDataContext';
26
26
  import { Pagination } from '../../../../../Domain/repository/Pagination';
27
27
  import {
28
28
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -47,33 +47,48 @@ import VoiceRecordingProgress from './VoiceRecordingProgress/VoiceRecordingProgr
47
47
  import UiKitTheme from '../../../../assets/UiKitTheme';
48
48
  import { DialogsViewModel } from '../../../../Views/Dialogs/DialogViewModel';
49
49
  import { HighLightLink, messageHasUrls } from './HighLightLink/HighLightLink';
50
+ // import CompanyLogo from '../../../layouts/TestStage/CompanyLogo/CompanyLogo';
50
51
 
51
52
  type HeaderDialogsMessagesProps = {
53
+ // InputWidgetToLeftPlaceHolder?: InputWidget;
54
+ // InputWidgetToRightPlaceHolder?: InputWidget;
55
+ // IncomingMessageWidgetToRightPlaceHolder?: InputWidget;
52
56
  dialogsViewModel: DialogsViewModel;
53
- InformationHandler?: FunctionTypeVoidToVoid;
57
+ onDialogInformationHandler?: FunctionTypeVoidToVoid;
54
58
  maxWidthToResize?: string;
55
59
  theme?: UiKitTheme;
60
+ subHeaderContent?: React.ReactNode;
61
+ upHeaderContent?: React.ReactNode;
56
62
  };
57
63
 
58
64
  // eslint-disable-next-line react/function-component-definition
59
65
  const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
66
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
67
+ // InputWidgetToLeftPlaceHolder,
68
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
69
+ // InputWidgetToRightPlaceHolder,
70
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
71
+ // IncomingMessageWidgetToRightPlaceHolder,
60
72
  dialogsViewModel,
61
- InformationHandler,
73
+ onDialogInformationHandler,
62
74
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
63
75
  maxWidthToResize = undefined,
64
76
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
65
77
  theme = undefined,
78
+ subHeaderContent = undefined,
79
+ upHeaderContent = undefined,
66
80
  }: HeaderDialogsMessagesProps) => {
67
81
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
68
82
  const maxWidthToResizing =
69
83
  maxWidthToResize || '$message-view-container-wrapper-min-width';
70
84
  // const maxWidthToResizing = '720px'; // $message-view-container-wrapper-min-width:
71
85
 
72
- const currentContext = useQbDataContext();
86
+ const currentContext = useQbInitializedDataContext();
73
87
  const currentUserId =
74
88
  currentContext.storage.REMOTE_DATA_SOURCE.authInformation?.userId;
75
89
  const currentUserName =
76
90
  currentContext.storage.REMOTE_DATA_SOURCE.authInformation?.userName;
91
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
77
92
  const { connectionRepository, browserOnline } = useQBConnection();
78
93
  const [dialogMessagesCount, setDialogMessageCount] = useState(100);
79
94
  const [hasMore, setHasMore] = React.useState(true);
@@ -339,6 +354,16 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
339
354
  >
340
355
  {getTimeShort24hFormat(message.date_sent)}
341
356
  </div>
357
+ <div
358
+ className="message-view-container__incoming-time"
359
+ onClick={() => {
360
+ // IncomingMessageWidgetToRightPlaceHolder?.textToWidget(
361
+ // message.message,
362
+ // );
363
+ }}
364
+ >
365
+ {/* {IncomingMessageWidgetToRightPlaceHolder?.renderWidget()} */}
366
+ </div>
342
367
  </div>
343
368
  );
344
369
  } else {
@@ -410,6 +435,8 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
410
435
  const [fileToSend, setFileToSend] = useState<File | null>(null);
411
436
  const [messageText, setMessageText] = useState<string>('');
412
437
  const [warningErrorText, setWarningErrorText] = useState<string>('');
438
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
439
+ const [widgetTextContent, setWidgetTextContent] = useState<string>('');
413
440
 
414
441
  useEffect(() => {
415
442
  setWarningErrorText(messagesViewModel.typingText);
@@ -465,6 +492,7 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
465
492
 
466
493
  const [audioChunks, setAudioChunks] = useState<Array<Blob>>([]);
467
494
 
495
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
468
496
  const mimeType = 'audio/webm;codecs=opus'; // audio/ogg audio/mpeg audio/webm audio/x-wav audio/mp4
469
497
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
470
498
  const getMicrophonePermission = async () => {
@@ -499,16 +527,34 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
499
527
  // eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/require-await
500
528
  const startRecording = async () => {
501
529
  if (!stream) return;
502
- // setRecordingStatus('recording');
530
+ // const mimeTypes = [
531
+ // 'audio/aac',
532
+ // 'audio/mp4',
533
+ // 'audio/mpeg',
534
+ // 'audio/ogg',
535
+ // 'audio/wav',
536
+ // 'audio/webm',
537
+ // 'audio/3gpp',
538
+ // 'audio/flac',
539
+ // 'audio/x-aiff',
540
+ // 'audio/x-m4a',
541
+ // ];
542
+ //
543
+ // console.log('MIME TYPES: ');
544
+ // mimeTypes.forEach((mimeType) => {
545
+ // if (MediaRecorder.isTypeSupported(mimeType)) {
546
+ // console.log(`${mimeType} is supported`);
547
+ // } else {
548
+ // console.log(`${mimeType} is not supported`);
549
+ // }
550
+ // });
503
551
  // audio/mp4;codecs=mp4a audio/webm;codecs=opus audio/webm;codecs=vp9,opus
504
552
  const mimeContent = window.MediaRecorder.isTypeSupported(
505
553
  'audio/mp4;codecs=mp4a',
506
554
  )
507
555
  ? 'audio/mp4;codecs=mp4a'
508
556
  : 'audio/webm;codecs=opus';
509
- /*
510
- this.mediaRecorder = new MediaRecorder(window.stream, {mimeType: mimeContent});
511
- */
557
+
512
558
  const media = new MediaRecorder(stream, { mimeType: mimeContent });
513
559
 
514
560
  mediaRecorder.current = media;
@@ -536,7 +582,17 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
536
582
  mediaRecorder.current.stop();
537
583
 
538
584
  mediaRecorder.current.onstop = () => {
539
- const audioBlob = new Blob(audioChunks, { type: mimeType });
585
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
586
+ const mimeContent = window.MediaRecorder.isTypeSupported(
587
+ 'audio/mp4;codecs=mp4a',
588
+ )
589
+ ? 'audio/mp4;codecs=mp4a'
590
+ : 'audio/webm;codecs=opus';
591
+ // const audioBlob = new Blob(audioChunks, { type: mimeContent }); // mimeType
592
+ // const mp4Blob = new Blob(recordedChunks, { type: 'video/mp4' });
593
+
594
+ // const audioBlob = new Blob(audioChunks, { type: 'video/mp4' }); // mimeType
595
+ const audioBlob = new Blob(audioChunks, { type: 'audio/mp4' }); // mimeType
540
596
 
541
597
  setResultAudioBlob(audioBlob);
542
598
 
@@ -564,14 +620,23 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
564
620
  return resultFile;
565
621
  };
566
622
 
623
+ const [useAudioWidget, setUseAudioWidget] = useState<boolean>(false);
624
+
567
625
  useEffect(() => {
626
+ const fileExt = 'mp4';
627
+
568
628
  if (resultAudioBlob) {
569
629
  const voiceMessage = blobToFile(
570
630
  resultAudioBlob,
571
- `${currentUserName || ''}_voice_message.webm`,
631
+ `${currentUserName || ''}_voice_message.${fileExt}`,
572
632
  );
573
633
 
574
634
  setFileToSend(voiceMessage);
635
+ if (useAudioWidget) {
636
+ setUseAudioWidget(false);
637
+ // InputWidgetToRightPlaceHolder?.fileToWidget(voiceMessage);
638
+ }
639
+ //
575
640
  }
576
641
  }, [resultAudioBlob]);
577
642
  // test component version
@@ -634,6 +699,49 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
634
699
  }
635
700
  }
636
701
 
702
+ // useEffect(() => {
703
+ // if (
704
+ // InputWidgetToLeftPlaceHolder?.textToInput &&
705
+ // InputWidgetToLeftPlaceHolder?.textToInput.length > 0
706
+ // ) {
707
+ // setMessageText(InputWidgetToLeftPlaceHolder?.textToInput);
708
+ // setWidgetTextContent(InputWidgetToLeftPlaceHolder?.textToInput);
709
+ // setTimeout(() => {
710
+ // setWidgetTextContent('');
711
+ // }, 45 * 1000);
712
+ // }
713
+ // }, [InputWidgetToLeftPlaceHolder?.textToInput]);
714
+ //
715
+ // useEffect(() => {
716
+ // if (
717
+ // InputWidgetToRightPlaceHolder?.textToInput &&
718
+ // InputWidgetToRightPlaceHolder?.textToInput.length > 0
719
+ // ) {
720
+ // setMessageText(InputWidgetToRightPlaceHolder?.textToInput);
721
+ // setWidgetTextContent(InputWidgetToRightPlaceHolder?.textToInput);
722
+ // setTimeout(() => {
723
+ // setWidgetTextContent('');
724
+ // }, 45 * 1000);
725
+ // }
726
+ // }, [InputWidgetToRightPlaceHolder?.textToInput]);
727
+ //
728
+ // useEffect(() => {
729
+ // if (
730
+ // IncomingMessageWidgetToRightPlaceHolder?.textToInput &&
731
+ // IncomingMessageWidgetToRightPlaceHolder?.textToInput.length > 0
732
+ // ) {
733
+ // setWidgetTextContent(
734
+ // IncomingMessageWidgetToRightPlaceHolder?.textToInput,
735
+ // );
736
+ // setTimeout(() => {
737
+ // setWidgetTextContent('');
738
+ // }, 45 * 1000);
739
+ // }
740
+ // }, [IncomingMessageWidgetToRightPlaceHolder?.textToInput]);
741
+
742
+ const useSubContent = subHeaderContent || false;
743
+ const useUpContent = upHeaderContent || false;
744
+
637
745
  return (
638
746
  <div
639
747
  style={
@@ -656,46 +764,75 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
656
764
  }}
657
765
  className="message-view-container--header"
658
766
  >
767
+ {useUpContent && upHeaderContent}
659
768
  <HeaderMessages
660
769
  dialog={messagesViewModel.entity}
661
- InformationHandler={InformationHandler}
770
+ InformationHandler={onDialogInformationHandler}
662
771
  countMembers={getCountDialogMembers(dialogsViewModel.entity)}
663
772
  />
773
+ {useSubContent && subHeaderContent}
664
774
  </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>
775
+ {/* <div */}
776
+ {/* style={{ */}
777
+ {/* flexGrow: `1`, */}
778
+ {/* flexShrink: `1`, */}
779
+ {/* flexBasis: `${maxWidthToResizing}`, */}
780
+ {/* }} */}
781
+ {/* className="message-view-container--information" */}
782
+ {/* > */}
783
+ {/* <div> */}
784
+ {/* connection status: */}
785
+ {/* {browserOnline ? 'online ' : 'offline '} */}
786
+ {/* /!* eslint-disable-next-line no-nested-ternary *!/ */}
787
+ {/* {connectionRepository.isChatConnected() === undefined */}
788
+ {/* ? 'unexpected undefined' */}
789
+ {/* : connectionRepository.isChatConnected() */}
790
+ {/* ? 'connected' */}
791
+ {/* : 'disconnected'} */}
792
+ {/* </div> */}
793
+ {/* {hasMore && ( */}
794
+ {/* <div style={{ color: 'red' }}> */}
795
+ {/* unread: {dialogMessagesCount - messagesToView.length} */}
796
+ {/* </div> */}
797
+ {/* )} */}
798
+ {/* <div>{` current user id: ${currentUserId || 'no user'}`}</div> */}
799
+ {/* </div> */}
800
+ {/* version 2 start */}
801
+ {/* <div */}
802
+ {/* style={ */}
803
+ {/* theme */}
804
+ {/* ? { */}
805
+ {/* flexGrow: `1`, */}
806
+ {/* flexShrink: `1`, */}
807
+ {/* flexBasis: `${maxWidthToResizing}`, */}
808
+ {/* backgroundColor: theme.mainElements(), */}
809
+ {/* } */}
810
+ {/* : { */}
811
+ {/* flexGrow: `1`, */}
812
+ {/* flexShrink: `1`, */}
813
+ {/* flexBasis: `${maxWidthToResizing}`, */}
814
+ {/* } */}
815
+ {/* } */}
816
+ {/* className="message-view-container--information" */}
817
+ {/* > */}
818
+ {/* <div> */}
819
+ {/* connection status: */}
820
+ {/* {browserOnline ? 'online ' : 'offline '} */}
821
+ {/* /!* eslint-disable-next-line no-nested-ternary *!/ */}
822
+ {/* {connectionRepository.isChatConnected() === undefined */}
823
+ {/* ? 'unexpected undefined' */}
824
+ {/* : connectionRepository.isChatConnected() */}
825
+ {/* ? 'connected' */}
826
+ {/* : 'disconnected'} */}
827
+ {/* </div> */}
828
+ {/* {hasMore && ( */}
829
+ {/* <div style={{ color: 'red' }}> */}
830
+ {/* unread: {dialogMessagesCount - messagesToView.length} */}
831
+ {/* </div> */}
832
+ {/* )} */}
833
+ {/* <div>{` current user id: ${currentUserId || 'no user'}`}</div> */}
834
+ {/* </div> */}
835
+ {/* version 2 end */}
699
836
  <div
700
837
  style={
701
838
  theme
@@ -804,7 +941,24 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
804
941
  }}
805
942
  />
806
943
  </label>
807
-
944
+ {/* start InputWidgetToRightPlaceHolder */}
945
+ {/* {InputWidgetToRightPlaceHolder && ( */}
946
+ {/* <div> */}
947
+ {/* <ActiveSvg */}
948
+ {/* content={InputWidgetToRightPlaceHolder.renderWidget()} */}
949
+ {/* clickAction={() => { */}
950
+ {/* console.log('click left place golder widget'); */}
951
+ {/* if (messagesViewModel?.loading) return; */}
952
+ {/* setIsRecording(!isRecording); */}
953
+ {/* setUseAudioWidget(true); */}
954
+ {/* }} */}
955
+ {/* touchAction={() => { */}
956
+ {/* console.log('touch left place golder widget'); */}
957
+ {/* }} */}
958
+ {/* /> */}
959
+ {/* </div> */}
960
+ {/* )} */}
961
+ {/* end InputWidgetToRightPlaceHolder */}
808
962
  {!isRecording && (
809
963
  <textarea
810
964
  style={theme ? { backgroundColor: theme.chatInput() } : {}}
@@ -849,7 +1003,22 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
849
1003
  }}
850
1004
  />
851
1005
  )}
852
-
1006
+ {/* InputWidgetToRightPlaceHolder start InputWidgetToLeftPlaceHolder */}
1007
+ {/* {InputWidgetToLeftPlaceHolder && ( */}
1008
+ {/* <div> */}
1009
+ {/* <ActiveSvg */}
1010
+ {/* content={InputWidgetToLeftPlaceHolder.renderWidget()} */}
1011
+ {/* clickAction={() => { */}
1012
+ {/* console.log('click left place golder widget'); */}
1013
+ {/* InputWidgetToLeftPlaceHolder?.textToWidget(messageText); */}
1014
+ {/* }} */}
1015
+ {/* touchAction={() => { */}
1016
+ {/* console.log('touch left place golder widget'); */}
1017
+ {/* }} */}
1018
+ {/* /> */}
1019
+ {/* </div> */}
1020
+ {/* )} */}
1021
+ {/* end InputWidgetLeftPlaceHolder */}
853
1022
  {!isVoiceMessage && (
854
1023
  <div>
855
1024
  <ActiveSvg
@@ -897,7 +1066,7 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
897
1066
  )}
898
1067
  </div>
899
1068
  {/* <div className="message-view-container--warning-error"> */}
900
- {/* {warningErrorText} */}
1069
+ {/* {widgetTextContent} */}
901
1070
  {/* </div> */}
902
1071
  </div>
903
1072
  );
@@ -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;
@@ -1,5 +1,6 @@
1
1
  import React, { useEffect, useState } from 'react';
2
- import useQbDataContext from '../../providers/QuickBloxUIKitProvider/useQbDataContext';
2
+ // import { Configuration, OpenAIApi } from 'openai';
3
+ import useQbInitializedDataContext from '../../providers/QuickBloxUIKitProvider/useQbInitializedDataContext';
3
4
  import { DialogEntity } from '../../../../Domain/entity/DialogEntity';
4
5
  import { DialogsViewModel } from '../../../Views/Dialogs/DialogViewModel';
5
6
  import DialogsComponent from '../../../Views/Dialogs/Dialogs';
@@ -16,9 +17,17 @@ import { Pagination } from '../../../../Domain/repository/Pagination';
16
17
  // import { DialogEventInfo } from '../../../../Domain/entity/DialogEventInfo';
17
18
  import UiKitTheme from '../../../assets/UiKitTheme';
18
19
  import BaseViewModel from '../../../Views/Base/BaseViewModel';
20
+ // import { InputWidget } from '../../UI/Dialogs/MessagesView/InputWidget/InputWidget';
21
+ // import useDefaultTextInputWidget from '../../UI/Dialogs/MessagesView/InputWidget/UseDefaultTextInputWidget';
22
+ // import useDefaultVoiceInputWidget from '../../UI/Dialogs/MessagesView/InputWidget/useDefaultVoiceInputWidget';
23
+ // import UseDefaultIncomingMessageWidget from '../../UI/Dialogs/MessagesView/InputWidget/UseDefaultIncomingMessageWidget';
24
+ // import CompanyLogo from '../TestStage/CompanyLogo/CompanyLogo';
19
25
 
20
26
  type QuickBloxUIKitDesktopLayoutProps = {
21
27
  theme?: UiKitTheme;
28
+ // InputWidgetToLeftPlaceHolder?: InputWidget;
29
+ // InputWidgetToRightPlaceHolder?: InputWidget;
30
+ // IncomingMessageWidgetToRightPlaceHolder?: InputWidget;
22
31
  };
23
32
 
24
33
  const QuickBloxUIKitDesktopLayout: React.FC<
@@ -29,7 +38,7 @@ const QuickBloxUIKitDesktopLayout: React.FC<
29
38
  const [selectedDialog, setSelectedDialog] =
30
39
  React.useState<BaseViewModel<DialogEntity>>();
31
40
 
32
- const currentContext = useQbDataContext();
41
+ const currentContext = useQbInitializedDataContext();
33
42
  // const eventMessaging = useEventMessagesRepository();
34
43
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
35
44
  // @ts-ignore
@@ -41,12 +50,34 @@ const QuickBloxUIKitDesktopLayout: React.FC<
41
50
  const dialogsViewModel: DialogsViewModel =
42
51
  useDialogsViewModel(currentContext);
43
52
 
53
+ // let defaultLeftPlaceHolderInputWidget = InputWidgetToLeftPlaceHolder; // useDefaultTextInputWidget();
54
+ //
55
+ // if (!defaultLeftPlaceHolderInputWidget) {
56
+ // defaultLeftPlaceHolderInputWidget = useDefaultTextInputWidget();
57
+ // }
58
+ // const defaultRightPlaceHolderInputWidget =
59
+ // InputWidgetToRightPlaceHolder || useDefaultVoiceInputWidget();
60
+ // let defaultIncomingMessageWidget = IncomingMessageWidgetToRightPlaceHolder;
61
+ //
62
+ // if (!defaultIncomingMessageWidget) {
63
+ // const apiKey = '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'; // Замените на ваш реальный ключ API
64
+ //
65
+ // const openAIConfiguration = new Configuration({
66
+ // apiKey,
67
+ // });
68
+ //
69
+ // const openAIApi = new OpenAIApi(openAIConfiguration);
70
+ //
71
+ // defaultIncomingMessageWidget = UseDefaultIncomingMessageWidget({
72
+ // openAIApi,
73
+ // });
74
+ // }
75
+
44
76
  const selectDialogActions = (item: BaseViewModel<DialogEntity>): void => {
45
77
  if (!dialogsViewModel.loading) {
46
78
  setSelectedDialog(item);
47
79
  }
48
80
  };
49
-
50
81
  // const subscribeToDialogEventsUseCase: SubscribeToDialogEventsUseCase =
51
82
  // new SubscribeToDialogEventsUseCase(eventMessaging, 'TestStage');
52
83
 
@@ -181,23 +212,34 @@ const QuickBloxUIKitDesktopLayout: React.FC<
181
212
  theme={theme}
182
213
  dialogsView={
183
214
  <DialogsComponent
215
+ // subHeaderContent={<CompanyLogo />}
216
+ // upHeaderContent={<CompanyLogo />}
184
217
  dialogsViewModel={dialogsViewModel} // 1 Get 2 Update UseCase
185
- itemSelectHandler={selectDialogActions}
218
+ onDialogSelectHandler={selectDialogActions}
186
219
  additionalSettings={{
187
220
  withoutHeader: false,
188
221
  themeHeader: theme,
189
222
  themePreview: theme,
223
+ useSubHeader: false,
224
+ useUpHeader: false,
190
225
  }}
191
226
  />
192
227
  }
193
228
  dialogMessagesView={
194
229
  selectedDialog && selectedDialog.entity && dialogsViewModel.entity ? (
195
230
  <MessagesView
231
+ // subHeaderContent={<CompanyLogo />}
232
+ // upHeaderContent={<CompanyLogo />}
196
233
  dialogsViewModel={dialogsViewModel}
197
- InformationHandler={informationOpenHandler}
234
+ onDialogInformationHandler={informationOpenHandler}
198
235
  maxWidthToResize={
199
236
  selectedDialog && needDialogInformation ? undefined : '1040px'
200
237
  }
238
+ // InputWidgetToLeftPlaceHolder={defaultLeftPlaceHolderInputWidget}
239
+ // InputWidgetToRightPlaceHolder={defaultRightPlaceHolderInputWidget}
240
+ // IncomingMessageWidgetToRightPlaceHolder={
241
+ // defaultIncomingMessageWidget
242
+ // }
201
243
  theme={theme}
202
244
  /> // 1 Get Messages + 1 Get User by Id
203
245
  ) : (
@@ -219,10 +261,11 @@ const QuickBloxUIKitDesktopLayout: React.FC<
219
261
  <div>
220
262
  {selectedDialog && needDialogInformation && (
221
263
  <DialogInformation
264
+ // subHeaderContent={<CompanyLogo />}
265
+ // upHeaderContent={<CompanyLogo />}
222
266
  dialog={selectedDialog.entity}
223
267
  dialogViewModel={dialogsViewModel}
224
- closeInformationHandler={informationCloseHandler}
225
- theme={theme}
268
+ onCloseDialogInformationHandler={informationCloseHandler}
226
269
  />
227
270
  )}
228
271
  </div>
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+
3
+ // eslint-disable-next-line react/function-component-definition
4
+ const CompanyLogo: React.FC = () => {
5
+ return (
6
+ <div
7
+ style={{
8
+ display: 'flex',
9
+ alignItems: 'center',
10
+ width: '322px',
11
+ height: '42px',
12
+ border: '1px solid #333',
13
+ }}
14
+ >
15
+ <img
16
+ src="../../../../../../src/Presentation/assets/img/bee-img.png"
17
+ alt="Company Logo"
18
+ style={{ width: '100px', height: 'auto', marginRight: '10px' }}
19
+ />
20
+ <span style={{ fontSize: '24px', fontWeight: 'bold', color: '#333' }}>
21
+ Your Company Name
22
+ </span>
23
+ </div>
24
+ );
25
+ };
26
+
27
+ export default CompanyLogo;
@@ -1,7 +1,7 @@
1
1
  import React, { useState } from 'react';
2
2
  import './Login.scss';
3
3
  import { InitParams } from '../../../providers/QuickBloxUIKitProvider/QuickBloxUIKitProvider';
4
- import useQbDataContext from '../../../providers/QuickBloxUIKitProvider/useQbDataContext';
4
+ import useQbInitializedDataContext from '../../../providers/QuickBloxUIKitProvider/useQbInitializedDataContext';
5
5
  import { LoginData } from '../../../../../Data/source/remote/RemoteDataSource';
6
6
 
7
7
  export type FunctionTypeLoginDataToVoid = (data: LoginData) => void;
@@ -11,7 +11,7 @@ type LoginProps = {
11
11
  };
12
12
  // eslint-disable-next-line react/function-component-definition
13
13
  const Login: React.FC<LoginProps> = ({ loginHandler }: LoginProps) => {
14
- const currentContext = useQbDataContext();
14
+ const currentContext = useQbInitializedDataContext();
15
15
  const [UserName, setUsername] = useState(
16
16
  currentContext.InitParams.loginData?.login || 'tester',
17
17
  );
@@ -1,8 +1,8 @@
1
1
  import EventMessagesRepository from '../../../../Data/repository/EventMessagesRepository';
2
- import useQbDataContext from './useQbDataContext';
2
+ import useQbInitializedDataContext from './useQbInitializedDataContext';
3
3
 
4
4
  const useEventMessagesRepository = (): EventMessagesRepository => {
5
- const currentQbDataContext = useQbDataContext();
5
+ const currentQbDataContext = useQbInitializedDataContext();
6
6
 
7
7
  return currentQbDataContext.storage.EVENT_MESSAGE_REPOSITORY;
8
8
  };
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { qbDataContext, QBDataContextType } from './QuickBloxUIKitProvider';
3
3
 
4
- const useQbDataContext = (): QBDataContextType => {
4
+ const useQbInitializedDataContext = (): QBDataContextType => {
5
5
  const currentQbDataContext = React.useContext(qbDataContext);
6
6
 
7
7
  console.log(
@@ -79,4 +79,4 @@ const useQbDataContext = (): QBDataContextType => {
79
79
  return currentQbDataContext;
80
80
  };
81
81
 
82
- export default useQbDataContext;
82
+ export default useQbInitializedDataContext;