@modochats/widget 0.1.3 → 1.0.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 (179) hide show
  1. package/.github/workflows/build-and-publish.yml +116 -174
  2. package/.releaserc +60 -0
  3. package/CHANGELOG.md +8 -0
  4. package/README.md +191 -163
  5. package/package.json +79 -76
  6. package/src/app.ts +117 -117
  7. package/src/constants/index.ts +21 -21
  8. package/src/constants/regex.ts +2 -2
  9. package/src/constants/version.ts +2 -0
  10. package/src/index.ts +16 -16
  11. package/src/services/chat/conversation.ts +135 -135
  12. package/src/services/chat/message-utils.ts +221 -221
  13. package/src/services/chat/model.ts +139 -139
  14. package/src/services/chatbot/chatbot.ts +66 -66
  15. package/src/services/checker.ts +10 -10
  16. package/src/services/listeners/fn.ts +77 -77
  17. package/src/services/socket/utils.ts +9 -9
  18. package/src/services/user/customer-data.ts +78 -78
  19. package/src/services/voice-chat/model.ts +79 -79
  20. package/src/services/voice-chat/utils.ts +137 -137
  21. package/src/tools/fetch.ts +7 -7
  22. package/src/types/app.ts +17 -17
  23. package/src/types/conversation.ts +14 -14
  24. package/src/types/socket.ts +7 -7
  25. package/src/types/window.ts +12 -12
  26. package/src/utils/audio.ts +67 -67
  27. package/src/utils/browser.ts +4 -4
  28. package/src/utils/fetch.ts +98 -98
  29. package/src/utils/uuid.ts +13 -13
  30. package/dist/src/app.d.ts +0 -29
  31. package/dist/src/app.js +0 -1
  32. package/dist/src/app.js.map +0 -1
  33. package/dist/src/constants/index.d.ts +0 -9
  34. package/dist/src/constants/index.js +0 -1
  35. package/dist/src/constants/index.js.map +0 -1
  36. package/dist/src/constants/regex.d.ts +0 -2
  37. package/dist/src/constants/regex.js +0 -1
  38. package/dist/src/constants/regex.js.map +0 -1
  39. package/dist/src/index.d.ts +0 -9
  40. package/dist/src/index.js +0 -1
  41. package/dist/src/index.js.map +0 -1
  42. package/dist/src/models/chatbot.d.ts +0 -23
  43. package/dist/src/models/chatbot.js +0 -1
  44. package/dist/src/models/chatbot.js.map +0 -1
  45. package/dist/src/models/conversation.d.ts +0 -22
  46. package/dist/src/models/conversation.js +0 -1
  47. package/dist/src/models/conversation.js.map +0 -1
  48. package/dist/src/models/customer-data.d.ts +0 -31
  49. package/dist/src/models/customer-data.js +0 -1
  50. package/dist/src/models/customer-data.js.map +0 -1
  51. package/dist/src/models/message-utils.d.ts +0 -12
  52. package/dist/src/models/message-utils.js +0 -1
  53. package/dist/src/models/message-utils.js.map +0 -1
  54. package/dist/src/services/chat/conversation.d.ts +0 -22
  55. package/dist/src/services/chat/conversation.js +0 -1
  56. package/dist/src/services/chat/conversation.js.map +0 -1
  57. package/dist/src/services/chat/message-utils.d.ts +0 -12
  58. package/dist/src/services/chat/message-utils.js +0 -1
  59. package/dist/src/services/chat/message-utils.js.map +0 -1
  60. package/dist/src/services/chat/model.d.ts +0 -27
  61. package/dist/src/services/chat/model.js +0 -1
  62. package/dist/src/services/chat/model.js.map +0 -1
  63. package/dist/src/services/chatbot/chatbot.d.ts +0 -23
  64. package/dist/src/services/chatbot/chatbot.js +0 -1
  65. package/dist/src/services/chatbot/chatbot.js.map +0 -1
  66. package/dist/src/services/checker.d.ts +0 -3
  67. package/dist/src/services/checker.js +0 -1
  68. package/dist/src/services/checker.js.map +0 -1
  69. package/dist/src/services/listeners/adders.d.ts +0 -3
  70. package/dist/src/services/listeners/adders.js +0 -1
  71. package/dist/src/services/listeners/adders.js.map +0 -1
  72. package/dist/src/services/listeners/fn.d.ts +0 -3
  73. package/dist/src/services/listeners/fn.js +0 -1
  74. package/dist/src/services/listeners/fn.js.map +0 -1
  75. package/dist/src/services/socket/utils.d.ts +0 -2
  76. package/dist/src/services/socket/utils.js +0 -1
  77. package/dist/src/services/socket/utils.js.map +0 -1
  78. package/dist/src/services/ui/fn.d.ts +0 -13
  79. package/dist/src/services/ui/fn.js +0 -1
  80. package/dist/src/services/ui/fn.js.map +0 -1
  81. package/dist/src/services/ui/html.d.ts +0 -3
  82. package/dist/src/services/ui/html.js +0 -1
  83. package/dist/src/services/ui/html.js.map +0 -1
  84. package/dist/src/services/user/customer-data.d.ts +0 -31
  85. package/dist/src/services/user/customer-data.js +0 -1
  86. package/dist/src/services/user/customer-data.js.map +0 -1
  87. package/dist/src/services/voice-chat/model.d.ts +0 -12
  88. package/dist/src/services/voice-chat/model.js +0 -1
  89. package/dist/src/services/voice-chat/model.js.map +0 -1
  90. package/dist/src/services/voice-chat/utils.d.ts +0 -9
  91. package/dist/src/services/voice-chat/utils.js +0 -1
  92. package/dist/src/services/voice-chat/utils.js.map +0 -1
  93. package/dist/src/tools/fetch.d.ts +0 -2
  94. package/dist/src/tools/fetch.js +0 -1
  95. package/dist/src/tools/fetch.js.map +0 -1
  96. package/dist/src/types/app.d.ts +0 -17
  97. package/dist/src/types/app.js +0 -1
  98. package/dist/src/types/app.js.map +0 -1
  99. package/dist/src/types/conversation.d.ts +0 -14
  100. package/dist/src/types/conversation.js +0 -1
  101. package/dist/src/types/conversation.js.map +0 -1
  102. package/dist/src/types/socket.d.ts +0 -6
  103. package/dist/src/types/socket.js +0 -1
  104. package/dist/src/types/socket.js.map +0 -1
  105. package/dist/src/types/window.d.ts +0 -9
  106. package/dist/src/types/window.js +0 -1
  107. package/dist/src/types/window.js.map +0 -1
  108. package/dist/src/utils/audio.d.ts +0 -3
  109. package/dist/src/utils/audio.js +0 -1
  110. package/dist/src/utils/audio.js.map +0 -1
  111. package/dist/src/utils/browser.d.ts +0 -2
  112. package/dist/src/utils/browser.js +0 -1
  113. package/dist/src/utils/browser.js.map +0 -1
  114. package/dist/src/utils/fetch.d.ts +0 -18
  115. package/dist/src/utils/fetch.js +0 -1
  116. package/dist/src/utils/fetch.js.map +0 -1
  117. package/dist/src/utils/uuid.d.ts +0 -6
  118. package/dist/src/utils/uuid.js +0 -1
  119. package/dist/src/utils/uuid.js.map +0 -1
  120. package/dist/types/src/app.d.ts +0 -30
  121. package/dist/types/src/app.d.ts.map +0 -1
  122. package/dist/types/src/constants/index.d.ts +0 -10
  123. package/dist/types/src/constants/index.d.ts.map +0 -1
  124. package/dist/types/src/constants/regex.d.ts +0 -3
  125. package/dist/types/src/constants/regex.d.ts.map +0 -1
  126. package/dist/types/src/index.d.ts +0 -10
  127. package/dist/types/src/index.d.ts.map +0 -1
  128. package/dist/types/src/models/chatbot.d.ts +0 -24
  129. package/dist/types/src/models/chatbot.d.ts.map +0 -1
  130. package/dist/types/src/models/conversation.d.ts +0 -23
  131. package/dist/types/src/models/conversation.d.ts.map +0 -1
  132. package/dist/types/src/models/customer-data.d.ts +0 -32
  133. package/dist/types/src/models/customer-data.d.ts.map +0 -1
  134. package/dist/types/src/models/message-utils.d.ts +0 -13
  135. package/dist/types/src/models/message-utils.d.ts.map +0 -1
  136. package/dist/types/src/services/chat/conversation.d.ts +0 -23
  137. package/dist/types/src/services/chat/conversation.d.ts.map +0 -1
  138. package/dist/types/src/services/chat/message-utils.d.ts +0 -13
  139. package/dist/types/src/services/chat/message-utils.d.ts.map +0 -1
  140. package/dist/types/src/services/chat/model.d.ts +0 -28
  141. package/dist/types/src/services/chat/model.d.ts.map +0 -1
  142. package/dist/types/src/services/chatbot/chatbot.d.ts +0 -24
  143. package/dist/types/src/services/chatbot/chatbot.d.ts.map +0 -1
  144. package/dist/types/src/services/checker.d.ts +0 -4
  145. package/dist/types/src/services/checker.d.ts.map +0 -1
  146. package/dist/types/src/services/listeners/adders.d.ts +0 -4
  147. package/dist/types/src/services/listeners/adders.d.ts.map +0 -1
  148. package/dist/types/src/services/listeners/fn.d.ts +0 -4
  149. package/dist/types/src/services/listeners/fn.d.ts.map +0 -1
  150. package/dist/types/src/services/socket/utils.d.ts +0 -3
  151. package/dist/types/src/services/socket/utils.d.ts.map +0 -1
  152. package/dist/types/src/services/ui/fn.d.ts +0 -14
  153. package/dist/types/src/services/ui/fn.d.ts.map +0 -1
  154. package/dist/types/src/services/ui/html.d.ts +0 -4
  155. package/dist/types/src/services/ui/html.d.ts.map +0 -1
  156. package/dist/types/src/services/user/customer-data.d.ts +0 -32
  157. package/dist/types/src/services/user/customer-data.d.ts.map +0 -1
  158. package/dist/types/src/services/voice-chat/model.d.ts +0 -13
  159. package/dist/types/src/services/voice-chat/model.d.ts.map +0 -1
  160. package/dist/types/src/services/voice-chat/utils.d.ts +0 -10
  161. package/dist/types/src/services/voice-chat/utils.d.ts.map +0 -1
  162. package/dist/types/src/tools/fetch.d.ts +0 -3
  163. package/dist/types/src/tools/fetch.d.ts.map +0 -1
  164. package/dist/types/src/types/app.d.ts +0 -18
  165. package/dist/types/src/types/app.d.ts.map +0 -1
  166. package/dist/types/src/types/conversation.d.ts +0 -15
  167. package/dist/types/src/types/conversation.d.ts.map +0 -1
  168. package/dist/types/src/types/socket.d.ts +0 -7
  169. package/dist/types/src/types/socket.d.ts.map +0 -1
  170. package/dist/types/src/types/window.d.ts +0 -10
  171. package/dist/types/src/types/window.d.ts.map +0 -1
  172. package/dist/types/src/utils/audio.d.ts +0 -4
  173. package/dist/types/src/utils/audio.d.ts.map +0 -1
  174. package/dist/types/src/utils/browser.d.ts +0 -3
  175. package/dist/types/src/utils/browser.d.ts.map +0 -1
  176. package/dist/types/src/utils/fetch.d.ts +0 -19
  177. package/dist/types/src/utils/fetch.d.ts.map +0 -1
  178. package/dist/types/src/utils/uuid.d.ts +0 -7
  179. package/dist/types/src/utils/uuid.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
