@memori.ai/memori-react 8.12.0 → 8.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/components/Chat/Chat.css +37 -3
  3. package/dist/components/Chat/Chat.js +60 -22
  4. package/dist/components/Chat/Chat.js.map +1 -1
  5. package/dist/components/ChatBubble/ChatBubble.css +9 -5
  6. package/dist/components/ChatBubble/ChatBubble.js +54 -11
  7. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  8. package/dist/components/ChatInputs/ChatInputs.css +293 -17
  9. package/dist/components/ChatInputs/ChatInputs.js +41 -25
  10. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  11. package/dist/components/ChatTextArea/ChatTextArea.css +75 -31
  12. package/dist/components/ChatTextArea/ChatTextArea.js +47 -18
  13. package/dist/components/ChatTextArea/ChatTextArea.js.map +1 -1
  14. package/dist/components/FilePreview/FilePreview.css +225 -146
  15. package/dist/components/FilePreview/FilePreview.d.ts +1 -2
  16. package/dist/components/FilePreview/FilePreview.js +20 -6
  17. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  18. package/dist/components/Header/Header.css +2 -2
  19. package/dist/components/MediaWidget/MediaItemWidget.js +2 -1
  20. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  21. package/dist/components/MediaWidget/MediaWidget.css +0 -4
  22. package/dist/components/MemoriWidget/MemoriWidget.css +11 -2
  23. package/dist/components/MemoriWidget/MemoriWidget.js +41 -5
  24. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  25. package/dist/components/MicrophoneButton/MicrophoneButton.css +2 -2
  26. package/dist/components/StartPanel/StartPanel.css +8 -0
  27. package/dist/components/UploadButton/UploadButton.css +20 -17
  28. package/dist/components/UploadButton/UploadButton.js +218 -89
  29. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  30. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +14 -4
  31. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  32. package/dist/components/UploadButton/UploadImages/UploadImages.js +143 -16
  33. package/dist/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  34. package/dist/components/layouts/chat.css +1 -1
  35. package/dist/helpers/constants.d.ts +1 -0
  36. package/dist/helpers/constants.js +2 -1
  37. package/dist/helpers/constants.js.map +1 -1
  38. package/dist/helpers/imageCompression.d.ts +7 -0
  39. package/dist/helpers/imageCompression.js +123 -0
  40. package/dist/helpers/imageCompression.js.map +1 -0
  41. package/dist/locales/de.json +7 -4
  42. package/dist/locales/en.json +8 -5
  43. package/dist/locales/es.json +7 -4
  44. package/dist/locales/fr.json +7 -4
  45. package/dist/locales/it.json +8 -5
  46. package/dist/styles.css +1 -2
  47. package/esm/components/Chat/Chat.css +37 -3
  48. package/esm/components/Chat/Chat.js +60 -22
  49. package/esm/components/Chat/Chat.js.map +1 -1
  50. package/esm/components/ChatBubble/ChatBubble.css +9 -5
  51. package/esm/components/ChatBubble/ChatBubble.js +54 -11
  52. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  53. package/esm/components/ChatInputs/ChatInputs.css +293 -17
  54. package/esm/components/ChatInputs/ChatInputs.js +42 -26
  55. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  56. package/esm/components/ChatTextArea/ChatTextArea.css +75 -31
  57. package/esm/components/ChatTextArea/ChatTextArea.js +49 -20
  58. package/esm/components/ChatTextArea/ChatTextArea.js.map +1 -1
  59. package/esm/components/FilePreview/FilePreview.css +225 -146
  60. package/esm/components/FilePreview/FilePreview.d.ts +1 -2
  61. package/esm/components/FilePreview/FilePreview.js +21 -7
  62. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  63. package/esm/components/Header/Header.css +2 -2
  64. package/esm/components/MediaWidget/MediaItemWidget.js +2 -1
  65. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  66. package/esm/components/MediaWidget/MediaWidget.css +0 -4
  67. package/esm/components/MemoriWidget/MemoriWidget.css +11 -2
  68. package/esm/components/MemoriWidget/MemoriWidget.js +41 -5
  69. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  70. package/esm/components/MicrophoneButton/MicrophoneButton.css +2 -2
  71. package/esm/components/StartPanel/StartPanel.css +8 -0
  72. package/esm/components/UploadButton/UploadButton.css +20 -17
  73. package/esm/components/UploadButton/UploadButton.js +219 -90
  74. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  75. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +14 -4
  76. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  77. package/esm/components/UploadButton/UploadImages/UploadImages.js +143 -16
  78. package/esm/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  79. package/esm/components/layouts/chat.css +1 -1
  80. package/esm/helpers/constants.d.ts +1 -0
  81. package/esm/helpers/constants.js +1 -0
  82. package/esm/helpers/constants.js.map +1 -1
  83. package/esm/helpers/imageCompression.d.ts +7 -0
  84. package/esm/helpers/imageCompression.js +119 -0
  85. package/esm/helpers/imageCompression.js.map +1 -0
  86. package/esm/locales/de.json +7 -4
  87. package/esm/locales/en.json +8 -5
  88. package/esm/locales/es.json +7 -4
  89. package/esm/locales/fr.json +7 -4
  90. package/esm/locales/it.json +8 -5
  91. package/esm/styles.css +1 -2
  92. package/package.json +1 -1
  93. package/src/components/Chat/Chat.css +37 -3
  94. package/src/components/Chat/Chat.tsx +89 -21
  95. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +672 -732
  96. package/src/components/ChatBubble/ChatBubble.css +9 -5
  97. package/src/components/ChatBubble/ChatBubble.tsx +111 -20
  98. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +4 -4
  99. package/src/components/ChatInputs/ChatInputs.css +293 -17
  100. package/src/components/ChatInputs/ChatInputs.tsx +144 -87
  101. package/src/components/ChatInputs/__snapshots__/ChatInputs.test.tsx.snap +430 -424
  102. package/src/components/ChatTextArea/ChatTextArea.css +75 -31
  103. package/src/components/ChatTextArea/ChatTextArea.test.tsx +1 -16
  104. package/src/components/ChatTextArea/ChatTextArea.tsx +51 -22
  105. package/src/components/ChatTextArea/__snapshots__/ChatTextArea.test.tsx.snap +9 -72
  106. package/src/components/FilePreview/FilePreview.css +225 -146
  107. package/src/components/FilePreview/FilePreview.tsx +49 -36
  108. package/src/components/FilePreview/__snapshots__/FilePreview.test.tsx.snap +2 -2
  109. package/src/components/Header/Header.css +2 -2
  110. package/src/components/MediaWidget/MediaItemWidget.tsx +2 -1
  111. package/src/components/MediaWidget/MediaWidget.css +0 -4
  112. package/src/components/MemoriWidget/MemoriWidget.css +11 -2
  113. package/src/components/MemoriWidget/MemoriWidget.tsx +61 -12
  114. package/src/components/MicrophoneButton/MicrophoneButton.css +2 -2
  115. package/src/components/StartPanel/StartPanel.css +8 -0
  116. package/src/components/UploadButton/UploadButton.css +20 -17
  117. package/src/components/UploadButton/UploadButton.stories.tsx +247 -35
  118. package/src/components/UploadButton/UploadButton.tsx +280 -175
  119. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +19 -4
  120. package/src/components/UploadButton/UploadImages/UploadImages.tsx +195 -35
  121. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +10 -1
  122. package/src/components/layouts/chat.css +1 -1
  123. package/src/helpers/constants.ts +1 -1
  124. package/src/helpers/imageCompression.ts +230 -0
  125. package/src/locales/de.json +7 -4
  126. package/src/locales/en.json +8 -5
  127. package/src/locales/es.json +7 -4
  128. package/src/locales/fr.json +7 -4
  129. package/src/locales/it.json +8 -5
  130. package/src/styles.css +1 -2
  131. package/src/components/UploadMenu/UploadMenu.css +0 -47
  132. package/src/components/UploadMenu/UploadMenu.stories.tsx +0 -66
  133. package/src/components/UploadMenu/UploadMenu.test.tsx +0 -34
  134. package/src/components/UploadMenu/UploadMenu.tsx +0 -68
  135. package/src/components/UploadMenu/__snapshots__/UploadMenu.test.tsx.snap +0 -137
