@adatechnology/conversations-ui 0.1.0-rc.4 → 0.1.0-rc.6
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/chunk-LITPZCWW.js +1465 -0
- package/dist/index.d.ts +223 -29
- package/dist/index.js +316 -366
- package/dist/preview/index.d.ts +92 -3
- package/dist/preview/index.js +627 -103
- package/dist/types-CeixG2Z9.d.ts +324 -0
- package/package.json +2 -2
- package/src/Avatar.tsx +13 -2
- package/src/ConversationDocumentsPanel.tsx +342 -24
- package/src/ConversationListItem.tsx +18 -2
- package/src/DocumentsLibrary.tsx +322 -0
- package/src/FileIcon.test.ts +83 -0
- package/src/FileIcon.tsx +88 -11
- package/src/Lightbox.tsx +18 -3
- package/src/MediaRenderer.tsx +5 -2
- package/src/MessageBubble.tsx +18 -2
- package/src/MessageComposer.tsx +20 -3
- package/src/WhatsAppMessageEditor.tsx +28 -4
- package/src/hooks/useConversationActions.ts +56 -0
- package/src/hooks/useConversationDocuments.ts +11 -7
- package/src/hooks/useConversationList.ts +15 -9
- package/src/hooks/useConversationMessages.ts +2 -2
- package/src/index.ts +32 -11
- package/src/lib/cn.test.ts +29 -0
- package/src/lib/createMediaUrlResolver.ts +33 -0
- package/src/lib/paginated.test.ts +33 -0
- package/src/lib/paginated.ts +26 -0
- package/src/preview/MediaTypesPreview.tsx +87 -0
- package/src/preview/createMockConversationsApi.ts +175 -15
- package/src/preview/index.ts +6 -1
- package/src/preview/mockDocumentsSearch.test.ts +57 -0
- package/src/preview/preview.test.ts +5 -3
- package/src/preview/previewFileSamples.test.ts +151 -0
- package/src/preview/previewFileSamples.ts +74 -0
- package/src/preview/previewFixtures.ts +288 -1
- package/src/preview/previewMediaSource.test.ts +62 -0
- package/src/preview/previewMediaSource.ts +91 -0
- package/src/providers/types.ts +127 -9
- package/src/settings/WhatsAppCreateTemplateForm.tsx +3 -1
- package/src/useWaitingNotifications.ts +74 -29
- package/dist/chunk-4R6Y43DQ.js +0 -726
- package/dist/types-C0PtaO7S.d.ts +0 -207
package/dist/preview/index.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
|
+
ConversationDocumentsPanel,
|
|
2
3
|
ConversationWallpaper,
|
|
4
|
+
ConversationsProvider,
|
|
3
5
|
DateDivider,
|
|
6
|
+
DocumentsLibrary,
|
|
4
7
|
MessageBubble,
|
|
5
8
|
MessageComposer
|
|
6
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-LITPZCWW.js";
|
|
7
10
|
import "../chunk-OGRRHQQW.js";
|
|
8
11
|
|
|
9
12
|
// src/preview/previewStore.ts
|
|
@@ -135,108 +138,6 @@ function createMockEventSource() {
|
|
|
135
138
|
};
|
|
136
139
|
}
|
|
137
140
|
|
|
138
|
-
// src/preview/createMockConversationsApi.ts
|
|
139
|
-
var PREVIEW_IMAGE_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYGD4DwABBAEAX+XyEgAAAABJRU5ErkJggg==";
|
|
140
|
-
var DEFAULT_LATENCY_MS = 120;
|
|
141
|
-
function createMockConversationsApi(params) {
|
|
142
|
-
const latencyMs = params.latencyMs ?? DEFAULT_LATENCY_MS;
|
|
143
|
-
async function withLatency(produce) {
|
|
144
|
-
await new Promise((resolve) => setTimeout(resolve, latencyMs));
|
|
145
|
-
return produce();
|
|
146
|
-
}
|
|
147
|
-
return {
|
|
148
|
-
fetchConversations(fetchParams) {
|
|
149
|
-
return withLatency(() => {
|
|
150
|
-
const conversations = params.store.listConversations({
|
|
151
|
-
waitingHuman: fetchParams?.waitingHuman,
|
|
152
|
-
search: fetchParams?.search
|
|
153
|
-
});
|
|
154
|
-
const limit = fetchParams?.limit ?? conversations.length;
|
|
155
|
-
const page = fetchParams?.page ?? 1;
|
|
156
|
-
return conversations.slice((page - 1) * limit, page * limit);
|
|
157
|
-
});
|
|
158
|
-
},
|
|
159
|
-
fetchMessages(conversationId, fetchParams) {
|
|
160
|
-
return withLatency(() => {
|
|
161
|
-
const messages = params.store.listMessages(conversationId);
|
|
162
|
-
const limit = fetchParams?.limit;
|
|
163
|
-
return limit ? messages.slice(-limit) : messages;
|
|
164
|
-
});
|
|
165
|
-
},
|
|
166
|
-
sendMessage(conversationId, text) {
|
|
167
|
-
return withLatency(
|
|
168
|
-
() => params.store.appendMessage({ conversationId, content: text, direction: "outbound", sender: "agent" })
|
|
169
|
-
);
|
|
170
|
-
},
|
|
171
|
-
sendMedia(conversationId, data) {
|
|
172
|
-
return withLatency(
|
|
173
|
-
() => params.store.appendMessage({
|
|
174
|
-
conversationId,
|
|
175
|
-
content: data.caption ?? data.filename,
|
|
176
|
-
direction: "outbound",
|
|
177
|
-
sender: "agent"
|
|
178
|
-
})
|
|
179
|
-
);
|
|
180
|
-
},
|
|
181
|
-
sendTemplate(conversationId, data) {
|
|
182
|
-
return withLatency(() => {
|
|
183
|
-
params.store.appendMessage({
|
|
184
|
-
conversationId,
|
|
185
|
-
content: `[template] ${data.templateName}`,
|
|
186
|
-
direction: "outbound",
|
|
187
|
-
sender: "agent"
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
},
|
|
191
|
-
markRead(conversationId) {
|
|
192
|
-
return withLatency(() => params.store.markRead(conversationId));
|
|
193
|
-
},
|
|
194
|
-
getContext(conversationId) {
|
|
195
|
-
return withLatency(() => {
|
|
196
|
-
const conversation = params.store.listConversations().find((item) => item.id === conversationId);
|
|
197
|
-
return {
|
|
198
|
-
currentState: conversation?.currentState ?? "unknown",
|
|
199
|
-
mode: conversation?.mode ?? "bot",
|
|
200
|
-
preview: true
|
|
201
|
-
};
|
|
202
|
-
});
|
|
203
|
-
},
|
|
204
|
-
getDocuments() {
|
|
205
|
-
return withLatency(() => []);
|
|
206
|
-
},
|
|
207
|
-
getDocumentUrl() {
|
|
208
|
-
return withLatency(() => `data:image/png;base64,${PREVIEW_IMAGE_BASE64}`);
|
|
209
|
-
},
|
|
210
|
-
getMediaProxyUrl() {
|
|
211
|
-
return withLatency(() => ({ mimeType: "image/png", data: PREVIEW_IMAGE_BASE64 }));
|
|
212
|
-
}
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// src/preview/createMockSSEProvider.ts
|
|
217
|
-
function createMockSSEProvider(params) {
|
|
218
|
-
function connect(channel) {
|
|
219
|
-
const source = createMockEventSource();
|
|
220
|
-
const unsubscribe = params.store.subscribe(channel, (emission) => {
|
|
221
|
-
source.emit(emission.event, emission.payload);
|
|
222
|
-
});
|
|
223
|
-
const close = source.close.bind(source);
|
|
224
|
-
source.close = () => {
|
|
225
|
-
unsubscribe();
|
|
226
|
-
close();
|
|
227
|
-
};
|
|
228
|
-
return source;
|
|
229
|
-
}
|
|
230
|
-
return {
|
|
231
|
-
connectConversationStream(conversationId) {
|
|
232
|
-
return connect(conversationChannel(conversationId));
|
|
233
|
-
},
|
|
234
|
-
connectGlobalStream() {
|
|
235
|
-
return connect(GLOBAL_CHANNEL);
|
|
236
|
-
}
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
|
|
240
141
|
// src/preview/previewFixtures.ts
|
|
241
142
|
var BASE_DAY = "2026-07-26";
|
|
242
143
|
function at(time) {
|
|
@@ -297,6 +198,24 @@ var PREVIEW_CONVERSATIONS = [
|
|
|
297
198
|
waitingHuman: false,
|
|
298
199
|
unread: 1,
|
|
299
200
|
currentState: "list_import"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
// Cobre TODO tipo que o composer aceita (DEFAULT_ACCEPTED_FILE_TYPES: image/*, video/*,
|
|
204
|
+
// audio/*, .pdf, .doc, .docx, .xls, .xlsx, .zip) mais sticker. Existe para que cada ramo do
|
|
205
|
+
// MediaRenderer e cada ícone/cor do FileIcon apareçam em algum lugar — ramo sem fixture é ramo
|
|
206
|
+
// que ninguém olha até quebrar em produção.
|
|
207
|
+
id: "5511944443333",
|
|
208
|
+
whatsappNumber: "5511944443333",
|
|
209
|
+
clientName: "Rita Documentos",
|
|
210
|
+
lastContent: "segue a planilha do pedido",
|
|
211
|
+
lastDirection: "inbound",
|
|
212
|
+
lastAt: at("15:10:00"),
|
|
213
|
+
lastInboundAt: at("15:10:00"),
|
|
214
|
+
mode: "human",
|
|
215
|
+
assignedUserId: "agent-1",
|
|
216
|
+
waitingHuman: false,
|
|
217
|
+
unread: 3,
|
|
218
|
+
currentState: "human_handling"
|
|
300
219
|
}
|
|
301
220
|
];
|
|
302
221
|
var PREVIEW_MESSAGES = {
|
|
@@ -375,8 +294,555 @@ var PREVIEW_MESSAGES = {
|
|
|
375
294
|
sender: "customer",
|
|
376
295
|
timestamp: at("13:31:00")
|
|
377
296
|
}
|
|
297
|
+
],
|
|
298
|
+
// Um tipo por mensagem, na ordem em que o MediaRenderer os trata.
|
|
299
|
+
"5511944443333": [
|
|
300
|
+
{
|
|
301
|
+
id: "fixture-doc-image",
|
|
302
|
+
type: "image",
|
|
303
|
+
mediaId: "preview-image-1",
|
|
304
|
+
mimeType: "image/png",
|
|
305
|
+
caption: "foto da prateleira",
|
|
306
|
+
direction: "inbound",
|
|
307
|
+
sender: "customer",
|
|
308
|
+
timestamp: at("15:00:00")
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
id: "fixture-doc-video",
|
|
312
|
+
type: "video",
|
|
313
|
+
mediaId: "preview-video-1",
|
|
314
|
+
mimeType: "video/mp4",
|
|
315
|
+
direction: "inbound",
|
|
316
|
+
sender: "customer",
|
|
317
|
+
timestamp: at("15:01:00")
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
id: "fixture-doc-audio",
|
|
321
|
+
type: "audio",
|
|
322
|
+
mediaId: "preview-audio-2",
|
|
323
|
+
mimeType: "audio/ogg",
|
|
324
|
+
direction: "inbound",
|
|
325
|
+
sender: "customer",
|
|
326
|
+
timestamp: at("15:02:00")
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
id: "fixture-doc-sticker",
|
|
330
|
+
type: "sticker",
|
|
331
|
+
mediaId: "preview-sticker-1",
|
|
332
|
+
mimeType: "image/webp",
|
|
333
|
+
direction: "inbound",
|
|
334
|
+
sender: "customer",
|
|
335
|
+
timestamp: at("15:03:00")
|
|
336
|
+
},
|
|
337
|
+
// Os cinco ramos do FileIcon: pdf, doc, xls, zip e o genérico do fallback.
|
|
338
|
+
{
|
|
339
|
+
id: "fixture-doc-pdf",
|
|
340
|
+
type: "document",
|
|
341
|
+
uploadId: "preview/documentos/nota-fiscal.pdf",
|
|
342
|
+
filename: "nota-fiscal.pdf",
|
|
343
|
+
mimeType: "application/pdf",
|
|
344
|
+
sizeBytes: 184320,
|
|
345
|
+
direction: "inbound",
|
|
346
|
+
sender: "customer",
|
|
347
|
+
timestamp: at("15:04:00")
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
id: "fixture-doc-docx",
|
|
351
|
+
type: "document",
|
|
352
|
+
uploadId: "preview/documentos/contrato.docx",
|
|
353
|
+
filename: "contrato.docx",
|
|
354
|
+
mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
355
|
+
sizeBytes: 42112,
|
|
356
|
+
direction: "inbound",
|
|
357
|
+
sender: "customer",
|
|
358
|
+
timestamp: at("15:05:00")
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
id: "fixture-doc-doc",
|
|
362
|
+
type: "document",
|
|
363
|
+
uploadId: "preview/documentos/procuracao.doc",
|
|
364
|
+
filename: "procuracao.doc",
|
|
365
|
+
mimeType: "application/msword",
|
|
366
|
+
sizeBytes: 31744,
|
|
367
|
+
direction: "inbound",
|
|
368
|
+
sender: "customer",
|
|
369
|
+
timestamp: at("15:06:00")
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
id: "fixture-doc-xlsx",
|
|
373
|
+
type: "document",
|
|
374
|
+
uploadId: "preview/documentos/pedido.xlsx",
|
|
375
|
+
filename: "pedido.xlsx",
|
|
376
|
+
mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
377
|
+
sizeBytes: 15872,
|
|
378
|
+
direction: "inbound",
|
|
379
|
+
sender: "customer",
|
|
380
|
+
timestamp: at("15:07:00")
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
id: "fixture-doc-xls",
|
|
384
|
+
type: "document",
|
|
385
|
+
uploadId: "preview/documentos/tabela-antiga.xls",
|
|
386
|
+
filename: "tabela-antiga.xls",
|
|
387
|
+
mimeType: "application/vnd.ms-excel",
|
|
388
|
+
sizeBytes: 9216,
|
|
389
|
+
direction: "inbound",
|
|
390
|
+
sender: "customer",
|
|
391
|
+
timestamp: at("15:08:00")
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
id: "fixture-doc-zip",
|
|
395
|
+
type: "document",
|
|
396
|
+
uploadId: "preview/documentos/comprovantes.zip",
|
|
397
|
+
filename: "comprovantes.zip",
|
|
398
|
+
mimeType: "application/zip",
|
|
399
|
+
sizeBytes: 2355200,
|
|
400
|
+
direction: "inbound",
|
|
401
|
+
sender: "customer",
|
|
402
|
+
timestamp: at("15:09:00")
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
id: "fixture-doc-txt",
|
|
406
|
+
type: "document",
|
|
407
|
+
uploadId: "preview/documentos/lista-compras.txt",
|
|
408
|
+
filename: "lista-compras.txt",
|
|
409
|
+
mimeType: "text/plain",
|
|
410
|
+
sizeBytes: 1024,
|
|
411
|
+
direction: "inbound",
|
|
412
|
+
sender: "customer",
|
|
413
|
+
timestamp: at("15:10:00")
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
id: "fixture-doc-csv",
|
|
417
|
+
type: "document",
|
|
418
|
+
uploadId: "preview/documentos/planilha-do-pedido.csv",
|
|
419
|
+
filename: "planilha-do-pedido.csv",
|
|
420
|
+
mimeType: "text/csv",
|
|
421
|
+
sizeBytes: 2048,
|
|
422
|
+
direction: "inbound",
|
|
423
|
+
sender: "customer",
|
|
424
|
+
timestamp: at("15:11:00")
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
id: "fixture-doc-pptx",
|
|
428
|
+
type: "document",
|
|
429
|
+
uploadId: "preview/documentos/apresentacao.pptx",
|
|
430
|
+
filename: "apresentacao.pptx",
|
|
431
|
+
mimeType: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
432
|
+
sizeBytes: 512e3,
|
|
433
|
+
direction: "inbound",
|
|
434
|
+
sender: "customer",
|
|
435
|
+
timestamp: at("15:12:00")
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
id: "fixture-doc-ppt",
|
|
439
|
+
type: "document",
|
|
440
|
+
uploadId: "preview/documentos/antiga.ppt",
|
|
441
|
+
filename: "antiga.ppt",
|
|
442
|
+
mimeType: "application/vnd.ms-powerpoint",
|
|
443
|
+
sizeBytes: 348160,
|
|
444
|
+
direction: "inbound",
|
|
445
|
+
sender: "customer",
|
|
446
|
+
timestamp: at("15:13:00")
|
|
447
|
+
},
|
|
448
|
+
// Mídia enviada COMO arquivo: aí a Meta manda o nome, então é onde a extensão de música e de
|
|
449
|
+
// vídeo aparece na lista. Mandada como `image`/`audio`/`video` (acima e abaixo) ela chega sem
|
|
450
|
+
// nome nenhum, e o rótulo vira o id da mídia — como em produção.
|
|
451
|
+
{
|
|
452
|
+
id: "fixture-doc-mp3",
|
|
453
|
+
type: "document",
|
|
454
|
+
uploadId: "preview/documentos/musica-do-anuncio.mp3",
|
|
455
|
+
filename: "musica-do-anuncio.mp3",
|
|
456
|
+
mimeType: "audio/mpeg",
|
|
457
|
+
sizeBytes: 3145728,
|
|
458
|
+
direction: "inbound",
|
|
459
|
+
sender: "customer",
|
|
460
|
+
timestamp: at("15:14:00")
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
id: "fixture-doc-m4a",
|
|
464
|
+
type: "document",
|
|
465
|
+
uploadId: "preview/documentos/recado.m4a",
|
|
466
|
+
filename: "recado.m4a",
|
|
467
|
+
mimeType: "audio/mp4",
|
|
468
|
+
sizeBytes: 486400,
|
|
469
|
+
direction: "inbound",
|
|
470
|
+
sender: "customer",
|
|
471
|
+
timestamp: at("15:15:00")
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
id: "fixture-doc-mp4-file",
|
|
475
|
+
type: "document",
|
|
476
|
+
uploadId: "preview/documentos/video-do-produto.mp4",
|
|
477
|
+
filename: "video-do-produto.mp4",
|
|
478
|
+
mimeType: "video/mp4",
|
|
479
|
+
sizeBytes: 8388608,
|
|
480
|
+
direction: "inbound",
|
|
481
|
+
sender: "customer",
|
|
482
|
+
timestamp: at("15:16:00")
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
id: "fixture-doc-jpg",
|
|
486
|
+
type: "document",
|
|
487
|
+
uploadId: "preview/documentos/foto-do-recibo.jpg",
|
|
488
|
+
filename: "foto-do-recibo.jpg",
|
|
489
|
+
mimeType: "image/jpeg",
|
|
490
|
+
sizeBytes: 262144,
|
|
491
|
+
direction: "inbound",
|
|
492
|
+
sender: "customer",
|
|
493
|
+
timestamp: at("15:17:00")
|
|
494
|
+
},
|
|
495
|
+
// As espécies restantes que a Meta aceita, sem nome de arquivo — fecham a lista de tipos
|
|
496
|
+
// aceitos e exercitam o fallback de ícone pela família do mimeType.
|
|
497
|
+
{
|
|
498
|
+
id: "fixture-media-jpeg",
|
|
499
|
+
type: "image",
|
|
500
|
+
mediaId: "preview-image-jpeg",
|
|
501
|
+
mimeType: "image/jpeg",
|
|
502
|
+
sizeBytes: 138240,
|
|
503
|
+
direction: "inbound",
|
|
504
|
+
sender: "customer",
|
|
505
|
+
timestamp: at("15:18:00")
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
id: "fixture-media-3gp",
|
|
509
|
+
type: "video",
|
|
510
|
+
mediaId: "preview-video-3gp",
|
|
511
|
+
mimeType: "video/3gp",
|
|
512
|
+
sizeBytes: 921600,
|
|
513
|
+
direction: "inbound",
|
|
514
|
+
sender: "customer",
|
|
515
|
+
timestamp: at("15:19:00")
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
id: "fixture-media-aac",
|
|
519
|
+
type: "audio",
|
|
520
|
+
mediaId: "preview-audio-aac",
|
|
521
|
+
mimeType: "audio/aac",
|
|
522
|
+
sizeBytes: 76800,
|
|
523
|
+
direction: "inbound",
|
|
524
|
+
sender: "customer",
|
|
525
|
+
timestamp: at("15:20:00")
|
|
526
|
+
},
|
|
527
|
+
{
|
|
528
|
+
id: "fixture-media-amr",
|
|
529
|
+
type: "audio",
|
|
530
|
+
mediaId: "preview-audio-amr",
|
|
531
|
+
mimeType: "audio/amr",
|
|
532
|
+
sizeBytes: 24576,
|
|
533
|
+
direction: "inbound",
|
|
534
|
+
sender: "customer",
|
|
535
|
+
timestamp: at("15:21:00")
|
|
536
|
+
}
|
|
378
537
|
]
|
|
379
538
|
};
|
|
539
|
+
var LIBRARY_MEDIA_TYPES = /* @__PURE__ */ new Set(["document", "image", "video", "audio", "sticker"]);
|
|
540
|
+
var PREVIEW_DOCUMENTS = {
|
|
541
|
+
"5511944443333": (PREVIEW_MESSAGES["5511944443333"] ?? []).filter((message) => LIBRARY_MEDIA_TYPES.has(message.type)).map((message) => ({
|
|
542
|
+
// Mídia não tem `uploadId` na mensagem: o backend deriva a key do id da mídia na Meta, e o
|
|
543
|
+
// caminho abaixo imita esse formato para o download assinado receber algo do mesmo feitio.
|
|
544
|
+
id: message.uploadId ?? (message.mediaId ? `preview/inbound/${message.mediaId}` : message.id),
|
|
545
|
+
// Só documento chega nomeado. Para os outros o backend salva o id da mídia como rótulo —
|
|
546
|
+
// manter isso aqui é o que faz o ícone por família do mimeType ser exercitado de verdade.
|
|
547
|
+
filename: message.filename ?? message.mediaId ?? message.id,
|
|
548
|
+
mimeType: message.mimeType ?? "application/octet-stream",
|
|
549
|
+
sizeBytes: message.sizeBytes ?? 0,
|
|
550
|
+
source: message.sender,
|
|
551
|
+
linkedAt: message.timestamp
|
|
552
|
+
}))
|
|
553
|
+
};
|
|
554
|
+
|
|
555
|
+
// src/preview/previewFileSamples.ts
|
|
556
|
+
var PREVIEW_FILE_SAMPLES = {
|
|
557
|
+
"application/pdf": "data:application/pdf;base64,JVBERi0xLjQKMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4+ZW5kb2JqCjIgMCBvYmo8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PmVuZG9iagozIDAgb2JqPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgMjYwIDExMF0vQ29udGVudHMgNCAwIFIvUmVzb3VyY2VzPDwvRm9udDw8L0YxIDUgMCBSPj4+Pj4+ZW5kb2JqCjQgMCBvYmo8PC9MZW5ndGggNjI+PnN0cmVhbQpCVCAvRjEgMTMgVGYgMTggNTUgVGQgKERvY3VtZW50byBkZSBleGVtcGxvIGRvIHByZXZpZXcpIFRqIEVUCmVuZHN0cmVhbWVuZG9iago1IDAgb2JqPDwvVHlwZS9Gb250L1N1YnR5cGUvVHlwZTEvQmFzZUZvbnQvSGVsdmV0aWNhPj5lbmRvYmoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDA5IDAwMDAwIG4gCjAwMDAwMDAwNTIgMDAwMDAgbiAKMDAwMDAwMDEwMSAwMDAwMCBuIAowMDAwMDAwMjExIDAwMDAwIG4gCjAwMDAwMDAzMTcgMDAwMDAgbiAKdHJhaWxlcjw8L1NpemUgNi9Sb290IDEgMCBSPj4Kc3RhcnR4cmVmCjM3OAolJUVPRgo=",
|
|
558
|
+
"image/png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAACXBIWXMAAAABAAAAAQBPJcTWAAAATElEQVR4nO3OMRHAIAAAMbhDWo2hCYPdu/xIh0RB5rPP+JN1O/AlVISKUBEqQkWoCBWhIlSEilARKkJFqAgVoSJUhIpQESpCRagIlRcgDwI25HmPQAAAAABJRU5ErkJggg==",
|
|
559
|
+
"image/jpeg": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD//gAQTGF2YzYyLjExLjEwMAD/2wBDAAgEBAQEBAUFBQUFBQYGBgYGBgYGBgYGBgYHBwcICAgHBwcGBgcHCAgICAkJCQgICAgJCQoKCgwMCwsODg4RERT/xABMAAEBAAAAAAAAAAAAAAAAAAAABAEBAQAAAAAAAAAAAAAAAAAAAAYQAQAAAAAAAAAAAAAAAAAAAAARAQAAAAAAAAAAAAAAAAAAAAD/wAARCAAwADADASIAAhEAAxEA/9oADAMBAAIRAxEAPwCUBRpwAAAAAAAAAAAAAAAB/9k=",
|
|
560
|
+
"image/webp": "data:image/webp;base64,UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",
|
|
561
|
+
"video/mp4": "data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAANdbW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAAASwAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAoh0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAASwAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAEAAAABAAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAEsAAAIAAABAAAAAAIAbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAAoAAAAEABVxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAABq21pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAWtzdGJsAAAAv3N0c2QAAAAAAAAAAQAAAK9hdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAQABIAAAASAAAAAAAAAABFUxhdmM2Mi4xMS4xMDAgbGlieDI2NAAAAAAAAAAAAAAAGP//AAAANWF2Y0MBZAAK/+EAGGdkAAqs2UQmwEQAAAMABAAAAwBQPEiWWAEABmjr48siwP34+AAAAAAQcGFzcAAAAAEAAAABAAAAFGJ0cnQAAAAAAABO2gAAAAAAAAAYc3R0cwAAAAAAAAABAAAAAwAABAAAAAAUc3RzcwAAAAAAAAABAAAAAQAAAChjdHRzAAAAAAAAAAMAAAABAAAIAAAAAAEAAAwAAAAAAQAABAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAMAAAABAAAAIHN0c3oAAAAAAAAAAAAAAAMAAALbAAAADgAAAAwAAAAUc3RjbwAAAAAAAAABAAADjQAAAGF1ZHRhAAAAWW1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALGlsc3QAAAAkqXRvbwAAABxkYXRhAAAAAQAAAABMYXZmNjIuMy4xMDAAAAAIZnJlZQAAAv1tZGF0AAACrgYF//+q3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2NSByMzIyMiBiMzU2MDVhIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyNSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTIgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEwIHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAJWWIhAA///7mdfgUoKykhh+DdK6xVynnAWznTQ4fVSgMZ1FwY28AAAAKQZoibEN//qePiAAAAAgBnkF5Df8HfQ==",
|
|
562
|
+
"audio/mpeg": "data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADTGF2ZjYyLjMuMTAwAAAAAAAAAAAAAAD/40jAAAAAAAAAAAAASW5mbwAAAA8AAAAFAAAGwABVVVVVVVVVVVVVVVVVVVVVVVVVgICAgICAgICAgICAgICAgICAgICqqqqqqqqqqqqqqqqqqqqqqqqqqtXV1dXV1dXV1dXV1dXV1dXV1dXV//////////////////////////8AAAAATGF2YzYyLjExAAAAAAAAAAAAAAAAJALAAAAAAAAABsDR4nNFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/40jEAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/40jEAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/40jEAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/40jEAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/40jEAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=",
|
|
563
|
+
"audio/ogg": "data:audio/ogg;base64,T2dnUwACAAAAAAAAAABXDTmmAAAAAKMnDKEBE09wdXNIZWFkAQE4AYC7AAAAAABPZ2dTAAAAAAAAAAAAAFcNOaYBAAAAZlPuKwE9T3B1c1RhZ3MMAAAATGF2ZjYyLjMuMTAwAQAAAB0AAABlbmNvZGVyPUxhdmM2Mi4xMS4xMDAgbGlib3B1c09nZ1MABLgmAAAAAAAAVw05pgIAAAA3uL6lCw8REhISEhISEhISeAvkwTbsxY2MSUaZpCaweAfJcifhROpV8fDA1d3pUmB4B8l5yMlXwKISI/rvZ/NkwOB4B8l5yMlXwKISI/rvZ/NkwOB4B8l5yMlXwKISI/rvZ/NkwOB4B8l5yMlXwKISI/rvZ/NkwOB4B8l5yMlXwKISI/rvZ/NkwOB4B8l5yMlXwKISI/rvZ/NkwOB4B8l5yMlXwKISI/rvZ/NkwOB4B8l5yMlXwKISI/rvZ/NkwOB4B8l5yMlXwKISI/rvZ/NkwOA=",
|
|
564
|
+
"audio/mp4": "data:audio/mp4;base64,AAAAHGZ0eXBNNEEgAAACAE00QSBpc29taXNvMgAAAAhmcmVlAAAAQW1kYXTeAgBMYXZjNjIuMTEuMTAwAAIwQA4BGCAHARggBwEYIAcBGCAHARggBwEYIAcBGCAHARggBwEYIAcAAAMibW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAAAMgAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAk10cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAAMgAAAAAAAAAAAAAAAEBAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAADIAAAEAAABAAAAAAHFbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAACsRAAAJnRVxAAAAAAALWhkbHIAAAAAAAAAAHNvdW4AAAAAAAAAAAAAAABTb3VuZEhhbmRsZXIAAAABcG1pbmYAAAAQc21oZAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAABNHN0YmwAAABqc3RzZAAAAAAAAAABAAAAWm1wNGEAAAAAAAAAAQAAAAAAAAAAAAEAEAAAAACsRAAAAAAANmVzZHMAAAAAA4CAgCUAAQAEgICAF0AVAAAAAAB9AAAAB/oFgICABRIIVuUABoCAgAECAAAAIHN0dHMAAAAAAAAAAgAAAAkAAAQAAAAAAQAAAnQAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAoAAAABAAAAPHN0c3oAAAAAAAAAAAAAAAoAAAAVAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAFHN0Y28AAAAAAAAAAQAAACwAAAAac2dwZAEAAAByb2xsAAAAAgAAAAH//wAAABxzYmdwAAAAAHJvbGwAAAABAAAACgAAAAEAAABhdWR0YQAAAFltZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAACxpbHN0AAAAJKl0b28AAAAcZGF0YQAAAAEAAAAATGF2ZjYyLjMuMTAw",
|
|
565
|
+
"audio/aac": "data:audio/aac;base64,//FQQAOf/N4CAExhdmM2Mi4xMS4xMDAAAjBADv/xUEABf/wBGCAH//FQQAF//AEYIAf/8VBAAX/8ARggB//xUEABf/wBGCAH//FQQAF//AEYIAf/8VBAAX/8ARggB//xUEABf/wBGCAH//FQQAF//AEYIAf/8VBAAX/8ARggBw==",
|
|
566
|
+
"text/plain": "data:text/plain;base64,TGlzdGEgZGUgY29tcHJhcwotIGFycm96IDJrZwotIG9sZW8gMXVuCg==",
|
|
567
|
+
"text/csv": "data:text/csv;base64,cHJvZHV0byxxdWFudGlkYWRlLHByZWNvCmFycm96LDIsMjQuOTAKb2xlbywxLDcuNTAK",
|
|
568
|
+
"application/zip": "data:application/zip;base64,UEsDBBQAAAAIANFO/FwtmGOxGwAAABkAAAARAAAAY29tcHJvdmFudGUtMS50eHRLzs8tKMovS8wrSVVISVUoSExPzE3NK8nnAgBQSwMEFAAAAAgA0U78XCftV8YWAAAAFAAAABEAAABjb21wcm92YW50ZS0yLnR4dCtOTS/NS8lXSM7PLSjKL0vMK0nlAgBQSwECFAMUAAAACADRTvxcLZhjsRsAAAAZAAAAEQAAAAAAAAAAAAAAgAEAAAAAY29tcHJvdmFudGUtMS50eHRQSwECFAMUAAAACADRTvxcJ+1XxhYAAAAUAAAAEQAAAAAAAAAAAAAAgAFKAAAAY29tcHJvdmFudGUtMi50eHRQSwUGAAAAAAIAAgB+AAAAjwAAAAAA",
|
|
569
|
+
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": "data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,UEsDBBQAAAAIANFO/Fx5bjPX6AAAAK0BAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbH1QyU7DMBD9FWuuKHHggBCK0wPLETiUDxjZk8SqN3nc0v49Tlt6QIXjzFv1+tXeO7GjzDYGBbdtB4KCjsaGScHn+rV5AMEFg0EXAyk4EMNq6NeHRCyqNrCCuZT0KCXrmTxyGxOFiowxeyz1zJNMqDc4kbzrunupYygUSlMWDxj6Zxpx64p42df3qUcmxyCeTsQlSwGm5KzGUnG5C+ZXSnNOaKvyyOHZJr6pBJBXExbk74Cz7r0Ok60h8YG5vKGvLPkVs5Em6q2vyvZ/mys94zhaTRf94pZy1MRcF/euvSAebfjpL49zD99QSwMEFAAAAAgA0U78XJv9N+qtAAAAKQEAAAsAAABfcmVscy8ucmVsc43POw7CMAwG4KtE3mlaBoRQ0y4IqSsqB7ASN61oHkrCo7cnAwNFDIy2f3+W6/ZpZnanECdnBVRFCYysdGqyWsClP232wGJCq3B2lgQsFKFt6jPNmPJKHCcfWTZsFDCm5A+cRzmSwVg4TzZPBhcMplwGzT3KK2ri27Lc8fBpwNpknRIQOlUB6xdP/9huGCZJRydvhmz6ceIrkWUMmpKAhwuKq3e7yCzwpuarF5sXUEsDBBQAAAAIANFO/FyraIuoqgAAAOcAAAARAAAAd29yZC9kb2N1bWVudC54bWxFjksOwjAMBa8SZU9TWCBUNWWBxAngAKExbaTGjpzQz+1JyoLNPFt+Grm9rn4SM3B0hFoeq1oKwJ6sw0HL5+N+uEgRk0FrJkLQcoMor127NJb6jwdMIgswNouWY0qhUSr2I3gTKwqA+fYm9ibllQe1ENvA1EOM2e8ndarrs/LGoSzKF9mtZCjggtTdCBObRMKCgBV8mPJIIjDMDpZWlU4h7ww7fx71/7H7AlBLAQIUAxQAAAAIANFO/Fx5bjPX6AAAAK0BAAATAAAAAAAAAAAAAACAAQAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAhQDFAAAAAgA0U78XJv9N+qtAAAAKQEAAAsAAAAAAAAAAAAAAIABGQEAAF9yZWxzLy5yZWxzUEsBAhQDFAAAAAgA0U78XKtoi6iqAAAA5wAAABEAAAAAAAAAAAAAAIAB7wEAAHdvcmQvZG9jdW1lbnQueG1sUEsFBgAAAAADAAMAuQAAAMgCAAAAAA==",
|
|
570
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,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"
|
|
571
|
+
};
|
|
572
|
+
var FAMILY_FALLBACK = {
|
|
573
|
+
image: "image/png",
|
|
574
|
+
video: "video/mp4",
|
|
575
|
+
audio: "audio/mpeg",
|
|
576
|
+
text: "text/plain"
|
|
577
|
+
};
|
|
578
|
+
function resolvePreviewFileSample(mimeType, filename) {
|
|
579
|
+
const normalized = (mimeType ?? "").split(";")[0].trim().toLowerCase();
|
|
580
|
+
const exact = PREVIEW_FILE_SAMPLES[normalized];
|
|
581
|
+
if (exact) return exact;
|
|
582
|
+
const family = FAMILY_FALLBACK[normalized.split("/")[0] ?? ""];
|
|
583
|
+
const byFamily = family ? PREVIEW_FILE_SAMPLES[family] : void 0;
|
|
584
|
+
if (byFamily) return byFamily;
|
|
585
|
+
const note = `Preview do SDK: nao existe amostra binaria valida para ${normalized || "tipo desconhecido"}${filename ? ` (${filename})` : ""}. Na tela real este arquivo vem do storage.`;
|
|
586
|
+
return `data:text/plain;charset=utf-8,${encodeURIComponent(note)}`;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
// src/preview/previewMediaSource.ts
|
|
590
|
+
var blobUrlCache = /* @__PURE__ */ new Map();
|
|
591
|
+
function toBlob(dataUrl) {
|
|
592
|
+
const [head, payload] = dataUrl.split(",");
|
|
593
|
+
const mimeType = head.replace(/^data:/, "").replace(/;base64$/, "").replace(/;charset=.*$/, "");
|
|
594
|
+
if (!head.endsWith(";base64")) {
|
|
595
|
+
return new Blob([decodeURIComponent(payload)], { type: mimeType || "text/plain" });
|
|
596
|
+
}
|
|
597
|
+
const binary = atob(payload);
|
|
598
|
+
const bytes = new Uint8Array(binary.length);
|
|
599
|
+
for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);
|
|
600
|
+
return new Blob([bytes], { type: mimeType });
|
|
601
|
+
}
|
|
602
|
+
function previewFileUrl(mimeType, filename) {
|
|
603
|
+
const dataUrl = resolvePreviewFileSample(mimeType, filename);
|
|
604
|
+
if (typeof URL === "undefined" || typeof URL.createObjectURL !== "function") return dataUrl;
|
|
605
|
+
const cached = blobUrlCache.get(dataUrl);
|
|
606
|
+
if (cached) return cached;
|
|
607
|
+
const blobUrl = URL.createObjectURL(toBlob(dataUrl));
|
|
608
|
+
blobUrlCache.set(dataUrl, blobUrl);
|
|
609
|
+
return blobUrl;
|
|
610
|
+
}
|
|
611
|
+
function previewFileBase64(mimeType, filename) {
|
|
612
|
+
const dataUrl = resolvePreviewFileSample(mimeType, filename);
|
|
613
|
+
const [head, payload] = dataUrl.split(",");
|
|
614
|
+
const declared = head.replace(/^data:/, "").replace(/;base64$/, "").replace(/;charset=.*$/, "");
|
|
615
|
+
if (head.endsWith(";base64")) return { mimeType: declared, data: payload };
|
|
616
|
+
return { mimeType: declared, data: btoa(decodeURIComponent(payload)) };
|
|
617
|
+
}
|
|
618
|
+
function createPreviewMediaResolver() {
|
|
619
|
+
const byId = /* @__PURE__ */ new Map();
|
|
620
|
+
for (const documents of Object.values(PREVIEW_DOCUMENTS)) {
|
|
621
|
+
for (const document of documents) {
|
|
622
|
+
byId.set(document.id, { mimeType: document.mimeType, filename: document.filename });
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
return async (message) => {
|
|
626
|
+
const reference = message.uploadId ?? (message.mediaId ? `preview/inbound/${message.mediaId}` : void 0);
|
|
627
|
+
if (!reference) return null;
|
|
628
|
+
const known = byId.get(reference);
|
|
629
|
+
return previewFileUrl(known?.mimeType ?? message.mimeType, known?.filename ?? message.filename);
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
// src/preview/createMockConversationsApi.ts
|
|
634
|
+
var DEFAULT_LATENCY_MS = 120;
|
|
635
|
+
var PREVIEW_AGENT_ID = "preview-agent";
|
|
636
|
+
var PREVIEW_TEMPLATES = [
|
|
637
|
+
{ name: "retomada_atendimento", language: "pt_BR", status: "APPROVED", category: "UTILITY" },
|
|
638
|
+
{ name: "lembrete_documentos", language: "pt_BR", status: "APPROVED", category: "UTILITY" },
|
|
639
|
+
{ name: "promocao_taxa", language: "pt_BR", status: "PENDING", category: "MARKETING" }
|
|
640
|
+
];
|
|
641
|
+
function createMockConversationsApi(params) {
|
|
642
|
+
const latencyMs = params.latencyMs ?? DEFAULT_LATENCY_MS;
|
|
643
|
+
async function withLatency(produce) {
|
|
644
|
+
await new Promise((resolve) => setTimeout(resolve, latencyMs));
|
|
645
|
+
return produce();
|
|
646
|
+
}
|
|
647
|
+
return {
|
|
648
|
+
// Devolve a forma paginada, não o array puro: é a que o contrato passou a oferecer e a que
|
|
649
|
+
// permite o preview desenhar controles de página. O total é contado ANTES do corte — depois
|
|
650
|
+
// dele seria sempre o tamanho da página, e a paginação nunca sairia da primeira.
|
|
651
|
+
fetchConversations(fetchParams) {
|
|
652
|
+
return withLatency(() => {
|
|
653
|
+
const conversations = params.store.listConversations({
|
|
654
|
+
waitingHuman: fetchParams?.waitingHuman,
|
|
655
|
+
search: fetchParams?.search
|
|
656
|
+
});
|
|
657
|
+
const limit = fetchParams?.limit ?? conversations.length;
|
|
658
|
+
const page = fetchParams?.page ?? 1;
|
|
659
|
+
return {
|
|
660
|
+
conversations: conversations.slice((page - 1) * limit, page * limit),
|
|
661
|
+
total: conversations.length
|
|
662
|
+
};
|
|
663
|
+
});
|
|
664
|
+
},
|
|
665
|
+
fetchMessages(conversationId, fetchParams) {
|
|
666
|
+
return withLatency(() => {
|
|
667
|
+
const messages = params.store.listMessages(conversationId);
|
|
668
|
+
const limit = fetchParams?.limit;
|
|
669
|
+
return limit ? messages.slice(-limit) : messages;
|
|
670
|
+
});
|
|
671
|
+
},
|
|
672
|
+
sendMessage(conversationId, text) {
|
|
673
|
+
return withLatency(
|
|
674
|
+
() => params.store.appendMessage({ conversationId, content: text, direction: "outbound", sender: "agent" })
|
|
675
|
+
);
|
|
676
|
+
},
|
|
677
|
+
sendMedia(conversationId, data) {
|
|
678
|
+
return withLatency(
|
|
679
|
+
() => params.store.appendMessage({
|
|
680
|
+
conversationId,
|
|
681
|
+
content: data.caption ?? data.filename,
|
|
682
|
+
direction: "outbound",
|
|
683
|
+
sender: "agent"
|
|
684
|
+
})
|
|
685
|
+
);
|
|
686
|
+
},
|
|
687
|
+
sendTemplate(conversationId, data) {
|
|
688
|
+
return withLatency(() => {
|
|
689
|
+
params.store.appendMessage({
|
|
690
|
+
conversationId,
|
|
691
|
+
// Sem nome, o host está pedindo o template padrão do backend — o mock representa isso
|
|
692
|
+
// pelo que o atendente veria, não por um nome inventado.
|
|
693
|
+
content: `[template] ${data.templateName ?? PREVIEW_TEMPLATES[0]?.name ?? "padrao"}`,
|
|
694
|
+
direction: "outbound",
|
|
695
|
+
sender: "agent"
|
|
696
|
+
});
|
|
697
|
+
});
|
|
698
|
+
},
|
|
699
|
+
markRead(conversationId) {
|
|
700
|
+
return withLatency(() => params.store.markRead(conversationId));
|
|
701
|
+
},
|
|
702
|
+
getContext(conversationId) {
|
|
703
|
+
return withLatency(() => {
|
|
704
|
+
const conversation = params.store.listConversations().find((item) => item.id === conversationId);
|
|
705
|
+
return {
|
|
706
|
+
currentState: conversation?.currentState ?? "unknown",
|
|
707
|
+
mode: conversation?.mode ?? "bot",
|
|
708
|
+
preview: true
|
|
709
|
+
};
|
|
710
|
+
});
|
|
711
|
+
},
|
|
712
|
+
/**
|
|
713
|
+
* Espelha o backend em busca, filtro de origem, ordenação E paginação. Mock que ignora params
|
|
714
|
+
* faz o painel parecer quebrado aqui e, pior, esconde o caso em que o backend também os ignora
|
|
715
|
+
* — foi exatamente assim que o filtro de origem passou a existir só no contrato.
|
|
716
|
+
*/
|
|
717
|
+
getDocuments(conversationId, documentParams) {
|
|
718
|
+
return withLatency(() => {
|
|
719
|
+
let documents = [...PREVIEW_DOCUMENTS[conversationId] ?? []];
|
|
720
|
+
const search = documentParams?.search?.trim().toLowerCase();
|
|
721
|
+
if (search) {
|
|
722
|
+
documents = documents.filter((document) => document.filename.toLowerCase().includes(search));
|
|
723
|
+
}
|
|
724
|
+
const source = documentParams?.source;
|
|
725
|
+
if (source === "team") {
|
|
726
|
+
documents = documents.filter((document) => document.source === "agent" || document.source === "bot");
|
|
727
|
+
} else if (source) {
|
|
728
|
+
documents = documents.filter((document) => document.source === source);
|
|
729
|
+
}
|
|
730
|
+
documents.sort(
|
|
731
|
+
(left, right) => documentParams?.sortDirection === "asc" ? left.linkedAt.localeCompare(right.linkedAt) : right.linkedAt.localeCompare(left.linkedAt)
|
|
732
|
+
);
|
|
733
|
+
const total = documents.length;
|
|
734
|
+
const limit = documentParams?.limit ?? total;
|
|
735
|
+
const page = documentParams?.page ?? 1;
|
|
736
|
+
return { documents: documents.slice((page - 1) * limit, page * limit), total };
|
|
737
|
+
});
|
|
738
|
+
},
|
|
739
|
+
/**
|
|
740
|
+
* Zip de mentira: um texto listando o que entraria. Basta para exercitar seleção, botão e o
|
|
741
|
+
* caminho de download no preview, sem arrastar uma lib de compactação para o pacote.
|
|
742
|
+
*/
|
|
743
|
+
downloadDocumentsArchive(conversationId, uploadIds) {
|
|
744
|
+
return withLatency(() => {
|
|
745
|
+
const known = PREVIEW_DOCUMENTS[conversationId] ?? [];
|
|
746
|
+
const names = uploadIds.map((id) => known.find((document) => document.id === id)?.filename ?? id);
|
|
747
|
+
return new Blob([`preview: ${names.length} arquivo(s)
|
|
748
|
+
${names.join("\n")}`], { type: "application/zip" });
|
|
749
|
+
});
|
|
750
|
+
},
|
|
751
|
+
/** Junta as bibliotecas de todas as conversas do fixture, com a origem de cada arquivo. */
|
|
752
|
+
getAllDocuments(documentParams) {
|
|
753
|
+
return withLatency(() => {
|
|
754
|
+
let all = Object.entries(PREVIEW_DOCUMENTS).flatMap(
|
|
755
|
+
([conversationId, docs]) => docs.map((document) => ({ ...document, conversationId }))
|
|
756
|
+
);
|
|
757
|
+
const search = documentParams?.search?.trim().toLowerCase();
|
|
758
|
+
if (search) {
|
|
759
|
+
const digits = search.replace(/\D/g, "");
|
|
760
|
+
all = all.filter(
|
|
761
|
+
(document) => document.filename.toLowerCase().includes(search) || digits !== "" && document.conversationId.includes(digits)
|
|
762
|
+
);
|
|
763
|
+
}
|
|
764
|
+
const source = documentParams?.source;
|
|
765
|
+
if (source === "team") {
|
|
766
|
+
all = all.filter((document) => document.source === "agent" || document.source === "bot");
|
|
767
|
+
} else if (source) {
|
|
768
|
+
all = all.filter((document) => document.source === source);
|
|
769
|
+
}
|
|
770
|
+
all.sort(
|
|
771
|
+
(left, right) => documentParams?.sortDirection === "asc" ? left.linkedAt.localeCompare(right.linkedAt) : right.linkedAt.localeCompare(left.linkedAt)
|
|
772
|
+
);
|
|
773
|
+
const total = all.length;
|
|
774
|
+
const limit = documentParams?.limit ?? total;
|
|
775
|
+
const page = documentParams?.page ?? 1;
|
|
776
|
+
return { documents: all.slice((page - 1) * limit, page * limit), total };
|
|
777
|
+
});
|
|
778
|
+
},
|
|
779
|
+
// Devolve os bytes DO TIPO do documento, não uma imagem para tudo: antes, abrir um PDF entregava
|
|
780
|
+
// um PNG rotulado `application/pdf` e o leitor recusava o arquivo. O `uploadId` é a única pista
|
|
781
|
+
// que o contrato dá, então o tipo vem da própria biblioteca.
|
|
782
|
+
getDocumentUrl(uploadId) {
|
|
783
|
+
return withLatency(() => {
|
|
784
|
+
const found = Object.values(PREVIEW_DOCUMENTS).flat().find((document) => document.id === uploadId);
|
|
785
|
+
return previewFileUrl(found?.mimeType, found?.filename);
|
|
786
|
+
});
|
|
787
|
+
},
|
|
788
|
+
// Caminho da mídia ainda não ingerida: o backend busca na Meta e devolve base64. Resolve pelo
|
|
789
|
+
// id para a bolha receber os bytes DO TIPO dela — devolvendo um PNG para todo id, vídeo e áudio
|
|
790
|
+
// apareciam quebrados na thread mesmo havendo amostra válida do formato.
|
|
791
|
+
getMediaProxyUrl(mediaId) {
|
|
792
|
+
return withLatency(() => {
|
|
793
|
+
const found = Object.values(PREVIEW_DOCUMENTS).flat().find((document) => document.id === `preview/inbound/${mediaId}`);
|
|
794
|
+
return previewFileBase64(found?.mimeType, found?.filename);
|
|
795
|
+
});
|
|
796
|
+
},
|
|
797
|
+
takeover(conversationId) {
|
|
798
|
+
return withLatency(
|
|
799
|
+
() => params.store.setMode({ conversationId, mode: "human", assignedUserId: PREVIEW_AGENT_ID })
|
|
800
|
+
);
|
|
801
|
+
},
|
|
802
|
+
release(conversationId) {
|
|
803
|
+
return withLatency(() => params.store.setMode({ conversationId, mode: "bot" }));
|
|
804
|
+
},
|
|
805
|
+
// Encerrar devolve ao bot como o release, e é de propósito: a diferença entre os dois é a
|
|
806
|
+
// despedida, que o host manda antes de chamar aqui. O mock não a inventa.
|
|
807
|
+
finalize(conversationId) {
|
|
808
|
+
return withLatency(() => params.store.setMode({ conversationId, mode: "bot" }));
|
|
809
|
+
},
|
|
810
|
+
markAllRead() {
|
|
811
|
+
return withLatency(() => {
|
|
812
|
+
for (const conversation of params.store.listConversations()) {
|
|
813
|
+
params.store.markRead(conversation.id);
|
|
814
|
+
}
|
|
815
|
+
});
|
|
816
|
+
},
|
|
817
|
+
listTemplates() {
|
|
818
|
+
return withLatency(() => [...PREVIEW_TEMPLATES]);
|
|
819
|
+
}
|
|
820
|
+
};
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
// src/preview/createMockSSEProvider.ts
|
|
824
|
+
function createMockSSEProvider(params) {
|
|
825
|
+
function connect(channel) {
|
|
826
|
+
const source = createMockEventSource();
|
|
827
|
+
const unsubscribe = params.store.subscribe(channel, (emission) => {
|
|
828
|
+
source.emit(emission.event, emission.payload);
|
|
829
|
+
});
|
|
830
|
+
const close = source.close.bind(source);
|
|
831
|
+
source.close = () => {
|
|
832
|
+
unsubscribe();
|
|
833
|
+
close();
|
|
834
|
+
};
|
|
835
|
+
return source;
|
|
836
|
+
}
|
|
837
|
+
return {
|
|
838
|
+
connectConversationStream(conversationId) {
|
|
839
|
+
return connect(conversationChannel(conversationId));
|
|
840
|
+
},
|
|
841
|
+
connectGlobalStream() {
|
|
842
|
+
return connect(GLOBAL_CHANNEL);
|
|
843
|
+
}
|
|
844
|
+
};
|
|
845
|
+
}
|
|
380
846
|
|
|
381
847
|
// src/preview/ConversationPreview.tsx
|
|
382
848
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -557,11 +1023,65 @@ function startPreviewScript(params) {
|
|
|
557
1023
|
}, intervalMs);
|
|
558
1024
|
return () => clearInterval(timer);
|
|
559
1025
|
}
|
|
1026
|
+
|
|
1027
|
+
// src/preview/MediaTypesPreview.tsx
|
|
1028
|
+
import { useMemo as useMemo2 } from "react";
|
|
1029
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
1030
|
+
var MEDIA_TYPES_CONVERSATION_ID = "5511944443333";
|
|
1031
|
+
function MediaTypesPreview({
|
|
1032
|
+
conversationId = MEDIA_TYPES_CONVERSATION_ID,
|
|
1033
|
+
className
|
|
1034
|
+
}) {
|
|
1035
|
+
const store = useMemo2(
|
|
1036
|
+
() => createPreviewStore({ conversations: PREVIEW_CONVERSATIONS, messages: PREVIEW_MESSAGES }),
|
|
1037
|
+
[]
|
|
1038
|
+
);
|
|
1039
|
+
const api = useMemo2(() => createMockConversationsApi({ store }), [store]);
|
|
1040
|
+
const sse = useMemo2(() => createMockSSEProvider({ store }), [store]);
|
|
1041
|
+
const messages = PREVIEW_MESSAGES[conversationId] ?? [];
|
|
1042
|
+
const documents = PREVIEW_DOCUMENTS[conversationId] ?? [];
|
|
1043
|
+
const mimeTypes = [...new Set(documents.map((document) => document.mimeType))];
|
|
1044
|
+
return /* @__PURE__ */ jsx2(ConversationsProvider, { api, sse, children: /* @__PURE__ */ jsxs2("div", { className, children: [
|
|
1045
|
+
/* @__PURE__ */ jsxs2("header", { className: "border-b px-4 py-3 dark:border-gray-700", children: [
|
|
1046
|
+
/* @__PURE__ */ jsx2("h1", { className: "text-lg font-semibold", children: "Teste manual de m\xEDdia" }),
|
|
1047
|
+
/* @__PURE__ */ jsxs2("p", { className: "text-sm text-gray-500", children: [
|
|
1048
|
+
documents.length,
|
|
1049
|
+
" arquivos, ",
|
|
1050
|
+
mimeTypes.length,
|
|
1051
|
+
" tipos. Clique no olho para abrir em aba nova e no bot\xE3o da bolha para carregar a m\xEDdia na thread \u2014 \xE9 o que teste automatizado n\xE3o v\xEA."
|
|
1052
|
+
] })
|
|
1053
|
+
] }),
|
|
1054
|
+
/* @__PURE__ */ jsxs2("div", { className: "grid gap-4 p-4 lg:grid-cols-2", children: [
|
|
1055
|
+
/* @__PURE__ */ jsxs2("section", { className: "space-y-3", children: [
|
|
1056
|
+
/* @__PURE__ */ jsx2("h2", { className: "text-sm font-semibold uppercase tracking-wide text-gray-500", children: "Biblioteca da empresa" }),
|
|
1057
|
+
/* @__PURE__ */ jsx2(DocumentsLibrary, { perPage: documents.length || 20 })
|
|
1058
|
+
] }),
|
|
1059
|
+
/* @__PURE__ */ jsxs2("section", { className: "space-y-3", children: [
|
|
1060
|
+
/* @__PURE__ */ jsx2("h2", { className: "text-sm font-semibold uppercase tracking-wide text-gray-500", children: "Painel da conversa" }),
|
|
1061
|
+
/* @__PURE__ */ jsx2(ConversationDocumentsPanel, { conversationId, open: true, perPage: documents.length || 20 }),
|
|
1062
|
+
/* @__PURE__ */ jsx2("h2", { className: "text-sm font-semibold uppercase tracking-wide text-gray-500", children: "Bolhas na thread" }),
|
|
1063
|
+
/* @__PURE__ */ jsx2(ConversationWallpaper, { className: "max-h-[70vh] overflow-y-auto rounded-lg px-3 py-2", children: messages.map((message, index) => /* @__PURE__ */ jsx2(
|
|
1064
|
+
MessageBubble,
|
|
1065
|
+
{
|
|
1066
|
+
message,
|
|
1067
|
+
isMine: message.direction === "outbound",
|
|
1068
|
+
isFirstInGroup: index === 0 || messages[index - 1]?.sender !== message.sender
|
|
1069
|
+
},
|
|
1070
|
+
message.id
|
|
1071
|
+
)) })
|
|
1072
|
+
] })
|
|
1073
|
+
] })
|
|
1074
|
+
] }) });
|
|
1075
|
+
}
|
|
560
1076
|
export {
|
|
561
1077
|
ConversationPreview,
|
|
562
1078
|
DEFAULT_PREVIEW_SCRIPT,
|
|
563
1079
|
GLOBAL_CHANNEL,
|
|
1080
|
+
MEDIA_TYPES_CONVERSATION_ID,
|
|
1081
|
+
MediaTypesPreview,
|
|
564
1082
|
PREVIEW_CONVERSATIONS,
|
|
1083
|
+
PREVIEW_DOCUMENTS,
|
|
1084
|
+
PREVIEW_FILE_SAMPLES,
|
|
565
1085
|
PREVIEW_MESSAGES,
|
|
566
1086
|
PreviewInProductionError,
|
|
567
1087
|
PreviewWebhookRejectedError,
|
|
@@ -570,7 +1090,11 @@ export {
|
|
|
570
1090
|
createMockConversationsApi,
|
|
571
1091
|
createMockEventSource,
|
|
572
1092
|
createMockSSEProvider,
|
|
1093
|
+
createPreviewMediaResolver,
|
|
573
1094
|
createPreviewStore,
|
|
574
1095
|
createPreviewWebhookClient,
|
|
1096
|
+
previewFileBase64,
|
|
1097
|
+
previewFileUrl,
|
|
1098
|
+
resolvePreviewFileSample,
|
|
575
1099
|
startPreviewScript
|
|
576
1100
|
};
|