- interface SocketMessage {
2
- type: "new_message" | "ai_response" | "conversation_status_change";
3
- message: any;
4
- status: string;
5
- }
6
-
7
- export type {SocketMessage};
1
+ interface SocketMessage {
2
+ type: "new_message" | "ai_response" | "conversation_status_change";
3
+ message: any;
4
+ status: string;
5
+ }
6
+
7
+ export type {SocketMessage};
@@ -1,12 +1,12 @@
1
- import {Widget} from "../app.js";
2
-
3
- declare global {
4
- interface Window {
5
- ModoChat: typeof Widget;
6
- ModoWidget: typeof Widget;
7
- getMWidget?: () => Widget;
8
- }
9
- }
10
-
11
- // This is needed to make this file a module
12
- export {};
1
+ import {Widget} from "../app.js";
2
+
3
+ declare global {
4
+ interface Window {
5
+ ModoChat: typeof Widget;
6
+ ModoWidget: typeof Widget;
7
+ getMWidget?: () => Widget;
8
+ }
9
+ }
10
+
11
+ // This is needed to make this file a module
12
+ export {};
@@ -1,67 +1,67 @@
1
- // Cache for preloaded audio elements
2
- const audioCache = new Map<string, HTMLAudioElement>();
3
-
4
- const preloadAudio = (audioPath: string): Promise<HTMLAudioElement> => {
5
- return new Promise((resolve, reject) => {
6
- if (audioCache.has(audioPath)) {
7
- resolve(audioCache.get(audioPath)!);
8
- return;
9
- }
10
-
11
- const audioElement = new Audio(audioPath);
12
- audioElement.volume = 0.5;
13
- audioElement.preload = "auto";
14
-
15
- audioElement.addEventListener("canplaythrough", () => {
16
- audioCache.set(audioPath, audioElement);
17
- resolve(audioElement);
18
- });
19
-
20
- audioElement.addEventListener("error", error => {
21
- reject(error);
22
- });
23
-
24
- // Start loading
25
- audioElement.load();
26
- });
27
- };
28
-
29
- const playAudio = async (audioPath: string) => {
30
- try {
31
- // Try to get preloaded audio or create new one
32
- let audioElement = audioCache.get(audioPath);
33
-
34
- if (!audioElement) {
35
- audioElement = new Audio(audioPath);
36
- audioElement.volume = 0.5;
37
- audioElement.preload = "auto";
38
- }
39
-
40
- // Play the audio
41
- await audioElement.play();
42
- } catch (error) {
43
- console.warn("Failed to play audio:", error);
44
- // Fallback: try to play a simple beep sound using Web Audio API
45
- try {
46
- const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();
47
- const oscillator = audioContext.createOscillator();
48
- const gainNode = audioContext.createGain();
49
-
50
- oscillator.connect(gainNode);
51
- gainNode.connect(audioContext.destination);
52
-
53
- oscillator.frequency.setValueAtTime(800, audioContext.currentTime);
54
- oscillator.type = "sine";
55
-
56
- gainNode.gain.setValueAtTime(0.3, audioContext.currentTime);
57
- gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.5);
58
-
59
- oscillator.start(audioContext.currentTime);
60
- oscillator.stop(audioContext.currentTime + 0.5);
61
- } catch (fallbackError) {
62
- console.warn("Audio fallback also failed:", fallbackError);
63
- }
64
- }
65
- };
66
-
67
- export {playAudio, preloadAudio};
1
+ // Cache for preloaded audio elements
2
+ const audioCache = new Map<string, HTMLAudioElement>();
3
+
4
+ const preloadAudio = (audioPath: string): Promise<HTMLAudioElement> => {
5
+ return new Promise((resolve, reject) => {
6
+ if (audioCache.has(audioPath)) {
7
+ resolve(audioCache.get(audioPath)!);
8
+ return;
9
+ }
10
+
11
+ const audioElement = new Audio(audioPath);
12
+ audioElement.volume = 0.5;
13
+ audioElement.preload = "auto";
14
+
15
+ audioElement.addEventListener("canplaythrough", () => {
16
+ audioCache.set(audioPath, audioElement);
17
+ resolve(audioElement);
18
+ });
19
+
20
+ audioElement.addEventListener("error", error => {
21
+ reject(error);
22
+ });
23
+
24
+ // Start loading
25
+ audioElement.load();
26
+ });
27
+ };
28
+
29
+ const playAudio = async (audioPath: string) => {
30
+ try {
31
+ // Try to get preloaded audio or create new one
32
+ let audioElement = audioCache.get(audioPath);
33
+
34
+ if (!audioElement) {
35
+ audioElement = new Audio(audioPath);
36
+ audioElement.volume = 0.5;
37
+ audioElement.preload = "auto";
38
+ }
39
+
40
+ // Play the audio
41
+ await audioElement.play();
42
+ } catch (error) {
43
+ console.warn("Failed to play audio:", error);
44
+ // Fallback: try to play a simple beep sound using Web Audio API
45
+ try {
46
+ const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();
47
+ const oscillator = audioContext.createOscillator();
48
+ const gainNode = audioContext.createGain();
49
+
50
+ oscillator.connect(gainNode);
51
+ gainNode.connect(audioContext.destination);
52
+
53
+ oscillator.frequency.setValueAtTime(800, audioContext.currentTime);
54
+ oscillator.type = "sine";
55
+
56
+ gainNode.gain.setValueAtTime(0.3, audioContext.currentTime);
57
+ gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.5);
58
+
59
+ oscillator.start(audioContext.currentTime);
60
+ oscillator.stop(audioContext.currentTime + 0.5);
61
+ } catch (fallbackError) {
62
+ console.warn("Audio fallback also failed:", fallbackError);
63
+ }
64
+ }
65
+ };
66
+
67
+ export {playAudio, preloadAudio};
@@ -1,4 +1,4 @@
1
- let getDocumentHead = () => {
2
- return document.getElementsByTagName("HEAD")[0];
3
- };
4
- export {getDocumentHead};
1
+ let getDocumentHead = () => {
2
+ return document.getElementsByTagName("HEAD")[0];
3
+ };
4
+ export {getDocumentHead};
@@ -1,98 +1,98 @@
1
- import {$fetch} from "#src/tools/fetch.js";
2
- import {FetchPaginationRes} from "#src/types/app.js";
3
-
4
- const fetchChatbot = async (publicKey: string) => {
5
- return await $fetch<Record<string, any>>(`/v1/chatbot/public/${publicKey}`);
6
- };
7
-
8
- const fetchSendMessage = async (
9
- chatbotId: number,
10
- content: string,
11
- uniqueId: string,
12
- conversationUuid?: string,
13
- phoneNumber?: string,
14
- options?: {
15
- file?: File;
16
- replyTo?: number;
17
- }
18
- ) => {
19
- const formData = new FormData();
20
- formData.append("chatbot_id", chatbotId.toString());
21
- formData.append("content", content);
22
- formData.append("message_type", "0");
23
- formData.append("unique_id", uniqueId);
24
- if (conversationUuid) formData.append("conversation_id", conversationUuid);
25
- formData.append("url", window?.location?.href || "");
26
- formData.append("title", document?.title || "");
27
- if (phoneNumber && phoneNumber !== "no phone number") formData.append("phone_number", phoneNumber);
28
- if (options?.file) formData.append("file", options.file);
29
- if (options?.replyTo) formData.append("response_to", options.replyTo.toString());
30
-
31
- return await $fetch("/v2/conversations/website/send-message/", {
32
- method: "POST",
33
- body: formData
34
- });
35
- };
36
- const fetchGetAccessTokenForSocket = async (chatbotId: string, conversationUuid: string, uniqueId: string) => {
37
- return await $fetch<{access_token: string; conversation_uuid: string; expires_in: number}>("/v2/conversations/websocket/auth/", {
38
- method: "POST",
39
- body: {
40
- chatbot_id: chatbotId,
41
- conversation_uuid: conversationUuid,
42
- unique_id: uniqueId
43
- }
44
- });
45
- };
46
- const fetchConversationMessages = async (conversationUuid: string, chatbotUuid: string) => {
47
- return await $fetch<Record<string, any>>(`/v2/conversations/website/conversations/${conversationUuid}/chatbot/${chatbotUuid}/messages/`);
48
- };
49
- const fetchUpdateUserData = async (chatbotUuid: string, uniqueId: string, userData: Record<string, any>) => {
50
- return await $fetch("/v1/chatbot/customners/set-user-data", {
51
- method: "POST",
52
- body: {
53
- chatbot_uuid: chatbotUuid,
54
- unique_id: uniqueId,
55
- user_data: userData
56
- }
57
- });
58
- };
59
- const fetchReadMessage = async (id: number) => {
60
- return await $fetch(`/v2/conversations/messages/${id}/`, {
61
- method: "POST"
62
- });
63
- };
64
- const fetchMarkConversationAsRead = async (conversationUuid: string, uniqueId: string) => {
65
- return await $fetch(`/v2/conversations/website/conversations/${conversationUuid}/messages/seen`, {
66
- method: "POST",
67
- body: {
68
- unique_id: uniqueId
69
- }
70
- });
71
- };
72
-
73
- const fetchMessageFeedback = async (id: number, uniqueId: string, conversationUuid: string, liked: boolean) => {
74
- return await $fetch(`/v2/conversations/website/conversations/messages/feedback`, {
75
- method: "POST",
76
- body: {
77
- unique_id: uniqueId,
78
- feedback: liked ? 1 : 0,
79
- message_id: id,
80
- conversation_uuid: conversationUuid
81
- }
82
- });
83
- };
84
-
85
- const fetchConversations = async (conversationUuid: string, uniqueId: string) => {
86
- return await $fetch<FetchPaginationRes>(`/v2/conversations/website/conversations/${conversationUuid}/customer/${uniqueId}`);
87
- };
88
- export {
89
- fetchChatbot,
90
- fetchSendMessage,
91
- fetchGetAccessTokenForSocket,
92
- fetchConversationMessages,
93
- fetchUpdateUserData,
94
- fetchReadMessage,
95
- fetchMarkConversationAsRead,
96
- fetchMessageFeedback,
97
- fetchConversations
98
- };
1
+ import {$fetch} from "#src/tools/fetch.js";
2
+ import {FetchPaginationRes} from "#src/types/app.js";
3
+
4
+ const fetchChatbot = async (publicKey: string) => {
5
+ return await $fetch<Record<string, any>>(`/v1/chatbot/public/${publicKey}`);
6
+ };
7
+
8
+ const fetchSendMessage = async (
9
+ chatbotId: number,
10
+ content: string,
11
+ uniqueId: string,
12
+ conversationUuid?: string,
13
+ phoneNumber?: string,
14
+ options?: {
15
+ file?: File;
16
+ replyTo?: number;
17
+ }
18
+ ) => {
19
+ const formData = new FormData();
20
+ formData.append("chatbot_id", chatbotId.toString());
21
+ formData.append("content", content);
22
+ formData.append("message_type", "0");
23
+ formData.append("unique_id", uniqueId);
24
+ if (conversationUuid) formData.append("conversation_id", conversationUuid);
25
+ formData.append("url", window?.location?.href || "");
26
+ formData.append("title", document?.title || "");
27
+ if (phoneNumber && phoneNumber !== "no phone number") formData.append("phone_number", phoneNumber);
28
+ if (options?.file) formData.append("file", options.file);
29
+ if (options?.replyTo) formData.append("response_to", options.replyTo.toString());
30
+
31
+ return await $fetch("/v2/conversations/website/send-message/", {
32
+ method: "POST",
33
+ body: formData
34
+ });
35
+ };
36
+ const fetchGetAccessTokenForSocket = async (chatbotId: string, conversationUuid: string, uniqueId: string) => {
37
+ return await $fetch<{access_token: string; conversation_uuid: string; expires_in: number}>("/v2/conversations/websocket/auth/", {
38
+ method: "POST",
39
+ body: {
40
+ chatbot_id: chatbotId,
41
+ conversation_uuid: conversationUuid,
42
+ unique_id: uniqueId
43
+ }
44
+ });
45
+ };
46
+ const fetchConversationMessages = async (conversationUuid: string, chatbotUuid: string) => {
47
+ return await $fetch<Record<string, any>>(`/v2/conversations/website/conversations/${conversationUuid}/chatbot/${chatbotUuid}/messages/`);
48
+ };
49
+ const fetchUpdateUserData = async (chatbotUuid: string, uniqueId: string, userData: Record<string, any>) => {
50
+ return await $fetch("/v1/chatbot/customners/set-user-data", {
51
+ method: "POST",
52
+ body: {
53
+ chatbot_uuid: chatbotUuid,
54
+ unique_id: uniqueId,
55
+ user_data: userData
56
+ }
57
+ });
58
+ };
59
+ const fetchReadMessage = async (id: number) => {
60
+ return await $fetch(`/v2/conversations/messages/${id}/`, {
61
+ method: "POST"
62
+ });
63
+ };
64
+ const fetchMarkConversationAsRead = async (conversationUuid: string, uniqueId: string) => {
65
+ return await $fetch(`/v2/conversations/website/conversations/${conversationUuid}/messages/seen`, {
66
+ method: "POST",
67
+ body: {
68
+ unique_id: uniqueId
69
+ }
70
+ });
71
+ };
72
+
73
+ const fetchMessageFeedback = async (id: number, uniqueId: string, conversationUuid: string, liked: boolean) => {
74
+ return await $fetch(`/v2/conversations/website/conversations/messages/feedback`, {
75
+ method: "POST",
76
+ body: {
77
+ unique_id: uniqueId,
78
+ feedback: liked ? 1 : 0,
79
+ message_id: id,
80
+ conversation_uuid: conversationUuid
81
+ }
82
+ });
83
+ };
84
+
85
+ const fetchConversations = async (conversationUuid: string, uniqueId: string) => {
86
+ return await $fetch<FetchPaginationRes>(`/v2/conversations/website/conversations/${conversationUuid}/customer/${uniqueId}`);
87
+ };
88
+ export {
89
+ fetchChatbot,
90
+ fetchSendMessage,
91
+ fetchGetAccessTokenForSocket,
92
+ fetchConversationMessages,
93
+ fetchUpdateUserData,
94
+ fetchReadMessage,
95
+ fetchMarkConversationAsRead,
96
+ fetchMessageFeedback,
97
+ fetchConversations
98
+ };
package/src/utils/uuid.ts CHANGED
@@ -1,13 +1,13 @@
1
- /**
2
- * Generates a random UUID v4
3
- * @returns A random UUID string
4
- */
5
- const generateUUID = (): string => {
6
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
7
- const r = (Math.random() * 16) | 0;
8
- const v = c === "x" ? r : (r & 0x3) | 0x8;
9
- return v.toString(16);
10
- });
11
- };
12
-
13
- export {generateUUID};
1
+ /**
2
+ * Generates a random UUID v4
3
+ * @returns A random UUID string
4
+ */
5
+ const generateUUID = (): string => {
6
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
7
+ const r = (Math.random() * 16) | 0;
8
+ const v = c === "x" ? r : (r & 0x3) | 0x8;
9
+ return v.toString(16);
10
+ });
11
+ };
12
+
13
+ export {generateUUID};
package/dist/src/app.d.ts DELETED
@@ -1,29 +0,0 @@
1
- import { WidgetOptions } from "./types/app.js";
2
- import { Chatbot } from "./services/chatbot/chatbot.js";
3
- import { CustomerData } from "./services/user/customer-data.js";
4
- import { VoiceChat } from "./services/voice-chat/model.js";
5
- import { Chat } from "./services/chat/model.js";
6
- declare class Widget {
7
- container?: HTMLDivElement;
8
- publicKey: string;
9
- chatbot?: Chatbot;
10
- customerData: CustomerData;
11
- chat: Chat;
12
- options: Partial<WidgetOptions>;
13
- openedCount: number;
14
- version: string;
15
- isInitialized: boolean;
16
- isOpen: boolean;
17
- voiceChat?: VoiceChat;
18
- constructor(publicKey: string, options?: Partial<WidgetOptions>);
19
- init(): Promise<void>;
20
- onOpen(): Promise<void>;
21
- onClose(): void;
22
- /**
23
- * Update user data with new values
24
- * @param newUserData - Object containing new user data to merge
25
- */
26
- updateUserData(newUserData: Record<string, any>): Promise<void>;
27
- get conversation(): import("../dist/src/models/conversation.js").Conversation;
28
- }
29
- export type { Widget };
package/dist/src/app.js DELETED
@@ -1 +0,0 @@
1
- import{Chatbot}from"./services/chatbot/chatbot.js";import{fetchChatbot}from"./utils/fetch.js";import{checkIfHostIsAllowed}from"./services/checker.js";import{createChatContainer}from"./services/ui/html.js";import{CustomerData}from"./services/user/customer-data.js";import{loadStarters,updateChatToggleImage,updateChatTitle,applyModoOptions,loadCss}from"./services/ui/fn.js";import{VERSION}from"./constants/index.js";import{VoiceChat}from"./services/voice-chat/model.js";import{Chat}from"./services/chat/model.js";class Widget{container;publicKey;chatbot;customerData;chat;options={};openedCount=0;version;isInitialized=!1;isOpen=!1;voiceChat;constructor(t,o){this.publicKey=t,this.customerData=new CustomerData(this,o?.userData),this.chat=new Chat,this.version=VERSION,this.options={position:o?.position||"right",theme:o?.theme,primaryColor:o?.primaryColor,title:o?.title||"",userData:o?.userData,foregroundColor:o?.foregroundColor,fullScreen:"boolean"==typeof o?.fullScreen&&o?.fullScreen},o?.autoInit&&this.init()}async init(){if(this.isInitialized)throw new Error("Widget already initialized");const t=await fetchChatbot(this.publicKey);if(this.chatbot=new Chatbot(t),this.options={...this.options,theme:this.options?.theme||this.chatbot?.uiConfig?.theme||"dark",primaryColor:this.options?.primaryColor||this.chatbot?.uiConfig?.primaryColor||"#667eea",foregroundColor:this.options?.foregroundColor||this.chatbot?.uiConfig?.foregroundColor||"#fff"},!checkIfHostIsAllowed(this))throw new Error("host not allowed");if(await loadCss(),window.getMWidget=()=>this,createChatContainer(this),applyModoOptions(),loadStarters(),updateChatToggleImage(),updateChatTitle(),this.isInitialized=!0,this.chatbot.showTooltip(),this.options.fullScreen){const t=this.container?.querySelector(".mw-chat-body");t&&(t.classList.remove("mw-hidden"),t.classList.add("mw-active"));try{this.chat.initInstance()}finally{this.onOpen()}}else this.chat.initInstance()}async onOpen(){this.isOpen=!0,this.openedCount++,this.conversation?.hideTooltip(),this.chatbot?.hideTooltip(),this.conversation?.markAsRead(),this.conversation?.scrollToBottom(),1===this.openedCount&&(this.chat.conversationD&&(await(this.conversation?.loadMessages()),await(this.chat?.socket?.connect())),this.chatbot?.voiceChat&&(this.voiceChat=new VoiceChat),await this.customerData.fetchUpdate())}onClose(){this.isOpen=!1}async updateUserData(t){await this.customerData.updateUserData(t)}get conversation(){return this.chat.conversation}}window.ModoChat=Widget,window.ModoWidget=Widget;
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,+BAA+B,CAAC;AACtD,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAC,oBAAoB,EAAC,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAC,YAAY,EAAC,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAC,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,gBAAgB,EAAE,OAAO,EAAC,MAAM,qBAAqB,CAAC;AACpH,OAAO,EAAC,OAAO,EAAC,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAC,SAAS,EAAC,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAC,IAAI,EAAC,MAAM,0BAA0B,CAAC;AAE9C,MAAM,MAAM;IACV,SAAS,CAAkB;IAC3B,SAAS,CAAS;IAClB,OAAO,CAAW;IAClB,YAAY,CAAe;IAC3B,IAAI,CAAO;IAEX,OAAO,GAA2B,EAAE,CAAC;IACrC,WAAW,GAAW,CAAC,CAAC;IACxB,OAAO,CAAS;IAChB,aAAa,GAAY,KAAK,CAAC;IAC/B,MAAM,GAAY,KAAK,CAAC;IACxB,SAAS,CAAa;IAEtB,YAAY,SAAiB,EAAE,OAAgC;QAC7D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,OAAO;YACtC,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;YAC3B,QAAQ,EAAE,OAAO,EAAE,QAAQ;YAC3B,eAAe,EAAE,OAAO,EAAE,eAAe;YACzC,UAAU,EAAE,OAAO,OAAO,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK;SACnF,CAAC;QACF,IAAI,OAAO,EAAE,QAAQ;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IACD,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG;YACb,GAAG,IAAI,CAAC,OAAO;YACf,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,MAAM;YACrE,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,IAAI,SAAS;YAC7F,eAAe,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,eAAe,IAAI,MAAM;SACpG,CAAC;QACF,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,OAAO,EAAE,CAAC;YAChB,MAAM,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;YAC/B,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC1B,gBAAgB,EAAE,CAAC;YACnB,YAAY,EAAE,CAAC;YACf,qBAAqB,EAAE,CAAC;YACxB,eAAe,EAAE,CAAC;YAElB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAE3B,kDAAkD;YAClD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC5B,iDAAiD;gBACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;gBAChE,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBACvC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACtC,CAAC;gBACD,IAAI,CAAC;oBACH,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC3B,CAAC;wBAAS,CAAC;oBACT,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;;gBAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,CAAC;;YAAM,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,mCAAmC;QACnC,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC5B,MAAM,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;gBACxC,MAAM,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YACrC,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,EAAE,SAAS;gBAAE,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;YAC9D,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,WAAgC;QACnD,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;IAChC,CAAC;CACF;AAED,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC;AACzB,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC"}
@@ -1,9 +0,0 @@
1
- declare const getEnvironment: () => any;
2
- declare const isDev: boolean;
3
- declare const isProd: boolean;
4
- declare const BASE_API_URL: string;
5
- declare const BASE_WEBSOCKET_URL: string;
6
- declare const VERSION = "0.51";
7
- declare const BASE_STORAGE_URL = "https://modochats.s3.ir-thr-at1.arvanstorage.ir";
8
- declare const NEW_MESSAGE_AUDIO_URL = "https://modochats.s3.ir-thr-at1.arvanstorage.ir/new-message.mp3";
9
- export { BASE_API_URL, BASE_WEBSOCKET_URL, VERSION, isDev, isProd, getEnvironment, NEW_MESSAGE_AUDIO_URL, BASE_STORAGE_URL };
@@ -1 +0,0 @@
1
- const getEnvironment=()=>"undefined"!=typeof window&&window.ENVIRONMENT?window.ENVIRONMENT:"undefined"!=typeof process&&process.env?.NODE_ENV?process.env.NODE_ENV.toUpperCase():"PROD",isDev="DEV"===getEnvironment(),isProd="PROD"===getEnvironment(),BASE_API_URL=isDev?"https://dev-api.modochats.com":"https://api.modochats.com",BASE_WEBSOCKET_URL=isDev?"wss://dev-api.modochats.com/ws":"wss://api.modochats.com/ws",VERSION="0.51",BASE_STORAGE_URL="https://modochats.s3.ir-thr-at1.arvanstorage.ir",NEW_MESSAGE_AUDIO_URL=`${BASE_STORAGE_URL}/new-message.mp3`;export{BASE_API_URL,BASE_WEBSOCKET_URL,VERSION,isDev,isProd,getEnvironment,NEW_MESSAGE_AUDIO_URL,BASE_STORAGE_URL};
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,GAAG,EAAE;IAC1B,oCAAoC;IACpC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAK,MAAc,CAAC,WAAW,EAAE,CAAC;QACjE,OAAQ,MAAc,CAAC,WAAW,CAAC;IACrC,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;QAC5D,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC,CAAC,wBAAwB;AACzC,CAAC,CAAC;AACF,MAAM,KAAK,GAAG,cAAc,EAAE,KAAK,KAAK,CAAC;AACzC,MAAM,MAAM,GAAG,cAAc,EAAE,KAAK,MAAM,CAAC;AAC3C,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,2BAA2B,CAAC;AAC3F,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,4BAA4B,CAAC;AACnG,MAAM,OAAO,GAAG,MAAM,CAAC;AACvB,MAAM,gBAAgB,GAAG,iDAAiD,CAAC;AAC3E,MAAM,qBAAqB,GAAG,GAAG,gBAAgB,kBAAkB,CAAC;AACpE,OAAO,EAAC,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- declare const PhoneNumberRegex: RegExp;
2
- export { PhoneNumberRegex };
@@ -1 +0,0 @@
1
- const PhoneNumberRegex=/^(\+98|0)?9\d{9}$/;export{PhoneNumberRegex};
@@ -1 +0,0 @@
1
- {"version":3,"file":"regex.js","sourceRoot":"","sources":["../../../src/constants/regex.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAC7C,OAAO,EAAC,gBAAgB,EAAC,CAAC"}
@@ -1,9 +0,0 @@
1
- export { Widget as ModoChat } from "./app.js";
2
- export type { WidgetOptions, FetchPaginationRes } from "./types/app.js";
3
- export { Chatbot } from "./services/chatbot/chatbot.js";
4
- export { Conversation } from "./services/chat/conversation.js";
5
- export { CustomerData } from "./services/user/customer-data.js";
6
- export { VoiceChat } from "./services/voice-chat/model.js";
7
- export { Chat } from "./services/chat/model.js";
8
- export type { ConversationStatus, MessageType } from "./types/conversation.js";
9
- export type { SocketMessage } from "./types/socket.js";
package/dist/src/index.js DELETED
@@ -1 +0,0 @@
1
- export{Chatbot}from"./services/chatbot/chatbot.js";export{Conversation}from"./services/chat/conversation.js";export{CustomerData}from"./services/user/customer-data.js";export{VoiceChat}from"./services/voice-chat/model.js";export{Chat}from"./services/chat/model.js";
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,SAAS;AACT,OAAO,EAAC,OAAO,EAAC,MAAM,+BAA+B,CAAC;AACtD,OAAO,EAAC,YAAY,EAAC,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAC,YAAY,EAAC,MAAM,kCAAkC,CAAC;AAE9D,WAAW;AACX,OAAO,EAAC,SAAS,EAAC,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAC,IAAI,EAAC,MAAM,0BAA0B,CAAC"}
@@ -1,23 +0,0 @@
1
- declare class Chatbot {
2
- name: string;
3
- image: string;
4
- shortDescription: string;
5
- starters: string[];
6
- voiceChat: boolean;
7
- createdAt: string;
8
- updatedAt: string;
9
- deletedAt: string | null;
10
- uuid: string;
11
- allowedHosts: string[];
12
- id: number;
13
- greetingMessage?: string;
14
- uiConfig: {
15
- primaryColor: string;
16
- foregroundColor: string;
17
- theme: "dark" | "light";
18
- };
19
- constructor(data: Record<string, any>);
20
- showTooltip(): void;
21
- hideTooltip(): void;
22
- }
23
- export { Chatbot };
@@ -1 +0,0 @@
1
- class Chatbot{name;image;shortDescription;starters=[];voiceChat;createdAt;updatedAt;deletedAt;uuid;allowedHosts=[];id;greetingMessage;uiConfig;constructor(t){this.name=t.name,this.image=t.image,this.shortDescription=t.short_description,this.starters=t.starters,this.voiceChat=t.voice_agent,this.createdAt=t.setting.created_at,this.updatedAt=t.setting.updated_at,this.deletedAt=t.setting.deleted_at,this.uuid=t.setting.unique_id,this.allowedHosts=t.setting.allow_hosts?.split(",")??[],this.id=t.setting.chatbot,this.allowedHosts.push("modochats.com"),this.uiConfig={primaryColor:t.primary_color,foregroundColor:t.foreground_color,theme:t.theme},this.greetingMessage=t.greeting_message}showTooltip(){const t=window.getMWidget?.(),e=t?.container?.querySelector(".mw-toggle-tooltip"),s=t?.container?.querySelector(".mw-toggle-tooltip-text"),i="true"===localStorage.getItem(`modochats:${t?.publicKey}-has-seen-greeting-message`);e&&s&&this.greetingMessage&&!i&&(e.classList.remove("mw-hidden"),s.textContent=this.greetingMessage)}hideTooltip(){const t=window.getMWidget?.(),e=t?.container?.querySelector(".mw-toggle-tooltip");e&&e.classList.add("mw-hidden")}}export{Chatbot};
@@ -1 +0,0 @@
1
- {"version":3,"file":"chatbot.js","sourceRoot":"","sources":["../../../src/models/chatbot.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO;IACX,IAAI,CAAS;IACb,KAAK,CAAS;IACd,gBAAgB,CAAS;IACzB,QAAQ,GAAa,EAAE,CAAC;IACxB,SAAS,CAAU;IACnB,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,SAAS,CAAgB;IACzB,IAAI,CAAS;IACb,YAAY,GAAa,EAAE,CAAC;IAC5B,EAAE,CAAS;IACX,eAAe,CAAU;IACzB,QAAQ,CAIN;IACF,YAAY,IAAyB;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG;YACd,YAAY,EAAE,IAAI,CAAC,aAAa;YAChC,eAAe,EAAE,IAAI,CAAC,gBAAgB;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC;IAC/C,CAAC;IACD,WAAW;QACT,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,yBAAyB,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,MAAM,EAAE,SAAS,4BAA4B,CAAC,KAAK,MAAM,CAAC;QAE5G,IAAI,OAAO,IAAI,WAAW,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/D,mBAAmB;YACnB,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAEtC,4CAA4C;YAC5C,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC;YAE/C,4BAA4B;YAC5B,qBAAqB;YACrB,wCAAwC;YACxC,YAAY;QACd,CAAC;IACH,CAAC;IACD,WAAW;QACT,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACvE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;CACF;AACD,OAAO,EAAC,OAAO,EAAC,CAAC"}
@@ -1,22 +0,0 @@
1
- import { ConversationMessage } from "@modochats/chat-client";
2
- declare class Conversation {
3
- constructor();
4
- get d(): import("@modochats/chat-client").Conversation | undefined;
5
- addMessage(message: ConversationMessage, options?: {
6
- incoming: boolean;
7
- }): void;
8
- clearContainerEl(): void;
9
- addSystemMessage(message: string): void;
10
- scrollToBottom(): void;
11
- clear(): void;
12
- onInit(): void;
13
- setStatus(): void;
14
- loadMessages(): Promise<void>;
15
- addBadge(): void;
16
- get unreadCount(): number;
17
- hideBadge(): void;
18
- hideTooltip(): void;
19
- markAsRead(): Promise<void>;
20
- get containerElement(): HTMLDivElement | null;
21
- }
22
- export { Conversation };
@@ -1 +0,0 @@
1
- import{NEW_MESSAGE_AUDIO_URL}from"#src/constants/index.js";import{setConversationType,switchToConversationLayout,switchToStarterLayout}from"#src/services/ui/fn.js";import{playAudio,preloadAudio}from"#src/utils/audio.js";import{initMessageElement,showMessageTooltip}from"./message-utils.js";class Conversation{constructor(){}get d(){return window.getMWidget?.().chat?.conversationD}addMessage(e,t){const s=window.getMWidget?.();initMessageElement(e),t?.incoming&&(s?.isOpen?this.markAsRead():(this.addBadge(),showMessageTooltip(e),playAudio(NEW_MESSAGE_AUDIO_URL).catch(console.warn))),this.scrollToBottom()}clearContainerEl(){const e=document.querySelector(".mw-chat-messages-con");e&&(e.innerHTML="")}addSystemMessage(e){const t=document.querySelector(".mw-chat-messages-con");if(t){const s=document.createElement("div");s.className="mw-system-message",s.innerHTML=`\n <div class="mw-system-message-content">\n ${e}\n </div>\n `,t.appendChild(s),this.scrollToBottom()}}scrollToBottom(){const e=document.querySelector(".mw-chat-messages-con");e&&(e.scrollTop=e.scrollHeight)}clear(){this.d?.clear(),this.d.messages=[];const e=window.getMWidget?.();localStorage.removeItem(`modo-chat:${e?.publicKey}-conversation-uuid`),this.clearContainerEl(),switchToStarterLayout()}onInit(){switchToConversationLayout(),preloadAudio("./audio/new-message.mp3").catch(console.warn),this?.d?.status&&setConversationType(this.d?.status)}setStatus(){setConversationType(this.d?.status)}async loadMessages(){const e=window.getMWidget?.(),t=await(this.d?.loadMessages()),s=e?.container?.querySelector(".mw-chat-messages-con");s&&(s.innerHTML="");for(const e of t||[])this.addMessage(e)}addBadge(){const e=window.getMWidget?.();if(!e?.isOpen&&this.unreadCount>0&&e){const t=e.container?.querySelector(".mw-badge"),s=e.container?.querySelector(".mw-badge-text");if(t&&s){t.classList.remove("mw-hidden");const e=this.unreadCount>99?"99+":this.unreadCount.toString();s.textContent=e,this.unreadCount>99?t.classList.add("mw-badge-plus"):t.classList.remove("mw-badge-plus")}}}get unreadCount(){return this.d?.unreadCount||0}hideBadge(){const e=window.getMWidget?.(),t=e?.container?.querySelector(".mw-badge");t&&t.classList.add("mw-hidden")}hideTooltip(){const e=window.getMWidget?.(),t=e?.container?.querySelector(".mw-toggle-tooltip");t&&t.classList.add("mw-hidden")}async markAsRead(){window.getMWidget?.(),await(this.d?.markAsRead()),this.hideBadge()}get containerElement(){return document.querySelector(".mw-chat-messages-con")}}export{Conversation};
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../../src/models/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAC,mBAAmB,EAAE,0BAA0B,EAAE,qBAAqB,EAAC,MAAM,wBAAwB,CAAC;AAC9G,OAAO,EAAC,SAAS,EAAE,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAC,kBAAkB,EAAE,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAG1E,MAAM,YAAY;IAChB,gBAAe,CAAC;IAChB,WAAW;IACX,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC;IACnD,CAAC;IACD,UAAU,CAAC,OAA4B,EAAE,OAA6B;QACpE,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACrC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,IAAI,MAAM,EAAE,MAAM;gBAAE,IAAI,CAAC,UAAU,EAAE,CAAC;iBACjC,CAAC;gBACJ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBAC5B,SAAS,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IACD,gBAAgB;QACd,MAAM,qBAAqB,GAAG,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;QAC9E,IAAI,qBAAqB,EAAE,CAAC;YAC1B,qBAAqB,CAAC,SAAS,GAAG,EAAE,CAAC;QACvC,CAAC;IACH,CAAC;IACD,gBAAgB,CAAC,OAAe;QAC9B,MAAM,qBAAqB,GAAG,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;QAC9E,IAAI,qBAAqB,EAAE,CAAC;YAC1B,MAAM,oBAAoB,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC3D,oBAAoB,CAAC,SAAS,GAAG,mBAAmB,CAAC;YACrD,oBAAoB,CAAC,SAAS,GAAG;;YAE3B,OAAO;;OAEZ,CAAC;YACF,qBAAqB,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;YACxD,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,cAAc;QACZ,MAAM,qBAAqB,GAAG,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;QAC9E,IAAI,qBAAqB,EAAE,CAAC;YAC1B,qBAAqB,CAAC,SAAS,GAAG,qBAAqB,CAAC,YAAY,CAAC;QACvE,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,CAAE,CAAC,QAAQ,GAAG,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACrC,YAAY,CAAC,UAAU,CAAC,aAAa,MAAM,EAAE,SAAS,oBAAoB,CAAC,CAAC;QAC5E,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,qBAAqB,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM;QACJ,0BAA0B,EAAE,CAAC;QAC7B,YAAY,CAAC,yBAAyB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,IAAI,EAAE,CAAC,EAAE,MAAM;YAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,MAAO,CAAC,CAAC;IAC5D,CAAC;IAED,SAAS;QACP,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,MAAO,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QAC9C,MAAM,qBAAqB,GAAG,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,uBAAuB,CAAC,CAAC;QACxF,IAAI,qBAAqB;YAAE,qBAAqB,CAAC,SAAS,GAAG,EAAE,CAAC;QAChE,KAAK,MAAM,OAAO,IAAI,QAAQ,IAAI,EAAE;YAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,QAAQ;QACN,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;YAEpE,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;gBACvB,iBAAiB;gBACjB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAEpC,oBAAoB;gBACpB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;gBACjF,SAAS,CAAC,WAAW,GAAG,YAAY,CAAC;gBAErC,gCAAgC;gBAChC,IAAI,IAAI,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;oBAC1B,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,CAAC,EAAE,WAAW,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,SAAS;QACP,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,WAAW;QACT,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACvE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;IACzD,CAAC;CACF;AACD,OAAO,EAAC,YAAY,EAAC,CAAC"}
@@ -1,31 +0,0 @@
1
- import { Widget } from "#src/app.js";
2
- declare class CustomerData {
3
- private _uniqueId?;
4
- private _userData?;
5
- private widget;
6
- phoneNumber?: string;
7
- constructor(widget: Widget, userData?: Record<string, any>);
8
- initializePhoneNumber(): void;
9
- /**
10
- * Initialize unique ID from localStorage or generate a new one
11
- * Unique ID is independent of user key/data and is generated by ourselves
12
- */
13
- private initializeUniqueId;
14
- /**
15
- * Get the current unique ID
16
- */
17
- get uniqueId(): string;
18
- /**
19
- * Get the current user data
20
- */
21
- get userData(): Record<string, any>;
22
- /**
23
- * Update user data with new values
24
- * @param newUserData - Object containing new user data to merge
25
- */
26
- updateUserData(newUserData?: Record<string, any>): Promise<void>;
27
- hasSubmittedPhoneForm(): boolean;
28
- savePhoneNumber(phoneNumber?: string): void;
29
- fetchUpdate(): Promise<void>;
30
- }
31
- export { CustomerData };
@@ -1 +0,0 @@
1
- import{fetchUpdateUserData}from"#src/utils/fetch.js";import{generateUUID}from"#src/utils/uuid.js";class CustomerData{_uniqueId;_userData;widget;phoneNumber;constructor(e,t){this.widget=e,this.initializeUniqueId(),this.updateUserData(t),this.initializePhoneNumber()}initializePhoneNumber(){const e=localStorage.getItem(`modo-chat:${this.widget.publicKey}-user-phone-number`);e&&(this.phoneNumber=e)}initializeUniqueId(){const e=localStorage.getItem(`modo-chat:${this.widget.publicKey}-user-unique-id`);e?this._uniqueId=e:(this._uniqueId=crypto.randomUUID?crypto.randomUUID():generateUUID(),localStorage.setItem(`modo-chat:${this.widget.publicKey}-user-unique-id`,this._uniqueId))}get uniqueId(){return this._uniqueId}get userData(){return this._userData||{}}async updateUserData(e){e&&"object"==typeof e?this._userData=e:e&&console.warn("Invalid user data")}hasSubmittedPhoneForm(){return Boolean(this.phoneNumber)}savePhoneNumber(e){this.phoneNumber=e||"no phone number",localStorage.setItem(`modo-chat:${this.widget.publicKey}-user-phone-number`,e||"no phone number")}async fetchUpdate(){await fetchUpdateUserData(this.widget.chatbot?.uuid,this.uniqueId,this.userData)}}export{CustomerData};
@@ -1 +0,0 @@
1
- {"version":3,"file":"customer-data.js","sourceRoot":"","sources":["../../../src/models/customer-data.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAEhD,MAAM,YAAY;IACR,SAAS,CAAU;IACnB,SAAS,CAAuB;IAChC,MAAM,CAAS;IACvB,WAAW,CAAU;IAErB,YAAY,MAAc,EAAE,QAA8B;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAED,qBAAqB;QACnB,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS,oBAAoB,CAAC,CAAC;QACtG,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,kBAAkB;QACxB,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS,iBAAiB,CAAC,CAAC;QAEhG,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,mDAAmD;YACnD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;YAC1E,YAAY,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,WAAiC;QACpD,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACnD,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;QAC/B,CAAC;aAAM,IAAI,WAAW;YAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC5D,CAAC;IAED,qBAAqB;QACnB,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED,eAAe,CAAC,WAAoB;QAClC,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,iBAAiB,CAAC;QACpD,YAAY,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS,oBAAoB,EAAE,WAAW,IAAI,iBAAiB,CAAC,CAAC;IACjH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/F,CAAC;CACF;AACD,OAAO,EAAC,YAAY,EAAC,CAAC"}