@@ -10,6 +10,7 @@ import Microphone from '../icons/Microphone';
10
10
  import UploadButton from '../UploadButton/UploadButton';
11
11
  import FilePreview from '../FilePreview/FilePreview';
12
12
  import memoriApiClient from '@memori.ai/memori-api-client';
13
+ import Plus from '../icons/Plus';
13
14
  export interface Props {
14
15
  dialogState?: DialogState;
15
16
  instruct?: boolean;
@@ -98,9 +99,13 @@ const ChatInputs: React.FC<Props> = ({
98
99
  }[]
99
100
  ) => {
100
101
  if (isTyping) return;
101
-
102
+
102
103
  const mediaWithIds = files.map((file, index) => {
103
- const generatedMediumID = file.mediumID || `file_${Date.now()}_${index}_${Math.random().toString(36).substr(2, 9)}`;
104
+ const generatedMediumID =
105
+ file.mediumID ||
106
+ `file_${Date.now()}_${index}_${Math.random()
107
+ .toString(36)
108
+ .substr(2, 9)}`;
104
109
  return {
105
110
  mediumID: generatedMediumID,
106
111
  mimeType: file.mimeType,
@@ -111,7 +116,7 @@ const ChatInputs: React.FC<Props> = ({
111
116
  url: file.url,
112
117
  };
113
118
  });
114
-
119
+
115
120
  sendMessage(userMessage, mediaWithIds);
116
121
 
117
122
  // Reset states after sending
@@ -135,7 +140,11 @@ const ChatInputs: React.FC<Props> = ({
135
140
  if (sendOnEnter === 'keypress' && userMessage?.length > 0) {
136
141
  stopListening();
137
142
  const mediaWithIds = documentPreviewFiles.map((file, index) => {
138
- const generatedMediumID = file.mediumID || `file_${Date.now()}_${index}_${Math.random().toString(36).substr(2, 9)}`;
143
+ const generatedMediumID =
144
+ file.mediumID ||
145
+ `file_${Date.now()}_${index}_${Math.random()
146
+ .toString(36)
147
+ .substr(2, 9)}`;
139
148
  return {
140
149
  mediumID: generatedMediumID,
141
150
  mimeType: file.mimeType,
@@ -146,7 +155,7 @@ const ChatInputs: React.FC<Props> = ({
146
155
  url: file.url,
147
156
  };
148
157
  });
149
-
158
+
150
159
  sendMessage(userMessage, mediaWithIds);
151
160
 
152
161
  setDocumentPreviewFiles([]);
@@ -187,94 +196,142 @@ const ChatInputs: React.FC<Props> = ({
187
196
  }
188
197
  };
189
198
 
199
+ const isDisabled =
200
+ dialogState?.state === 'X2a' || dialogState?.state === 'X3';
201
+ const textareaDisabled = ['R2', 'R3', 'R4', 'R5', 'G3', 'X3'].includes(
202
+ dialogState?.state || ''
203
+ );
204
+
190
205
  return (
191
- <fieldset
192
- id="chat-fieldset"
193
- className={cx('memori-chat-inputs', {
194
- 'memori-chat-inputs--expanded': isExpanded,
195
- })}
196
- disabled={dialogState?.state === 'X2a' || dialogState?.state === 'X3'}
197
- >
198
- <ChatTextArea
199
- value={userMessage}
200
- onChange={onChangeUserMessage}
201
- onPressEnter={onTextareaPressEnter}
202
- onFocus={onTextareaFocus}
203
- onBlur={onTextareaBlur}
204
- onExpandedChange={handleTextareaExpanded}
205
- disabled={['R2', 'R3', 'R4', 'R5', 'G3', 'X3'].includes(
206
- dialogState?.state || ''
207
- )}
208
- />
209
- {/* Preview for document files */}
210
- {showUpload && (
211
- <>
206
+ <div className="memori-chat-inputs-wrapper">
207
+ <fieldset
208
+ id="chat-fieldset"
209
+ className={cx('memori-chat-inputs', {
210
+ 'memori-chat-inputs--expanded': isExpanded,
211
+ })}
212
+ disabled={isDisabled}
213
+ >
214
+ {/* Preview for document files */}
215
+ {showUpload && (
212
216
  <FilePreview
213
217
  previewFiles={documentPreviewFiles}
214
218
  removeFile={removeFile}
215
219
  />
220
+ )}
221
+ <div className="memori-chat-inputs--container">
222
+ {/* Leading area - Plus button */}
223
+ <div className="memori-chat-inputs--leading">
224
+ {showUpload && (
225
+ <div className="memori-chat-inputs--upload-wrapper">
226
+ <UploadButton
227
+ authToken={authToken}
228
+ client={client}
229
+ sessionID={sessionID}
230
+ isMediaAccepted={dialogState?.acceptsMedia || false}
231
+ setDocumentPreviewFiles={setDocumentPreviewFiles}
232
+ documentPreviewFiles={documentPreviewFiles}
233
+ memoriID={memoriID}
234
+ />
235
+ </div>
236
+ )}
237
+ </div>
216
238
 
217
- {/* Replace the individual buttons with our unified upload component */}
218
- <UploadButton
219
- authToken={authToken}
220
- client={client}
221
- sessionID={sessionID}
222
- isMediaAccepted={dialogState?.acceptsMedia || false}
223
- setDocumentPreviewFiles={setDocumentPreviewFiles}
224
- documentPreviewFiles={documentPreviewFiles}
225
- memoriID={memoriID}
226
- />
227
- </>
228
- )}
229
- <Button
230
- shape="circle"
231
- primary={!!userMessage?.length}
232
- loading={isTyping}
233
- disabled={!userMessage || userMessage.length === 0}
234
- className="memori-chat-inputs--send"
235
- onClick={() => {
236
- onSendMessage(documentPreviewFiles);
237
- }}
238
- title={t('send') || 'Send'}
239
- icon={<Send />}
240
- />
241
- {showMicrophone && microphoneMode === 'HOLD_TO_TALK' && (
242
- <MicrophoneButton
243
- listening={listening}
244
- startListening={startListening}
245
- stopListening={() => {
246
- stopListening();
247
- if (listening && !!userMessage?.length) {
248
- sendMessage(userMessage);
249
- }
250
- }}
251
- stopAudio={stopAudio}
252
- />
253
- )}
254
- {showMicrophone && microphoneMode === 'CONTINUOUS' && (
255
- <Button
256
- primary
257
- className={cx('memori-chat-inputs--mic', {
258
- 'memori-chat-inputs--mic--listening': listening,
259
- })}
260
- title={
261
- listening
262
- ? t('write_and_speak.micButtonPopoverListening') || 'Listening'
263
- : t('write_and_speak.micButtonPopover') || 'Start listening'
264
- }
265
- onClick={() => {
266
- if (listening) {
267
- stopListening();
268
- } else {
269
- stopAudio();
270
- startListening();
271
- }
272
- }}
273
- shape="circle"
274
- icon={<Microphone />}
275
- />
276
- )}
277
- </fieldset>
239
+ {/* Primary area - Textarea */}
240
+ <div className="memori-chat-inputs--primary">
241
+ <ChatTextArea
242
+ value={userMessage}
243
+ onChange={onChangeUserMessage}
244
+ onPressEnter={onTextareaPressEnter}
245
+ onFocus={onTextareaFocus}
246
+ onBlur={onTextareaBlur}
247
+ onExpandedChange={handleTextareaExpanded}
248
+ disabled={textareaDisabled}
249
+ />
250
+ </div>
251
+
252
+ {/* Trailing area - Microphone and Send button */}
253
+ <div className="memori-chat-inputs--trailing">
254
+ <div className="memori-chat-inputs--trailing-inner">
255
+ {showMicrophone && microphoneMode === 'CONTINUOUS' && (
256
+ <button
257
+ type="button"
258
+ className={cx('memori-chat-inputs--mic-btn', {
259
+ 'memori-chat-inputs--mic-btn--listening': listening,
260
+ })}
261
+ title={
262
+ listening
263
+ ? t('write_and_speak.micButtonPopoverListening') ||
264
+ 'Listening'
265
+ : t('write_and_speak.micButtonPopover') ||
266
+ 'Start listening'
267
+ }
268
+ onClick={() => {
269
+ if (listening) {
270
+ stopListening();
271
+ } else {
272
+ stopAudio();
273
+ startListening();
274
+ }
275
+ }}
276
+ disabled={isDisabled}
277
+ aria-label={
278
+ listening
279
+ ? t('write_and_speak.micButtonPopoverListening') ||
280
+ 'Listening'
281
+ : t('write_and_speak.micButtonPopover') ||
282
+ 'Start listening'
283
+ }
284
+ >
285
+ <Microphone className="icon" />
286
+ </button>
287
+ )}
288
+ {showMicrophone && microphoneMode === 'HOLD_TO_TALK' && (
289
+ <MicrophoneButton
290
+ listening={listening}
291
+ startListening={startListening}
292
+ stopListening={() => {
293
+ stopListening();
294
+ if (listening && !!userMessage?.length) {
295
+ sendMessage(userMessage);
296
+ }
297
+ }}
298
+ stopAudio={stopAudio}
299
+ />
300
+ )}
301
+ <button
302
+ type="button"
303
+ className={cx('memori-chat-inputs--send-btn', {
304
+ 'memori-chat-inputs--send-btn--active': !!userMessage?.length,
305
+ 'memori-chat-inputs--send-btn--disabled':
306
+ !userMessage || userMessage.length === 0,
307
+ })}
308
+ onClick={() => {
309
+ onSendMessage(documentPreviewFiles);
310
+ }}
311
+ disabled={!userMessage || userMessage.length === 0 || isTyping}
312
+ title={t('send') || 'Send'}
313
+ aria-label={t('send') || 'Send'}
314
+ >
315
+ {isTyping ? (
316
+ <div className="memori-chat-inputs--send-btn--loading" />
317
+ ) : (
318
+ <Send className="icon" />
319
+ )}
320
+ </button>
321
+ </div>
322
+ </div>
323
+ </div>
324
+ </fieldset>
325
+ {/* Disclaimer */}
326
+ {/* <div className="memori-chat-inputs--disclaimer">
327
+ <div>
328
+ {t(
329
+ 'chat.disclaimer',
330
+ 'AIsuru può commettere errori. Assicurati di verificare le informazioni importanti.'
331
+ )}
332
+ </div>
333
+ </div> */}
334
+ </div>
278
335
  );
279
336
  };
280
337