quickblox-react-ui-kit 0.2.2 → 0.2.3

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 (32) hide show
  1. package/dist/Data/source/remote/Mapper/MessageDTOMapper.d.ts +3 -1
  2. package/dist/Domain/use_cases/ai/AIRephraseUseCase.d.ts +15 -0
  3. package/dist/Domain/use_cases/ai/AIRephraseWithProxyUseCase.d.ts +15 -0
  4. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIMessageWidget.d.ts +6 -0
  5. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidget.d.ts +2 -10
  6. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidgetWithProxy.d.ts +2 -0
  7. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidget.d.ts +2 -10
  8. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidgetWithProxy.d.ts +2 -0
  9. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidget.d.ts +2 -10
  10. package/dist/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidgetWithProxy.d.ts +2 -0
  11. package/dist/index-ui.js +79 -13
  12. package/package.json +1 -1
  13. package/src/App.tsx +3 -1
  14. package/src/Data/source/remote/Mapper/DialogDTOMapper.ts +3 -0
  15. package/src/Data/source/remote/Mapper/MessageDTOMapper.ts +55 -2
  16. package/src/Data/source/remote/RemoteDataSource.ts +2 -1
  17. package/src/Domain/use_cases/ai/AIRephraseUseCase.ts +87 -0
  18. package/src/Domain/use_cases/ai/AIRephraseWithProxyUseCase.ts +71 -0
  19. package/src/Presentation/Views/Dialogs/Dialogs.tsx +1 -1
  20. package/src/Presentation/Views/Dialogs/useDialogsViewModel.ts +4 -1
  21. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/AIMessageWidget.ts +11 -0
  22. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidget.tsx +15 -35
  23. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidgetWithProxy.tsx +79 -0
  24. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidget.tsx +23 -41
  25. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidgetWithProxy.tsx +86 -0
  26. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidget.tsx +15 -33
  27. package/src/Presentation/components/UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidgetWithProxy.tsx +88 -0
  28. package/src/Presentation/components/UI/Dialogs/MessagesView/MessagesView.tsx +19 -17
  29. package/src/Presentation/components/UI/Dialogs/MessagesView/VideoAttachmentComponent/VideoAttachmentComponent.scss +6 -2
  30. package/src/Presentation/components/UI/Dialogs/MessagesView/useMessagesViewModel.ts +13 -3
  31. package/src/Presentation/components/layouts/Desktop/QuickBloxUIKitDesktopLayout.tsx +38 -27
  32. package/src/Presentation/components/providers/QuickBloxUIKitProvider/QuickBloxUIKitProvider.tsx +1 -1
@@ -0,0 +1,86 @@
1
+ import { useState } from 'react';
2
+ import { AIMessageWidget, MessageWidgetProps } from './AIMessageWidget';
3
+ import ErrorMessageIcon from './ErrorMessageIcon';
4
+ import AIWidgetIcon from '../../../svgs/Icons/AIWidgets/AIWidget';
5
+ import { Tone } from './Tone';
6
+ import { IChatMessage } from '../../../../../../Data/source/AISource';
7
+ import { AIRephraseWithProxyUseCase } from '../../../../../../Domain/use_cases/ai/AIRephraseWithProxyUseCase';
8
+
9
+ // interface MessageWidgetProps {
10
+ // servername: string;
11
+ // api: string;
12
+ // port: string;
13
+ // apiKeyOrSessionToken: string;
14
+ // apiKey: string;
15
+ // }
16
+
17
+ export default function UseDefaultAIRephraseMessageWidgetWithProxy({
18
+ servername,
19
+ api,
20
+ port,
21
+ apiKeyOrSessionToken,
22
+ }: MessageWidgetProps): AIMessageWidget {
23
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
24
+ const [errorMessage, setErrorMessage] = useState<string>('');
25
+
26
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/no-empty-function
27
+ const fileToWidget = (file: File, context: IChatMessage[]): void => {};
28
+
29
+ const renderWidget = (): JSX.Element => {
30
+ if (errorMessage && errorMessage.length > 0) {
31
+ const errorsDescriptions:
32
+ | { title: string; action: () => void }[]
33
+ | undefined = [];
34
+
35
+ return (
36
+ <ErrorMessageIcon
37
+ errorMessageText={errorMessage}
38
+ errorsDescriptions={errorsDescriptions}
39
+ />
40
+ );
41
+ }
42
+
43
+ return <AIWidgetIcon applyZoom color="green" />;
44
+ };
45
+
46
+ const [textFromWidgetToContent, setTextFromWidgetToContent] = useState('');
47
+
48
+ const textToWidget = async (
49
+ textToSend: string,
50
+ context: IChatMessage[],
51
+ additionalSettings?: { [key: string]: any },
52
+ ): Promise<string> => {
53
+ if (textToSend && textToSend.length > 0) {
54
+ const { tone } = additionalSettings || {};
55
+
56
+ const openAIModel = 'gpt-3.5-turbo';
57
+
58
+ const useCaseAIRephrase = new AIRephraseWithProxyUseCase(
59
+ textToSend,
60
+ tone as Tone,
61
+ context,
62
+ servername,
63
+ api,
64
+ port,
65
+ apiKeyOrSessionToken,
66
+ openAIModel,
67
+ );
68
+
69
+ // eslint-disable-next-line no-return-await
70
+ return await useCaseAIRephrase.execute().then((data) => {
71
+ setTextFromWidgetToContent(data);
72
+
73
+ return data;
74
+ });
75
+ }
76
+
77
+ //
78
+ return '';
79
+ };
80
+
81
+ return {
82
+ textToContent: textFromWidgetToContent,
83
+ renderWidget,
84
+ textToWidget,
85
+ };
86
+ }
@@ -1,26 +1,25 @@
1
1
  import { useState } from 'react';
