@bigbinary/neeto-whatsapp-frontend 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +186 -0
  2. package/app/javascript/src/translations/ar.json +5 -0
  3. package/app/javascript/src/translations/bg.json +5 -0
  4. package/app/javascript/src/translations/ca.json +5 -0
  5. package/app/javascript/src/translations/cs.json +5 -0
  6. package/app/javascript/src/translations/da.json +5 -0
  7. package/app/javascript/src/translations/de.json +5 -0
  8. package/app/javascript/src/translations/en.json +21 -0
  9. package/app/javascript/src/translations/es-MX.json +5 -0
  10. package/app/javascript/src/translations/es.json +5 -0
  11. package/app/javascript/src/translations/et.json +5 -0
  12. package/app/javascript/src/translations/fi.json +5 -0
  13. package/app/javascript/src/translations/fil.json +5 -0
  14. package/app/javascript/src/translations/fr.json +5 -0
  15. package/app/javascript/src/translations/he.json +5 -0
  16. package/app/javascript/src/translations/hi.json +5 -0
  17. package/app/javascript/src/translations/hr.json +5 -0
  18. package/app/javascript/src/translations/id.json +5 -0
  19. package/app/javascript/src/translations/index.js +3 -0
  20. package/app/javascript/src/translations/it.json +5 -0
  21. package/app/javascript/src/translations/ja.json +5 -0
  22. package/app/javascript/src/translations/ko.json +5 -0
  23. package/app/javascript/src/translations/nl.json +5 -0
  24. package/app/javascript/src/translations/pl.json +5 -0
  25. package/app/javascript/src/translations/pt-BR.json +5 -0
  26. package/app/javascript/src/translations/pt.json +5 -0
  27. package/app/javascript/src/translations/ro.json +5 -0
  28. package/app/javascript/src/translations/ru.json +5 -0
  29. package/app/javascript/src/translations/sk.json +5 -0
  30. package/app/javascript/src/translations/sl.json +5 -0
  31. package/app/javascript/src/translations/sv.json +5 -0
  32. package/app/javascript/src/translations/th.json +5 -0
  33. package/app/javascript/src/translations/tr.json +5 -0
  34. package/app/javascript/src/translations/uk.json +5 -0
  35. package/app/javascript/src/translations/vi.json +5 -0
  36. package/app/javascript/src/translations/zh-CN.json +5 -0
  37. package/app/javascript/src/translations/zh-TW.json +5 -0
  38. package/dist/WelcomeScreen.js +13 -0
  39. package/dist/WelcomeScreen.js.map +1 -0
  40. package/dist/WhatsAppMessages.js +488 -0
  41. package/dist/WhatsAppMessages.js.map +1 -0
  42. package/dist/cjs/WelcomeScreen.js +15 -0
  43. package/dist/cjs/WelcomeScreen.js.map +1 -0
  44. package/dist/cjs/WhatsAppMessages.js +490 -0
  45. package/dist/cjs/WhatsAppMessages.js.map +1 -0
  46. package/dist/cjs/index.js +31 -0
  47. package/dist/cjs/index.js.map +1 -0
  48. package/dist/index.js +24 -0
  49. package/dist/index.js.map +1 -0
  50. package/package.json +238 -0
  51. package/types.d.ts +8 -0
