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.
- package/dist/Presentation/Views/Base/BaseViewModel.d.ts +8 -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/AIWidgets/AIWidget.d.ts +8 -0
- package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/ErrorMessageIcon.d.ts +11 -0
- package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidgetWithProxy.d.ts +9 -0
- package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultTextInputWidget.d.ts +2 -0
- package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/useDefaultVoiceInputWidget.d.ts +2 -0
- package/dist/Presentation/components/UI/Dialogs/MessagesView/ContextMenu.d.ts +10 -0
- package/dist/Presentation/components/UI/Dialogs/MessagesView/MessagesView.d.ts +7 -1
- package/dist/Presentation/components/UI/svgs/Icons/Media/AIWidget/index.d.ts +4 -0
- package/dist/Presentation/components/layouts/Desktop/QuickBloxUIKitDesktopLayout.d.ts +9 -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 +72 -17
- package/dist/utils/utils.d.ts +3 -0
- package/package.json +1 -1
- package/src/App.tsx +21 -19
- package/src/Presentation/Views/Base/BaseViewModel.ts +17 -1
- package/src/Presentation/Views/Dialogs/Dialogs.tsx +14 -9
- 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/AIWidgets/AIWidget.ts +13 -0
- package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/ErrorMessageIcon.tsx +98 -0
- package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidgetWithProxy.tsx +136 -0
- package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultTextInputWidget.tsx +60 -0
- package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/useDefaultVoiceInputWidget.tsx +86 -0
- package/src/Presentation/components/UI/Dialogs/MessagesView/ContextMenu.tsx +96 -0
- package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesView.tsx +275 -51
- 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 +83 -8
- 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 +12 -0
- package/src/index-ui.ts +4 -2
- package/src/utils/utils.ts +39 -0
- 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 {
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
|
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={
|
|
825
|
+
InformationHandler={onDialogInformationHandler}
|
|
662
826
|
countMembers={getCountDialogMembers(dialogsViewModel.entity)}
|
|
663
827
|
/>
|
|
828
|
+
{useSubContent && subHeaderContent}
|
|
664
829
|
</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
|
-
|
|
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
|
-
{/* {
|
|
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
|
|
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;
|