2
2
  import AIWidgetIcon from '../../../svgs/Icons/AIWidgets/AIWidget';
3
3
  import ErrorMessageIcon from './ErrorMessageIcon';
4
- import { AIMessageWidget } from './AIMessageWidget';
4
+ import { AIMessageWidget, MessageWidgetProps } from './AIMessageWidget';
5
5
  import { AISource, IChatMessage } from '../../../../../../Data/source/AISource';
6
6
 
7
- interface MessageWidgetProps {
8
- // https://api.openai.com/v1/chat/completions'
9
- // api: 'v1/chat/completions',
10
- // servername: 'https://myproxy.com',
11
- // https://func270519800.azurewebsites.net/api/TranslateTextToEng
12
- servername: string;
13
- api: string;
14
- port: string;
15
- sessionToken: string;
16
- apiKey: string;
17
- }
7
+ // interface MessageWidgetProps {
8
+ // // https://api.openai.com/v1/chat/completions'
9
+ // // api: 'v1/chat/completions',
10
+ // // servername: 'https://myproxy.com',
11
+ // // https://func270519800.azurewebsites.net/api/TranslateTextToEng
12
+ // servername: string;
13
+ // api: string;
14
+ // port: string;
15
+ // apiKeyOrSessionToken: string;
16
+ // apiKey: string;
17
+ // }
18
18
  export default function UseDefaultAITranslateWidget({
19
19
  servername,
20
20
  api,
21
21
  port,
22
- sessionToken,
23
- apiKey,
22
+ apiKeyOrSessionToken,
24
23
  }: MessageWidgetProps): AIMessageWidget {
25
24
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
26
25
  const [errorMessage, setErrorMessage] = useState<string>('');
@@ -62,32 +61,15 @@ export default function UseDefaultAITranslateWidget({
62
61
  } and give me just only translated text. Text to translate is: "${textToSend}"`;
63
62
  }
64
63
 
65
- if (apiKey.length > 0) {
66
- // eslint-disable-next-line no-return-await
67
- return await AISource.getData(
68
- prompt,
69
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
70
- context,
71
- servername,
72
- api,
73
- port,
74
- sessionToken,
75
- ).then((data) => {
76
- setTextFromWidgetToContent(data);
77
-
78
- return data;
79
- });
80
- }
81
-
82
64
  // eslint-disable-next-line no-return-await
83
- return await AISource.getDataWithProxyServer(
65
+ return await AISource.getData(
84
66
  prompt,
85
67
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
86
68
  context,
87
69
  servername,
88
70
  api,
89
71
  port,
90
- sessionToken,
72
+ apiKeyOrSessionToken,
91
73
  ).then((data) => {
92
74
  setTextFromWidgetToContent(data);
93
75
 
@@ -0,0 +1,88 @@
1
+ import { useState } from 'react';
2
+ import AIWidgetIcon from '../../../svgs/Icons/AIWidgets/AIWidget';
3
+ import ErrorMessageIcon from './ErrorMessageIcon';
4
+ import { AIMessageWidget, MessageWidgetProps } from './AIMessageWidget';
5
+ import { AISource, IChatMessage } from '../../../../../../Data/source/AISource';
6
+
7
+ // interface MessageWidgetProps {
8
+ // // https://api.openai.com/v1/chat/completions'
9
+ // // api: 'v1/chat/completions',
10
+ // // servername: 'https://myproxy.com',
11
+ // // https://func270519800.azurewebsites.net/api/TranslateTextToEng
12
+ // servername: string;
13
+ // api: string;
14
+ // port: string;
15
+ // apiKeyOrSessionToken: string;
16
+ // apiKey: string;
17
+ // }
18
+ export default function UseDefaultAITranslateWidgetWithProxy({
19
+ servername,
20
+ api,
21
+ port,
22
+ apiKeyOrSessionToken,
23
+ }: MessageWidgetProps): AIMessageWidget {
24
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
25
+ const [errorMessage, setErrorMessage] = useState<string>('');
26
+
27
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/no-empty-function
28
+ const fileToWidget = (file: File, context: IChatMessage[]): void => {};
29
+
30
+ const renderWidget = (): JSX.Element => {
31
+ if (errorMessage && errorMessage.length > 0) {
32
+ const errorsDescriptions:
33
+ | { title: string; action: () => void }[]
34
+ | undefined = [];
35
+
36
+ return (
37
+ <ErrorMessageIcon
38
+ errorMessageText={errorMessage}
39
+ errorsDescriptions={errorsDescriptions}
40
+ />
41
+ );
42
+ }
43
+
44
+ return <AIWidgetIcon applyZoom color="green" />;
45
+ };
46
+
47
+ const [textFromWidgetToContent, setTextFromWidgetToContent] = useState('');
48
+ const textToWidget = async (
49
+ textToSend: string,
50
+ context: IChatMessage[],
51
+ additionalSettings?: { [key: string]: any },
52
+ ): Promise<string> => {
53
+ if (textToSend && textToSend.length > 0) {
54
+ // eslint-disable-next-line no-return-await
55
+ let prompt = `Please, translate the next text in english and give me just only translated text. Text to translate is: "${textToSend}"`;
56
+ const { language } = additionalSettings || {};
57
+
58
+ if (language) {
59
+ prompt = `Please, translate the next text in ${
60
+ language as string
61
+ } and give me just only translated text. Text to translate is: "${textToSend}"`;
62
+ }
63
+
64
+ // eslint-disable-next-line no-return-await
65
+ return await AISource.getDataWithProxyServer(
66
+ prompt,
67
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
68
+ context,
69
+ servername,
70
+ api,
71
+ port,
72
+ apiKeyOrSessionToken,
73
+ ).then((data) => {
74
+ setTextFromWidgetToContent(data);
75
+
76
+ return data;
77
+ });
78
+ }
79
+
80
+ return '';
81
+ };
82
+
83
+ return {
84
+ textToContent: textFromWidgetToContent,
85
+ renderWidget,
86
+ textToWidget,
87
+ };
88
+ }
@@ -61,6 +61,8 @@ import SmirkIcon from '../../svgs/Icons/AIWidgets/SmirkIcon';
61
61
  import PerformingArtsIcon from '../../svgs/Icons/AIWidgets/PerformingArtsIcon';
62
62
  import { FunctionTypeVoidToVoid } from '../../../../Views/Base/BaseViewModel';
63
63
  import { IChatMessage } from '../../../../../Data/source/AISource';
64
+ import AIWidgetActions from './AIWidgets/AIWidgetActions/AIWidgetActions';
65
+ import ToneIcon from '../../svgs/Icons/Actions/Tone';
64
66
  // import ToneIcon from '../../svgs/Icons/Actions/Tone';
65
67
  // import AIWidgetActions from './AIWidgets/AIWidgetActions/AIWidgetActions';
66
68
 
@@ -1183,23 +1185,23 @@ const MessagesView: React.FC<HeaderDialogsMessagesProps> = ({
1183
1185
  placeholder="enter text to send"
1184
1186
  />
1185
1187
  </div>
1186
- {/* <div className="right"> */}
1187
- {/* {AIRephrase && ( */}
1188
- {/* <div className="icon"> */}
1189
- {/* <AIWidgetActions */}
1190
- {/* widgetToRender={ */}
1191
- {/* <ToneIcon */}
1192
- {/* width="24" */}
1193
- {/* height="24" */}
1194
- {/* applyZoom */}
1195
- {/* color={theme ? theme.mainText() : 'var(--main-text)'} */}
1196
- {/* /> */}
1197
- {/* } */}
1198
- {/* items={getAIEditingMessagesItems()} */}
1199
- {/* /> */}
1200
- {/* </div> */}
1201
- {/* )} */}
1202
- {/* </div> */}
1188
+ <div className="right">
1189
+ {AIRephrase && (
1190
+ <div className="icon">
1191
+ <AIWidgetActions
1192
+ widgetToRender={
1193
+ <ToneIcon
1194
+ width="24"
1195
+ height="24"
1196
+ applyZoom
1197
+ color={theme ? theme.mainText() : 'var(--main-text)'}
1198
+ />
1199
+ }
1200
+ items={getAIEditingMessagesItems()}
1201
+ />
1202
+ </div>
1203
+ )}
1204
+ </div>
1203
1205
  </div>
1204
1206
  )}
1205
1207
 
@@ -1,7 +1,11 @@
1
1
  .video-body{
2
2
  // border: 1px solid red;
3
- // max-height: 300px;
4
- // max-width: 100%;
3
+ //max-height: 300px;
4
+ //max-width: 100%;
5
+ max-width: 240px;
6
+ max-height: 130px;
7
+ min-width: 240px;
8
+ width: 240px;
5
9
  padding: 0;
6
10
  border-radius: 4px;
7
11
  }
@@ -399,12 +399,18 @@ export default function useMessagesViewModel(
399
399
  .then((fileMessage: FileEntity) => {
400
400
  console.log(JSON.stringify(fileMessage));
401
401
  // '[attachment]'
402
+ const recipientId =
403
+ dialog.type === DialogType.private
404
+ ? (dialog as PrivateDialogEntity).participantId
405
+ : currentUserId;
406
+
407
+ // eslint-disable-next-line promise/always-return
408
+ const messageBody = fileMessage.name || '[attachment]';
402
409
  const messageToSend: MessageEntity =
403
410
  Stubs.createMessageEntityWithParams(
404
411
  '',
405
412
  dialog.id,
406
- // eslint-disable-next-line promise/always-return
407
- fileMessage.name || '[attachment]',
413
+ messageBody,
408
414
  Date.now().toString(),
409
415
  Date.now(),
410
416
  Date.now().toString(),
@@ -412,7 +418,8 @@ export default function useMessagesViewModel(
412
418
  [],
413
419
  1,
414
420
  currentUserId,
415
- currentUserId,
421
+ // eslint-disable-next-line promise/always-return
422
+ recipientId,
416
423
  [],
417
424
  '',
418
425
  DialogType.group,
@@ -433,6 +440,9 @@ export default function useMessagesViewModel(
433
440
 
434
441
  messageToSend.attachments = attachments;
435
442
 
443
+ messageToSend.message = `MediaContentEntity|${messageBody}|${
444
+ fileMessage.uid
445
+ }|${fileMessage.type!.toString()}`;
436
446
  sendMessage(messageToSend);
437
447
  //
438
448
  })
@@ -15,6 +15,9 @@ import UseDefaultAIAssistAnswerWidget from '../../UI/Dialogs/MessagesView/AIWidg
15
15
  import UseDefaultAITranslateWidget from '../../UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidget';
16
16
  import UseDefaultAIRephraseMessageWidget from '../../UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidget';
17
17
  import { DefaultConfigurations } from '../../../../Data/DefaultConfigurations';
18
+ import UseDefaultAIAssistAnswerWidgetWithProxy from '../../UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIAssistAnswerWidgetWithProxy';
19
+ import UseDefaultAITranslateWidgetWithProxy from '../../UI/Dialogs/MessagesView/AIWidgets/UseDefaultAITranslateWidgetWithProxy';
20
+ import UseDefaultAIRephraseMessageWidgetWithProxy from '../../UI/Dialogs/MessagesView/AIWidgets/UseDefaultAIRephraseMessageWidgetWithProxy';
18
21
 
19
22
  type AIWidgetPlaceHolder = {
20
23
  enabled: boolean;
@@ -80,25 +83,28 @@ const QuickBloxUIKitDesktopLayout: React.FC<
80
83
  } else {
81
84
  const { apiKey } = QBConfig.configAIApi.AIAnswerAssistWidgetConfig;
82
85
  let token = '';
86
+ const proxyConfig: ProxyConfig =
87
+ QBConfig.configAIApi.AIAnswerAssistWidgetConfig.proxyConfig ||
88
+ DefaultConfigurations.getDefaultProxyConfig();
83
89
 
84
90
  if (apiKey) {
85
91
  token = apiKey;
92
+ defaultAIAnswerToMessageWidget = UseDefaultAIAssistAnswerWidget({
93
+ ...proxyConfig,
94
+ apiKeyOrSessionToken: token,
95
+ });
86
96
  } else {
87
97
  token =
88
98
  QBConfig.configAIApi.AIAnswerAssistWidgetConfig.proxyConfig
89
99
  .sessionToken ||
90
100
  sessionToken ||
91
101
  '';
102
+ defaultAIAnswerToMessageWidget =
103
+ UseDefaultAIAssistAnswerWidgetWithProxy({
104
+ ...proxyConfig,
105
+ apiKeyOrSessionToken: token,
106
+ });
92
107
  }
93
- const proxyConfig: ProxyConfig =
94
- QBConfig.configAIApi.AIAnswerAssistWidgetConfig.proxyConfig ||
95
- DefaultConfigurations.getDefaultProxyConfig();
96
-
97
- defaultAIAnswerToMessageWidget = UseDefaultAIAssistAnswerWidget({
98
- ...proxyConfig,
99
- sessionToken: token,
100
- apiKey,
101
- });
102
108
  }
103
109
  }
104
110
  };
@@ -117,25 +123,27 @@ const QuickBloxUIKitDesktopLayout: React.FC<
117
123
  } else {
118
124
  const { apiKey } = QBConfig.configAIApi.AITranslateWidgetConfig;
119
125
  let token = '';
126
+ const proxyConfig: ProxyConfig =
127
+ QBConfig.configAIApi.AITranslateWidgetConfig.proxyConfig ||
128
+ DefaultConfigurations.getDefaultProxyConfig();
120
129
 
121
130
  if (apiKey) {
122
131
  token = apiKey;
132
+ defaultAITranslateWidget = UseDefaultAITranslateWidget({
133
+ ...proxyConfig,
134
+ apiKeyOrSessionToken: token,
135
+ });
123
136
  } else {
124
137
  token =
125
138
  QBConfig.configAIApi.AITranslateWidgetConfig.proxyConfig
126
139
  .sessionToken ||
127
140
  sessionToken ||
128
141
  '';
142
+ defaultAITranslateWidget = UseDefaultAITranslateWidgetWithProxy({
143
+ ...proxyConfig,
144
+ apiKeyOrSessionToken: token,
145
+ });
129
146
  }
130
- const proxyConfig: ProxyConfig =
131
- QBConfig.configAIApi.AITranslateWidgetConfig.proxyConfig ||
132
- DefaultConfigurations.getDefaultProxyConfig();
133
-
134
- defaultAITranslateWidget = UseDefaultAITranslateWidget({
135
- ...proxyConfig,
136
- sessionToken: token,
137
- apiKey,
138
- });
139
147
  }
140
148
  }
141
149
  };
@@ -154,25 +162,28 @@ const QuickBloxUIKitDesktopLayout: React.FC<
154
162
  } else {
155
163
  const { apiKey } = QBConfig.configAIApi.AIRephraseWidgetConfig;
156
164
  let token = '';
165
+ const proxyConfig: ProxyConfig =
166
+ QBConfig.configAIApi.AIRephraseWidgetConfig.proxyConfig ||
167
+ DefaultConfigurations.getDefaultProxyConfig();
157
168
 
158
169
  if (apiKey) {
159
170
  token = apiKey;
171
+ defaultAIEditMessageWidget = UseDefaultAIRephraseMessageWidget({
172
+ ...proxyConfig,
173
+ apiKeyOrSessionToken: token,
174
+ });
160
175
  } else {
161
176
  token =
162
177
  QBConfig.configAIApi.AIRephraseWidgetConfig.proxyConfig
163
178
  .sessionToken ||
164
179
  sessionToken ||
165
180
  '';
181
+ defaultAIEditMessageWidget =
182
+ UseDefaultAIRephraseMessageWidgetWithProxy({
183
+ ...proxyConfig,
184
+ apiKeyOrSessionToken: token,
185
+ });
166
186
  }
167
- const proxyConfig: ProxyConfig =
168
- QBConfig.configAIApi.AIRephraseWidgetConfig.proxyConfig ||
169
- DefaultConfigurations.getDefaultProxyConfig();
170
-
171
- defaultAIEditMessageWidget = UseDefaultAIRephraseMessageWidget({
172
- ...proxyConfig,
173
- sessionToken: token,
174
- apiKey,
175
- });
176
187
  }
177
188
  }
178
189
  };
@@ -291,7 +291,7 @@ function QuickBloxUIKitProvider({
291
291
  // eslint-disable-next-line @typescript-eslint/no-empty-function
292
292
  // storage.SYNC_DIALOGS_USE_CASE.execute(() => {});
293
293
 
294
- // todo: MUST use sessionToken or login/pass to re-init
294
+ // todo: MUST use apiKeyOrSessionToken or login/pass to re-init
295
295
  // const remoteDataSourceMock: RemoteDataSource =
296
296
  // storage.REMOTE_DATA_SOURCE as RemoteDataSource;
297
297
  // // remoteDataSourceMock