@@ -0,0 +1,488 @@
1
+ import React, { useState, useEffect, createElement } from 'react';
2
+ import Spinner from '@bigbinary/neetoui/Spinner';
3
+ import NoData from '@bigbinary/neetoui/NoData';
4
+ import { last, isEmpty } from 'ramda';
5
+ import { useTranslation } from 'react-i18next';
6
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
7
+ import { useQuery } from '@tanstack/react-query';
8
+ import { useMutationWithInvalidation } from '@bigbinary/neeto-commons-frontend/react-utils';
9
+ import axios from 'axios';
10
+ import Clock from '@bigbinary/neeto-icons/Clock';
11
+ import Error from '@bigbinary/neeto-icons/Error';
12
+ import DoubleCheck from '@bigbinary/neeto-icons/DoubleCheck';
13
+ import Check from '@bigbinary/neeto-icons/Check';
14
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
15
+ import Button from '@bigbinary/neetoui/Button';
16
+ import Textarea from '@bigbinary/neetoui/Textarea';
17
+ import Tooltip from '@bigbinary/neetoui/Tooltip';
18
+ import Toastr from '@bigbinary/neetoui/Toastr';
19
+ import { jsx, jsxs } from 'react/jsx-runtime';
20
+ import classnames from 'classnames';
21
+ import Typography from '@bigbinary/neetoui/Typography';
22
+
23
+ var NEETO_WHATSAPP_ENGINE_BASE_URL = "/neeto_whatsapp/api/v1";
24
+ var MESSAGES_URL = "".concat(NEETO_WHATSAPP_ENGINE_BASE_URL, "/messages");
25
+ var QUERY_KEYS = {
26
+ WHATSAPP_MESSAGES: "neeto-whatsapp-messages"
27
+ };
28
+ var FORMATTING_MARKERS = [{
29
+ "char": "*",
30
+ Tag: "strong"
31
+ }, {
32
+ "char": "_",
33
+ Tag: "em"
34
+ }, {
35
+ "char": "~",
36
+ Tag: "del"
37
+ }];
38
+ var PUNCTUATION_REGEX = /(?:[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B4E\u1B4F\u1B5A-\u1B60\u1B7D-\u1B7F\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDD6E\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9\uDFD4\uDFD5\uDFD7\uDFD8]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09\uDFE1]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDD6D-\uDD6F\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD839\uDDFF|\uD83A[\uDD5E\uDD5F])/;
39
+ var WHATSAPP_MESSAGES_REFETCH_INTERVAL = 10000;
40
+ var STATUS_ICON_CONFIG = {
41
+ pending: {
42
+ Icon: Clock,
43
+ className: "neeto-ui-text-gray-600"
44
+ },
45
+ sent: {
46
+ Icon: Check,
47
+ className: "neeto-ui-text-gray-600"
48
+ },
49
+ delivered: {
50
+ Icon: DoubleCheck,
51
+ className: "neeto-ui-text-gray-600"
52
+ },
53
+ read: {
54
+ Icon: DoubleCheck,
55
+ className: "neeto-ui-text-info-500"
56
+ },
57
+ failed: {
58
+ Icon: Error,
59
+ className: "neeto-ui-text-danger-500"
60
+ }
61
+ };
62
+
63
+ var fetch = function fetch(_ref) {
64
+ var entityType = _ref.entityType,
65
+ entityId = _ref.entityId;
66
+ return axios.get(MESSAGES_URL, {
67
+ params: {
68
+ entityType: entityType,
69
+ entityId: entityId
70
+ }
71
+ });
72
+ };
73
+ var create = function create(_ref2) {
74
+ var body = _ref2.body,
75
+ entityType = _ref2.entityType,
76
+ entityId = _ref2.entityId;
77
+ return axios.post(MESSAGES_URL, {
78
+ body: body,
79
+ entityType: entityType,
80
+ entityId: entityId
81
+ });
82
+ };
83
+ var messagesApi = {
84
+ fetch: fetch,
85
+ create: create
86
+ };
87
+
88
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
89
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
90
+ var useFetchWhatsappMessages = function useFetchWhatsappMessages(_ref) {
91
+ var entityType = _ref.entityType,
92
+ entityId = _ref.entityId;
93
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
94
+ return useQuery(_objectSpread({
95
+ queryKey: [QUERY_KEYS.WHATSAPP_MESSAGES, entityType, entityId],
96
+ queryFn: function queryFn() {
97
+ return messagesApi.fetch({
98
+ entityType: entityType,
99
+ entityId: entityId
100
+ });
101
+ },
102
+ enabled: Boolean(entityType && entityId),
103
+ refetchInterval: WHATSAPP_MESSAGES_REFETCH_INTERVAL
104
+ }, options));
105
+ };
106
+ var useCreateWhatsappMessage = function useCreateWhatsappMessage(_ref2) {
107
+ var entityType = _ref2.entityType,
108
+ entityId = _ref2.entityId;
109
+ return useMutationWithInvalidation(messagesApi.create, {
110
+ keysToInvalidate: [[QUERY_KEYS.WHATSAPP_MESSAGES, entityType, entityId]]
111
+ });
112
+ };
113
+
114
+ var ComposeForm = function ComposeForm(_ref) {
115
+ var entityType = _ref.entityType,
116
+ entityId = _ref.entityId,
117
+ canReply = _ref.canReply;
118
+ var _useTranslation = useTranslation(),
119
+ t = _useTranslation.t;
120
+ var _useState = useState(""),
121
+ _useState2 = _slicedToArray(_useState, 2),
122
+ body = _useState2[0],
123
+ setBody = _useState2[1];
124
+ var _useState3 = useState(!canReply),
125
+ _useState4 = _slicedToArray(_useState3, 2),
126
+ isWindowExpired = _useState4[0],
127
+ setIsWindowExpired = _useState4[1];
128
+ useEffect(function () {
129
+ setIsWindowExpired(!canReply);
130
+ }, [canReply]);
131
+ var _useCreateWhatsappMes = useCreateWhatsappMessage({
132
+ entityType: entityType,
133
+ entityId: entityId
134
+ }),
135
+ createMessage = _useCreateWhatsappMes.mutate,
136
+ isPending = _useCreateWhatsappMes.isPending;
137
+ var handleSubmit = function handleSubmit() {
138
+ if (!body.trim()) return;
139
+ createMessage({
140
+ body: body.trim(),
141
+ entityType: entityType,
142
+ entityId: entityId
143
+ }, {
144
+ onSuccess: function onSuccess() {
145
+ return setBody("");
146
+ },
147
+ onError: function onError(error) {
148
+ var _error$response;
149
+ var errorMessage = ((_error$response = error.response) === null || _error$response === void 0 || (_error$response = _error$response.data) === null || _error$response === void 0 ? void 0 : _error$response.error) || t("neetoWhatsapp.messages.compose.sendError");
150
+ Toastr.error(errorMessage);
151
+ if (errorMessage.includes("24-hour conversation window has expired")) {
152
+ setIsWindowExpired(true);
153
+ }
154
+ }
155
+ });
156
+ };
157
+ var handleKeyDown = function handleKeyDown(event) {
158
+ if (!(event.key === "Enter" && !event.shiftKey)) return;
159
+ event.preventDefault();
160
+ handleSubmit();
161
+ };
162
+ var sendButton = /*#__PURE__*/jsx(Button, {
163
+ disabled: isWindowExpired || isPending || !body.trim(),
164
+ label: t("neetoWhatsapp.messages.compose.send"),
165
+ loading: isPending,
166
+ onClick: handleSubmit
167
+ });
168
+ return /*#__PURE__*/jsxs("div", {
169
+ className: "neeto-ui-border-t neeto-ui-bg-white sticky bottom-0 flex items-end gap-2 py-8",
170
+ children: [/*#__PURE__*/jsx(Textarea, {
171
+ disabled: isWindowExpired,
172
+ rows: 2,
173
+ value: body,
174
+ placeholder: isWindowExpired ? t("neetoWhatsapp.messages.compose.windowExpired") : t("neetoWhatsapp.messages.compose.placeholder"),
175
+ onChange: function onChange(e) {
176
+ return setBody(e.target.value);
177
+ },
178
+ onKeyDown: handleKeyDown
179
+ }), isWindowExpired ? /*#__PURE__*/jsx(Tooltip, {
180
+ content: t("neetoWhatsapp.messages.compose.windowExpired"),
181
+ position: "top",
182
+ children: sendButton
183
+ }) : sendButton]
184
+ });
185
+ };
186
+
187
+ var formatTimestamp = function formatTimestamp(timestamp) {
188
+ if (!timestamp) return "";
189
+ var date = new Date(timestamp);
190
+ return date.toLocaleString(undefined, {
191
+ month: "short",
192
+ day: "numeric",
193
+ hour: "numeric",
194
+ minute: "2-digit"
195
+ });
196
+ };
197
+
198
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
199
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
200
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
201
+ var keyCounter = 0;
202
+ var getKey = function getKey() {
203
+ return "wa-fmt-".concat(keyCounter++);
204
+ };
205
+ var isWhitespace = function isWhitespace(_char) {
206
+ return /\s/.test(_char);
207
+ };
208
+ var isPunctuation = function isPunctuation(_char2) {
209
+ return PUNCTUATION_REGEX.test(_char2);
210
+ };
211
+ var isValidOpeningPosition = function isValidOpeningPosition(text, index) {
212
+ var nextChar = index + 1 < text.length ? text[index + 1] : undefined;
213
+ var prevChar = index > 0 ? text[index - 1] : undefined;
214
+ if (!nextChar || isWhitespace(nextChar)) return false;
215
+ return !(prevChar && !isWhitespace(prevChar) && !isPunctuation(prevChar));
216
+ };
217
+ var findClosingMarker = function findClosingMarker(text, startIndex, markerChar) {
218
+ for (var j = startIndex; j < text.length; j++) {
219
+ if (text[j] === markerChar) {
220
+ var prevChar = j > 0 ? text[j - 1] : undefined;
221
+ var nextChar = j + 1 < text.length ? text[j + 1] : undefined;
222
+ if (!prevChar || isWhitespace(prevChar)) continue;
223
+ if (nextChar && !isWhitespace(nextChar) && !isPunctuation(nextChar)) {
224
+ continue;
225
+ }
226
+ return j;
227
+ }
228
+ }
229
+ return -1;
230
+ };
231
+ var _parseFormattingMarkers = function parseFormattingMarkers(text) {
232
+ if (!text) return [];
233
+ var result = [];
234
+ var i = 0;
235
+ var textBuffer = "";
236
+ var flushText = function flushText() {
237
+ if (!textBuffer) return;
238
+ result.push(textBuffer);
239
+ textBuffer = "";
240
+ };
241
+ while (i < text.length) {
242
+ var matched = false;
243
+ var _iterator = _createForOfIteratorHelper(FORMATTING_MARKERS),
244
+ _step;
245
+ try {
246
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
247
+ var _step$value = _step.value,
248
+ _char3 = _step$value["char"],
249
+ Tag = _step$value.Tag;
250
+ if (text[i] === _char3 && isValidOpeningPosition(text, i)) {
251
+ var closeIndex = findClosingMarker(text, i + 1, _char3);
252
+ if (closeIndex !== -1) {
253
+ flushText();
254
+ var innerText = text.slice(i + 1, closeIndex);
255
+ var innerElements = _parseFormattingMarkers(innerText);
256
+ result.push(/*#__PURE__*/jsx(Tag, {
257
+ children: innerElements
258
+ }, getKey()));
259
+ i = closeIndex + 1;
260
+ matched = true;
261
+ break;
262
+ }
263
+ }
264
+ }
265
+ } catch (err) {
266
+ _iterator.e(err);
267
+ } finally {
268
+ _iterator.f();
269
+ }
270
+ if (!matched) {
271
+ textBuffer += text[i];
272
+ i++;
273
+ }
274
+ }
275
+ flushText();
276
+ return result;
277
+ };
278
+ var processInlineFormatting = function processInlineFormatting(text) {
279
+ var parts = [];
280
+ var regex = /`([^`\n]+)`/g;
281
+ var lastIndex = 0;
282
+ var match;
283
+ while ((match = regex.exec(text)) !== null) {
284
+ if (match.index > lastIndex) {
285
+ parts.push({
286
+ type: "text",
287
+ content: text.slice(lastIndex, match.index)
288
+ });
289
+ }
290
+ parts.push({
291
+ type: "code",
292
+ content: match[1]
293
+ });
294
+ lastIndex = match.index + match[0].length;
295
+ }
296
+ if (lastIndex < text.length) {
297
+ parts.push({
298
+ type: "text",
299
+ content: text.slice(lastIndex)
300
+ });
301
+ }
302
+ return parts.map(function (part) {
303
+ if (part.type === "code") {
304
+ return /*#__PURE__*/jsx("code", {
305
+ className: "neeto-ui-bg-gray-200 neeto-ui-rounded px-1 py-0.5 font-mono text-sm",
306
+ children: part.content
307
+ }, getKey());
308
+ }
309
+ var formatted = _parseFormattingMarkers(part.content);
310
+ if (formatted.length === 1 && typeof formatted[0] === "string") {
311
+ return formatted[0];
312
+ }
313
+ return /*#__PURE__*/jsx(React.Fragment, {
314
+ children: formatted
315
+ }, getKey());
316
+ });
317
+ };
318
+ var processTextSegment = function processTextSegment(text) {
319
+ var lines = text.split("\n");
320
+ var blocks = [];
321
+ var i = 0;
322
+ while (i < lines.length) {
323
+ if (lines[i].startsWith("> ")) {
324
+ var quoteLines = [];
325
+ while (i < lines.length && lines[i].startsWith("> ")) {
326
+ quoteLines.push(lines[i].slice(2));
327
+ i++;
328
+ }
329
+ blocks.push({
330
+ type: "quote",
331
+ content: quoteLines.join("\n")
332
+ });
333
+ } else {
334
+ var normalLines = [];
335
+ while (i < lines.length && !lines[i].startsWith("> ")) {
336
+ normalLines.push(lines[i]);
337
+ i++;
338
+ }
339
+ blocks.push({
340
+ type: "text",
341
+ content: normalLines.join("\n")
342
+ });
343
+ }
344
+ }
345
+ var result = [];
346
+ blocks.forEach(function (block, index) {
347
+ if (index > 0) result.push("\n");
348
+ if (block.type === "quote") {
349
+ result.push(/*#__PURE__*/jsx("span", {
350
+ className: "block border-l-4 neeto-ui-border-gray-400 pl-2 neeto-ui-text-gray-600",
351
+ children: processInlineFormatting(block.content)
352
+ }, getKey()));
353
+ } else {
354
+ result.push(/*#__PURE__*/jsx(React.Fragment, {
355
+ children: processInlineFormatting(block.content)
356
+ }, getKey()));
357
+ }
358
+ });
359
+ return result;
360
+ };
361
+ var formatWhatsAppText = function formatWhatsAppText(text) {
362
+ if (!text || typeof text !== "string") return text;
363
+ keyCounter = 0;
364
+ var segments = [];
365
+ var codeBlockRegex = /```([\s\S]*?)```/g;
366
+ var lastIndex = 0;
367
+ var match;
368
+ while ((match = codeBlockRegex.exec(text)) !== null) {
369
+ if (match.index > lastIndex) {
370
+ segments.push({
371
+ type: "text",
372
+ content: text.slice(lastIndex, match.index)
373
+ });
374
+ }
375
+ segments.push({
376
+ type: "codeBlock",
377
+ content: match[1]
378
+ });
379
+ lastIndex = match.index + match[0].length;
380
+ }
381
+ if (lastIndex < text.length) {
382
+ segments.push({
383
+ type: "text",
384
+ content: text.slice(lastIndex)
385
+ });
386
+ }
387
+ return segments.map(function (segment) {
388
+ if (segment.type === "codeBlock") {
389
+ return /*#__PURE__*/jsx("code", {
390
+ className: "block neeto-ui-bg-gray-200 my-1 overflow-x-auto neeto-ui-rounded p-2 font-mono text-sm",
391
+ children: segment.content
392
+ }, getKey());
393
+ }
394
+ return /*#__PURE__*/jsx(React.Fragment, {
395
+ children: processTextSegment(segment.content)
396
+ }, getKey());
397
+ });
398
+ };
399
+
400
+ var MessageCard = function MessageCard(_ref) {
401
+ var message = _ref.message;
402
+ var isInbound = message.direction === "inbound";
403
+ var _ref2 = STATUS_ICON_CONFIG[message.status] || {},
404
+ Icon = _ref2.Icon,
405
+ iconClassName = _ref2.className;
406
+ return /*#__PURE__*/jsx("div", {
407
+ id: message.id,
408
+ className: classnames("flex w-full", {
409
+ "justify-start": isInbound,
410
+ "justify-end": !isInbound
411
+ }),
412
+ children: /*#__PURE__*/jsxs("div", {
413
+ className: classnames("max-w-[75%] neeto-ui-rounded-lg px-4 py-2", {
414
+ "neeto-ui-bg-gray-100 rounded-tl-none": isInbound,
415
+ "neeto-ui-bg-info-100 rounded-tr-none": !isInbound
416
+ }),
417
+ children: [/*#__PURE__*/jsx(Typography, {
418
+ className: "whitespace-pre-wrap break-words",
419
+ style: "body2",
420
+ children: formatWhatsAppText(message.body)
421
+ }), /*#__PURE__*/jsxs("div", {
422
+ className: "mt-1 flex items-center justify-end gap-1",
423
+ children: [/*#__PURE__*/jsx(Typography, {
424
+ className: "neeto-ui-text-gray-600",
425
+ style: "nano",
426
+ children: formatTimestamp(message.sentAt)
427
+ }), !isInbound && Icon && /*#__PURE__*/jsx(Icon, {
428
+ className: iconClassName,
429
+ size: 18
430
+ })]
431
+ })]
432
+ })
433
+ });
434
+ };
435
+
436
+ var WhatsAppMessages = function WhatsAppMessages(_ref) {
437
+ var entityType = _ref.entityType,
438
+ entityId = _ref.entityId;
439
+ var _useTranslation = useTranslation(),
440
+ t = _useTranslation.t;
441
+ var _useFetchWhatsappMess = useFetchWhatsappMessages({
442
+ entityType: entityType,
443
+ entityId: entityId
444
+ }),
445
+ _useFetchWhatsappMess2 = _useFetchWhatsappMess.data,
446
+ _useFetchWhatsappMess3 = _useFetchWhatsappMess2 === void 0 ? {} : _useFetchWhatsappMess2,
447
+ _useFetchWhatsappMess4 = _useFetchWhatsappMess3.messages,
448
+ messages = _useFetchWhatsappMess4 === void 0 ? [] : _useFetchWhatsappMess4,
449
+ _useFetchWhatsappMess5 = _useFetchWhatsappMess3.canReply,
450
+ canReply = _useFetchWhatsappMess5 === void 0 ? false : _useFetchWhatsappMess5,
451
+ isLoading = _useFetchWhatsappMess.isLoading;
452
+ useEffect(function () {
453
+ var lastMessage = last(messages);
454
+ if (!lastMessage) return;
455
+ var element = document.getElementById(lastMessage.id);
456
+ element === null || element === void 0 || element.scrollIntoView();
457
+ }, [messages]);
458
+ if (isLoading) {
459
+ return /*#__PURE__*/jsx("div", {
460
+ className: "flex h-full w-full items-center justify-center py-4",
461
+ children: /*#__PURE__*/jsx(Spinner, {})
462
+ });
463
+ }
464
+ return /*#__PURE__*/jsxs("div", {
465
+ className: "flex flex-col",
466
+ children: [/*#__PURE__*/jsx("div", {
467
+ className: "flex flex-col gap-y-4 py-4",
468
+ children: isEmpty(messages) ? /*#__PURE__*/jsx("div", {
469
+ className: "flex w-full items-center justify-center py-4",
470
+ children: /*#__PURE__*/jsx(NoData, {
471
+ title: t("neetoWhatsapp.messages.emptyState")
472
+ })
473
+ }) : messages.map(function (message) {
474
+ return /*#__PURE__*/createElement(MessageCard, {
475
+ message: message,
476
+ key: message.id
477
+ });
478
+ })
479
+ }), /*#__PURE__*/jsx(ComposeForm, {
480
+ canReply: canReply,
481
+ entityId: entityId,
482
+ entityType: entityType
483
+ })]
484
+ });
485
+ };
486
+
487
+ export { WhatsAppMessages as default };
488
+ //# sourceMappingURL=WhatsAppMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WhatsAppMessages.js","sources":["../app/javascript/src/constants/index.js","../app/javascript/src/apis/messages.js","../app/javascript/src/hooks/reactQuery/useMessagesApi.js","../app/javascript/src/components/WhatsAppMessages/ComposeForm.jsx","../app/javascript/src/utils/index.js","../app/javascript/src/utils/formatWhatsAppMessage.jsx","../app/javascript/src/components/WhatsAppMessages/MessageCard.jsx","../app/javascript/src/components/WhatsAppMessages/index.jsx"],"sourcesContent":["import { Clock, Error, DoubleCheck, Check } from \"neetoicons\";\n\nexport const NEETO_WHATSAPP_ENGINE_BASE_URL = \"/neeto_whatsapp/api/v1\";\n\nexport const MESSAGES_URL = `${NEETO_WHATSAPP_ENGINE_BASE_URL}/messages`;\n\nexport const QUERY_KEYS = {\n WHATSAPP_MESSAGES: \"neeto-whatsapp-messages\",\n};\n\nexport const FORMATTING_MARKERS = [\n { char: \"*\", Tag: \"strong\" },\n { char: \"_\", Tag: \"em\" },\n { char: \"~\", Tag: \"del\" },\n];\n\nexport const PUNCTUATION_REGEX = /[\\p{P}]/u;\n\nexport const WHATSAPP_MESSAGES_REFETCH_INTERVAL = 10_000;\n\nexport const STATUS_ICON_CONFIG = {\n pending: { Icon: Clock, className: \"neeto-ui-text-gray-600\" },\n sent: { Icon: Check, className: \"neeto-ui-text-gray-600\" },\n delivered: { Icon: DoubleCheck, className: \"neeto-ui-text-gray-600\" },\n read: { Icon: DoubleCheck, className: \"neeto-ui-text-info-500\" },\n failed: { Icon: Error, className: \"neeto-ui-text-danger-500\" },\n};\n","import axios from \"axios\";\n\nimport { MESSAGES_URL } from \"constants\";\n\nconst fetch = ({ entityType, entityId }) =>\n axios.get(MESSAGES_URL, { params: { entityType, entityId } });\n\nconst create = ({ body, entityType, entityId }) =>\n axios.post(MESSAGES_URL, { body, entityType, entityId });\n\nconst messagesApi = { fetch, create };\n\nexport default messagesApi;\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useMutationWithInvalidation } from \"neetocommons/react-utils\";\n\nimport messagesApi from \"apis/messages\";\nimport { QUERY_KEYS, WHATSAPP_MESSAGES_REFETCH_INTERVAL } from \"constants\";\n\nexport const useFetchWhatsappMessages = (\n { entityType, entityId },\n options = {}\n) =>\n useQuery({\n queryKey: [QUERY_KEYS.WHATSAPP_MESSAGES, entityType, entityId],\n queryFn: () => messagesApi.fetch({ entityType, entityId }),\n enabled: Boolean(entityType && entityId),\n refetchInterval: WHATSAPP_MESSAGES_REFETCH_INTERVAL,\n ...options,\n });\n\nexport const useCreateWhatsappMessage = ({ entityType, entityId }) =>\n useMutationWithInvalidation(messagesApi.create, {\n keysToInvalidate: [[QUERY_KEYS.WHATSAPP_MESSAGES, entityType, entityId]],\n });\n","import { useEffect, useState } from \"react\";\n\nimport { Button, Textarea, Tooltip, Toastr } from \"neetoui\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { useCreateWhatsappMessage } from \"hooks/reactQuery/useMessagesApi\";\n\nconst ComposeForm = ({ entityType, entityId, canReply }) => {\n const { t } = useTranslation();\n const [body, setBody] = useState(\"\");\n const [isWindowExpired, setIsWindowExpired] = useState(!canReply);\n\n useEffect(() => {\n setIsWindowExpired(!canReply);\n }, [canReply]);\n\n const { mutate: createMessage, isPending } = useCreateWhatsappMessage({\n entityType,\n entityId,\n });\n\n const handleSubmit = () => {\n if (!body.trim()) return;\n\n createMessage(\n { body: body.trim(), entityType, entityId },\n {\n onSuccess: () => setBody(\"\"),\n onError: error => {\n const errorMessage =\n error.response?.data?.error ||\n t(\"neetoWhatsapp.messages.compose.sendError\");\n\n Toastr.error(errorMessage);\n\n if (\n errorMessage.includes(\"24-hour conversation window has expired\")\n ) {\n setIsWindowExpired(true);\n }\n },\n }\n );\n };\n\n const handleKeyDown = event => {\n if (!(event.key === \"Enter\" && !event.shiftKey)) return;\n event.preventDefault();\n handleSubmit();\n };\n\n const sendButton = (\n <Button\n disabled={isWindowExpired || isPending || !body.trim()}\n label={t(\"neetoWhatsapp.messages.compose.send\")}\n loading={isPending}\n onClick={handleSubmit}\n />\n );\n\n return (\n <div className=\"neeto-ui-border-t neeto-ui-bg-white sticky bottom-0 flex items-end gap-2 py-8\">\n <Textarea\n disabled={isWindowExpired}\n rows={2}\n value={body}\n placeholder={\n isWindowExpired\n ? t(\"neetoWhatsapp.messages.compose.windowExpired\")\n : t(\"neetoWhatsapp.messages.compose.placeholder\")\n }\n onChange={e => setBody(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n {isWindowExpired ? (\n <Tooltip\n content={t(\"neetoWhatsapp.messages.compose.windowExpired\")}\n position=\"top\"\n >\n {sendButton}\n </Tooltip>\n ) : (\n sendButton\n )}\n </div>\n );\n};\n\nexport default ComposeForm;\n","export const formatTimestamp = timestamp => {\n if (!timestamp) return \"\";\n\n const date = new Date(timestamp);\n\n return date.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n};\n","import React from \"react\";\n\nimport { FORMATTING_MARKERS, PUNCTUATION_REGEX } from \"constants\";\n\nlet keyCounter = 0;\nconst getKey = () => `wa-fmt-${keyCounter++}`;\n\nconst isWhitespace = char => /\\s/.test(char);\nconst isPunctuation = char => PUNCTUATION_REGEX.test(char);\n\nconst isValidOpeningPosition = (text, index) => {\n const nextChar = index + 1 < text.length ? text[index + 1] : undefined;\n const prevChar = index > 0 ? text[index - 1] : undefined;\n\n if (!nextChar || isWhitespace(nextChar)) return false;\n\n return !(prevChar && !isWhitespace(prevChar) && !isPunctuation(prevChar));\n};\n\nconst findClosingMarker = (text, startIndex, markerChar) => {\n for (let j = startIndex; j < text.length; j++) {\n if (text[j] === markerChar) {\n const prevChar = j > 0 ? text[j - 1] : undefined;\n const nextChar = j + 1 < text.length ? text[j + 1] : undefined;\n\n if (!prevChar || isWhitespace(prevChar)) continue;\n\n if (nextChar && !isWhitespace(nextChar) && !isPunctuation(nextChar)) {\n continue;\n }\n\n return j;\n }\n }\n\n return -1;\n};\n\nconst parseFormattingMarkers = text => {\n if (!text) return [];\n\n const result = [];\n let i = 0;\n let textBuffer = \"\";\n\n const flushText = () => {\n if (!textBuffer) return;\n result.push(textBuffer);\n textBuffer = \"\";\n };\n\n while (i < text.length) {\n let matched = false;\n\n for (const { char, Tag } of FORMATTING_MARKERS) {\n if (text[i] === char && isValidOpeningPosition(text, i)) {\n const closeIndex = findClosingMarker(text, i + 1, char);\n\n if (closeIndex !== -1) {\n flushText();\n const innerText = text.slice(i + 1, closeIndex);\n const innerElements = parseFormattingMarkers(innerText);\n result.push(<Tag key={getKey()}>{innerElements}</Tag>);\n i = closeIndex + 1;\n matched = true;\n break;\n }\n }\n }\n\n if (!matched) {\n textBuffer += text[i];\n i++;\n }\n }\n\n flushText();\n\n return result;\n};\n\nconst processInlineFormatting = text => {\n const parts = [];\n const regex = /`([^`\\n]+)`/g;\n let lastIndex = 0;\n let match;\n\n while ((match = regex.exec(text)) !== null) {\n if (match.index > lastIndex) {\n parts.push({ type: \"text\", content: text.slice(lastIndex, match.index) });\n }\n parts.push({ type: \"code\", content: match[1] });\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n parts.push({ type: \"text\", content: text.slice(lastIndex) });\n }\n\n return parts.map(part => {\n if (part.type === \"code\") {\n return (\n <code\n className=\"neeto-ui-bg-gray-200 neeto-ui-rounded px-1 py-0.5 font-mono text-sm\"\n key={getKey()}\n >\n {part.content}\n </code>\n );\n }\n\n const formatted = parseFormattingMarkers(part.content);\n if (formatted.length === 1 && typeof formatted[0] === \"string\") {\n return formatted[0];\n }\n\n return <React.Fragment key={getKey()}>{formatted}</React.Fragment>;\n });\n};\n\nconst processTextSegment = text => {\n const lines = text.split(\"\\n\");\n const blocks = [];\n let i = 0;\n\n while (i < lines.length) {\n if (lines[i].startsWith(\"> \")) {\n const quoteLines = [];\n while (i < lines.length && lines[i].startsWith(\"> \")) {\n quoteLines.push(lines[i].slice(2));\n i++;\n }\n blocks.push({ type: \"quote\", content: quoteLines.join(\"\\n\") });\n } else {\n const normalLines = [];\n while (i < lines.length && !lines[i].startsWith(\"> \")) {\n normalLines.push(lines[i]);\n i++;\n }\n blocks.push({ type: \"text\", content: normalLines.join(\"\\n\") });\n }\n }\n\n const result = [];\n blocks.forEach((block, index) => {\n if (index > 0) result.push(\"\\n\");\n\n if (block.type === \"quote\") {\n result.push(\n <span\n className=\"block border-l-4 neeto-ui-border-gray-400 pl-2 neeto-ui-text-gray-600\"\n key={getKey()}\n >\n {processInlineFormatting(block.content)}\n </span>\n );\n } else {\n result.push(\n <React.Fragment key={getKey()}>\n {processInlineFormatting(block.content)}\n </React.Fragment>\n );\n }\n });\n\n return result;\n};\n\nconst formatWhatsAppText = text => {\n if (!text || typeof text !== \"string\") return text;\n\n keyCounter = 0;\n\n const segments = [];\n const codeBlockRegex = /```([\\s\\S]*?)```/g;\n let lastIndex = 0;\n let match;\n\n while ((match = codeBlockRegex.exec(text)) !== null) {\n if (match.index > lastIndex) {\n segments.push({\n type: \"text\",\n content: text.slice(lastIndex, match.index),\n });\n }\n segments.push({ type: \"codeBlock\", content: match[1] });\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n segments.push({ type: \"text\", content: text.slice(lastIndex) });\n }\n\n return segments.map(segment => {\n if (segment.type === \"codeBlock\") {\n return (\n <code\n className=\"block neeto-ui-bg-gray-200 my-1 overflow-x-auto neeto-ui-rounded p-2 font-mono text-sm\"\n key={getKey()}\n >\n {segment.content}\n </code>\n );\n }\n\n return (\n <React.Fragment key={getKey()}>\n {processTextSegment(segment.content)}\n </React.Fragment>\n );\n });\n};\n\nexport default formatWhatsAppText;\n","import classnames from \"classnames\";\nimport { Typography } from \"neetoui\";\n\nimport { STATUS_ICON_CONFIG } from \"constants\";\nimport { formatTimestamp } from \"utils\";\nimport formatWhatsAppText from \"utils/formatWhatsAppMessage\";\n\nconst MessageCard = ({ message }) => {\n const isInbound = message.direction === \"inbound\";\n const { Icon, className: iconClassName } =\n STATUS_ICON_CONFIG[message.status] || {};\n\n return (\n <div\n id={message.id}\n className={classnames(\"flex w-full\", {\n \"justify-start\": isInbound,\n \"justify-end\": !isInbound,\n })}\n >\n <div\n className={classnames(\"max-w-[75%] neeto-ui-rounded-lg px-4 py-2\", {\n \"neeto-ui-bg-gray-100 rounded-tl-none\": isInbound,\n \"neeto-ui-bg-info-100 rounded-tr-none\": !isInbound,\n })}\n >\n <Typography className=\"whitespace-pre-wrap break-words\" style=\"body2\">\n {formatWhatsAppText(message.body)}\n </Typography>\n <div className=\"mt-1 flex items-center justify-end gap-1\">\n <Typography className=\"neeto-ui-text-gray-600\" style=\"nano\">\n {formatTimestamp(message.sentAt)}\n </Typography>\n {!isInbound && Icon && <Icon className={iconClassName} size={18} />}\n </div>\n </div>\n </div>\n );\n};\n\nexport default MessageCard;\n","import { useEffect } from \"react\";\n\nimport { Spinner, NoData } from \"neetoui\";\nimport { isEmpty, last } from \"ramda\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { useFetchWhatsappMessages } from \"hooks/reactQuery/useMessagesApi\";\n\nimport ComposeForm from \"./ComposeForm\";\nimport MessageCard from \"./MessageCard\";\n\nconst WhatsAppMessages = ({ entityType, entityId }) => {\n const { t } = useTranslation();\n\n const { data: { messages = [], canReply = false } = {}, isLoading } =\n useFetchWhatsappMessages({ entityType, entityId });\n\n useEffect(() => {\n const lastMessage = last(messages);\n\n if (!lastMessage) return;\n\n const element = document.getElementById(lastMessage.id);\n\n element?.scrollIntoView();\n }, [messages]);\n\n if (isLoading) {\n return (\n <div className=\"flex h-full w-full items-center justify-center py-4\">\n <Spinner />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n <div className=\"flex flex-col gap-y-4 py-4\">\n {isEmpty(messages) ? (\n <div className=\"flex w-full items-center justify-center py-4\">\n <NoData title={t(\"neetoWhatsapp.messages.emptyState\")} />\n </div>\n ) : (\n messages.map(message => (\n <MessageCard {...{ message }} key={message.id} />\n ))\n )}\n </div>\n <ComposeForm {...{ canReply, entityId, entityType }} />\n </div>\n );\n};\n\nexport default WhatsAppMessages;\n"],"names":["NEETO_WHATSAPP_ENGINE_BASE_URL","MESSAGES_URL","concat","QUERY_KEYS","WHATSAPP_MESSAGES","FORMATTING_MARKERS","Tag","PUNCTUATION_REGEX","WHATSAPP_MESSAGES_REFETCH_INTERVAL","STATUS_ICON_CONFIG","pending","Icon","Clock","className","sent","Check","delivered","DoubleCheck","read","failed","Error","fetch","_ref","entityType","entityId","axios","get","params","create","_ref2","body","post","messagesApi","useFetchWhatsappMessages","options","arguments","length","undefined","useQuery","_objectSpread","queryKey","queryFn","enabled","Boolean","refetchInterval","useCreateWhatsappMessage","useMutationWithInvalidation","keysToInvalidate","ComposeForm","canReply","_useTranslation","useTranslation","t","_useState","useState","_useState2","_slicedToArray","setBody","_useState3","_useState4","isWindowExpired","setIsWindowExpired","useEffect","_useCreateWhatsappMes","createMessage","mutate","isPending","handleSubmit","trim","onSuccess","onError","error","_error$response","errorMessage","response","data","Toastr","includes","handleKeyDown","event","key","shiftKey","preventDefault","sendButton","_jsx","Button","disabled","label","loading","onClick","_jsxs","children","Textarea","rows","value","placeholder","onChange","e","target","onKeyDown","Tooltip","content","position","formatTimestamp","timestamp","date","Date","toLocaleString","month","day","hour","minute","keyCounter","getKey","isWhitespace","char","test","isPunctuation","isValidOpeningPosition","text","index","nextChar","prevChar","findClosingMarker","startIndex","markerChar","j","parseFormattingMarkers","result","i","textBuffer","flushText","push","matched","_iterator","_createForOfIteratorHelper","_step","s","n","done","_step$value","closeIndex","innerText","slice","innerElements","err","f","processInlineFormatting","parts","regex","lastIndex","match","exec","type","map","part","formatted","React","Fragment","processTextSegment","lines","split","blocks","startsWith","quoteLines","join","normalLines","forEach","block","formatWhatsAppText","segments","codeBlockRegex","segment","MessageCard","message","isInbound","direction","status","iconClassName","id","classnames","Typography","style","sentAt","size","WhatsAppMessages","_useFetchWhatsappMess","_useFetchWhatsappMess2","_useFetchWhatsappMess3","_useFetchWhatsappMess4","messages","_useFetchWhatsappMess5","isLoading","lastMessage","last","element","document","getElementById","scrollIntoView","Spinner","isEmpty","NoData","title","_createElement"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ var reactI18next = require('react-i18next');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ var WelcomeScreen = function WelcomeScreen() {
7
+ var _useTranslation = reactI18next.useTranslation(),
8
+ t = _useTranslation.t;
9
+ return /*#__PURE__*/jsxRuntime.jsx("div", {
10
+ children: t("neetoWhatsapp.welcomeScreen")
11
+ });
12
+ };
13
+
14
+ module.exports = WelcomeScreen;
15
+ //# sourceMappingURL=WelcomeScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WelcomeScreen.js","sources":["../../app/javascript/src/components/WelcomeScreen/index.jsx"],"sourcesContent":["import { useTranslation } from \"react-i18next\";\n\nconst WelcomeScreen = () => {\n const { t } = useTranslation();\n\n return <div>{t(\"neetoWhatsapp.welcomeScreen\")}</div>;\n};\nexport default WelcomeScreen;\n"],"names":["WelcomeScreen","_useTranslation","useTranslation","t","_jsx","children"],"mappings":";;;;;AAEA,IAAMA,aAAa,GAAG,SAAhBA,aAAaA,GAAS;AAC1B,EAAA,IAAAC,eAAA,GAAcC,2BAAc,EAAE;IAAtBC,CAAC,GAAAF,eAAA,CAADE,CAAC;AAET,EAAA,oBAAOC,cAAA,CAAA,KAAA,EAAA;IAAAC,QAAA,EAAMF,CAAC,CAAC,6BAA6B;AAAC,GAAM,CAAC;AACtD;;;;"}