@adatechnology/conversations-ui 0.2.1 → 0.3.1
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/{ConversationSimulatorPanel-ikgmlciE.d.ts → ConversationSimulatorPanel-DmV8uaFE.d.ts} +1 -1
- package/dist/{chunk-DKPXKQGC.js → chunk-HMCOTZAX.js} +18 -1
- package/dist/{chunk-NHQDQJL2.js → chunk-L4OE4ORQ.js} +18 -19
- package/dist/{chunk-WCBDXZ3X.js → chunk-PJNR6UMN.js} +73 -8
- package/dist/flows/index.js +32 -28
- package/dist/index.d.ts +44 -5
- package/dist/index.js +563 -289
- package/dist/preview/index.d.ts +2 -2
- package/dist/preview/index.js +2 -2
- package/package.json +2 -2
- package/src/InteractiveMessage.tsx +13 -13
- package/src/MessageText.tsx +1 -3
- package/src/blockFormattingNesting.test.tsx +47 -0
- package/src/flows/FlowWhatsAppPreview.tsx +40 -42
- package/src/index.ts +3 -0
- package/src/lib/WhatsAppMessagePreview.tsx +32 -0
- package/src/lib/composer-formatting.ts +8 -0
- package/src/lib/whatsapp-formatting.test.tsx +65 -2
- package/src/lib/whatsapp-formatting.tsx +110 -13
- package/src/quickReplies/QuickRepliesWorkspace.tsx +249 -164
- package/src/quickReplies/QuickReplyFormattingToolbar.tsx +62 -0
- package/src/quickReplies/QuickReplyWhatsAppPreview.tsx +57 -0
- package/src/quickReplies/labels.ts +27 -1
- package/src/quickReplies/quickReplyFormatting.test.tsx +336 -0
- package/src/quickReplies/quickReplyFormatting.ts +232 -0
- package/src/quickReplies/useQuickRepliesWorkspace.ts +1 -1
package/dist/{ConversationSimulatorPanel-ikgmlciE.d.ts → ConversationSimulatorPanel-DmV8uaFE.d.ts}
RENAMED
|
@@ -903,4 +903,4 @@ type ConversationSimulatorPanelProps = Omit<ConversationPreviewProps, 'placehold
|
|
|
903
903
|
};
|
|
904
904
|
declare function ConversationSimulatorPanel({ onClose, channel, displayHandle, displayNumber, labels, headerActions, ...previewProps }: ConversationSimulatorPanelProps): react.JSX.Element;
|
|
905
905
|
|
|
906
|
-
export { type
|
|
906
|
+
export { type ListDocumentsParams as $, AudioRecorderButton as A, acceptsMediaKind as B, type ConversationSummary as C, DEFAULT_AUDIO_RECORDER_BUTTON_LABELS as D, assertPreviewEnvironment as E, createPreviewMediaPoster as F, createPreviewMediaUploader as G, createPreviewWebhookClient as H, isConversationSimulatorClient as I, mediaKindOf as J, mediaTypeOf as K, type ListConversationsParams as L, type MessagePayload as M, signPreviewPayload as N, simulatorPanelLabelsOf as O, type PreviewUploadedMedia$1 as P, toConversationSimulatorClient as Q, type ResolveMediaUrl as R, type SSEProvider as S, type ToSimulatorClientParams as T, type InteractiveSelection as U, type MessageTranscription as V, type InteractivePayload as W, type ConversationsFeatures as X, type QuickReply as Y, type ConversationChannel as Z, type TranscriptionMode as _, type ConversationEventSource as a, type ConversationTemplate as a0, type QueuedAttachment as a1, type QuickReplyInput as a2, type QuickReplyAttachment as a3, type ConversationVariable as a4, type ChannelFilter as a5, type ChannelFilterOption as a6, CHANNEL_CAPABILITIES as a7, CHANNEL_FILTER_ALL as a8, CONVERSATION_CHANNEL as a9, type ChannelCapabilities as aa, type CompanyDocument as ab, type CompanyDocumentPage as ac, type ConversationDocumentPage as ad, type ConversationsTheme as ae, type ConversationsUIConfig as af, DEFAULT_CONVERSATION_CHANNEL as ag, DEFAULT_MAX_RECORDING_MILLISECONDS as ah, type FormatContactHandleParams as ai, HANDLE_KIND as aj, type HandleKind as ak, type InteractiveOption as al, type InteractiveSection as am, MediaRenderer as an, type MediaRendererProps as ao, QUICK_REPLY_ATTACHMENT_LIMIT as ap, REOPEN_MECHANISM as aq, type ReopenMechanism as ar, type StoredAttachmentSendResult as as, type TranscriptionStatus as at, capabilitiesOf as au, channelFiltersFor as av, contactFlag as aw, formatContactHandle as ax, type ConversationsApi as b, type ConversationPage as c, type ConversationDocument as d, type SendPreviewMediaParams as e, type PreviewWebhookClient as f, type AudioRecorderButtonLabels as g, type AudioRecorderButtonProps as h, ConversationPreview as i, type ConversationPreviewProps as j, type ConversationSimulatorClient as k, ConversationSimulatorPanel as l, type ConversationSimulatorPanelLabels as m, type ConversationSimulatorPanelProps as n, type CreatePreviewMediaUploaderParams as o, type CreatePreviewWebhookClientParams as p, DEFAULT_CONVERSATION_SIMULATOR_PANEL_LABELS as q, DEFAULT_MEDIA_UPLOAD_PATH as r, PreviewInProductionError as s, PreviewMediaUploadRejectedError as t, type PreviewMediaUploadRequest as u, type PreviewUploadedMedia as v, PreviewWebhookRejectedError as w, SIMULATOR_FILE_MEDIA_KINDS as x, type SendSimulatorMediaParams as y, type SimulatorMediaKind as z };
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn
|
|
3
|
+
} from "./chunk-PJNR6UMN.js";
|
|
4
|
+
|
|
1
5
|
// src/Tooltip.tsx
|
|
2
6
|
import { useEffect, useRef, useState } from "react";
|
|
3
7
|
import { createPortal } from "react-dom";
|
|
@@ -104,7 +108,20 @@ function TooltipLayer() {
|
|
|
104
108
|
);
|
|
105
109
|
}
|
|
106
110
|
|
|
111
|
+
// src/lib/WhatsAppMessagePreview.tsx
|
|
112
|
+
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
113
|
+
function WhatsAppMessagePreview({ children, belowBubble, footer, className }) {
|
|
114
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("rounded-xl bg-[#e5ddd5] dark:bg-gray-900 p-3 space-y-1.5", className), children: [
|
|
115
|
+
/* @__PURE__ */ jsxs("div", { className: "max-w-[85%]", children: [
|
|
116
|
+
/* @__PURE__ */ jsx2("div", { className: "rounded-lg rounded-tl-none bg-white dark:bg-gray-700 px-3 py-2 text-sm text-gray-900 dark:text-gray-100 shadow-sm whitespace-pre-wrap break-words", children }),
|
|
117
|
+
belowBubble
|
|
118
|
+
] }),
|
|
119
|
+
footer
|
|
120
|
+
] });
|
|
121
|
+
}
|
|
122
|
+
|
|
107
123
|
export {
|
|
108
124
|
TOOLTIP_ATTRIBUTE,
|
|
109
|
-
TooltipLayer
|
|
125
|
+
TooltipLayer,
|
|
126
|
+
WhatsAppMessagePreview
|
|
110
127
|
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
|
+
cn,
|
|
2
3
|
parseWhatsAppFormatting,
|
|
3
4
|
useIsDarkTheme
|
|
4
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-PJNR6UMN.js";
|
|
5
6
|
|
|
6
7
|
// src/ConversationLocalesProvider.tsx
|
|
7
8
|
import { createContext, useContext } from "react";
|
|
@@ -189,15 +190,6 @@ function AudioPlayer({ src, isMine = false }) {
|
|
|
189
190
|
// src/AudioTranscription.tsx
|
|
190
191
|
import { useCallback, useState as useState2 } from "react";
|
|
191
192
|
import { Check, Copy, FileText, Loader2, RefreshCw } from "lucide-react";
|
|
192
|
-
|
|
193
|
-
// src/lib/cn.ts
|
|
194
|
-
import { clsx } from "clsx";
|
|
195
|
-
import { twMerge } from "tailwind-merge";
|
|
196
|
-
function cn(...inputs) {
|
|
197
|
-
return twMerge(clsx(inputs));
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// src/AudioTranscription.tsx
|
|
201
193
|
import { Fragment, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
202
194
|
var COPIED_FEEDBACK_MS = 2e3;
|
|
203
195
|
var COLLAPSE_ABOVE_CHARS = 320;
|
|
@@ -655,18 +647,15 @@ function InteractiveMessage({ payload, onSelect, labels, className }) {
|
|
|
655
647
|
const hasRows = collectRows(payload).length > 0;
|
|
656
648
|
const isInteractable = onSelect !== void 0;
|
|
657
649
|
return /* @__PURE__ */ jsxs6("div", { className: cn("flex flex-col gap-1", className), children: [
|
|
658
|
-
payload.header?.text ? /* @__PURE__ */ jsx8("
|
|
650
|
+
payload.header?.text ? /* @__PURE__ */ jsx8("div", { className: cn("text-sm font-semibold text-gray-900 dark:text-gray-100", FORMATTING_CLASSES), children: parseWhatsAppFormatting(payload.header.text) }) : null,
|
|
659
651
|
payload.body?.text ? /* @__PURE__ */ jsx8(
|
|
660
|
-
"
|
|
652
|
+
"div",
|
|
661
653
|
{
|
|
662
|
-
className: cn(
|
|
663
|
-
"whitespace-pre-wrap break-words text-sm text-gray-900 dark:text-gray-100",
|
|
664
|
-
FORMATTING_CLASSES
|
|
665
|
-
),
|
|
654
|
+
className: cn("whitespace-pre-wrap break-words text-sm text-gray-900 dark:text-gray-100", FORMATTING_CLASSES),
|
|
666
655
|
children: parseWhatsAppFormatting(payload.body.text)
|
|
667
656
|
}
|
|
668
657
|
) : null,
|
|
669
|
-
payload.footer?.text ? /* @__PURE__ */ jsx8("
|
|
658
|
+
payload.footer?.text ? /* @__PURE__ */ jsx8("div", { className: cn("text-xs text-gray-500 dark:text-gray-400", FORMATTING_CLASSES), children: parseWhatsAppFormatting(payload.footer.text) }) : null,
|
|
670
659
|
buttons.length > 0 ? /* @__PURE__ */ jsx8("div", { className: "mt-1 flex flex-col gap-1 border-t border-gray-200 pt-1 dark:border-gray-700", children: buttons.map((button) => /* @__PURE__ */ jsx8(
|
|
671
660
|
"button",
|
|
672
661
|
{
|
|
@@ -1372,7 +1361,18 @@ var DEFAULT_QUICK_REPLIES_WORKSPACE_LABELS = {
|
|
|
1372
1361
|
attachmentMoveDown: "Mover para baixo",
|
|
1373
1362
|
attachmentLimitReached: "Limite de 10 anexos por mensagem.",
|
|
1374
1363
|
attachmentTooLarge: (filename) => `${filename}: excede o tamanho m\xE1ximo para o tipo de arquivo.`,
|
|
1375
|
-
saveBlockedUploading: "Aguardando o envio dos anexos\u2026"
|
|
1364
|
+
saveBlockedUploading: "Aguardando o envio dos anexos\u2026",
|
|
1365
|
+
formatBold: "Negrito",
|
|
1366
|
+
formatItalic: "It\xE1lico",
|
|
1367
|
+
formatStrikethrough: "Tachado",
|
|
1368
|
+
formatMonospace: "Monoespa\xE7ado",
|
|
1369
|
+
formatInlineCode: "C\xF3digo",
|
|
1370
|
+
formatBulletedList: "Lista",
|
|
1371
|
+
formatNumberedList: "Lista numerada",
|
|
1372
|
+
formatQuote: "Cita\xE7\xE3o",
|
|
1373
|
+
formattingToolbar: "Formata\xE7\xE3o do texto",
|
|
1374
|
+
previewTitle: "Pr\xE9-visualiza\xE7\xE3o no WhatsApp",
|
|
1375
|
+
previewEmptyBody: "Digite o texto para ver como a mensagem chega ao cliente."
|
|
1376
1376
|
};
|
|
1377
1377
|
|
|
1378
1378
|
// src/quickReplies/QuickRepliesPicker.tsx
|
|
@@ -3152,7 +3152,6 @@ export {
|
|
|
3152
3152
|
useConversationLocales,
|
|
3153
3153
|
StatusTicks,
|
|
3154
3154
|
AudioPlayer,
|
|
3155
|
-
cn,
|
|
3156
3155
|
AudioTranscription,
|
|
3157
3156
|
FileIcon,
|
|
3158
3157
|
formatTimestamp,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/lib/whatsapp-formatting.tsx
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
var MONOSPACE_REGEX = /```([\s\S]*?)```/g;
|
|
4
4
|
function tokenize(text) {
|
|
5
5
|
const tokens = [];
|
|
@@ -24,7 +24,7 @@ function tokenize(text) {
|
|
|
24
24
|
i += skip.length;
|
|
25
25
|
continue;
|
|
26
26
|
}
|
|
27
|
-
const inlineMatch = remaining.slice(i).match(/^`([
|
|
27
|
+
const inlineMatch = remaining.slice(i).match(/^`([^`\n]+)`/);
|
|
28
28
|
if (inlineMatch && inlineMatch.index === 0) {
|
|
29
29
|
if (buffer) {
|
|
30
30
|
tokens.push(...parseInlineTokens(buffer));
|
|
@@ -46,19 +46,19 @@ function parseInlineTokens(text) {
|
|
|
46
46
|
const result = [];
|
|
47
47
|
let remaining = text;
|
|
48
48
|
while (remaining.length > 0) {
|
|
49
|
-
const boldMatch = remaining.match(/^\*([
|
|
49
|
+
const boldMatch = remaining.match(/^\*([^*\n]+)\*/);
|
|
50
50
|
if (boldMatch) {
|
|
51
51
|
result.push({ type: "bold", content: boldMatch[1] });
|
|
52
52
|
remaining = remaining.slice(boldMatch[0].length);
|
|
53
53
|
continue;
|
|
54
54
|
}
|
|
55
|
-
const italicMatch = remaining.match(/^_([^_]+)_/);
|
|
55
|
+
const italicMatch = remaining.match(/^_([^_\n]+)_/);
|
|
56
56
|
if (italicMatch) {
|
|
57
57
|
result.push({ type: "italic", content: italicMatch[1] });
|
|
58
58
|
remaining = remaining.slice(italicMatch[0].length);
|
|
59
59
|
continue;
|
|
60
60
|
}
|
|
61
|
-
const strikeMatch = remaining.match(/^~([
|
|
61
|
+
const strikeMatch = remaining.match(/^~([^~\n]+)~/);
|
|
62
62
|
if (strikeMatch) {
|
|
63
63
|
result.push({ type: "strikethrough", content: strikeMatch[1] });
|
|
64
64
|
remaining = remaining.slice(strikeMatch[0].length);
|
|
@@ -79,8 +79,59 @@ function parseInlineTokens(text) {
|
|
|
79
79
|
}
|
|
80
80
|
return result;
|
|
81
81
|
}
|
|
82
|
+
var BULLETED_LINE = /^[*-] (.*)$/;
|
|
83
|
+
var NUMBERED_LINE = /^(\d+)\. (.*)$/;
|
|
84
|
+
var QUOTE_LINE = /^> (.*)$/;
|
|
85
|
+
function blockKindOf(line) {
|
|
86
|
+
if (BULLETED_LINE.test(line)) return "bulleted";
|
|
87
|
+
if (NUMBERED_LINE.test(line)) return "numbered";
|
|
88
|
+
if (QUOTE_LINE.test(line)) return "quote";
|
|
89
|
+
return "plain";
|
|
90
|
+
}
|
|
91
|
+
function groupLines(lines) {
|
|
92
|
+
const groups = [];
|
|
93
|
+
for (const line of lines) {
|
|
94
|
+
const kind = blockKindOf(line);
|
|
95
|
+
const last = groups[groups.length - 1];
|
|
96
|
+
if (last && last.kind === kind) last.lines.push(line);
|
|
97
|
+
else groups.push({ kind, lines: [line] });
|
|
98
|
+
}
|
|
99
|
+
return groups;
|
|
100
|
+
}
|
|
101
|
+
function renderBlockGroup(group, key) {
|
|
102
|
+
if (group.kind === "bulleted") {
|
|
103
|
+
return /* @__PURE__ */ jsx("ul", { className: "list-disc pl-5", children: group.lines.map((line, index) => /* @__PURE__ */ jsx("li", { children: renderTokens(tokenize(line.replace(BULLETED_LINE, "$1"))) }, index)) }, key);
|
|
104
|
+
}
|
|
105
|
+
if (group.kind === "numbered") {
|
|
106
|
+
return /* @__PURE__ */ jsx("ol", { className: "list-decimal pl-6", children: group.lines.map((line, index) => {
|
|
107
|
+
const [, number, content] = NUMBERED_LINE.exec(line) ?? [];
|
|
108
|
+
return /* @__PURE__ */ jsx("li", { value: Number(number), children: renderTokens(tokenize(content ?? "")) }, index);
|
|
109
|
+
}) }, key);
|
|
110
|
+
}
|
|
111
|
+
if (group.kind === "quote") {
|
|
112
|
+
return /* @__PURE__ */ jsx(
|
|
113
|
+
"blockquote",
|
|
114
|
+
{
|
|
115
|
+
className: "border-l-4 border-gray-300 pl-2 text-gray-600 dark:border-gray-500 dark:text-gray-300",
|
|
116
|
+
children: group.lines.map((line, index) => /* @__PURE__ */ jsx("div", { children: renderTokens(tokenize(line.replace(QUOTE_LINE, "$1"))) }, index))
|
|
117
|
+
},
|
|
118
|
+
key
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
const joined = group.lines.join("\n");
|
|
122
|
+
const trailingBreak = group.lines[group.lines.length - 1] === "" ? "\n" : null;
|
|
123
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
124
|
+
renderTokens(tokenize(joined)),
|
|
125
|
+
trailingBreak
|
|
126
|
+
] }, key);
|
|
127
|
+
}
|
|
82
128
|
function parseWhatsAppFormatting(text) {
|
|
83
|
-
const
|
|
129
|
+
const lines = text.split("\n");
|
|
130
|
+
const hasBlockLine = lines.some((line) => blockKindOf(line) !== "plain");
|
|
131
|
+
if (!hasBlockLine || text.includes("```")) return renderTokens(tokenize(text));
|
|
132
|
+
return groupLines(lines).map(renderBlockGroup);
|
|
133
|
+
}
|
|
134
|
+
function renderTokens(tokens) {
|
|
84
135
|
return tokens.map((token, index) => {
|
|
85
136
|
switch (token.type) {
|
|
86
137
|
case "bold":
|
|
@@ -139,8 +190,14 @@ function htmlToWA(html) {
|
|
|
139
190
|
if (!html) return "";
|
|
140
191
|
let text = html;
|
|
141
192
|
text = text.replace(EMPTY_CODE_REGEX, "");
|
|
142
|
-
text = text.replace(
|
|
143
|
-
|
|
193
|
+
text = text.replace(
|
|
194
|
+
/<code data-wa="block"[^>]*>([\s\S]*?)<\/code>/gi,
|
|
195
|
+
(_match, inner) => `\`\`\`${unescapeHtml(inner.replace(/<br\s*\/?>/gi, "\n"))}\`\`\``
|
|
196
|
+
);
|
|
197
|
+
text = text.replace(
|
|
198
|
+
/<code data-wa="inline"[^>]*>([\s\S]*?)<\/code>/gi,
|
|
199
|
+
(_match, inner) => `\`${unescapeHtml(inner)}\``
|
|
200
|
+
);
|
|
144
201
|
text = text.replace(/<br\s*\/?>/gi, "\n").replace(/<div>/gi, "\n").replace(/<\/div>/gi, "").replace(/<\/p>/gi, "\n").replace(/<p[^>]*>/gi, "");
|
|
145
202
|
text = text.replace(/<strong>(.*?)<\/strong>/gi, "*$1*");
|
|
146
203
|
text = text.replace(/<b>(.*?)<\/b>/gi, "*$1*");
|
|
@@ -212,7 +269,15 @@ function useDarkMode() {
|
|
|
212
269
|
return { isDark, toggle };
|
|
213
270
|
}
|
|
214
271
|
|
|
272
|
+
// src/lib/cn.ts
|
|
273
|
+
import { clsx } from "clsx";
|
|
274
|
+
import { twMerge } from "tailwind-merge";
|
|
275
|
+
function cn(...inputs) {
|
|
276
|
+
return twMerge(clsx(inputs));
|
|
277
|
+
}
|
|
278
|
+
|
|
215
279
|
export {
|
|
280
|
+
cn,
|
|
216
281
|
parseWhatsAppFormatting,
|
|
217
282
|
ZERO_WIDTH_SPACE,
|
|
218
283
|
waToHTML,
|
package/dist/flows/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
|
-
TooltipLayer
|
|
3
|
-
|
|
2
|
+
TooltipLayer,
|
|
3
|
+
WhatsAppMessagePreview
|
|
4
|
+
} from "../chunk-HMCOTZAX.js";
|
|
4
5
|
import {
|
|
5
6
|
parseWhatsAppFormatting,
|
|
6
7
|
useIsDarkTheme
|
|
7
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-PJNR6UMN.js";
|
|
8
9
|
|
|
9
10
|
// src/flows/FlowNodeCard.tsx
|
|
10
11
|
import { useState } from "react";
|
|
@@ -1244,7 +1245,7 @@ import { Plus as Plus3, Trash2, Save, X as X3, AlertTriangle as AlertTriangle2,
|
|
|
1244
1245
|
|
|
1245
1246
|
// src/flows/FlowWhatsAppPreview.tsx
|
|
1246
1247
|
import { List } from "lucide-react";
|
|
1247
|
-
import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1248
|
+
import { Fragment as Fragment3, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1248
1249
|
function FlowWhatsAppPreview({
|
|
1249
1250
|
body,
|
|
1250
1251
|
options,
|
|
@@ -1255,35 +1256,38 @@ function FlowWhatsAppPreview({
|
|
|
1255
1256
|
}
|
|
1256
1257
|
const usesButtons = rendersAsButtons(options);
|
|
1257
1258
|
const hasOptions = (options?.length ?? 0) > 0;
|
|
1258
|
-
return /* @__PURE__ */ jsxs9(
|
|
1259
|
-
|
|
1260
|
-
|
|
1259
|
+
return /* @__PURE__ */ jsxs9(
|
|
1260
|
+
WhatsAppMessagePreview,
|
|
1261
|
+
{
|
|
1262
|
+
belowBubble: /* @__PURE__ */ jsxs9(Fragment3, { children: [
|
|
1263
|
+
hasOptions && usesButtons && /* @__PURE__ */ jsx10("div", { className: "mt-1 space-y-1", children: options.map(([id, label]) => /* @__PURE__ */ jsx10(
|
|
1264
|
+
"div",
|
|
1265
|
+
{
|
|
1266
|
+
className: "rounded-lg bg-white dark:bg-gray-700 py-1.5 text-center text-sm font-medium text-cyan-600 dark:text-cyan-400 shadow-sm",
|
|
1267
|
+
children: label || /* @__PURE__ */ jsx10("span", { className: "italic text-gray-400", children: labels.previewEmptyOption })
|
|
1268
|
+
},
|
|
1269
|
+
id
|
|
1270
|
+
)) }),
|
|
1271
|
+
hasOptions && !usesButtons && /* @__PURE__ */ jsx10("div", { className: "mt-1.5 rounded-lg bg-white dark:bg-gray-700 shadow-sm divide-y divide-gray-100 dark:divide-gray-600 overflow-hidden", children: options.slice(0, WHATSAPP_LIMITS.MAX_LIST_ROWS).map(([id, label]) => /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 px-3 py-1.5 text-sm text-gray-800 dark:text-gray-100", children: [
|
|
1272
|
+
/* @__PURE__ */ jsx10("span", { className: "h-3.5 w-3.5 rounded-full border border-gray-300 dark:border-gray-500 shrink-0" }),
|
|
1273
|
+
label || /* @__PURE__ */ jsx10("span", { className: "italic text-gray-400", children: labels.previewEmptyOption })
|
|
1274
|
+
] }, id)) })
|
|
1275
|
+
] }),
|
|
1276
|
+
footer: hasOptions && /* @__PURE__ */ jsx10("p", { className: "text-[11px] text-gray-500 dark:text-gray-400 px-1", children: usesButtons ? labels.previewModeButtons : labels.previewModeList }),
|
|
1277
|
+
children: [
|
|
1261
1278
|
body ? parseWhatsAppFormatting(body) : /* @__PURE__ */ jsx10("span", { className: "italic text-gray-400", children: labels.previewEmptyBody }),
|
|
1262
1279
|
hasOptions && !usesButtons && /* @__PURE__ */ jsx10("div", { className: "mt-2 -mx-3 -mb-2 border-t border-gray-100 dark:border-gray-600", children: /* @__PURE__ */ jsxs9("div", { className: "flex items-center justify-center gap-1.5 py-2 text-sm font-medium text-cyan-600 dark:text-cyan-400", children: [
|
|
1263
1280
|
/* @__PURE__ */ jsx10(List, { size: 15 }),
|
|
1264
1281
|
" ",
|
|
1265
1282
|
labels.previewListButton
|
|
1266
1283
|
] }) })
|
|
1267
|
-
]
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
{
|
|
1271
|
-
className: "rounded-lg bg-white dark:bg-gray-700 py-1.5 text-center text-sm font-medium text-cyan-600 dark:text-cyan-400 shadow-sm",
|
|
1272
|
-
children: label || /* @__PURE__ */ jsx10("span", { className: "italic text-gray-400", children: labels.previewEmptyOption })
|
|
1273
|
-
},
|
|
1274
|
-
id
|
|
1275
|
-
)) }),
|
|
1276
|
-
hasOptions && !usesButtons && /* @__PURE__ */ jsx10("div", { className: "mt-1.5 rounded-lg bg-white dark:bg-gray-700 shadow-sm divide-y divide-gray-100 dark:divide-gray-600 overflow-hidden", children: options.slice(0, WHATSAPP_LIMITS.MAX_LIST_ROWS).map(([id, label]) => /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 px-3 py-1.5 text-sm text-gray-800 dark:text-gray-100", children: [
|
|
1277
|
-
/* @__PURE__ */ jsx10("span", { className: "h-3.5 w-3.5 rounded-full border border-gray-300 dark:border-gray-500 shrink-0" }),
|
|
1278
|
-
label || /* @__PURE__ */ jsx10("span", { className: "italic text-gray-400", children: labels.previewEmptyOption })
|
|
1279
|
-
] }, id)) })
|
|
1280
|
-
] }),
|
|
1281
|
-
hasOptions && /* @__PURE__ */ jsx10("p", { className: "text-[11px] text-gray-500 dark:text-gray-400 px-1", children: usesButtons ? labels.previewModeButtons : labels.previewModeList })
|
|
1282
|
-
] });
|
|
1284
|
+
]
|
|
1285
|
+
}
|
|
1286
|
+
);
|
|
1283
1287
|
}
|
|
1284
1288
|
|
|
1285
1289
|
// src/flows/FlowNodePanel.tsx
|
|
1286
|
-
import { Fragment as
|
|
1290
|
+
import { Fragment as Fragment4, jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1287
1291
|
var SELECT_CLASSNAME = "border border-gray-200 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-100 rounded-xl px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400 focus:border-transparent transition-all";
|
|
1288
1292
|
var INPUT_CLASSNAME = "border border-gray-200 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-100 rounded-xl px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400 focus:border-transparent transition-all";
|
|
1289
1293
|
function truncateLabel(value, max = 60) {
|
|
@@ -1387,7 +1391,7 @@ function FlowNodePanel({
|
|
|
1387
1391
|
setDraft((prev) => ({ ...prev, options: (prev.options ?? []).filter((_, i) => i !== index) }));
|
|
1388
1392
|
}
|
|
1389
1393
|
function nextNodeOptions() {
|
|
1390
|
-
return /* @__PURE__ */ jsxs10(
|
|
1394
|
+
return /* @__PURE__ */ jsxs10(Fragment4, { children: [
|
|
1391
1395
|
otherNodeIds.map((id) => /* @__PURE__ */ jsx11("option", { value: id, children: truncateLabel(nodeLabel(graph.nodes[id], labels)) }, id)),
|
|
1392
1396
|
otherFlows.length > 0 && /* @__PURE__ */ jsx11("optgroup", { label: labels.nodePanel.otherFlowsGroup, children: otherFlows.map((flow) => /* @__PURE__ */ jsx11("option", { value: `${CROSS_FLOW_PREFIX}${flow.key}`, children: flow.label }, flow.key)) })
|
|
1393
1397
|
] });
|
|
@@ -1929,7 +1933,7 @@ function findFreeSlot(params) {
|
|
|
1929
1933
|
}
|
|
1930
1934
|
|
|
1931
1935
|
// src/flows/FlowsWorkspace.tsx
|
|
1932
|
-
import { Fragment as
|
|
1936
|
+
import { Fragment as Fragment5, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1933
1937
|
var RF_NODE_TYPES = {
|
|
1934
1938
|
...flowNodeTypes,
|
|
1935
1939
|
...flowPortalNodeTypes,
|
|
@@ -2552,7 +2556,7 @@ function FlowsWorkspace({
|
|
|
2552
2556
|
]
|
|
2553
2557
|
}
|
|
2554
2558
|
),
|
|
2555
|
-
viewMode === "detail" && /* @__PURE__ */ jsxs11(
|
|
2559
|
+
viewMode === "detail" && /* @__PURE__ */ jsxs11(Fragment5, { children: [
|
|
2556
2560
|
/* @__PURE__ */ jsxs11(
|
|
2557
2561
|
"button",
|
|
2558
2562
|
{
|
|
@@ -2727,7 +2731,7 @@ function FlowsWorkspace({
|
|
|
2727
2731
|
}
|
|
2728
2732
|
)
|
|
2729
2733
|
] }),
|
|
2730
|
-
quickAddFrom && /* @__PURE__ */ jsxs11(
|
|
2734
|
+
quickAddFrom && /* @__PURE__ */ jsxs11(Fragment5, { children: [
|
|
2731
2735
|
/* @__PURE__ */ jsx12("div", { className: "fixed inset-0 z-40", onClick: () => setQuickAddFrom(null) }),
|
|
2732
2736
|
/* @__PURE__ */ jsxs11(
|
|
2733
2737
|
"div",
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import react__default, { ReactNode, CSSProperties, UIEvent, FormEvent, RefObject, KeyboardEvent } from 'react';
|
|
3
|
-
import {
|
|
4
|
-
export { A as AudioRecorderButton,
|
|
3
|
+
import { M as MessagePayload, R as ResolveMediaUrl, U as InteractiveSelection, V as MessageTranscription, W as InteractivePayload, X as ConversationsFeatures, Y as QuickReply$1, C as ConversationSummary, Z as ConversationChannel, L as ListConversationsParams, b as ConversationsApi, S as SSEProvider, _ as TranscriptionMode, $ as ListDocumentsParams, d as ConversationDocument, a0 as ConversationTemplate, a1 as QueuedAttachment, a2 as QuickReplyInput, a3 as QuickReplyAttachment, a4 as ConversationVariable, a5 as ChannelFilter, a6 as ChannelFilterOption, k as ConversationSimulatorClient, m as ConversationSimulatorPanelLabels, P as PreviewUploadedMedia } from './ConversationSimulatorPanel-DmV8uaFE.js';
|
|
4
|
+
export { A as AudioRecorderButton, g as AudioRecorderButtonLabels, h as AudioRecorderButtonProps, a7 as CHANNEL_CAPABILITIES, a8 as CHANNEL_FILTER_ALL, a9 as CONVERSATION_CHANNEL, aa as ChannelCapabilities, ab as CompanyDocument, ac as CompanyDocumentPage, ad as ConversationDocumentPage, a as ConversationEventSource, c as ConversationPage, ae as ConversationsTheme, af as ConversationsUIConfig, D as DEFAULT_AUDIO_RECORDER_BUTTON_LABELS, ag as DEFAULT_CONVERSATION_CHANNEL, ah as DEFAULT_MAX_RECORDING_MILLISECONDS, ai as FormatContactHandleParams, aj as HANDLE_KIND, ak as HandleKind, al as InteractiveOption, am as InteractiveSection, an as MediaRenderer, ao as MediaRendererProps, ap as QUICK_REPLY_ATTACHMENT_LIMIT, aq as REOPEN_MECHANISM, ar as ReopenMechanism, y as SendSimulatorMediaParams, z as SimulatorMediaKind, as as StoredAttachmentSendResult, at as TranscriptionStatus, au as capabilitiesOf, av as channelFiltersFor, aw as contactFlag, ax as formatContactHandle } from './ConversationSimulatorPanel-DmV8uaFE.js';
|
|
5
5
|
import '@adatechnology/meta-whatsapp-contracts/testing';
|
|
6
6
|
|
|
7
7
|
interface MessageBubbleProps {
|
|
@@ -252,8 +252,22 @@ interface QuickRepliesWorkspaceLabels {
|
|
|
252
252
|
readonly attachmentLimitReached: string;
|
|
253
253
|
readonly attachmentTooLarge: (filename: string) => string;
|
|
254
254
|
readonly saveBlockedUploading: string;
|
|
255
|
-
|
|
256
|
-
|
|
255
|
+
/** Barra de formatação acima do campo de texto — notação do WhatsApp. */
|
|
256
|
+
readonly formatBold?: string;
|
|
257
|
+
readonly formatItalic?: string;
|
|
258
|
+
readonly formatStrikethrough?: string;
|
|
259
|
+
readonly formatMonospace?: string;
|
|
260
|
+
readonly formatInlineCode?: string;
|
|
261
|
+
readonly formatBulletedList?: string;
|
|
262
|
+
readonly formatNumberedList?: string;
|
|
263
|
+
readonly formatQuote?: string;
|
|
264
|
+
readonly formattingToolbar?: string;
|
|
265
|
+
readonly previewTitle?: string;
|
|
266
|
+
readonly previewEmptyBody?: string;
|
|
267
|
+
}
|
|
268
|
+
/** Os rótulos já completados pelos padrões — as chaves novas são opcionais no tipo público. */
|
|
269
|
+
type ResolvedQuickRepliesWorkspaceLabels = Required<QuickRepliesWorkspaceLabels>;
|
|
270
|
+
declare const DEFAULT_QUICK_REPLIES_WORKSPACE_LABELS: ResolvedQuickRepliesWorkspaceLabels;
|
|
257
271
|
|
|
258
272
|
/**
|
|
259
273
|
* Mensagem pronta que o atendente cola no campo com um clique.
|
|
@@ -1707,11 +1721,36 @@ interface UseInboxActionsResult {
|
|
|
1707
1721
|
/** Ações que valem para a caixa inteira, sem conversa selecionada. */
|
|
1708
1722
|
declare function useInboxActions(): UseInboxActionsResult;
|
|
1709
1723
|
|
|
1724
|
+
/**
|
|
1725
|
+
* Formatação do WhatsApp: inline (`*`, `_`, `~`, `` ` ``, ```` ``` ````) e, por linha, lista (`* `,
|
|
1726
|
+
* `- `), lista numerada (`1. `) e citação (`> `). Sem linha de bloco, a saída é só inline, igual à de
|
|
1727
|
+
* sempre. Com bloco de código de várias linhas, também — dividir por linha partiria o bloco.
|
|
1728
|
+
*/
|
|
1710
1729
|
declare function parseWhatsAppFormatting(text: string): ReactNode[];
|
|
1711
1730
|
declare function waToHTML(text: string): string;
|
|
1712
1731
|
declare function htmlToWA(html: string): string;
|
|
1713
1732
|
declare function waToHTMLInline(text: string): string;
|
|
1714
1733
|
|
|
1734
|
+
interface WhatsAppMessagePreviewProps {
|
|
1735
|
+
/** Conteúdo dentro do balão (texto já formatado, anexos, botão de lista). */
|
|
1736
|
+
readonly children: ReactNode;
|
|
1737
|
+
/** Abaixo do balão, ainda na coluna dele — botões de resposta, linhas de lista. */
|
|
1738
|
+
readonly belowBubble?: ReactNode;
|
|
1739
|
+
/** Rodapé fora da coluna do balão, sobre o fundo. */
|
|
1740
|
+
readonly footer?: ReactNode;
|
|
1741
|
+
readonly className?: string;
|
|
1742
|
+
}
|
|
1743
|
+
/** Balão recebido sobre o fundo do WhatsApp — o único estilo de pré-visualização do pacote. */
|
|
1744
|
+
declare function WhatsAppMessagePreview({ children, belowBubble, footer, className }: WhatsAppMessagePreviewProps): react.JSX.Element;
|
|
1745
|
+
|
|
1746
|
+
/** Notação do WhatsApp de cada ação — a mesma que `parseWhatsAppFormatting` reconhece. */
|
|
1747
|
+
declare const WHATSAPP_MARKER_BY_ACTION: {
|
|
1748
|
+
readonly bold: "*";
|
|
1749
|
+
readonly italic: "_";
|
|
1750
|
+
readonly strikethrough: "~";
|
|
1751
|
+
readonly monospace: "```";
|
|
1752
|
+
};
|
|
1753
|
+
|
|
1715
1754
|
declare function formatPhone(number: string): string;
|
|
1716
1755
|
declare function phoneInitials(number: string): string;
|
|
1717
1756
|
|
|
@@ -2214,4 +2253,4 @@ type QueuedAttachmentsListProps = {
|
|
|
2214
2253
|
};
|
|
2215
2254
|
declare function QueuedAttachmentsList({ items, statusOf, onRemove, onRetry, retryingKeys, getThumbnailUrl, labels, busy, }: QueuedAttachmentsListProps): react.JSX.Element | null;
|
|
2216
2255
|
|
|
2217
|
-
export { type AsyncResourceState, type AttachmentFileRejection, AudioPlayer, type AudioPlayerProps, AudioTranscription, type AudioTranscriptionProps, Avatar, type AvatarLabels, type AvatarProps, type BotMessages, type BuildTranscriptTextParams, BulkActionBar, type BulkActionBarProps, CHANNEL_BRAND_COLOR, CONVERSATIONS_PER_PAGE, CONVERSATION_WINDOW, ChannelFilter, ChannelFilterOption, ChannelIcon, type ChannelIconProps, ConversationChannel, type ConversationContextEntry, ConversationContextPanel, type ConversationContextPanelClassNames, type ConversationContextPanelLabels, type ConversationContextPanelProps, type ConversationContextStatus, ConversationDocument, ConversationDocumentsPanel, type ConversationDocumentsPanelClassNames, type ConversationDocumentsPanelLabels, type ConversationDocumentsPanelProps, ConversationHeader, type ConversationHeaderClassNames, type ConversationHeaderLabels, type ConversationHeaderProps, type ConversationHeaderUtility, ConversationListItem, type ConversationListItemLabels, type ConversationListItemProps, type ConversationLocales, ConversationLocalesProvider, type ConversationLocalesProviderProps, ConversationPane, type ConversationPaneProps, type ConversationRealtimeHandler, ConversationRow, type ConversationRowClassNames, type ConversationRowProps, ConversationSimulatorClient, ConversationSummary, ConversationTemplate, ConversationVariable, ConversationWallpaper, type ConversationWallpaperProps, type ConversationWindow, ConversationsApi, ConversationsFeatures, ConversationsInboxList, type ConversationsInboxListProps, ConversationsProvider, ConversationsWorkspace, type ConversationsWorkspaceLabels, type ConversationsWorkspaceProps, type ConversationsWorkspaceSimulator, DEFAULT_ACCEPTED_FILE_TYPES, DEFAULT_AVATAR_LABELS, DEFAULT_CONVERSATIONS_WORKSPACE_LABELS, DEFAULT_CONVERSATION_CONTEXT_LABELS, DEFAULT_CONVERSATION_DOCUMENTS_LABELS, DEFAULT_CONVERSATION_HEADER_LABELS, DEFAULT_CONVERSATION_LIST_ITEM_LABELS, DEFAULT_DARK_MODE_TOGGLE_LABELS, DEFAULT_DOCUMENTS_LIBRARY_LABELS, DEFAULT_DOCUMENTS_WORKSPACE_LABELS, DEFAULT_EMOJI_PICKER_LABELS, DEFAULT_INTERACTIVE_MESSAGE_LABELS, DEFAULT_LIGHTBOX_LABELS, DEFAULT_MAX_ATTACHMENT_SIZE_BYTES, DEFAULT_MESSAGE_COMPOSER_LABELS, DEFAULT_QUICK_REPLIES_PICKER_LABELS, DEFAULT_QUICK_REPLIES_WORKSPACE_LABELS, DEFAULT_RICH_COMPOSER_TOOLTIPS, DEFAULT_TEMPLATES_SETTINGS_LABELS, DEFAULT_WHATSAPP_MESSAGE_EDITOR_LABELS, DEFAULT_WINDOW_EXPIRED_LABELS, DOCUMENT_SOURCE_FILTER, DarkModeToggle, type DarkModeToggleLabels, type DarkModeToggleProps, DateDivider, type DateDividerClassNames, type DateDividerProps, type DocumentSourceFilter, type DocumentsFiltersContext, DocumentsLibrary, type DocumentsLibraryClassNames, type DocumentsLibraryLabels, type DocumentsLibraryProps, DocumentsWorkspace, type DocumentsWorkspaceClassNames, type DocumentsWorkspaceLabels, type DocumentsWorkspaceProps, EMOJI_CATEGORIES, type EmojiCategory, type EmojiEntry, EmojiPicker, type EmojiPickerLabels, type EmojiPickerProps, FileIcon, type FileIconProps, type FilterOption, type FilterQuickRepliesParams, InteractiveMessage, type InteractiveMessageLabels, type InteractiveMessageProps, InteractivePayload, InteractiveSelection, Lightbox, type LightboxLabels, type LightboxProps, ListConversationsParams, ListDocumentsParams, ListingPagination, type ListingPaginationProps, type MatchSegment, type MaxAttachmentSizeBytes, MessageBubble, type MessageBubbleProps, MessageComposer, type MessageComposerClassNames, type MessageComposerLabels, type MessageComposerProps, MessagePayload, MessageTail, MessageText, type MessageTextProps, MessageTimestamp, MessageTranscription, MessagesWorkspace, type MessagesWorkspaceApi, type MessagesWorkspaceLabels, type MessagesWorkspaceProps, type MessagesWorkspaceTemplateRole, MultiSelectFilter, type MultiSelectFilterProps, NARROW_MAX_WIDTH_PX, type OutgoingItems, QueuedAttachment, QueuedAttachmentsList, QuickRepliesPicker, type QuickRepliesPickerLabels, type QuickRepliesPickerProps, QuickRepliesWorkspace, type QuickRepliesWorkspaceLabels, type QuickRepliesWorkspaceProps, type QuickReply, QuickReplyAttachment, QuickReplyInput, REPLY_LATENCY, REPLY_LATENCY_CRITICAL_HOURS, REPLY_LATENCY_LATE_HOURS, RICH_COMPOSER_ACTION, type ReplyLatency, type ReplyLatencyParams, ResolveMediaUrl, type RichComposerAction, type RichComposerQuickReply, type RichComposerTooltips, type RichComposerVariable, RichMessageComposer, type RichMessageComposerHandle, type RichMessageComposerProps, SSEProvider, QuickReply$1 as SavedQuickReply, SimpleEmojiPicker, type SimpleEmojiPickerProps, type SimulatorTransportFactory, type SimulatorTransportParams, type SortDirection, SortableHead, type SortableHeadProps, StatusTicks, type StatusTicksProps, TEMPLATE_SETTINGS_TAB, TOOLTIP_ATTRIBUTE, type TemplateSettings, type TemplateSettingsTab, ToastProvider, TooltipLayer, type TopicItem, TopicsForm, type TopicsFormLabels, type TopicsFormProps, TranscriptionMode, type TranscriptionSettings, TranscriptionSettingsForm, type TranscriptionSettingsFormLabels, type TranscriptionSettingsFormProps, type UrlStateOptions, type UseConversationActionsResult, type UseConversationContextResult, type UseConversationDocumentsParams, type UseConversationDocumentsResult, type UseConversationListParams, type UseConversationListResult, type UseConversationMessagesResult, type UseConversationsInboxParams, type UseConversationsInboxResult, type UseInboxActionsResult, type UseScrollToLatestMessageParams, type UseScrollToLatestMessageResult, type UseWaitingNotificationsLabels, type UseWaitingNotificationsParams, type UseWaitingNotificationsResult, type ValidateAttachmentFilesResult, WINDOW_FILTERS, WelcomeFarewellForm, type WelcomeFarewellFormLabels, type WelcomeFarewellFormProps, WhatsAppCreateTemplateForm, type WhatsAppCreateTemplateFormLabels, type WhatsAppCreateTemplateFormProps, type WhatsAppCreateTemplateResult, type WhatsAppCreateTemplateState, WhatsAppMessageEditor, type WhatsAppMessageEditorLabels, type WhatsAppMessageEditorProps, type WhatsAppTemplateHeaderType, WhatsAppTemplateSettingsForm, type WhatsAppTemplateSettingsFormLabels, type WhatsAppTemplateSettingsFormProps, type WhatsAppTemplateSummary, type WhatsAppTemplateVariableSuggestion, WhatsAppTemplatesSettings, type WhatsAppTemplatesSettingsLabels, type WhatsAppTemplatesSettingsProps, WindowExpiredNotice, type WindowExpiredNoticeLabels, type WindowExpiredNoticeProps, type WindowOfParams, applyQuickReplyVariables, buildTranscriptFilename, buildTranscriptText, createMediaUrlResolver, downloadTextFile, filterQuickReplies, formatDateTime, formatFileSize, formatPhone, formatStalledFor, formatTimestamp, highlightMatch, htmlToWA, isReplyOverdue, isSameDay, isWindowBlocking, normalizeForSearch, parseWhatsAppFormatting, phoneInitials, queuedAttachmentsFromQuickReply, replyLatencyOf, resolveMaxAttachmentSizeBytes, resolveQuickReply, searchEmojis, toast, useConversationActions, useConversationContext, useConversationDocuments, useConversationList, useConversationLocales, useConversationMessages, useConversationRealtime, useConversations, useConversationsInbox, useDarkMode, useDebouncedValue, useGlobalRealtime, useInboxActions, useIsDarkTheme, useIsNarrow, useScrollToLatestMessage, useToast, useUrlArrayState, useUrlNumberState, useUrlStringState, useWaitingNotifications, waToHTML, waToHTMLInline, windowOf };
|
|
2256
|
+
export { type AsyncResourceState, type AttachmentFileRejection, AudioPlayer, type AudioPlayerProps, AudioTranscription, type AudioTranscriptionProps, Avatar, type AvatarLabels, type AvatarProps, type BotMessages, type BuildTranscriptTextParams, BulkActionBar, type BulkActionBarProps, CHANNEL_BRAND_COLOR, CONVERSATIONS_PER_PAGE, CONVERSATION_WINDOW, ChannelFilter, ChannelFilterOption, ChannelIcon, type ChannelIconProps, ConversationChannel, type ConversationContextEntry, ConversationContextPanel, type ConversationContextPanelClassNames, type ConversationContextPanelLabels, type ConversationContextPanelProps, type ConversationContextStatus, ConversationDocument, ConversationDocumentsPanel, type ConversationDocumentsPanelClassNames, type ConversationDocumentsPanelLabels, type ConversationDocumentsPanelProps, ConversationHeader, type ConversationHeaderClassNames, type ConversationHeaderLabels, type ConversationHeaderProps, type ConversationHeaderUtility, ConversationListItem, type ConversationListItemLabels, type ConversationListItemProps, type ConversationLocales, ConversationLocalesProvider, type ConversationLocalesProviderProps, ConversationPane, type ConversationPaneProps, type ConversationRealtimeHandler, ConversationRow, type ConversationRowClassNames, type ConversationRowProps, ConversationSimulatorClient, ConversationSummary, ConversationTemplate, ConversationVariable, ConversationWallpaper, type ConversationWallpaperProps, type ConversationWindow, ConversationsApi, ConversationsFeatures, ConversationsInboxList, type ConversationsInboxListProps, ConversationsProvider, ConversationsWorkspace, type ConversationsWorkspaceLabels, type ConversationsWorkspaceProps, type ConversationsWorkspaceSimulator, DEFAULT_ACCEPTED_FILE_TYPES, DEFAULT_AVATAR_LABELS, DEFAULT_CONVERSATIONS_WORKSPACE_LABELS, DEFAULT_CONVERSATION_CONTEXT_LABELS, DEFAULT_CONVERSATION_DOCUMENTS_LABELS, DEFAULT_CONVERSATION_HEADER_LABELS, DEFAULT_CONVERSATION_LIST_ITEM_LABELS, DEFAULT_DARK_MODE_TOGGLE_LABELS, DEFAULT_DOCUMENTS_LIBRARY_LABELS, DEFAULT_DOCUMENTS_WORKSPACE_LABELS, DEFAULT_EMOJI_PICKER_LABELS, DEFAULT_INTERACTIVE_MESSAGE_LABELS, DEFAULT_LIGHTBOX_LABELS, DEFAULT_MAX_ATTACHMENT_SIZE_BYTES, DEFAULT_MESSAGE_COMPOSER_LABELS, DEFAULT_QUICK_REPLIES_PICKER_LABELS, DEFAULT_QUICK_REPLIES_WORKSPACE_LABELS, DEFAULT_RICH_COMPOSER_TOOLTIPS, DEFAULT_TEMPLATES_SETTINGS_LABELS, DEFAULT_WHATSAPP_MESSAGE_EDITOR_LABELS, DEFAULT_WINDOW_EXPIRED_LABELS, DOCUMENT_SOURCE_FILTER, DarkModeToggle, type DarkModeToggleLabels, type DarkModeToggleProps, DateDivider, type DateDividerClassNames, type DateDividerProps, type DocumentSourceFilter, type DocumentsFiltersContext, DocumentsLibrary, type DocumentsLibraryClassNames, type DocumentsLibraryLabels, type DocumentsLibraryProps, DocumentsWorkspace, type DocumentsWorkspaceClassNames, type DocumentsWorkspaceLabels, type DocumentsWorkspaceProps, EMOJI_CATEGORIES, type EmojiCategory, type EmojiEntry, EmojiPicker, type EmojiPickerLabels, type EmojiPickerProps, FileIcon, type FileIconProps, type FilterOption, type FilterQuickRepliesParams, InteractiveMessage, type InteractiveMessageLabels, type InteractiveMessageProps, InteractivePayload, InteractiveSelection, Lightbox, type LightboxLabels, type LightboxProps, ListConversationsParams, ListDocumentsParams, ListingPagination, type ListingPaginationProps, type MatchSegment, type MaxAttachmentSizeBytes, MessageBubble, type MessageBubbleProps, MessageComposer, type MessageComposerClassNames, type MessageComposerLabels, type MessageComposerProps, MessagePayload, MessageTail, MessageText, type MessageTextProps, MessageTimestamp, MessageTranscription, MessagesWorkspace, type MessagesWorkspaceApi, type MessagesWorkspaceLabels, type MessagesWorkspaceProps, type MessagesWorkspaceTemplateRole, MultiSelectFilter, type MultiSelectFilterProps, NARROW_MAX_WIDTH_PX, type OutgoingItems, QueuedAttachment, QueuedAttachmentsList, QuickRepliesPicker, type QuickRepliesPickerLabels, type QuickRepliesPickerProps, QuickRepliesWorkspace, type QuickRepliesWorkspaceLabels, type QuickRepliesWorkspaceProps, type QuickReply, QuickReplyAttachment, QuickReplyInput, REPLY_LATENCY, REPLY_LATENCY_CRITICAL_HOURS, REPLY_LATENCY_LATE_HOURS, RICH_COMPOSER_ACTION, type ReplyLatency, type ReplyLatencyParams, ResolveMediaUrl, type RichComposerAction, type RichComposerQuickReply, type RichComposerTooltips, type RichComposerVariable, RichMessageComposer, type RichMessageComposerHandle, type RichMessageComposerProps, SSEProvider, QuickReply$1 as SavedQuickReply, SimpleEmojiPicker, type SimpleEmojiPickerProps, type SimulatorTransportFactory, type SimulatorTransportParams, type SortDirection, SortableHead, type SortableHeadProps, StatusTicks, type StatusTicksProps, TEMPLATE_SETTINGS_TAB, TOOLTIP_ATTRIBUTE, type TemplateSettings, type TemplateSettingsTab, ToastProvider, TooltipLayer, type TopicItem, TopicsForm, type TopicsFormLabels, type TopicsFormProps, TranscriptionMode, type TranscriptionSettings, TranscriptionSettingsForm, type TranscriptionSettingsFormLabels, type TranscriptionSettingsFormProps, type UrlStateOptions, type UseConversationActionsResult, type UseConversationContextResult, type UseConversationDocumentsParams, type UseConversationDocumentsResult, type UseConversationListParams, type UseConversationListResult, type UseConversationMessagesResult, type UseConversationsInboxParams, type UseConversationsInboxResult, type UseInboxActionsResult, type UseScrollToLatestMessageParams, type UseScrollToLatestMessageResult, type UseWaitingNotificationsLabels, type UseWaitingNotificationsParams, type UseWaitingNotificationsResult, type ValidateAttachmentFilesResult, WHATSAPP_MARKER_BY_ACTION, WINDOW_FILTERS, WelcomeFarewellForm, type WelcomeFarewellFormLabels, type WelcomeFarewellFormProps, WhatsAppCreateTemplateForm, type WhatsAppCreateTemplateFormLabels, type WhatsAppCreateTemplateFormProps, type WhatsAppCreateTemplateResult, type WhatsAppCreateTemplateState, WhatsAppMessageEditor, type WhatsAppMessageEditorLabels, type WhatsAppMessageEditorProps, WhatsAppMessagePreview, type WhatsAppMessagePreviewProps, type WhatsAppTemplateHeaderType, WhatsAppTemplateSettingsForm, type WhatsAppTemplateSettingsFormLabels, type WhatsAppTemplateSettingsFormProps, type WhatsAppTemplateSummary, type WhatsAppTemplateVariableSuggestion, WhatsAppTemplatesSettings, type WhatsAppTemplatesSettingsLabels, type WhatsAppTemplatesSettingsProps, WindowExpiredNotice, type WindowExpiredNoticeLabels, type WindowExpiredNoticeProps, type WindowOfParams, applyQuickReplyVariables, buildTranscriptFilename, buildTranscriptText, createMediaUrlResolver, downloadTextFile, filterQuickReplies, formatDateTime, formatFileSize, formatPhone, formatStalledFor, formatTimestamp, highlightMatch, htmlToWA, isReplyOverdue, isSameDay, isWindowBlocking, normalizeForSearch, parseWhatsAppFormatting, phoneInitials, queuedAttachmentsFromQuickReply, replyLatencyOf, resolveMaxAttachmentSizeBytes, resolveQuickReply, searchEmojis, toast, useConversationActions, useConversationContext, useConversationDocuments, useConversationList, useConversationLocales, useConversationMessages, useConversationRealtime, useConversations, useConversationsInbox, useDarkMode, useDebouncedValue, useGlobalRealtime, useInboxActions, useIsDarkTheme, useIsNarrow, useScrollToLatestMessage, useToast, useUrlArrayState, useUrlNumberState, useUrlStringState, useWaitingNotifications, waToHTML, waToHTMLInline, windowOf };
|