@adatechnology/conversations-ui 0.1.0-rc.25 → 0.1.0-rc.27
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-DXPSPUWF.js +110 -0
- package/dist/{chunk-TV4OQRGH.js → chunk-UZJBYD5O.js} +123 -45
- package/dist/{chunk-2AYDBWNE.js → chunk-WCBDXZ3X.js} +13 -3
- package/dist/flows/index.d.ts +3 -1
- package/dist/flows/index.js +61 -18
- package/dist/index.d.ts +37 -10
- package/dist/index.js +694 -297
- package/dist/preview/index.js +3 -3
- package/dist/styles.css +119 -6
- package/package.json +1 -1
- package/src/AudioPlayer.tsx +8 -0
- package/src/AudioRecorderButton.test.tsx +3 -3
- package/src/AudioRecorderButton.tsx +3 -3
- package/src/AudioTranscription.tsx +4 -1
- package/src/Avatar.tsx +1 -1
- package/src/ConversationContextPanel.tsx +2 -2
- package/src/ConversationDocumentsPanel.tsx +11 -6
- package/src/ConversationHeader.test.tsx +66 -0
- package/src/ConversationHeader.tsx +147 -47
- package/src/ConversationListItem.tsx +3 -2
- package/src/ConversationRow.tsx +31 -7
- package/src/DocumentsLibrary.tsx +9 -4
- package/src/EmojiPicker.tsx +2 -1
- package/src/InteractiveMessage.tsx +3 -0
- package/src/Lightbox.tsx +1 -1
- package/src/MediaRenderer.tsx +2 -0
- package/src/MessageBubble.test.tsx +41 -0
- package/src/MessageBubble.tsx +27 -8
- package/src/MessageComposer.tsx +11 -8
- package/src/RichMessageComposer.test.tsx +42 -12
- package/src/RichMessageComposer.tsx +216 -45
- package/src/SimpleEmojiPicker.tsx +5 -3
- package/src/StatusTicks.tsx +1 -1
- package/src/Toast.tsx +4 -0
- package/src/Tooltip.test.ts +42 -0
- package/src/Tooltip.tsx +164 -0
- package/src/WhatsAppMessageEditor.tsx +4 -4
- package/src/WindowExpiredNotice.tsx +12 -4
- package/src/composer.constant.ts +33 -0
- package/src/conversationWindow.ts +7 -5
- package/src/documents/DocumentsWorkspace.tsx +10 -6
- package/src/flows/FlowGroupHeader.tsx +2 -2
- package/src/flows/FlowMapNode.tsx +2 -1
- package/src/flows/FlowNodeCard.tsx +3 -3
- package/src/flows/FlowNodePanel.tsx +6 -5
- package/src/flows/FlowPalette.tsx +7 -1
- package/src/flows/FlowPortalNode.tsx +1 -1
- package/src/flows/FlowsWorkspace.tsx +16 -5
- package/src/flows/labels.ts +4 -0
- package/src/hooks/useContainerWidth.ts +35 -0
- package/src/hooks/useConversationRealtime.ts +10 -8
- package/src/icon.constant.ts +12 -0
- package/src/index.ts +1 -0
- package/src/lib/composer-formatting.test.ts +78 -0
- package/src/lib/composer-formatting.ts +145 -0
- package/src/lib/whatsapp-formatting.test.tsx +37 -0
- package/src/lib/whatsapp-formatting.tsx +28 -3
- package/src/listing/index.tsx +5 -1
- package/src/pagination.constant.ts +10 -0
- package/src/preview/ConversationSimulatorPanel.tsx +1 -1
- package/src/providers/ConversationsProvider.tsx +8 -6
- package/src/settings/MessagesWorkspace.tsx +3 -0
- package/src/settings/TopicsForm.tsx +2 -0
- package/src/settings/TranscriptionSettingsForm.test.tsx +1 -1
- package/src/settings/TranscriptionSettingsForm.tsx +1 -0
- package/src/settings/WelcomeFarewellForm.tsx +1 -0
- package/src/settings/WhatsAppCreateTemplateForm.tsx +1 -0
- package/src/settings/WhatsAppTemplateSettingsForm.tsx +5 -2
- package/src/settings/WhatsAppTemplatesSettings.tsx +2 -0
- package/src/styles.css +100 -4
- package/src/workspace/BulkTemplateModal.tsx +4 -2
- package/src/workspace/ConversationPane.tsx +49 -19
- package/src/workspace/ConversationsInboxList.tsx +17 -8
- package/src/workspace/ConversationsWorkspace.tsx +24 -16
- package/src/workspace/useConversationsInbox.ts +5 -2
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// src/Tooltip.tsx
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
var TOOLTIP_ATTRIBUTE = "data-cv-tooltip";
|
|
6
|
+
var TOOLTIP_DELAY_MS = 120;
|
|
7
|
+
var TOOLTIP_GAP_PX = 8;
|
|
8
|
+
var TOOLTIP_EDGE_PX = 72;
|
|
9
|
+
function tooltipPositionOf({ targetRect, viewportWidth }) {
|
|
10
|
+
const placement = targetRect.top < TOOLTIP_EDGE_PX ? "bottom" : "top";
|
|
11
|
+
const centerX = targetRect.left + targetRect.width / 2;
|
|
12
|
+
return {
|
|
13
|
+
left: Math.min(Math.max(centerX, TOOLTIP_EDGE_PX), viewportWidth - TOOLTIP_EDGE_PX),
|
|
14
|
+
top: placement === "top" ? targetRect.top - TOOLTIP_GAP_PX : targetRect.bottom + TOOLTIP_GAP_PX,
|
|
15
|
+
placement
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function tooltipStateFor(target, text) {
|
|
19
|
+
const position = tooltipPositionOf({
|
|
20
|
+
targetRect: target.getBoundingClientRect(),
|
|
21
|
+
viewportWidth: window.innerWidth
|
|
22
|
+
});
|
|
23
|
+
return { text, ...position };
|
|
24
|
+
}
|
|
25
|
+
var layerOwner;
|
|
26
|
+
function TooltipLayer() {
|
|
27
|
+
const identity = useRef({});
|
|
28
|
+
const [isOwner, setIsOwner] = useState(false);
|
|
29
|
+
const [tooltip, setTooltip] = useState(void 0);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
const owned = identity.current;
|
|
32
|
+
if (layerOwner && layerOwner !== owned) return void 0;
|
|
33
|
+
layerOwner = owned;
|
|
34
|
+
setIsOwner(true);
|
|
35
|
+
return () => {
|
|
36
|
+
if (layerOwner === owned) layerOwner = void 0;
|
|
37
|
+
};
|
|
38
|
+
}, []);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (!isOwner) return void 0;
|
|
41
|
+
let timer;
|
|
42
|
+
function cancelPending() {
|
|
43
|
+
if (timer) clearTimeout(timer);
|
|
44
|
+
timer = void 0;
|
|
45
|
+
}
|
|
46
|
+
function hide() {
|
|
47
|
+
cancelPending();
|
|
48
|
+
setTooltip(void 0);
|
|
49
|
+
}
|
|
50
|
+
function handleEnter(event) {
|
|
51
|
+
const origin = event.target;
|
|
52
|
+
if (!(origin instanceof Element)) return;
|
|
53
|
+
const target = origin.closest(`[${TOOLTIP_ATTRIBUTE}]`);
|
|
54
|
+
if (!(target instanceof HTMLElement)) {
|
|
55
|
+
hide();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const text = target.getAttribute(TOOLTIP_ATTRIBUTE);
|
|
59
|
+
if (!text) {
|
|
60
|
+
hide();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
cancelPending();
|
|
64
|
+
timer = setTimeout(() => setTooltip(tooltipStateFor(target, text)), TOOLTIP_DELAY_MS);
|
|
65
|
+
}
|
|
66
|
+
function handleLeaveWindow(event) {
|
|
67
|
+
if (!event.relatedTarget) hide();
|
|
68
|
+
}
|
|
69
|
+
function handleKeyDown(event) {
|
|
70
|
+
if (event.key === "Escape") hide();
|
|
71
|
+
}
|
|
72
|
+
document.addEventListener("pointerover", handleEnter);
|
|
73
|
+
document.addEventListener("pointerout", handleLeaveWindow);
|
|
74
|
+
document.addEventListener("focusin", handleEnter);
|
|
75
|
+
document.addEventListener("pointerdown", hide);
|
|
76
|
+
document.addEventListener("focusout", hide);
|
|
77
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
78
|
+
window.addEventListener("scroll", hide, true);
|
|
79
|
+
window.addEventListener("resize", hide);
|
|
80
|
+
return () => {
|
|
81
|
+
cancelPending();
|
|
82
|
+
document.removeEventListener("pointerover", handleEnter);
|
|
83
|
+
document.removeEventListener("pointerout", handleLeaveWindow);
|
|
84
|
+
document.removeEventListener("focusin", handleEnter);
|
|
85
|
+
document.removeEventListener("pointerdown", hide);
|
|
86
|
+
document.removeEventListener("focusout", hide);
|
|
87
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
88
|
+
window.removeEventListener("scroll", hide, true);
|
|
89
|
+
window.removeEventListener("resize", hide);
|
|
90
|
+
};
|
|
91
|
+
}, [isOwner]);
|
|
92
|
+
if (!tooltip) return null;
|
|
93
|
+
return createPortal(
|
|
94
|
+
/* @__PURE__ */ jsx(
|
|
95
|
+
"div",
|
|
96
|
+
{
|
|
97
|
+
role: "tooltip",
|
|
98
|
+
className: `cv-tooltip cv-tooltip--${tooltip.placement}`,
|
|
99
|
+
style: { left: tooltip.left, top: tooltip.top },
|
|
100
|
+
children: tooltip.text
|
|
101
|
+
}
|
|
102
|
+
),
|
|
103
|
+
document.body
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export {
|
|
108
|
+
TOOLTIP_ATTRIBUTE,
|
|
109
|
+
TooltipLayer
|
|
110
|
+
};
|