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.
- package/dist/Presentation/Views/Base/BaseViewModel.d.ts +7 -0
- package/dist/Presentation/Views/Dialogs/Dialogs.d.ts +3 -1
- package/dist/Presentation/components/UI/Dialogs/DialogInformation/DialogInformation.d.ts +3 -1
- package/dist/Presentation/components/UI/Dialogs/MessagesView/InputWidget/InputWidget.d.ts +8 -0
- package/dist/Presentation/components/UI/Dialogs/MessagesView/InputWidget/UseDefaultTextInputWidget.d.ts +2 -0
- package/dist/Presentation/components/UI/Dialogs/MessagesView/InputWidget/useDefaultVoiceInputWidget.d.ts +2 -0
- package/dist/Presentation/components/UI/Dialogs/MessagesView/MessagesView.d.ts +3 -1
- package/dist/Presentation/components/UI/svgs/Icons/Media/AIWidget/index.d.ts +4 -0
- package/dist/Presentation/components/layouts/TestStage/CompanyLogo/CompanyLogo.d.ts +3 -0
- package/dist/Presentation/components/providers/QuickBloxUIKitProvider/useQbInitializedDataContext.d.ts +3 -0
- package/dist/Presentation/components/providers/QuickBloxUIKitProvider/useQbUIKitDataContext.d.ts +3 -0
- package/dist/QBconfig.d.ts +12 -0
- package/dist/index-ui.d.ts +3 -2
- package/dist/index-ui.js +28 -17
- package/package.json +1 -1
- package/src/App.tsx +39 -18
- package/src/Presentation/Views/Base/BaseViewModel.ts +9 -1
- package/src/Presentation/Views/Dialogs/Dialogs.tsx +14 -8
- package/src/Presentation/Views/Dialogs/useDialogsViewModel.ts +1 -1
- package/src/Presentation/components/UI/Dialogs/DialogInformation/DialogInformation.tsx +17 -8
- package/src/Presentation/components/UI/Dialogs/DialogInformation/UsersList/useUsersListViewModel.ts +2 -2
- package/src/Presentation/components/UI/Dialogs/EditDialog/EditDialog.tsx +2 -2
- package/src/Presentation/components/UI/Dialogs/InviteMembers/useInviteMembersViewModel.ts +2 -2
- package/src/Presentation/components/UI/Dialogs/MessagesView/InputWidget/InputWidget.ts +15 -0
- package/src/Presentation/components/UI/Dialogs/MessagesView/InputWidget/UseDefaultTextInputWidget.tsx +60 -0
- package/src/Presentation/components/UI/Dialogs/MessagesView/InputWidget/useDefaultVoiceInputWidget.tsx +86 -0
- package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesView.tsx +217 -48
- package/src/Presentation/components/UI/Dialogs/MessagesView/useMessagesViewModel.ts +2 -2
- package/src/Presentation/components/UI/svgs/Icons/Media/AIWidget/Send.svg +3 -0
- package/src/Presentation/components/UI/svgs/Icons/Media/AIWidget/index.tsx +39 -0
- package/src/Presentation/components/layouts/Desktop/QuickBloxUIKitDesktopLayout.tsx +50 -7
- package/src/Presentation/components/layouts/TestStage/CompanyLogo/CompanyLogo.tsx +27 -0
- package/src/Presentation/components/layouts/TestStage/LoginView/Login.tsx +2 -2
- package/src/Presentation/components/providers/QuickBloxUIKitProvider/useEventMessagesRepository.ts +2 -2
- package/src/Presentation/components/providers/QuickBloxUIKitProvider/{useQbDataContext.ts → useQbInitializedDataContext.ts} +2 -2
- package/src/Presentation/components/providers/QuickBloxUIKitProvider/useQbUIKitDataContext.ts +11 -0
- package/src/QBconfig.ts +13 -0
- package/src/index-ui.ts +4 -2
- 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
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
|
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={
|
|
770
|
+
InformationHandler={onDialogInformationHandler}
|
|
662
771
|
countMembers={getCountDialogMembers(dialogsViewModel.entity)}
|
|
663
772
|
/>
|
|
773
|
+
{useSubContent && subHeaderContent}
|
|
664
774
|
</div>
|
|
665
|
-
<div
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
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
|
-
{/* {
|
|
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
|
|
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 =
|
|
45
|
+
const currentContext = useQbInitializedDataContext();
|
|
46
46
|
const eventMessaging = useEventMessagesRepository();
|
|
47
47
|
|
|
48
48
|
const subscribeToDialogEventsUseCase: SubscribeToDialogEventsUseCase =
|
|
@@ -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
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
14
|
+
const currentContext = useQbInitializedDataContext();
|
|
15
15
|
const [UserName, setUsername] = useState(
|
|
16
16
|
currentContext.InitParams.loginData?.login || 'tester',
|
|
17
17
|
);
|
package/src/Presentation/components/providers/QuickBloxUIKitProvider/useEventMessagesRepository.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import EventMessagesRepository from '../../../../Data/repository/EventMessagesRepository';
|
|
2
|
-
import
|
|
2
|
+
import useQbInitializedDataContext from './useQbInitializedDataContext';
|
|
3
3
|
|
|
4
4
|
const useEventMessagesRepository = (): EventMessagesRepository => {
|
|
5
|
-
const currentQbDataContext =
|
|
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
|
|
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
|
|
82
|
+
export default useQbInitializedDataContext;
|