@giovchat/react-native 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +333 -2
  3. package/dist/GiovChat.d.ts +100 -0
  4. package/dist/GiovChat.d.ts.map +1 -0
  5. package/dist/GiovChat.js +257 -0
  6. package/dist/GiovChat.js.map +1 -0
  7. package/dist/attachments.d.ts +121 -0
  8. package/dist/attachments.d.ts.map +1 -0
  9. package/dist/attachments.js +185 -0
  10. package/dist/attachments.js.map +1 -0
  11. package/dist/brand-assets.d.ts +6 -0
  12. package/dist/brand-assets.d.ts.map +1 -0
  13. package/dist/brand-assets.js +9 -0
  14. package/dist/brand-assets.js.map +1 -0
  15. package/dist/client.d.ts +190 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +801 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/color.d.ts +25 -0
  20. package/dist/color.d.ts.map +1 -0
  21. package/dist/color.js +78 -0
  22. package/dist/color.js.map +1 -0
  23. package/dist/components/Attachments.d.ts +13 -0
  24. package/dist/components/Attachments.d.ts.map +1 -0
  25. package/dist/components/Attachments.js +42 -0
  26. package/dist/components/Attachments.js.map +1 -0
  27. package/dist/components/Branding.d.ts +6 -0
  28. package/dist/components/Branding.d.ts.map +1 -0
  29. package/dist/components/Branding.js +28 -0
  30. package/dist/components/Branding.js.map +1 -0
  31. package/dist/components/ChatMarkdown.d.ts +15 -0
  32. package/dist/components/ChatMarkdown.d.ts.map +1 -0
  33. package/dist/components/ChatMarkdown.js +72 -0
  34. package/dist/components/ChatMarkdown.js.map +1 -0
  35. package/dist/components/GiovBotMark.d.ts +6 -0
  36. package/dist/components/GiovBotMark.d.ts.map +1 -0
  37. package/dist/components/GiovBotMark.js +11 -0
  38. package/dist/components/GiovBotMark.js.map +1 -0
  39. package/dist/components/GreetingBubble.d.ts +7 -0
  40. package/dist/components/GreetingBubble.d.ts.map +1 -0
  41. package/dist/components/GreetingBubble.js +12 -0
  42. package/dist/components/GreetingBubble.js.map +1 -0
  43. package/dist/components/Header.d.ts +18 -0
  44. package/dist/components/Header.d.ts.map +1 -0
  45. package/dist/components/Header.js +67 -0
  46. package/dist/components/Header.js.map +1 -0
  47. package/dist/components/MessageBubble.d.ts +16 -0
  48. package/dist/components/MessageBubble.d.ts.map +1 -0
  49. package/dist/components/MessageBubble.js +49 -0
  50. package/dist/components/MessageBubble.js.map +1 -0
  51. package/dist/components/PreChatForm.d.ts +11 -0
  52. package/dist/components/PreChatForm.d.ts.map +1 -0
  53. package/dist/components/PreChatForm.js +72 -0
  54. package/dist/components/PreChatForm.js.map +1 -0
  55. package/dist/components/TypingIndicator.d.ts +9 -0
  56. package/dist/components/TypingIndicator.d.ts.map +1 -0
  57. package/dist/components/TypingIndicator.js +18 -0
  58. package/dist/components/TypingIndicator.js.map +1 -0
  59. package/dist/components/WidgetStyles.d.ts +3 -0
  60. package/dist/components/WidgetStyles.d.ts.map +1 -0
  61. package/dist/components/WidgetStyles.js +9 -0
  62. package/dist/components/WidgetStyles.js.map +1 -0
  63. package/dist/components/bubbleStyles.d.ts +47 -0
  64. package/dist/components/bubbleStyles.d.ts.map +1 -0
  65. package/dist/components/bubbleStyles.js +19 -0
  66. package/dist/components/bubbleStyles.js.map +1 -0
  67. package/dist/components/index.d.ts +11 -0
  68. package/dist/components/index.d.ts.map +1 -0
  69. package/dist/components/index.js +14 -0
  70. package/dist/components/index.js.map +1 -0
  71. package/dist/errors.d.ts +18 -0
  72. package/dist/errors.d.ts.map +1 -0
  73. package/dist/errors.js +26 -0
  74. package/dist/errors.js.map +1 -0
  75. package/dist/i18n.d.ts +73 -0
  76. package/dist/i18n.d.ts.map +1 -0
  77. package/dist/i18n.js +292 -0
  78. package/dist/i18n.js.map +1 -0
  79. package/dist/identity.d.ts +41 -0
  80. package/dist/identity.d.ts.map +1 -0
  81. package/dist/identity.js +41 -0
  82. package/dist/identity.js.map +1 -0
  83. package/dist/index.d.ts +20 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +46 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/markdown.d.ts +56 -0
  88. package/dist/markdown.d.ts.map +1 -0
  89. package/dist/markdown.js +219 -0
  90. package/dist/markdown.js.map +1 -0
  91. package/dist/outbox.d.ts +68 -0
  92. package/dist/outbox.d.ts.map +1 -0
  93. package/dist/outbox.js +168 -0
  94. package/dist/outbox.js.map +1 -0
  95. package/dist/protocol.d.ts +9 -0
  96. package/dist/protocol.d.ts.map +1 -0
  97. package/dist/protocol.js +34 -0
  98. package/dist/protocol.js.map +1 -0
  99. package/dist/styleOverrides.d.ts +37 -0
  100. package/dist/styleOverrides.d.ts.map +1 -0
  101. package/dist/styleOverrides.js +54 -0
  102. package/dist/styleOverrides.js.map +1 -0
  103. package/dist/types.d.ts +111 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +3 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/unread.d.ts +9 -0
  108. package/dist/unread.d.ts.map +1 -0
  109. package/dist/unread.js +49 -0
  110. package/dist/unread.js.map +1 -0
  111. package/dist/useChatSession.d.ts +78 -0
  112. package/dist/useChatSession.d.ts.map +1 -0
  113. package/dist/useChatSession.js +796 -0
  114. package/dist/useChatSession.js.map +1 -0
  115. package/package.json +59 -4
  116. package/src/GiovChat.tsx +530 -0
  117. package/src/attachments.ts +218 -0
  118. package/src/brand-assets.ts +5 -0
  119. package/src/client.ts +758 -0
  120. package/src/color.ts +74 -0
  121. package/src/components/Attachments.tsx +75 -0
  122. package/src/components/Branding.tsx +35 -0
  123. package/src/components/ChatMarkdown.tsx +111 -0
  124. package/src/components/GiovBotMark.tsx +19 -0
  125. package/src/components/GreetingBubble.tsx +20 -0
  126. package/src/components/Header.tsx +131 -0
  127. package/src/components/MessageBubble.tsx +121 -0
  128. package/src/components/PreChatForm.tsx +183 -0
  129. package/src/components/TypingIndicator.tsx +34 -0
  130. package/src/components/WidgetStyles.tsx +5 -0
  131. package/src/components/bubbleStyles.ts +16 -0
  132. package/src/components/index.ts +14 -0
  133. package/src/errors.ts +30 -0
  134. package/src/i18n.ts +351 -0
  135. package/src/identity.ts +54 -0
  136. package/src/index.ts +68 -0
  137. package/src/markdown.ts +227 -0
  138. package/src/outbox.ts +175 -0
  139. package/src/protocol.ts +31 -0
  140. package/src/styleOverrides.ts +85 -0
  141. package/src/types.ts +119 -0
  142. package/src/unread.ts +39 -0
  143. package/src/useChatSession.ts +695 -0
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.GiovChat = void 0;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const react_1 = __importStar(require("react"));
39
+ const react_native_1 = require("react-native");
40
+ const useChatSession_1 = require("./useChatSession");
41
+ const components_1 = require("./components");
42
+ const react_native_safe_area_context_1 = require("react-native-safe-area-context");
43
+ const styleOverrides_1 = require("./styleOverrides");
44
+ const WidgetStyles_1 = require("./components/WidgetStyles");
45
+ const Branding_1 = require("./components/Branding");
46
+ const i18n_1 = require("./i18n");
47
+ const identity_1 = require("./identity");
48
+ const markdown_1 = require("./markdown");
49
+ const outbox_1 = require("./outbox");
50
+ const color_1 = require("./color");
51
+ const attachments_1 = require("./attachments");
52
+ const unread_1 = require("./unread");
53
+ // ─── Component ───────────────────────────────────────────────────────────────
54
+ exports.GiovChat = react_1.default.forwardRef(function GiovChat(props, ref) {
55
+ const scope = (0, useChatSession_1.sessionScope)(props.baseUrl ?? "https://api.giovchat.app", props.tenantKey, props.contact, props.sessionKey);
56
+ return (0, jsx_runtime_1.jsx)(GiovChatInstance, { ...props, ref: ref }, scope);
57
+ });
58
+ function errorText(error, strings) {
59
+ switch (error.code) {
60
+ case "invalid_session": return strings.sessionExpired;
61
+ case "conversation_closed": return strings.conversationEnded;
62
+ case "upload_failed": return strings.uploadFailed;
63
+ case "send_failed": return strings.sendFailed;
64
+ case "disconnected":
65
+ case "connection_failed": return strings.reconnecting;
66
+ case "workspace_busy": return strings.busy;
67
+ default: return strings.unavailable;
68
+ }
69
+ }
70
+ function problemText(problem, strings) {
71
+ switch (problem.kind) {
72
+ case "disabled": return strings.attachmentsOff;
73
+ case "type": return strings.typeNotAllowed(problem.name);
74
+ case "size": return strings.fileTooLarge(problem.name, problem.maxSizeMb);
75
+ case "count": return strings.tooManyFiles(problem.max);
76
+ }
77
+ }
78
+ const GiovChatInstance = react_1.default.forwardRef(function GiovChatInstance({ tenantKey, mode = "modal", visible = true, onClose, contact, baseUrl = "https://api.giovchat.app", primaryColor: overridePrimaryColor, theme: themeOverride, styleOverrides, locale, strings: stringOverrides, attachmentPicker, keepConnected, onUnreadCountChange, onConversationStart, sessionKey, sessionStorage, onError, onConnectionStatusChange, }, ref) {
79
+ const systemScheme = (0, react_native_1.useColorScheme)();
80
+ const custom = (0, react_1.useMemo)(() => (0, styleOverrides_1.resolveStyleOverrides)(styleOverrides), [styleOverrides]);
81
+ const strings = (0, react_1.useMemo)(() => (0, i18n_1.resolveStrings)(locale, stringOverrides), [locale, stringOverrides]);
82
+ const scope = (0, useChatSession_1.sessionScope)(baseUrl, tenantKey, contact, sessionKey);
83
+ const chat = (0, useChatSession_1.useChatSession)({
84
+ tenantKey, baseUrl, visible, contact, scope, sessionKey, sessionStorage, keepConnected,
85
+ onError, onConnectionStatusChange, onConversationStart, onUnreadCountChange,
86
+ });
87
+ const { phase, config, messages, agentTyping, agentTypingIsBot, error, sending, uploads, requiredFields, retry, reset, submitContact, send } = chat;
88
+ const [input, setInput] = (0, react_1.useState)("");
89
+ const [files, setFiles] = (0, react_1.useState)([]);
90
+ const [fileProblem, setFileProblem] = (0, react_1.useState)(null);
91
+ const listRef = (0, react_1.useRef)(null);
92
+ const unreadOwner = (0, react_1.useRef)(Symbol("giovchat-unread"));
93
+ (0, react_1.useImperativeHandle)(ref, () => ({
94
+ reset: async () => { setInput(""); setFiles([]); await reset(); },
95
+ registerPushToken: (token, platform, options) => chat.registerPushToken(token, platform, { ...(locale ? { locale } : {}), ...options }),
96
+ unregisterPushToken: chat.unregisterPushToken,
97
+ }), [reset, chat.registerPushToken, chat.unregisterPushToken, locale]);
98
+ (0, react_1.useEffect)(() => {
99
+ const timer = setTimeout(() => listRef.current?.scrollToEnd({ animated: true }), 80);
100
+ return () => clearTimeout(timer);
101
+ }, [messages.length, messages[messages.length - 1]?.content]);
102
+ (0, react_1.useEffect)(() => { (0, unread_1.publishUnreadCount)(unreadOwner.current, tenantKey, chat.unreadCount); }, [tenantKey, chat.unreadCount]);
103
+ // Screen readers hear each reply as it arrives (history is not read out again).
104
+ const incoming = chat.lastIncoming;
105
+ (0, react_1.useEffect)(() => {
106
+ if (!incoming || !visible)
107
+ return;
108
+ const sender = (0, identity_1.messageSenderLabel)(incoming, { botName: config?.botName, agentName: chat.currentAgentName, you: strings.you, automated: strings.automated, agent: strings.agent });
109
+ const text = (0, markdown_1.plainText)(incoming.content) || (incoming.attachments?.length ? strings.attachment : "");
110
+ if (text)
111
+ react_native_1.AccessibilityInfo.announceForAccessibility?.(strings.newMessage(sender, text));
112
+ // Announced once per message: only the message itself triggers it.
113
+ // eslint-disable-next-line react-hooks/exhaustive-deps
114
+ }, [incoming]);
115
+ (0, react_1.useEffect)(() => () => (0, unread_1.forgetUnreadCount)(unreadOwner.current), []);
116
+ const primaryColor = overridePrimaryColor ?? config?.primaryColor ?? "#7c3aed";
117
+ const themeSetting = themeOverride ?? config?.theme;
118
+ const isDark = themeSetting === "dark" || (themeSetting === "auto" && systemScheme === "dark");
119
+ const handleClose = (0, react_1.useCallback)(() => onClose?.(), [onClose]);
120
+ const policy = config?.attachments ?? attachments_1.DEFAULT_ATTACHMENT_POLICY;
121
+ // Uploads need a conversation: the first message starts it, then files can follow.
122
+ const canAttach = !!attachmentPicker && chat.hasConversation && policy.enabled && policy.allowedTypes.length > 0;
123
+ const composing = phase === "ready" || phase === "connecting" || phase === "active";
124
+ const canSend = composing && !sending && (!!input.trim() || files.length > 0);
125
+ const handleSend = async () => {
126
+ const text = input.trim();
127
+ if (!canSend)
128
+ return;
129
+ const sentFiles = files;
130
+ if (await send(text, sentFiles)) {
131
+ setInput((current) => current.trim() === text ? "" : current);
132
+ setFiles((current) => current === sentFiles ? [] : current);
133
+ setFileProblem(null);
134
+ }
135
+ };
136
+ const handleAttach = async () => {
137
+ if (!attachmentPicker)
138
+ return;
139
+ setFileProblem(null);
140
+ try {
141
+ const picked = await attachmentPicker.pick({ allowedTypes: policy.allowedTypes, maxFiles: Math.max(1, attachments_1.MAX_ATTACHED_FILES - files.length), maxSizeMb: policy.maxSizeMb });
142
+ const { accepted, problems } = (0, attachments_1.validateAttachments)(picked, files.length, policy);
143
+ if (accepted.length)
144
+ setFiles((current) => [...current, ...accepted]);
145
+ if (problems.length)
146
+ setFileProblem(problems.map((problem) => problemText(problem, strings)).join(" "));
147
+ }
148
+ catch { /* The picker was dismissed or failed; nothing changes. */ }
149
+ };
150
+ const identity = config ? (0, identity_1.headerIdentity)(config, chat.currentAgentName, chat.currentAgentAvatar) : null;
151
+ const subtitle = phase === "active" || phase === "ready"
152
+ ? identity?.kind === "person" ? strings.statusPerson : identity?.kind === "bot" ? strings.statusBot : strings.statusTeam
153
+ : phase === "connecting" ? strings.connecting : null;
154
+ const showClose = mode === "modal" || !!onClose;
155
+ const bgColor = isDark ? "#0a0a0a" : "#fff";
156
+ // Black or white on the buttons' colour, by WCAG contrast.
157
+ const buttonInk = (0, color_1.textOn)(custom.button.backgroundColor ?? primaryColor);
158
+ // ── Render ───────────────────────────────────────────────────────────────────
159
+ const chatContent = ((0, jsx_runtime_1.jsx)(i18n_1.GiovChatStringsContext.Provider, { value: strings, children: (0, jsx_runtime_1.jsx)(WidgetStyles_1.WidgetStylesContext.Provider, { value: custom, children: (0, jsx_runtime_1.jsxs)(react_native_safe_area_context_1.SafeAreaView, { style: [styles.safeArea, { backgroundColor: bgColor }, custom.container], children: [(0, jsx_runtime_1.jsx)(components_1.Header, { privacyPolicyUrl: config?.privacyPolicyUrl, title: identity?.title ?? config?.title ?? "Chat", subtitle: subtitle, primaryColor: primaryColor, avatarUrl: identity?.avatar, kind: identity?.kind, onClose: showClose ? handleClose : undefined }), (phase === "loading" || phase === "idle") && ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.centered, children: [(0, jsx_runtime_1.jsx)(react_native_1.ActivityIndicator, { size: "large", color: primaryColor }), (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.hint, { color: isDark ? "#555" : "#aaa" }, custom.hint], children: strings.loading })] })), phase === "error" && ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.centered, children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.errorText, custom.errorText], children: error ? errorText(error, strings) : strings.unavailable }), (0, jsx_runtime_1.jsx)(react_native_1.TouchableOpacity, { style: [styles.retryBtn, { backgroundColor: primaryColor }, custom.button], onPress: retry, accessibilityRole: "button", accessibilityLabel: strings.retry, children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.retryBtnText, { color: buttonInk }, custom.buttonText], children: strings.tryAgain }) })] })), phase === "pre-chat" && config?.requestUserInfo && ((0, jsx_runtime_1.jsx)(components_1.PreChatForm, { fields: requiredFields, primaryColor: primaryColor, dark: isDark, initialValues: contact, onSubmit: submitContact })), composing && ((0, jsx_runtime_1.jsxs)(react_native_1.KeyboardAvoidingView, { style: styles.flex, behavior: react_native_1.Platform.OS === "ios" ? "padding" : "height", children: [error && ((0, jsx_runtime_1.jsx)(react_native_1.Text, { accessibilityRole: "alert", style: [styles.errorText, { padding: 10 }, custom.errorText], children: errorText(error, strings) })), (0, jsx_runtime_1.jsx)(react_native_1.FlatList, { ref: listRef, data: messages, keyExtractor: (item) => item.clientMessageId ?? item.id, contentContainerStyle: styles.listContent, ListHeaderComponent: config ? ((0, jsx_runtime_1.jsx)(components_1.GreetingBubble, { text: config.greetingText, dark: isDark })) : null, ListFooterComponent: agentTyping ? (0, jsx_runtime_1.jsx)(components_1.TypingIndicator, { dark: isDark, isBot: agentTypingIsBot, botName: config?.botName }) : null, renderItem: ({ item }) => ((0, jsx_runtime_1.jsx)(components_1.MessageBubble, { message: item, primaryColor: primaryColor, dark: isDark, botName: config?.botName, resolveAttachmentUrl: chat.attachmentUrl, onRetry: (message) => message.clientMessageId && chat.retryMessage(message.clientMessageId), onDiscard: (message) => message.clientMessageId && chat.discardMessage(message.clientMessageId) })) }), (files.length > 0 || fileProblem) && ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [styles.files, { backgroundColor: bgColor, borderTopColor: isDark ? "#1e1e1e" : "#ebebeb" }], children: [fileProblem && (0, jsx_runtime_1.jsx)(react_native_1.Text, { accessibilityRole: "alert", style: [styles.fileProblem, custom.errorText], children: fileProblem }), (0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.fileChips, children: files.map((file, index) => {
160
+ const upload = uploads[index];
161
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [styles.fileChip, { backgroundColor: isDark ? "#1c1c1c" : "#f2f2f2" }], children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.fileChipText, { color: isDark ? "#e5e5e5" : "#222" }, custom.hint], numberOfLines: 1, children: upload ? strings.uploading(Math.round(upload.progress * 100)) : file.name }), !sending && ((0, jsx_runtime_1.jsx)(react_native_1.TouchableOpacity, { onPress: () => setFiles((current) => current.filter((_, i) => i !== index)), accessibilityRole: "button", accessibilityLabel: strings.removeAttachment(file.name), hitSlop: { top: 8, bottom: 8, left: 8, right: 8 }, children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: { color: isDark ? "#aaa" : "#666", fontSize: 14 }, children: "\u2715" }) }))] }, `${file.uri}-${index}`));
162
+ }) })] })), (0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [
163
+ styles.composerRow,
164
+ {
165
+ borderTopColor: isDark ? "#1e1e1e" : "#ebebeb",
166
+ backgroundColor: bgColor,
167
+ },
168
+ custom.composer,
169
+ ], children: [canAttach && ((0, jsx_runtime_1.jsx)(react_native_1.TouchableOpacity, { style: [styles.attachBtn, { borderColor: isDark ? "#2e2e2e" : "#e5e5e5" }], onPress: handleAttach, disabled: sending || files.length >= attachments_1.MAX_ATTACHED_FILES, accessibilityRole: "button", accessibilityLabel: strings.attachFile, children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.attachIcon, { color: isDark ? "#ccc" : "#555" }], children: "+" }) })), (0, jsx_runtime_1.jsx)(react_native_1.TextInput, { style: [
170
+ styles.composerInput,
171
+ {
172
+ color: isDark ? "#f0f0f0" : "#111",
173
+ backgroundColor: isDark ? "#1c1c1c" : "#f5f5f5",
174
+ borderColor: isDark ? "#2e2e2e" : "#e5e5e5",
175
+ },
176
+ custom.input,
177
+ ], value: input,
178
+ // Over the limit (a long paste) the text is cut at 2000, never dropped, and never through an emoji.
179
+ onChangeText: (value) => { setInput((0, outbox_1.clampMessage)(value)); if (value.trim())
180
+ chat.notifyTyping(); }, placeholder: config?.textArea ?? strings.composerPlaceholder, placeholderTextColor: custom.hint.color ?? (isDark ? "#484848" : "#b0b0b0"), accessibilityLabel: strings.messageInput,
181
+ // Typing goes on while files upload; only Send waits.
182
+ editable: composing, multiline: true }), (0, jsx_runtime_1.jsx)(react_native_1.TouchableOpacity, { style: [
183
+ styles.sendBtn,
184
+ { backgroundColor: primaryColor },
185
+ custom.button,
186
+ !canSend && styles.sendBtnOff,
187
+ ], onPress: handleSend, disabled: !canSend, accessibilityRole: "button", accessibilityLabel: strings.sendMessage, children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.sendIcon, { color: buttonInk }, custom.buttonText], children: "\u2191" }) })] })] })), (0, jsx_runtime_1.jsx)(Branding_1.Branding, { showBranding: config?.showBranding })] }) }) }));
188
+ if (mode === "modal") {
189
+ return ((0, jsx_runtime_1.jsx)(react_native_1.Modal, { visible: visible, animationType: "slide", presentationStyle: "pageSheet", onRequestClose: handleClose, children: chatContent }));
190
+ }
191
+ return visible ? chatContent : null;
192
+ });
193
+ const styles = react_native_1.StyleSheet.create({
194
+ flex: { flex: 1 },
195
+ safeArea: { flex: 1 },
196
+ centered: {
197
+ flex: 1,
198
+ alignItems: "center",
199
+ justifyContent: "center",
200
+ gap: 14,
201
+ padding: 24,
202
+ },
203
+ hint: { fontSize: 14, marginTop: 4 },
204
+ errorText: {
205
+ color: "#dc2626",
206
+ fontSize: 14,
207
+ textAlign: "center",
208
+ lineHeight: 20,
209
+ },
210
+ retryBtn: {
211
+ borderRadius: 8,
212
+ paddingHorizontal: 28,
213
+ paddingVertical: 11,
214
+ },
215
+ retryBtnText: { color: "#fff", fontWeight: "600", fontSize: 14 },
216
+ listContent: { paddingBottom: 12 },
217
+ files: { paddingHorizontal: 10, paddingTop: 8, borderTopWidth: react_native_1.StyleSheet.hairlineWidth, gap: 6 },
218
+ fileProblem: { color: "#dc2626", fontSize: 12 },
219
+ fileChips: { flexDirection: "row", flexWrap: "wrap", gap: 6 },
220
+ fileChip: { flexDirection: "row", alignItems: "center", gap: 6, borderRadius: 14, paddingHorizontal: 10, paddingVertical: 5, maxWidth: 220 },
221
+ fileChipText: { fontSize: 12, flexShrink: 1 },
222
+ composerRow: {
223
+ flexDirection: "row",
224
+ alignItems: "flex-end",
225
+ gap: 8,
226
+ padding: 10,
227
+ borderTopWidth: react_native_1.StyleSheet.hairlineWidth,
228
+ },
229
+ attachBtn: {
230
+ width: 40,
231
+ height: 40,
232
+ borderRadius: 20,
233
+ borderWidth: 1,
234
+ alignItems: "center",
235
+ justifyContent: "center",
236
+ },
237
+ attachIcon: { fontSize: 22, lineHeight: 24 },
238
+ composerInput: {
239
+ flex: 1,
240
+ borderWidth: 1,
241
+ borderRadius: 22,
242
+ paddingHorizontal: 14,
243
+ paddingVertical: react_native_1.Platform.OS === "ios" ? 10 : 8,
244
+ fontSize: 14,
245
+ maxHeight: 120,
246
+ },
247
+ sendBtn: {
248
+ width: 40,
249
+ height: 40,
250
+ borderRadius: 20,
251
+ alignItems: "center",
252
+ justifyContent: "center",
253
+ },
254
+ sendBtnOff: { opacity: 0.35 },
255
+ sendIcon: { color: "#fff", fontSize: 18, fontWeight: "700", lineHeight: 22 },
256
+ });
257
+ //# sourceMappingURL=GiovChat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GiovChat.js","sourceRoot":"","sources":["../src/GiovChat.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Attachments, as the web widget handles them (apps/widget-web/src/lib/attachment-policy.ts,
3
+ * attachment-preview.ts and attachment-access.ts): the agent's policy decides what a visitor may
4
+ * send, previews arrive from the network and are validated field by field, and downloads carry a
5
+ * narrow per-conversation access token. Pure: no React or native modules.
6
+ */
7
+ /** A file the host's picker returned. `uri` is what React Native's FormData uploads (file://, content://). */
8
+ export interface GiovChatPickedFile {
9
+ uri: string;
10
+ name: string;
11
+ /** MIME type, e.g. "image/jpeg". Files without one are rejected by the policy check. */
12
+ type: string;
13
+ /** Bytes, when the picker knows it; the server enforces the limit either way. */
14
+ size?: number;
15
+ /** Image dimensions, when the picker knows them; used for the placeholder box. */
16
+ width?: number;
17
+ height?: number;
18
+ /**
19
+ * Optional low-resolution placeholder, `data:image/jpeg;base64,…` (or webp) under 6,000 characters,
20
+ * e.g. from expo-image-manipulator. With width and height it is stored, so every viewer sees the
21
+ * image's shape before it loads. Without it the image simply loads in place.
22
+ */
23
+ thumbnail?: string;
24
+ }
25
+ /**
26
+ * Supplied by the host app to enable attachments: open the platform's picker and return what the
27
+ * visitor chose (an empty array when they cancel). The SDK ships no native modules; see the README
28
+ * for expo-document-picker, expo-image-picker and react-native-document-picker adapters.
29
+ */
30
+ export interface GiovChatAttachmentPicker {
31
+ pick(options: {
32
+ allowedTypes: string[];
33
+ maxFiles: number;
34
+ maxSizeMb: number;
35
+ }): Promise<GiovChatPickedFile[]>;
36
+ }
37
+ export type GiovAttachmentPreview = {
38
+ thumb?: string;
39
+ width?: number;
40
+ height?: number;
41
+ };
42
+ export interface GiovAttachment {
43
+ url: string;
44
+ /** Empty when the server did not say; the UI then names it by type. */
45
+ filename: string;
46
+ preview?: GiovAttachmentPreview;
47
+ /** Known only for files sent from this device. */
48
+ contentType?: string;
49
+ }
50
+ export interface GiovAttachmentPolicy {
51
+ enabled: boolean;
52
+ allowedTypes: string[];
53
+ maxSizeMb: number;
54
+ }
55
+ export declare const SUPPORTED_ATTACHMENT_TYPES: string[];
56
+ /** Without a published agent policy, visitors may send images (the widget's default). */
57
+ export declare const DEFAULT_ATTACHMENT_POLICY: GiovAttachmentPolicy;
58
+ export declare const MAX_ATTACHED_FILES = 5;
59
+ export declare function normalizeAttachmentPolicy(value: unknown): GiovAttachmentPolicy | undefined;
60
+ export type AttachmentProblem = {
61
+ kind: "disabled";
62
+ } | {
63
+ kind: "type";
64
+ name: string;
65
+ } | {
66
+ kind: "size";
67
+ name: string;
68
+ maxSizeMb: number;
69
+ } | {
70
+ kind: "count";
71
+ max: number;
72
+ };
73
+ /** The picker's files checked against the policy; the server remains authoritative. */
74
+ export declare function validateAttachments<T extends {
75
+ name: string;
76
+ type: string;
77
+ size?: number;
78
+ }>(files: T[], existingCount?: number, policy?: GiovAttachmentPolicy): {
79
+ accepted: T[];
80
+ problems: AttachmentProblem[];
81
+ };
82
+ /** Keeps only the parts of an untrusted preview that are safe to render. */
83
+ export declare function sanitizePreview(value: unknown): GiovAttachmentPreview | undefined;
84
+ /**
85
+ * `attachmentId` is a JSON-encoded array of URLs (the socket and history both send it that way).
86
+ * `previews` is a real array aligned with it by index; anything else means no previews.
87
+ */
88
+ export declare function parseAttachments(attachmentId: unknown, previews?: unknown): GiovAttachment[];
89
+ /** Mirrors the widget's attachment image cap. */
90
+ export declare const MAX_IMAGE_WIDTH = 200;
91
+ export declare const MAX_IMAGE_HEIGHT = 150;
92
+ /** Display box for an image, scaled down (never up) to fit the cap. */
93
+ export declare function previewBoxSize(preview: GiovAttachmentPreview | undefined, maxWidth?: number, maxHeight?: number): {
94
+ width: number;
95
+ height: number;
96
+ } | null;
97
+ /** Images render inline; everything else is a file row. */
98
+ export declare function isImageAttachment(attachment: Pick<GiovAttachment, "url" | "contentType" | "preview">): boolean;
99
+ /** A readable name for a file row: the known filename, else the last path segment of the URL. */
100
+ export declare function attachmentName(attachment: Pick<GiovAttachment, "url" | "filename">): string;
101
+ /**
102
+ * Narrow credential for downloading the attachments of one conversation; the server keeps it the
103
+ * same for hours, so a URL built with it stays stable and images can be cached. Milliseconds.
104
+ */
105
+ export type AttachmentAccess = {
106
+ token: string;
107
+ expiresAt: number;
108
+ };
109
+ /** Stop using a token this long before it expires, so a download never starts with a dying one. */
110
+ export declare const ATTACHMENT_ACCESS_MARGIN_MS: number;
111
+ export declare function parseAttachmentAccess(value: unknown): AttachmentAccess | null;
112
+ export declare function usableAttachmentToken(access: AttachmentAccess | null | undefined, now: number): string | undefined;
113
+ /** Keeps the stored value unless the response carried one that expires no earlier. */
114
+ export declare function newerAttachmentAccess(current: AttachmentAccess | null, incoming: AttachmentAccess | null): AttachmentAccess | null;
115
+ /** Adds exactly one credential: `at` when an access token is usable, else the visitor token, else nothing. */
116
+ export declare function attachmentDisplayUrl(url: string, accessToken?: string | null, visitorToken?: string | null): string;
117
+ /** The preview the upload can carry: all three fields or none, as the server requires. */
118
+ export declare function uploadPreview(file: GiovChatPickedFile): Required<GiovAttachmentPreview> | null;
119
+ /** React Native's FormData takes `{ uri, name, type }` for a file part; the preview fields are optional extras. */
120
+ export declare function buildUploadForm(file: GiovChatPickedFile): FormData;
121
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ /**
3
+ * Attachments, as the web widget handles them (apps/widget-web/src/lib/attachment-policy.ts,
4
+ * attachment-preview.ts and attachment-access.ts): the agent's policy decides what a visitor may
5
+ * send, previews arrive from the network and are validated field by field, and downloads carry a
6
+ * narrow per-conversation access token. Pure: no React or native modules.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ATTACHMENT_ACCESS_MARGIN_MS = exports.MAX_IMAGE_HEIGHT = exports.MAX_IMAGE_WIDTH = exports.MAX_ATTACHED_FILES = exports.DEFAULT_ATTACHMENT_POLICY = exports.SUPPORTED_ATTACHMENT_TYPES = void 0;
10
+ exports.normalizeAttachmentPolicy = normalizeAttachmentPolicy;
11
+ exports.validateAttachments = validateAttachments;
12
+ exports.sanitizePreview = sanitizePreview;
13
+ exports.parseAttachments = parseAttachments;
14
+ exports.previewBoxSize = previewBoxSize;
15
+ exports.isImageAttachment = isImageAttachment;
16
+ exports.attachmentName = attachmentName;
17
+ exports.parseAttachmentAccess = parseAttachmentAccess;
18
+ exports.usableAttachmentToken = usableAttachmentToken;
19
+ exports.newerAttachmentAccess = newerAttachmentAccess;
20
+ exports.attachmentDisplayUrl = attachmentDisplayUrl;
21
+ exports.uploadPreview = uploadPreview;
22
+ exports.buildUploadForm = buildUploadForm;
23
+ // The visitor upload endpoint accepts this bounded set; a wildcard cannot enable other types.
24
+ exports.SUPPORTED_ATTACHMENT_TYPES = [
25
+ "image/jpeg", "image/png", "image/gif", "image/webp", "application/pdf", "text/plain", "text/csv",
26
+ "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
27
+ "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
28
+ "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation",
29
+ "audio/mpeg", "audio/mp4", "audio/ogg", "audio/webm", "audio/wav",
30
+ ];
31
+ const LEGACY_IMAGE_TYPES = exports.SUPPORTED_ATTACHMENT_TYPES.filter((type) => type.startsWith("image/"));
32
+ /** Without a published agent policy, visitors may send images (the widget's default). */
33
+ exports.DEFAULT_ATTACHMENT_POLICY = { enabled: true, allowedTypes: LEGACY_IMAGE_TYPES, maxSizeMb: 10 };
34
+ exports.MAX_ATTACHED_FILES = 5;
35
+ function normalizeAttachmentPolicy(value) {
36
+ if (!value || typeof value !== "object" || Array.isArray(value))
37
+ return undefined;
38
+ const raw = value;
39
+ const patterns = Array.isArray(raw.allowedTypes)
40
+ ? raw.allowedTypes.filter((type) => typeof type === "string").map((type) => type.toLowerCase())
41
+ : LEGACY_IMAGE_TYPES;
42
+ return {
43
+ enabled: raw.enabled !== false,
44
+ allowedTypes: exports.SUPPORTED_ATTACHMENT_TYPES.filter((type) => patterns.some((pattern) => pattern === "*" || pattern === type || (pattern.endsWith("/*") && type.startsWith(pattern.slice(0, -1))))),
45
+ maxSizeMb: typeof raw.maxSizeMb === "number" && Number.isFinite(raw.maxSizeMb)
46
+ ? Math.max(0.1, Math.min(10, raw.maxSizeMb)) : 10,
47
+ };
48
+ }
49
+ /** The picker's files checked against the policy; the server remains authoritative. */
50
+ function validateAttachments(files, existingCount = 0, policy = exports.DEFAULT_ATTACHMENT_POLICY) {
51
+ if (!policy.enabled)
52
+ return { accepted: [], problems: files.length ? [{ kind: "disabled" }] : [] };
53
+ const accepted = [];
54
+ const problems = [];
55
+ const capacity = Math.max(0, exports.MAX_ATTACHED_FILES - existingCount);
56
+ for (const file of files) {
57
+ if (!policy.allowedTypes.includes(String(file.type).toLowerCase()))
58
+ problems.push({ kind: "type", name: file.name });
59
+ else if (typeof file.size === "number" && file.size > policy.maxSizeMb * 1024 * 1024)
60
+ problems.push({ kind: "size", name: file.name, maxSizeMb: policy.maxSizeMb });
61
+ else if (accepted.length >= capacity) {
62
+ if (!problems.some((problem) => problem.kind === "count"))
63
+ problems.push({ kind: "count", max: exports.MAX_ATTACHED_FILES });
64
+ }
65
+ else
66
+ accepted.push(file);
67
+ }
68
+ return { accepted, problems };
69
+ }
70
+ const MAX_THUMB_LENGTH = 6000;
71
+ const THUMB_PATTERN = /^data:image\/(jpeg|webp);base64,[A-Za-z0-9+/=]+$/;
72
+ const dimension = (value) => typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
73
+ /** Keeps only the parts of an untrusted preview that are safe to render. */
74
+ function sanitizePreview(value) {
75
+ if (!value || typeof value !== "object")
76
+ return undefined;
77
+ const raw = value;
78
+ const preview = {};
79
+ if (typeof raw.thumb === "string" && raw.thumb.length <= MAX_THUMB_LENGTH && THUMB_PATTERN.test(raw.thumb))
80
+ preview.thumb = raw.thumb;
81
+ const width = dimension(raw.width), height = dimension(raw.height);
82
+ // An aspect ratio needs both sides, so a lone dimension is dropped.
83
+ if (width && height) {
84
+ preview.width = width;
85
+ preview.height = height;
86
+ }
87
+ return preview.thumb || preview.width ? preview : undefined;
88
+ }
89
+ /**
90
+ * `attachmentId` is a JSON-encoded array of URLs (the socket and history both send it that way).
91
+ * `previews` is a real array aligned with it by index; anything else means no previews.
92
+ */
93
+ function parseAttachments(attachmentId, previews) {
94
+ if (!attachmentId || typeof attachmentId !== "string")
95
+ return [];
96
+ try {
97
+ const urls = JSON.parse(attachmentId);
98
+ if (!Array.isArray(urls))
99
+ return [];
100
+ const list = Array.isArray(previews) ? previews : [];
101
+ return urls.filter((url) => typeof url === "string" && url.length > 0).map((url, index) => {
102
+ const preview = sanitizePreview(list[index]);
103
+ return preview ? { url, filename: "", preview } : { url, filename: "" };
104
+ });
105
+ }
106
+ catch {
107
+ return [];
108
+ }
109
+ }
110
+ /** Mirrors the widget's attachment image cap. */
111
+ exports.MAX_IMAGE_WIDTH = 200;
112
+ exports.MAX_IMAGE_HEIGHT = 150;
113
+ /** Display box for an image, scaled down (never up) to fit the cap. */
114
+ function previewBoxSize(preview, maxWidth = exports.MAX_IMAGE_WIDTH, maxHeight = exports.MAX_IMAGE_HEIGHT) {
115
+ if (!preview?.width || !preview.height)
116
+ return null;
117
+ const scale = Math.min(1, maxWidth / preview.width, maxHeight / preview.height);
118
+ return { width: Math.max(1, Math.round(preview.width * scale)), height: Math.max(1, Math.round(preview.height * scale)) };
119
+ }
120
+ const IMAGE_EXTENSION = /\.(jpe?g|png|gif|webp)$/i;
121
+ /** Images render inline; everything else is a file row. */
122
+ function isImageAttachment(attachment) {
123
+ if (attachment.contentType)
124
+ return attachment.contentType.startsWith("image/");
125
+ if (attachment.preview)
126
+ return true;
127
+ try {
128
+ return IMAGE_EXTENSION.test(decodeURIComponent(new URL(attachment.url).pathname));
129
+ }
130
+ catch {
131
+ return IMAGE_EXTENSION.test(attachment.url);
132
+ }
133
+ }
134
+ /** A readable name for a file row: the known filename, else the last path segment of the URL. */
135
+ function attachmentName(attachment) {
136
+ if (attachment.filename)
137
+ return attachment.filename;
138
+ try {
139
+ const last = decodeURIComponent(new URL(attachment.url).pathname).split("/").filter(Boolean).pop();
140
+ return last || "";
141
+ }
142
+ catch {
143
+ return "";
144
+ }
145
+ }
146
+ const ACCESS_TOKEN = /^[A-Za-z0-9._-]{16,256}$/;
147
+ /** Stop using a token this long before it expires, so a download never starts with a dying one. */
148
+ exports.ATTACHMENT_ACCESS_MARGIN_MS = 5 * 60 * 1000;
149
+ function parseAttachmentAccess(value) {
150
+ const { token, expiresAt } = (value ?? {});
151
+ return typeof token === "string" && ACCESS_TOKEN.test(token) && typeof expiresAt === "number" && Number.isFinite(expiresAt)
152
+ ? { token, expiresAt } : null;
153
+ }
154
+ function usableAttachmentToken(access, now) {
155
+ return access && access.expiresAt - now > exports.ATTACHMENT_ACCESS_MARGIN_MS ? access.token : undefined;
156
+ }
157
+ /** Keeps the stored value unless the response carried one that expires no earlier. */
158
+ function newerAttachmentAccess(current, incoming) {
159
+ return incoming && !(current && current.expiresAt > incoming.expiresAt) ? incoming : current;
160
+ }
161
+ /** Adds exactly one credential: `at` when an access token is usable, else the visitor token, else nothing. */
162
+ function attachmentDisplayUrl(url, accessToken, visitorToken) {
163
+ const credential = accessToken ? `at=${accessToken}` : visitorToken ? `token=${encodeURIComponent(visitorToken)}` : "";
164
+ return credential ? `${url}${url.includes("?") ? "&" : "?"}${credential}` : url;
165
+ }
166
+ /** The preview the upload can carry: all three fields or none, as the server requires. */
167
+ function uploadPreview(file) {
168
+ if (!file.type.startsWith("image/"))
169
+ return null;
170
+ const preview = sanitizePreview({ thumb: file.thumbnail, width: file.width, height: file.height });
171
+ return preview?.thumb && preview.width && preview.height ? { thumb: preview.thumb, width: preview.width, height: preview.height } : null;
172
+ }
173
+ /** React Native's FormData takes `{ uri, name, type }` for a file part; the preview fields are optional extras. */
174
+ function buildUploadForm(file) {
175
+ const form = new FormData();
176
+ form.append("file", { uri: file.uri, name: file.name || "file", type: file.type });
177
+ const preview = uploadPreview(file);
178
+ if (preview) {
179
+ form.append("thumbnail", preview.thumb);
180
+ form.append("width", String(Math.round(preview.width)));
181
+ form.append("height", String(Math.round(preview.height)));
182
+ }
183
+ return form;
184
+ }
185
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"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"}