@giovchat/react-native 0.0.0-stage → 0.3.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 (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +390 -2
  3. package/dist/GiovChat.d.ts +135 -0
  4. package/dist/GiovChat.d.ts.map +1 -0
  5. package/dist/GiovChat.js +294 -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/brandingStyle.d.ts +38 -0
  16. package/dist/brandingStyle.d.ts.map +1 -0
  17. package/dist/brandingStyle.js +71 -0
  18. package/dist/brandingStyle.js.map +1 -0
  19. package/dist/client.d.ts +226 -0
  20. package/dist/client.d.ts.map +1 -0
  21. package/dist/client.js +891 -0
  22. package/dist/client.js.map +1 -0
  23. package/dist/color.d.ts +25 -0
  24. package/dist/color.d.ts.map +1 -0
  25. package/dist/color.js +78 -0
  26. package/dist/color.js.map +1 -0
  27. package/dist/components/Attachments.d.ts +13 -0
  28. package/dist/components/Attachments.d.ts.map +1 -0
  29. package/dist/components/Attachments.js +42 -0
  30. package/dist/components/Attachments.js.map +1 -0
  31. package/dist/components/Branding.d.ts +29 -0
  32. package/dist/components/Branding.d.ts.map +1 -0
  33. package/dist/components/Branding.js +71 -0
  34. package/dist/components/Branding.js.map +1 -0
  35. package/dist/components/ChatMarkdown.d.ts +15 -0
  36. package/dist/components/ChatMarkdown.d.ts.map +1 -0
  37. package/dist/components/ChatMarkdown.js +72 -0
  38. package/dist/components/ChatMarkdown.js.map +1 -0
  39. package/dist/components/GiovBotMark.d.ts +6 -0
  40. package/dist/components/GiovBotMark.d.ts.map +1 -0
  41. package/dist/components/GiovBotMark.js +11 -0
  42. package/dist/components/GiovBotMark.js.map +1 -0
  43. package/dist/components/GreetingBubble.d.ts +7 -0
  44. package/dist/components/GreetingBubble.d.ts.map +1 -0
  45. package/dist/components/GreetingBubble.js +12 -0
  46. package/dist/components/GreetingBubble.js.map +1 -0
  47. package/dist/components/Header.d.ts +18 -0
  48. package/dist/components/Header.d.ts.map +1 -0
  49. package/dist/components/Header.js +67 -0
  50. package/dist/components/Header.js.map +1 -0
  51. package/dist/components/MessageBubble.d.ts +23 -0
  52. package/dist/components/MessageBubble.d.ts.map +1 -0
  53. package/dist/components/MessageBubble.js +51 -0
  54. package/dist/components/MessageBubble.js.map +1 -0
  55. package/dist/components/PreChatForm.d.ts +11 -0
  56. package/dist/components/PreChatForm.d.ts.map +1 -0
  57. package/dist/components/PreChatForm.js +72 -0
  58. package/dist/components/PreChatForm.js.map +1 -0
  59. package/dist/components/RatingCard.d.ts +23 -0
  60. package/dist/components/RatingCard.d.ts.map +1 -0
  61. package/dist/components/RatingCard.js +107 -0
  62. package/dist/components/RatingCard.js.map +1 -0
  63. package/dist/components/TypingIndicator.d.ts +9 -0
  64. package/dist/components/TypingIndicator.d.ts.map +1 -0
  65. package/dist/components/TypingIndicator.js +18 -0
  66. package/dist/components/TypingIndicator.js.map +1 -0
  67. package/dist/components/WidgetStyles.d.ts +3 -0
  68. package/dist/components/WidgetStyles.d.ts.map +1 -0
  69. package/dist/components/WidgetStyles.js +9 -0
  70. package/dist/components/WidgetStyles.js.map +1 -0
  71. package/dist/components/bubbleStyles.d.ts +47 -0
  72. package/dist/components/bubbleStyles.d.ts.map +1 -0
  73. package/dist/components/bubbleStyles.js +19 -0
  74. package/dist/components/bubbleStyles.js.map +1 -0
  75. package/dist/components/index.d.ts +11 -0
  76. package/dist/components/index.d.ts.map +1 -0
  77. package/dist/components/index.js +14 -0
  78. package/dist/components/index.js.map +1 -0
  79. package/dist/errors.d.ts +20 -0
  80. package/dist/errors.d.ts.map +1 -0
  81. package/dist/errors.js +26 -0
  82. package/dist/errors.js.map +1 -0
  83. package/dist/i18n.d.ts +96 -0
  84. package/dist/i18n.d.ts.map +1 -0
  85. package/dist/i18n.js +392 -0
  86. package/dist/i18n.js.map +1 -0
  87. package/dist/identity.d.ts +41 -0
  88. package/dist/identity.d.ts.map +1 -0
  89. package/dist/identity.js +41 -0
  90. package/dist/identity.js.map +1 -0
  91. package/dist/index.d.ts +30 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +64 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/markdown.d.ts +56 -0
  96. package/dist/markdown.d.ts.map +1 -0
  97. package/dist/markdown.js +219 -0
  98. package/dist/markdown.js.map +1 -0
  99. package/dist/outbox.d.ts +68 -0
  100. package/dist/outbox.d.ts.map +1 -0
  101. package/dist/outbox.js +168 -0
  102. package/dist/outbox.js.map +1 -0
  103. package/dist/protocol.d.ts +9 -0
  104. package/dist/protocol.d.ts.map +1 -0
  105. package/dist/protocol.js +39 -0
  106. package/dist/protocol.js.map +1 -0
  107. package/dist/rating.d.ts +41 -0
  108. package/dist/rating.d.ts.map +1 -0
  109. package/dist/rating.js +165 -0
  110. package/dist/rating.js.map +1 -0
  111. package/dist/ratingStore.d.ts +36 -0
  112. package/dist/ratingStore.d.ts.map +1 -0
  113. package/dist/ratingStore.js +55 -0
  114. package/dist/ratingStore.js.map +1 -0
  115. package/dist/styleOverrides.d.ts +45 -0
  116. package/dist/styleOverrides.d.ts.map +1 -0
  117. package/dist/styleOverrides.js +63 -0
  118. package/dist/styleOverrides.js.map +1 -0
  119. package/dist/types.d.ts +156 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +3 -0
  122. package/dist/types.js.map +1 -0
  123. package/dist/unread.d.ts +9 -0
  124. package/dist/unread.d.ts.map +1 -0
  125. package/dist/unread.js +49 -0
  126. package/dist/unread.js.map +1 -0
  127. package/dist/useChatSession.d.ts +95 -0
  128. package/dist/useChatSession.d.ts.map +1 -0
  129. package/dist/useChatSession.js +965 -0
  130. package/dist/useChatSession.js.map +1 -0
  131. package/package.json +60 -4
  132. package/src/GiovChat.tsx +640 -0
  133. package/src/attachments.ts +218 -0
  134. package/src/brand-assets.ts +5 -0
  135. package/src/brandingStyle.ts +87 -0
  136. package/src/client.ts +848 -0
  137. package/src/color.ts +74 -0
  138. package/src/components/Attachments.tsx +75 -0
  139. package/src/components/Branding.tsx +94 -0
  140. package/src/components/ChatMarkdown.tsx +111 -0
  141. package/src/components/GiovBotMark.tsx +19 -0
  142. package/src/components/GreetingBubble.tsx +20 -0
  143. package/src/components/Header.tsx +131 -0
  144. package/src/components/MessageBubble.tsx +137 -0
  145. package/src/components/PreChatForm.tsx +183 -0
  146. package/src/components/RatingCard.tsx +219 -0
  147. package/src/components/TypingIndicator.tsx +34 -0
  148. package/src/components/WidgetStyles.tsx +5 -0
  149. package/src/components/bubbleStyles.ts +16 -0
  150. package/src/components/index.ts +14 -0
  151. package/src/errors.ts +33 -0
  152. package/src/i18n.ts +474 -0
  153. package/src/identity.ts +54 -0
  154. package/src/index.ts +85 -0
  155. package/src/markdown.ts +227 -0
  156. package/src/outbox.ts +175 -0
  157. package/src/protocol.ts +36 -0
  158. package/src/rating.ts +169 -0
  159. package/src/ratingStore.ts +65 -0
  160. package/src/styleOverrides.ts +98 -0
  161. package/src/types.ts +170 -0
  162. package/src/unread.ts +39 -0
  163. package/src/useChatSession.ts +841 -0
package/dist/outbox.js ADDED
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Outbox = exports.retryDelay = exports.MAX_MESSAGE_CHARS = exports.MAX_SEND_FAILURES = exports.ACK_TIMEOUT_MS = void 0;
4
+ exports.randomClientId = randomClientId;
5
+ exports.clampMessage = clampMessage;
6
+ const errors_1 = require("./errors");
7
+ /** A sent message with no ack after this long means a dead socket: reconnect and resend. */
8
+ exports.ACK_TIMEOUT_MS = 10000;
9
+ /** Save failures retried before the visitor is told the message did not send. */
10
+ exports.MAX_SEND_FAILURES = 3;
11
+ exports.MAX_MESSAGE_CHARS = 2000;
12
+ /** Wait before resending after a save failure: 2 s, 4 s, … */
13
+ const retryDelay = (failures) => 2000 * failures;
14
+ exports.retryDelay = retryDelay;
15
+ /** UUID v4 where crypto is available (Hermes ships getRandomValues with most setups), else a unique fallback. */
16
+ function randomClientId() {
17
+ const c = globalThis.crypto;
18
+ if (c && typeof c.randomUUID === "function")
19
+ return c.randomUUID();
20
+ if (c && typeof c.getRandomValues === "function") {
21
+ const bytes = c.getRandomValues(new Uint8Array(16));
22
+ bytes[6] = (bytes[6] & 0x0f) | 0x40;
23
+ bytes[8] = (bytes[8] & 0x3f) | 0x80;
24
+ const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
25
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
26
+ }
27
+ return `rn-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;
28
+ }
29
+ class Outbox {
30
+ constructor() {
31
+ this.entries = new Map();
32
+ this.listeners = new Set();
33
+ }
34
+ subscribe(listener) {
35
+ this.listeners.add(listener);
36
+ return () => { this.listeners.delete(listener); };
37
+ }
38
+ changed() {
39
+ for (const listener of this.listeners) {
40
+ try {
41
+ listener();
42
+ }
43
+ catch { /* Listeners cannot break the queue. */ }
44
+ }
45
+ }
46
+ /** Copies, oldest first. */
47
+ list() { return [...this.entries.values()].map((entry) => ({ ...entry, attachments: [...entry.attachments] })); }
48
+ get(clientMessageId) {
49
+ const entry = this.entries.get(clientMessageId);
50
+ return entry && { ...entry, attachments: [...entry.attachments] };
51
+ }
52
+ get size() { return this.entries.size; }
53
+ /** Adds a message at the end. Throws when it could never be accepted (empty or too long). */
54
+ enqueue(content, attachments = [], now = Date.now(), clientMessageId = randomClientId()) {
55
+ if ((!content.trim() && attachments.length === 0) || content.length > exports.MAX_MESSAGE_CHARS) {
56
+ throw new errors_1.GiovChatError("send_failed", "Messages must contain 1–2000 characters.");
57
+ }
58
+ const entry = { clientMessageId, content, attachments: [...attachments], createdAt: now, state: "queued", sentAt: 0, failures: 0 };
59
+ this.entries.set(clientMessageId, entry);
60
+ this.changed();
61
+ return { ...entry, attachments: [...entry.attachments] };
62
+ }
63
+ /** The wire frame; identical every time it is sent. */
64
+ static frame(entry) {
65
+ return JSON.stringify({ type: "message", content: entry.content, clientMessageId: entry.clientMessageId,
66
+ ...(entry.attachments.length ? { attachments: entry.attachments } : {}) });
67
+ }
68
+ /** Everything waiting for a socket, in order, marked as sent now. Failed messages wait for `retry`. */
69
+ takeQueued(now = Date.now()) {
70
+ const out = [];
71
+ for (const entry of this.entries.values()) {
72
+ if (entry.state !== "queued")
73
+ continue;
74
+ entry.state = "sending";
75
+ entry.sentAt = now;
76
+ out.push({ clientMessageId: entry.clientMessageId, frame: Outbox.frame(entry) });
77
+ }
78
+ if (out.length)
79
+ this.changed();
80
+ return out;
81
+ }
82
+ /** The server saved it: the message leaves the queue. Unknown ids (already acknowledged) return null. */
83
+ acknowledge(clientMessageId) {
84
+ const entry = this.entries.get(clientMessageId);
85
+ if (!entry)
86
+ return null;
87
+ this.entries.delete(clientMessageId);
88
+ this.changed();
89
+ return entry;
90
+ }
91
+ /** The server could not save it: wait and resend, or give up after MAX_SEND_FAILURES. */
92
+ rejected(clientMessageId) {
93
+ const entry = this.entries.get(clientMessageId);
94
+ if (!entry || entry.state === "failed")
95
+ return null;
96
+ entry.failures += 1;
97
+ entry.sentAt = 0;
98
+ entry.state = entry.failures >= exports.MAX_SEND_FAILURES ? "failed" : "queued";
99
+ this.changed();
100
+ return { failed: entry.state === "failed", retryAfter: entry.state === "failed" ? 0 : (0, exports.retryDelay)(entry.failures) };
101
+ }
102
+ /** A message the server refused outright (invalid content or attachment): no retry can fix it. */
103
+ refuseOldestSending() {
104
+ for (const entry of this.entries.values()) {
105
+ if (entry.state !== "sending")
106
+ continue;
107
+ entry.state = "failed";
108
+ entry.sentAt = 0;
109
+ this.changed();
110
+ return { ...entry, attachments: [...entry.attachments] };
111
+ }
112
+ return null;
113
+ }
114
+ /** The socket went away: whatever was on it goes out again on the next one, with the same ids. */
115
+ socketClosed() {
116
+ let changed = false;
117
+ for (const entry of this.entries.values()) {
118
+ if (entry.state === "sending") {
119
+ entry.state = "queued";
120
+ entry.sentAt = 0;
121
+ changed = true;
122
+ }
123
+ }
124
+ if (changed)
125
+ this.changed();
126
+ }
127
+ /** True when a message has waited longer than ACK_TIMEOUT_MS on an open socket. */
128
+ stale(now = Date.now()) {
129
+ for (const entry of this.entries.values()) {
130
+ if (entry.state === "sending" && entry.sentAt > 0 && now - entry.sentAt > exports.ACK_TIMEOUT_MS)
131
+ return true;
132
+ }
133
+ return false;
134
+ }
135
+ /** The visitor asked to try a failed message again: it rejoins the queue in its original place. */
136
+ retry(clientMessageId) {
137
+ const entry = this.entries.get(clientMessageId);
138
+ if (!entry || entry.state !== "failed")
139
+ return false;
140
+ entry.state = "queued";
141
+ entry.failures = 0;
142
+ entry.sentAt = 0;
143
+ this.changed();
144
+ return true;
145
+ }
146
+ remove(clientMessageId) {
147
+ const removed = this.entries.delete(clientMessageId);
148
+ if (removed)
149
+ this.changed();
150
+ return removed;
151
+ }
152
+ clear() {
153
+ if (!this.entries.size)
154
+ return;
155
+ this.entries.clear();
156
+ this.changed();
157
+ }
158
+ }
159
+ exports.Outbox = Outbox;
160
+ /** Composer text cut to MAX_MESSAGE_CHARS UTF-16 units (JavaScript string length), never through a surrogate pair. */
161
+ function clampMessage(text, max = exports.MAX_MESSAGE_CHARS) {
162
+ if (text.length <= max)
163
+ return text;
164
+ const cut = text.slice(0, max);
165
+ const last = cut.charCodeAt(cut.length - 1);
166
+ return last >= 0xd800 && last <= 0xdbff ? cut.slice(0, -1) : cut;
167
+ }
168
+ //# sourceMappingURL=outbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.js","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { GiovMessage } from "./types";
2
+ export declare function object(value: unknown): Record<string, unknown>;
3
+ /**
4
+ * A message from a socket frame (camelCase) or a history row (snake_case). The server stores the
5
+ * visitor's role as "user". Sender identity is kept for agents only, and the AI identity wins over
6
+ * "automated" (AI replies carry both flags).
7
+ */
8
+ export declare function parseMessage(value: unknown): GiovMessage | null;
9
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAK3C,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAqB/D"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.object = object;
4
+ exports.parseMessage = parseMessage;
5
+ const rating_1 = require("./rating");
6
+ const attachments_1 = require("./attachments");
7
+ const identity_1 = require("./identity");
8
+ function object(value) {
9
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
10
+ }
11
+ /**
12
+ * A message from a socket frame (camelCase) or a history row (snake_case). The server stores the
13
+ * visitor's role as "user". Sender identity is kept for agents only, and the AI identity wins over
14
+ * "automated" (AI replies carry both flags).
15
+ */
16
+ function parseMessage(value) {
17
+ const m = object(value);
18
+ const role = m.role === "user" ? "visitor" : m.role;
19
+ const createdAt = m.createdAt ?? m.created_at;
20
+ if (typeof m.id !== "string" || !m.id || (role !== "agent" && role !== "visitor") ||
21
+ typeof m.content !== "string" || typeof createdAt !== "number" || !Number.isFinite(createdAt))
22
+ return null;
23
+ // camelCase first; the snake_case history fields are deprecated aliases (protocol v1).
24
+ const isBot = role === "agent" && (typeof m.isBot === "boolean" ? m.isBot : m.is_bot === 1);
25
+ const isAutomated = role === "agent" && (typeof m.isAutomated === "boolean" ? m.isAutomated : m.is_automated === 1);
26
+ const human = role === "agent" && !isBot && !isAutomated;
27
+ const attachments = (0, attachments_1.parseAttachments)(m.attachmentId ?? m.attachment_id, m.attachmentPreviews ?? m.attachment_previews);
28
+ // Unknown block types are ignored (protocol versioning); only the rating card is drawn.
29
+ const rating = Array.isArray(m.blocks) ? m.blocks.map(rating_1.parseRatingBlock).find((block) => block !== null) : undefined;
30
+ return {
31
+ id: m.id, role, content: m.content, createdAt, isBot, isAutomated,
32
+ senderName: role === "agent" && typeof m.senderName === "string" ? m.senderName : undefined,
33
+ ...(human && (0, identity_1.safeImageUrl)(m.senderAvatar) ? { senderAvatar: (0, identity_1.safeImageUrl)(m.senderAvatar) } : {}),
34
+ ...(attachments.length ? { attachments } : {}),
35
+ ...(rating ? { rating } : {}),
36
+ ...(isBot && (m.feedback === "up" || m.feedback === "down") ? { feedback: m.feedback } : {}),
37
+ };
38
+ }
39
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { GiovFeedbackValue, GiovMessage, GiovRatingBlock, GiovRatingRequest, GiovRatingResult, GiovRatingScore } from "./types";
2
+ import { GiovChatError } from "./errors";
3
+ /** Pure rules for conversation ratings and the thumbs under GiovBot answers (docs/protocol, "Conversation ratings"). */
4
+ export declare const MAX_RATING_COMMENT = 1000;
5
+ export declare const MAX_FEEDBACK_REASON = 300;
6
+ /** A `rating` block from a message; null for any other (or malformed) block. */
7
+ export declare function parseRatingBlock(value: unknown): GiovRatingBlock | null;
8
+ /** The `rating` socket frame: the card changed (answered, changed or replaced). */
9
+ export interface GiovRatingFrame {
10
+ requestId: string;
11
+ messageId?: string;
12
+ closesAt: number;
13
+ score?: GiovRatingScore;
14
+ comment?: string;
15
+ state?: "replaced";
16
+ }
17
+ export declare function parseRatingFrame(value: unknown): GiovRatingFrame | null;
18
+ /** Sets the answer, deadline and state on the card a frame (or an answer) names; other messages stay as they are. */
19
+ export declare function patchRating(messages: GiovMessage[], frame: GiovRatingFrame): GiovMessage[];
20
+ /**
21
+ * One open card per conversation: an older card the visitor never answered is replaced by a newer
22
+ * one (also before the server's own `replaced` mark arrives). Answered cards keep their answer.
23
+ */
24
+ export declare function supersedeRatings(messages: GiovMessage[]): GiovMessage[];
25
+ /** "hidden" (replaced), "open" (can be answered or changed) or "closed" (read-only: the clock reached `closesAt`; the server decides). */
26
+ export declare function ratingPhase(block: Pick<GiovRatingBlock, "closesAt" | "state">, now: number): "hidden" | "open" | "closed";
27
+ /** The card the visitor can answer or change now, or null. */
28
+ export declare function pendingRatingRequest(messages: GiovMessage[], now: number): GiovRatingRequest | null;
29
+ /** A refusal for one card: `closed` makes it read-only now, `replaced` hides it. */
30
+ export declare function markRating(messages: GiovMessage[], requestId: string, kind: "closed" | "replaced", now?: number): GiovMessage[];
31
+ /** What a failed answer means for the card: read-only states, or a message to retry. */
32
+ export declare function ratingFailure(code: string): "closed" | "replaced" | "retry";
33
+ /** What tapping a thumb sends: the same thumb again takes the vote back. */
34
+ export declare const nextFeedback: (current: "up" | "down" | undefined, tapped: "up" | "down") => GiovFeedbackValue;
35
+ export declare function applyFeedback(messages: GiovMessage[], id: string, value: GiovFeedbackValue): GiovMessage[];
36
+ /** Thumbs go under finished GiovBot answers, never under the rating request itself. */
37
+ export declare const canVoteOn: (message: GiovMessage) => boolean;
38
+ /** The documented refusals of the rating and feedback routes, as typed errors. A 404 without a code is a server that lacks the routes. */
39
+ export declare function ratingError(status: number, body: unknown, retryAfter?: string | null): GiovChatError;
40
+ export declare function parseRatingResult(body: unknown, fallbackRequestId?: string): GiovRatingResult | null;
41
+ //# sourceMappingURL=rating.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rating.d.ts","sourceRoot":"","sources":["../src/rating.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EACtG,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAqB,MAAM,UAAU,CAAC;AAE5D,wHAAwH;AAExH,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAQvC,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAYvE;AAED,mFAAmF;AACnF,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAYvE;AAED,qHAAqH;AACrH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,eAAe,GAAG,WAAW,EAAE,CAiB1F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAWvE;AAED,0IAA0I;AAC1I,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAEzH;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAWnG;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,UAAU,EAAE,GAAG,SAAa,GAAG,WAAW,EAAE,CAMnI;AAED,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAE3E;AAED,4EAA4E;AAC5E,eAAO,MAAM,YAAY,GAAI,SAAS,IAAI,GAAG,MAAM,GAAG,SAAS,EAAE,QAAQ,IAAI,GAAG,MAAM,KAAG,iBAA2D,CAAC;AAErJ,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,WAAW,EAAE,CAM1G;AAED,uFAAuF;AACvF,eAAO,MAAM,SAAS,GAAI,SAAS,WAAW,KAAG,OACmF,CAAC;AAQrI,0IAA0I;AAC1I,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,CAUpG;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CASpG"}
package/dist/rating.js ADDED
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canVoteOn = exports.nextFeedback = exports.MAX_FEEDBACK_REASON = exports.MAX_RATING_COMMENT = void 0;
4
+ exports.parseRatingBlock = parseRatingBlock;
5
+ exports.parseRatingFrame = parseRatingFrame;
6
+ exports.patchRating = patchRating;
7
+ exports.supersedeRatings = supersedeRatings;
8
+ exports.ratingPhase = ratingPhase;
9
+ exports.pendingRatingRequest = pendingRatingRequest;
10
+ exports.markRating = markRating;
11
+ exports.ratingFailure = ratingFailure;
12
+ exports.applyFeedback = applyFeedback;
13
+ exports.ratingError = ratingError;
14
+ exports.parseRatingResult = parseRatingResult;
15
+ const errors_1 = require("./errors");
16
+ /** Pure rules for conversation ratings and the thumbs under GiovBot answers (docs/protocol, "Conversation ratings"). */
17
+ exports.MAX_RATING_COMMENT = 1000;
18
+ exports.MAX_FEEDBACK_REASON = 300;
19
+ const obj = (value) => value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
20
+ const isScore = (value) => typeof value === "number" && Number.isInteger(value) && value >= 1 && value <= 5;
21
+ /** A `rating` block from a message; null for any other (or malformed) block. */
22
+ function parseRatingBlock(value) {
23
+ const b = obj(value);
24
+ if (b.type !== "rating" || typeof b.requestId !== "string" || !b.requestId ||
25
+ typeof b.closesAt !== "number" || !Number.isFinite(b.closesAt))
26
+ return null;
27
+ const score = isScore(b.score) ? b.score : undefined;
28
+ return {
29
+ requestId: b.requestId, closesAt: b.closesAt,
30
+ ...(typeof b.url === "string" && /^https:\/\//i.test(b.url) ? { url: b.url } : {}),
31
+ ...(score ? { score } : {}),
32
+ ...(score && typeof b.comment === "string" && b.comment ? { comment: b.comment } : {}),
33
+ ...(b.state === "replaced" ? { state: "replaced" } : {}),
34
+ };
35
+ }
36
+ function parseRatingFrame(value) {
37
+ const f = obj(value);
38
+ if (f.type !== "rating" || typeof f.requestId !== "string" || !f.requestId ||
39
+ typeof f.closesAt !== "number" || !Number.isFinite(f.closesAt))
40
+ return null;
41
+ const score = isScore(f.score) ? f.score : undefined;
42
+ return {
43
+ requestId: f.requestId, closesAt: f.closesAt,
44
+ ...(typeof f.messageId === "string" && f.messageId ? { messageId: f.messageId } : {}),
45
+ ...(score ? { score } : {}),
46
+ ...(score && typeof f.comment === "string" && f.comment ? { comment: f.comment } : {}),
47
+ ...(f.state === "replaced" ? { state: "replaced" } : {}),
48
+ };
49
+ }
50
+ /** Sets the answer, deadline and state on the card a frame (or an answer) names; other messages stay as they are. */
51
+ function patchRating(messages, frame) {
52
+ let changed = false;
53
+ const next = messages.map((message) => {
54
+ if ((frame.messageId && message.id !== frame.messageId) || message.rating?.requestId !== frame.requestId)
55
+ return message;
56
+ changed = true;
57
+ const { score: _s, comment: _c, state: _t, ...rest } = message.rating;
58
+ return {
59
+ ...message,
60
+ rating: {
61
+ ...rest, closesAt: frame.closesAt,
62
+ ...(frame.score ? { score: frame.score } : {}),
63
+ ...(frame.score && frame.comment ? { comment: frame.comment } : {}),
64
+ ...(frame.state ? { state: frame.state } : message.rating.state ? { state: message.rating.state } : {}),
65
+ },
66
+ };
67
+ });
68
+ return changed ? next : messages;
69
+ }
70
+ /**
71
+ * One open card per conversation: an older card the visitor never answered is replaced by a newer
72
+ * one (also before the server's own `replaced` mark arrives). Answered cards keep their answer.
73
+ */
74
+ function supersedeRatings(messages) {
75
+ let latest = -1;
76
+ messages.forEach((message, index) => { if (message.rating && message.rating.state !== "replaced")
77
+ latest = index; });
78
+ let changed = false;
79
+ const next = messages.map((message, index) => {
80
+ const card = message.rating;
81
+ if (!card || card.state === "replaced" || index === latest || card.score)
82
+ return message;
83
+ changed = true;
84
+ return { ...message, rating: { ...card, state: "replaced" } };
85
+ });
86
+ return changed ? next : messages;
87
+ }
88
+ /** "hidden" (replaced), "open" (can be answered or changed) or "closed" (read-only: the clock reached `closesAt`; the server decides). */
89
+ function ratingPhase(block, now) {
90
+ return block.state === "replaced" ? "hidden" : now < block.closesAt ? "open" : "closed";
91
+ }
92
+ /** The card the visitor can answer or change now, or null. */
93
+ function pendingRatingRequest(messages, now) {
94
+ const cards = supersedeRatings(messages).filter((message) => message.rating && ratingPhase(message.rating, now) === "open");
95
+ const message = cards[cards.length - 1];
96
+ const card = message?.rating;
97
+ if (!message || !card)
98
+ return null;
99
+ return {
100
+ requestId: card.requestId, messageId: message.id, closesAt: card.closesAt, answered: !!card.score,
101
+ ...(card.url ? { url: card.url } : {}),
102
+ ...(card.score ? { score: card.score } : {}),
103
+ ...(card.comment ? { comment: card.comment } : {}),
104
+ };
105
+ }
106
+ /** A refusal for one card: `closed` makes it read-only now, `replaced` hides it. */
107
+ function markRating(messages, requestId, kind, now = Date.now()) {
108
+ return messages.map((message) => {
109
+ const card = message.rating;
110
+ if (!card || card.requestId !== requestId)
111
+ return message;
112
+ return { ...message, rating: kind === "replaced" ? { ...card, state: "replaced" } : { ...card, closesAt: Math.min(card.closesAt, now) } };
113
+ });
114
+ }
115
+ /** What a failed answer means for the card: read-only states, or a message to retry. */
116
+ function ratingFailure(code) {
117
+ return code === "rating_closed" ? "closed" : code === "request_replaced" ? "replaced" : "retry";
118
+ }
119
+ /** What tapping a thumb sends: the same thumb again takes the vote back. */
120
+ const nextFeedback = (current, tapped) => (current === tapped ? "none" : tapped);
121
+ exports.nextFeedback = nextFeedback;
122
+ function applyFeedback(messages, id, value) {
123
+ return messages.map((message) => {
124
+ if (message.id !== id)
125
+ return message;
126
+ const { feedback: _f, ...rest } = message;
127
+ return value === "none" ? rest : { ...rest, feedback: value };
128
+ });
129
+ }
130
+ /** Thumbs go under finished GiovBot answers, never under the rating request itself. */
131
+ const canVoteOn = (message) => message.role === "agent" && message.isBot === true && !message.isStreaming && !message.id.startsWith("stream:") && !message.rating;
132
+ exports.canVoteOn = canVoteOn;
133
+ const CODES = {
134
+ invalid_rating: "invalid_rating", invalid_feedback: "invalid_feedback", request_not_found: "request_not_found",
135
+ message_not_found: "message_not_found", request_replaced: "request_replaced", rating_closed: "rating_closed",
136
+ too_many_changes: "too_many_changes",
137
+ };
138
+ /** The documented refusals of the rating and feedback routes, as typed errors. A 404 without a code is a server that lacks the routes. */
139
+ function ratingError(status, body, retryAfter) {
140
+ const data = obj(body);
141
+ const server = typeof data.error === "string" ? data.error : "";
142
+ const known = CODES[server];
143
+ const wait = (0, errors_1.retryAfterSeconds)(retryAfter);
144
+ if (known)
145
+ return new errors_1.GiovChatError(known, "Rating was refused.", status, wait);
146
+ if (status === 404 || status === 405 || status === 501)
147
+ return new errors_1.GiovChatError("unsupported", "This chat does not take ratings.", status);
148
+ if (status === 401 || status === 403)
149
+ return new errors_1.GiovChatError("invalid_session", "Chat session expired. Please start a new chat.", status);
150
+ if (status === 429)
151
+ return new errors_1.GiovChatError("rate_limited", "Too many requests. Please wait a moment.", status, wait);
152
+ return new errors_1.GiovChatError("server", "Chat is unavailable. Please try again.", status, wait);
153
+ }
154
+ function parseRatingResult(body, fallbackRequestId) {
155
+ const b = obj(body);
156
+ const requestId = typeof b.requestId === "string" ? b.requestId : fallbackRequestId;
157
+ if (!requestId || !isScore(b.score) || typeof b.closesAt !== "number" || !Number.isFinite(b.closesAt))
158
+ return null;
159
+ return {
160
+ requestId, score: b.score, closesAt: b.closesAt,
161
+ ...(typeof b.comment === "string" && b.comment ? { comment: b.comment } : {}),
162
+ ...(typeof b.ratedAt === "number" ? { ratedAt: b.ratedAt } : {}),
163
+ };
164
+ }
165
+ //# sourceMappingURL=rating.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rating.js","sourceRoot":"","sources":["../src/rating.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { GiovFeedbackValue, GiovRatingRequest, GiovRatingResult } from "./types";
2
+ /**
3
+ * What `useGiovRating` returns: the rating card the visitor can answer now, and the calls to answer it
4
+ * or to open the built-in rating sheet. Each mounted `GiovChat` publishes its own entry under its tenant key.
5
+ */
6
+ export interface GiovRatingController {
7
+ /** The open rating card (answered or not) or null: nothing to rate right now. */
8
+ request: GiovRatingRequest | null;
9
+ /** False once the server turned out not to take ratings (an older server): hide your own controls. */
10
+ supported: boolean;
11
+ /** Rates the conversation; see `GiovChatHandle.submitRating`. */
12
+ submit(score: number, options?: {
13
+ comment?: string;
14
+ requestId?: string;
15
+ }): Promise<GiovRatingResult>;
16
+ /** Thumbs on a GiovBot answer; see `GiovChatHandle.submitAnswerFeedback`. */
17
+ submitFeedback(messageId: string, value: GiovFeedbackValue, options?: {
18
+ reason?: string;
19
+ }): Promise<void>;
20
+ /** Opens the built-in rating sheet for the open card; false when there is none. */
21
+ show(): boolean;
22
+ }
23
+ export declare function publishRating(owner: symbol, tenantKey: string, value: GiovRatingController): void;
24
+ export declare function forgetRating(owner: symbol): void;
25
+ export declare function readRating(tenantKey?: string): GiovRatingController;
26
+ /**
27
+ * Conversation rating for a host that draws its own prompt (turn the built-in card off with
28
+ * `ratingCard={false}`), or wants a button that opens the built-in sheet. Needs a mounted `GiovChat`.
29
+ *
30
+ * ```tsx
31
+ * const rating = useGiovRating();
32
+ * if (rating.request && !rating.request.answered) return <Button title="Rate us" onPress={rating.show} />;
33
+ * ```
34
+ */
35
+ export declare function useGiovRating(tenantKey?: string): GiovRatingController;
36
+ //# sourceMappingURL=ratingStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ratingStore.d.ts","sourceRoot":"","sources":["../src/ratingStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEtF;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,sGAAsG;IACtG,SAAS,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrG,6EAA6E;IAC7E,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1G,mFAAmF;IACnF,IAAI,IAAI,OAAO,CAAC;CACjB;AASD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAGjG;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,oBAAoB,CASnE;AAOD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAEtE"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.publishRating = publishRating;
4
+ exports.forgetRating = forgetRating;
5
+ exports.readRating = readRating;
6
+ exports.useGiovRating = useGiovRating;
7
+ const react_1 = require("react");
8
+ const errors_1 = require("./errors");
9
+ const unavailable = () => Promise.reject(new errors_1.GiovChatError("disconnected", "No chat is mounted."));
10
+ const NONE = { request: null, supported: true, submit: unavailable, submitFeedback: unavailable, show: () => false };
11
+ const entries = new Map();
12
+ const listeners = new Set();
13
+ const notify = () => { for (const listener of listeners) {
14
+ try {
15
+ listener();
16
+ }
17
+ catch { /* Isolated. */ }
18
+ } };
19
+ function publishRating(owner, tenantKey, value) {
20
+ entries.set(owner, { tenantKey, value });
21
+ notify();
22
+ }
23
+ function forgetRating(owner) {
24
+ if (entries.delete(owner))
25
+ notify();
26
+ }
27
+ function readRating(tenantKey) {
28
+ let found = null;
29
+ for (const entry of entries.values()) {
30
+ if (tenantKey && entry.tenantKey !== tenantKey)
31
+ continue;
32
+ // The first mounted chat with a card wins; otherwise the first chat.
33
+ if (entry.value.request)
34
+ return entry.value;
35
+ found ?? (found = entry.value);
36
+ }
37
+ return found ?? NONE;
38
+ }
39
+ function subscribe(listener) {
40
+ listeners.add(listener);
41
+ return () => { listeners.delete(listener); };
42
+ }
43
+ /**
44
+ * Conversation rating for a host that draws its own prompt (turn the built-in card off with
45
+ * `ratingCard={false}`), or wants a button that opens the built-in sheet. Needs a mounted `GiovChat`.
46
+ *
47
+ * ```tsx
48
+ * const rating = useGiovRating();
49
+ * if (rating.request && !rating.request.answered) return <Button title="Rate us" onPress={rating.show} />;
50
+ * ```
51
+ */
52
+ function useGiovRating(tenantKey) {
53
+ return (0, react_1.useSyncExternalStore)(subscribe, () => readRating(tenantKey), () => NONE);
54
+ }
55
+ //# sourceMappingURL=ratingStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ratingStore.js","sourceRoot":"","sources":["../src/ratingStore.ts"],"names":[],"mappings":";;AA4BA,sCAGC;AAED,oCAEC;AAED,gCASC;AAgBD,sCAEC;AAhED,iCAA6C;AAC7C,qCAAyC;AAoBzC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,sBAAa,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC,CAAC;AACnG,MAAM,IAAI,GAAyB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;AAE3I,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8D,CAAC;AACtF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AACxC,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;IAAC,IAAI,CAAC;QAAC,QAAQ,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;AAAC,CAAC,CAAC,CAAC,CAAC;AAE7G,SAAgB,aAAa,CAAC,KAAa,EAAE,SAAiB,EAAE,KAA2B;IACzF,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC;AACX,CAAC;AAED,SAAgB,YAAY,CAAC,KAAa;IACxC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,CAAC;AACtC,CAAC;AAED,SAAgB,UAAU,CAAC,SAAkB;IAC3C,IAAI,KAAK,GAAgC,IAAI,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,IAAI,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAAE,SAAS;QACzD,qEAAqE;QACrE,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC,KAAK,CAAC;QAC5C,KAAK,KAAL,KAAK,GAAK,KAAK,CAAC,KAAK,EAAC;IACxB,CAAC;IACD,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AAED,SAAS,SAAS,CAAC,QAAoB;IACrC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,aAAa,CAAC,SAAkB;IAC9C,OAAO,IAAA,4BAAoB,EAAC,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { TextStyle, ViewStyle } from "react-native";
2
+ import type { GiovChatBrandingStyle } from "./brandingStyle";
3
+ /** Typography and colors only; text sizing and layout remain SDK-controlled. */
4
+ export type GiovChatTextStyle = Pick<TextStyle, "fontFamily" | "fontWeight" | "fontStyle"> & {
5
+ color?: string;
6
+ };
7
+ export type GiovChatBackgroundStyle = {
8
+ backgroundColor?: string;
9
+ };
10
+ /** Plain objects only. No arbitrary React Native styles. */
11
+ export interface GiovChatStyleOverrides {
12
+ /** Default font family for all customizable text. Load the font in your app. */
13
+ fontFamily?: string;
14
+ container?: GiovChatBackgroundStyle;
15
+ header?: GiovChatBackgroundStyle;
16
+ headerTitle?: GiovChatTextStyle;
17
+ headerSubtitle?: GiovChatTextStyle;
18
+ agentBubble?: GiovChatBackgroundStyle;
19
+ visitorBubble?: GiovChatBackgroundStyle;
20
+ agentText?: GiovChatTextStyle;
21
+ visitorText?: GiovChatTextStyle;
22
+ composer?: GiovChatBackgroundStyle;
23
+ input?: GiovChatTextStyle & GiovChatBackgroundStyle;
24
+ button?: GiovChatBackgroundStyle;
25
+ buttonText?: GiovChatTextStyle;
26
+ form?: GiovChatBackgroundStyle;
27
+ formTitle?: GiovChatTextStyle;
28
+ label?: GiovChatTextStyle;
29
+ hint?: GiovChatTextStyle;
30
+ errorText?: GiovChatTextStyle;
31
+ /**
32
+ * The "Powered by GiovChat" footer: font family, text colour, link colour and background. It follows
33
+ * your app, but stays on (only the plan removes it) and keeps 4.5:1 contrast. Layout, size and text are fixed.
34
+ */
35
+ branding?: GiovChatBrandingStyle;
36
+ }
37
+ declare const backgroundSlots: readonly ["container", "header", "agentBubble", "visitorBubble", "composer", "button", "form"];
38
+ declare const textSlots: readonly ["headerTitle", "headerSubtitle", "agentText", "visitorText", "input", "buttonText", "formTitle", "label", "hint", "errorText"];
39
+ export type ResolvedWidgetStyles = Record<(typeof backgroundSlots)[number], ViewStyle> & Record<(typeof textSlots)[number], TextStyle> & {
40
+ branding: GiovChatBrandingStyle;
41
+ };
42
+ /** Rebuild every slot from an allowlist, including for untyped JavaScript callers. */
43
+ export declare function resolveStyleOverrides(value: unknown): ResolvedWidgetStyles;
44
+ export {};
45
+ //# sourceMappingURL=styleOverrides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styleOverrides.d.ts","sourceRoot":"","sources":["../src/styleOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D,gFAAgF;AAChF,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC,GAAG;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IAAE,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACrC,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,aAAa,CAAC,EAAE,uBAAuB,CAAC;IACxC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,KAAK,CAAC,EAAE,iBAAiB,GAAG,uBAAuB,CAAC;IACpD,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,IAAI,CAAC,EAAE,uBAAuB,CAAC;IAC/B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC;AAED,QAAA,MAAM,eAAe,gGAEX,CAAC;AACX,QAAA,MAAM,SAAS,0IAGL,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,GACpF,MAAM,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG;IAAE,QAAQ,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAYtF,sFAAsF;AACtF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAqC1E"}