@modochats/widget 0.1.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 (195) hide show
  1. package/.github/workflows/build-and-publish.yml +174 -0
  2. package/.vscode/settings.json +3 -0
  3. package/.yarn/install-state.gz +0 -0
  4. package/README.md +163 -0
  5. package/cdn-dist/README.md +42 -0
  6. package/cdn-dist/modo-web-component.js +1344 -0
  7. package/cdn-dist/modo-web-component.min.js +1 -0
  8. package/cdn-dist/package.json +27 -0
  9. package/dist/src/app.d.ts +29 -0
  10. package/dist/src/app.js +1 -0
  11. package/dist/src/app.js.map +1 -0
  12. package/dist/src/constants/index.d.ts +9 -0
  13. package/dist/src/constants/index.js +1 -0
  14. package/dist/src/constants/index.js.map +1 -0
  15. package/dist/src/constants/regex.d.ts +2 -0
  16. package/dist/src/constants/regex.js +1 -0
  17. package/dist/src/constants/regex.js.map +1 -0
  18. package/dist/src/index.d.ts +9 -0
  19. package/dist/src/index.js +1 -0
  20. package/dist/src/index.js.map +1 -0
  21. package/dist/src/models/chatbot.d.ts +23 -0
  22. package/dist/src/models/chatbot.js +1 -0
  23. package/dist/src/models/chatbot.js.map +1 -0
  24. package/dist/src/models/conversation.d.ts +22 -0
  25. package/dist/src/models/conversation.js +1 -0
  26. package/dist/src/models/conversation.js.map +1 -0
  27. package/dist/src/models/customer-data.d.ts +31 -0
  28. package/dist/src/models/customer-data.js +1 -0
  29. package/dist/src/models/customer-data.js.map +1 -0
  30. package/dist/src/models/message-utils.d.ts +12 -0
  31. package/dist/src/models/message-utils.js +1 -0
  32. package/dist/src/models/message-utils.js.map +1 -0
  33. package/dist/src/services/chat/conversation.d.ts +22 -0
  34. package/dist/src/services/chat/conversation.js +1 -0
  35. package/dist/src/services/chat/conversation.js.map +1 -0
  36. package/dist/src/services/chat/message-utils.d.ts +12 -0
  37. package/dist/src/services/chat/message-utils.js +1 -0
  38. package/dist/src/services/chat/message-utils.js.map +1 -0
  39. package/dist/src/services/chat/model.d.ts +27 -0
  40. package/dist/src/services/chat/model.js +1 -0
  41. package/dist/src/services/chat/model.js.map +1 -0
  42. package/dist/src/services/chatbot/chatbot.d.ts +23 -0
  43. package/dist/src/services/chatbot/chatbot.js +1 -0
  44. package/dist/src/services/chatbot/chatbot.js.map +1 -0
  45. package/dist/src/services/checker.d.ts +3 -0
  46. package/dist/src/services/checker.js +1 -0
  47. package/dist/src/services/checker.js.map +1 -0
  48. package/dist/src/services/listeners/adders.d.ts +3 -0
  49. package/dist/src/services/listeners/adders.js +1 -0
  50. package/dist/src/services/listeners/adders.js.map +1 -0
  51. package/dist/src/services/listeners/fn.d.ts +3 -0
  52. package/dist/src/services/listeners/fn.js +1 -0
  53. package/dist/src/services/listeners/fn.js.map +1 -0
  54. package/dist/src/services/socket/utils.d.ts +2 -0
  55. package/dist/src/services/socket/utils.js +1 -0
  56. package/dist/src/services/socket/utils.js.map +1 -0
  57. package/dist/src/services/ui/fn.d.ts +13 -0
  58. package/dist/src/services/ui/fn.js +1 -0
  59. package/dist/src/services/ui/fn.js.map +1 -0
  60. package/dist/src/services/ui/html.d.ts +3 -0
  61. package/dist/src/services/ui/html.js +1 -0
  62. package/dist/src/services/ui/html.js.map +1 -0
  63. package/dist/src/services/user/customer-data.d.ts +31 -0
  64. package/dist/src/services/user/customer-data.js +1 -0
  65. package/dist/src/services/user/customer-data.js.map +1 -0
  66. package/dist/src/services/voice-chat/model.d.ts +12 -0
  67. package/dist/src/services/voice-chat/model.js +1 -0
  68. package/dist/src/services/voice-chat/model.js.map +1 -0
  69. package/dist/src/services/voice-chat/utils.d.ts +9 -0
  70. package/dist/src/services/voice-chat/utils.js +1 -0
  71. package/dist/src/services/voice-chat/utils.js.map +1 -0
  72. package/dist/src/tools/fetch.d.ts +2 -0
  73. package/dist/src/tools/fetch.js +1 -0
  74. package/dist/src/tools/fetch.js.map +1 -0
  75. package/dist/src/types/app.d.ts +17 -0
  76. package/dist/src/types/app.js.map +1 -0
  77. package/dist/src/types/conversation.d.ts +14 -0
  78. package/dist/src/types/conversation.js +1 -0
  79. package/dist/src/types/conversation.js.map +1 -0
  80. package/dist/src/types/socket.d.ts +6 -0
  81. package/dist/src/types/socket.js +1 -0
  82. package/dist/src/types/socket.js.map +1 -0
  83. package/dist/src/types/window.d.ts +9 -0
  84. package/dist/src/types/window.js +1 -0
  85. package/dist/src/types/window.js.map +1 -0
  86. package/dist/src/utils/audio.d.ts +3 -0
  87. package/dist/src/utils/audio.js +1 -0
  88. package/dist/src/utils/audio.js.map +1 -0
  89. package/dist/src/utils/browser.d.ts +2 -0
  90. package/dist/src/utils/browser.js +1 -0
  91. package/dist/src/utils/browser.js.map +1 -0
  92. package/dist/src/utils/fetch.d.ts +18 -0
  93. package/dist/src/utils/fetch.js +1 -0
  94. package/dist/src/utils/fetch.js.map +1 -0
  95. package/dist/src/utils/uuid.d.ts +6 -0
  96. package/dist/src/utils/uuid.js +1 -0
  97. package/dist/src/utils/uuid.js.map +1 -0
  98. package/dist/types/src/app.d.ts +30 -0
  99. package/dist/types/src/app.d.ts.map +1 -0
  100. package/dist/types/src/constants/index.d.ts +10 -0
  101. package/dist/types/src/constants/index.d.ts.map +1 -0
  102. package/dist/types/src/constants/regex.d.ts +3 -0
  103. package/dist/types/src/constants/regex.d.ts.map +1 -0
  104. package/dist/types/src/index.d.ts +10 -0
  105. package/dist/types/src/index.d.ts.map +1 -0
  106. package/dist/types/src/models/chatbot.d.ts +24 -0
  107. package/dist/types/src/models/chatbot.d.ts.map +1 -0
  108. package/dist/types/src/models/conversation.d.ts +23 -0
  109. package/dist/types/src/models/conversation.d.ts.map +1 -0
  110. package/dist/types/src/models/customer-data.d.ts +32 -0
  111. package/dist/types/src/models/customer-data.d.ts.map +1 -0
  112. package/dist/types/src/models/message-utils.d.ts +13 -0
  113. package/dist/types/src/models/message-utils.d.ts.map +1 -0
  114. package/dist/types/src/services/chat/conversation.d.ts +23 -0
  115. package/dist/types/src/services/chat/conversation.d.ts.map +1 -0
  116. package/dist/types/src/services/chat/message-utils.d.ts +13 -0
  117. package/dist/types/src/services/chat/message-utils.d.ts.map +1 -0
  118. package/dist/types/src/services/chat/model.d.ts +28 -0
  119. package/dist/types/src/services/chat/model.d.ts.map +1 -0
  120. package/dist/types/src/services/chatbot/chatbot.d.ts +24 -0
  121. package/dist/types/src/services/chatbot/chatbot.d.ts.map +1 -0
  122. package/dist/types/src/services/checker.d.ts +4 -0
  123. package/dist/types/src/services/checker.d.ts.map +1 -0
  124. package/dist/types/src/services/listeners/adders.d.ts +4 -0
  125. package/dist/types/src/services/listeners/adders.d.ts.map +1 -0
  126. package/dist/types/src/services/listeners/fn.d.ts +4 -0
  127. package/dist/types/src/services/listeners/fn.d.ts.map +1 -0
  128. package/dist/types/src/services/socket/utils.d.ts +3 -0
  129. package/dist/types/src/services/socket/utils.d.ts.map +1 -0
  130. package/dist/types/src/services/ui/fn.d.ts +14 -0
  131. package/dist/types/src/services/ui/fn.d.ts.map +1 -0
  132. package/dist/types/src/services/ui/html.d.ts +4 -0
  133. package/dist/types/src/services/ui/html.d.ts.map +1 -0
  134. package/dist/types/src/services/user/customer-data.d.ts +32 -0
  135. package/dist/types/src/services/user/customer-data.d.ts.map +1 -0
  136. package/dist/types/src/services/voice-chat/model.d.ts +13 -0
  137. package/dist/types/src/services/voice-chat/model.d.ts.map +1 -0
  138. package/dist/types/src/services/voice-chat/utils.d.ts +10 -0
  139. package/dist/types/src/services/voice-chat/utils.d.ts.map +1 -0
  140. package/dist/types/src/tools/fetch.d.ts +3 -0
  141. package/dist/types/src/tools/fetch.d.ts.map +1 -0
  142. package/dist/types/src/types/app.d.ts +18 -0
  143. package/dist/types/src/types/app.d.ts.map +1 -0
  144. package/dist/types/src/types/conversation.d.ts +15 -0
  145. package/dist/types/src/types/conversation.d.ts.map +1 -0
  146. package/dist/types/src/types/socket.d.ts +7 -0
  147. package/dist/types/src/types/socket.d.ts.map +1 -0
  148. package/dist/types/src/types/window.d.ts +10 -0
  149. package/dist/types/src/types/window.d.ts.map +1 -0
  150. package/dist/types/src/utils/audio.d.ts +4 -0
  151. package/dist/types/src/utils/audio.d.ts.map +1 -0
  152. package/dist/types/src/utils/browser.d.ts +3 -0
  153. package/dist/types/src/utils/browser.d.ts.map +1 -0
  154. package/dist/types/src/utils/fetch.d.ts +19 -0
  155. package/dist/types/src/utils/fetch.d.ts.map +1 -0
  156. package/dist/types/src/utils/uuid.d.ts +7 -0
  157. package/dist/types/src/utils/uuid.d.ts.map +1 -0
  158. package/package.json +76 -0
  159. package/rollup.config.js +18 -0
  160. package/rollup.dev.config.js +22 -0
  161. package/scripts/create-umd-bundle.js +213 -0
  162. package/scripts/terser-minify.js +112 -0
  163. package/src/app.ts +117 -0
  164. package/src/constants/index.ts +21 -0
  165. package/src/constants/regex.ts +2 -0
  166. package/src/index.ts +16 -0
  167. package/src/services/chat/conversation.ts +135 -0
  168. package/src/services/chat/message-utils.ts +221 -0
  169. package/src/services/chat/model.ts +139 -0
  170. package/src/services/chatbot/chatbot.ts +66 -0
  171. package/src/services/checker.ts +10 -0
  172. package/src/services/listeners/adders.ts +178 -0
  173. package/src/services/listeners/fn.ts +77 -0
  174. package/src/services/socket/utils.ts +9 -0
  175. package/src/services/ui/fn.ts +254 -0
  176. package/src/services/ui/html.ts +192 -0
  177. package/src/services/user/customer-data.ts +78 -0
  178. package/src/services/voice-chat/model.ts +79 -0
  179. package/src/services/voice-chat/utils.ts +137 -0
  180. package/src/tools/fetch.ts +7 -0
  181. package/src/types/app.ts +17 -0
  182. package/src/types/conversation.ts +14 -0
  183. package/src/types/socket.ts +7 -0
  184. package/src/types/window.ts +12 -0
  185. package/src/utils/audio.ts +67 -0
  186. package/src/utils/browser.ts +4 -0
  187. package/src/utils/fetch.ts +98 -0
  188. package/src/utils/uuid.ts +13 -0
  189. package/temp/audio/new-message.mp3 +0 -0
  190. package/temp/audio/on-hold.mp3 +0 -0
  191. package/temp/audio-processor.js +261 -0
  192. package/temp/css/index.css +2283 -0
  193. package/temp/dev.html +87 -0
  194. package/temp/index.html +16 -0
  195. package/tsconfig.json +119 -0
@@ -0,0 +1,32 @@
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 };
32
+ //# sourceMappingURL=customer-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer-data.d.ts","sourceRoot":"","sources":["../../../../../src/services/user/customer-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAInC,cAAM,YAAY;IAChB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAsB;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;gBAET,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAO1D,qBAAqB;IAOrB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAElC;IAED;;;OAGG;IACG,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtE,qBAAqB,IAAI,OAAO;IAIhC,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM;IAK9B,WAAW;CAGlB;AACD,OAAO,EAAC,YAAY,EAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { VoiceClient } from "@modochats/voice-client";
2
+ declare class VoiceChat {
3
+ instance?: VoiceClient;
4
+ isFirstInSession: boolean;
5
+ constructor();
6
+ connect(): Promise<void>;
7
+ disconnect(): Promise<void>;
8
+ initHtml(): void;
9
+ toggleLayout(): void;
10
+ showTooltip(): void;
11
+ }
12
+ export { VoiceChat };
13
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../../src/services/voice-chat/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAY,MAAM,yBAAyB,CAAC;AAW/D,cAAM,SAAS;IACb,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAQ;;IAwC3B,OAAO;IAOP,UAAU;IAGhB,QAAQ;IAGR,YAAY;IAIZ,WAAW;CAOZ;AACD,OAAO,EAAC,SAAS,EAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ declare function toggleVoiceChatLayout(): void;
2
+ declare function initVoiceChatLayout(): void;
3
+ declare function updateVoiceChatStatus(status: string, color?: string): void;
4
+ declare function handleVoiceConnected(): void;
5
+ declare function handleVoiceDisconnected(reason?: string): void;
6
+ declare function handleVoiceConnectionError(message: string): void;
7
+ declare function handleMicrophonePaused(): void;
8
+ declare function handleMicrophoneResumed(): void;
9
+ export { toggleVoiceChatLayout, initVoiceChatLayout, updateVoiceChatStatus, handleVoiceConnected, handleVoiceDisconnected, handleVoiceConnectionError, handleMicrophonePaused, handleMicrophoneResumed };
10
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/services/voice-chat/utils.ts"],"names":[],"mappings":"AAAA,iBAAS,qBAAqB,SAQ7B;AAED,iBAAS,mBAAmB,SAuD3B;AAED,iBAAS,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,QAU5D;AAED,iBAAS,oBAAoB,SAc5B;AAED,iBAAS,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,QAe/C;AAED,iBAAS,0BAA0B,CAAC,OAAO,EAAE,MAAM,QAKlD;AAED,iBAAS,sBAAsB,SAE9B;AAED,iBAAS,uBAAuB,SAE/B;AAED,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACxB,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const $fetch: import("ofetch").$Fetch;
2
+ export { $fetch };
3
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/tools/fetch.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,yBAEV,CAAC;AACH,OAAO,EAAC,MAAM,EAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ interface WidgetOptions {
2
+ position: "left" | "right";
3
+ theme: "dark" | "light";
4
+ primaryColor: string;
5
+ title: string;
6
+ foregroundColor: string;
7
+ userData?: Record<string, any>;
8
+ autoInit?: boolean;
9
+ fullScreen: boolean;
10
+ }
11
+ interface FetchPaginationRes<T = any> {
12
+ results: T[];
13
+ next: string | null;
14
+ prev: string | null;
15
+ count: number;
16
+ }
17
+ export { WidgetOptions, FetchPaginationRes };
18
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../../src/types/app.ts"],"names":[],"mappings":"AAAA,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AACD,UAAU,kBAAkB,CAAC,CAAC,GAAG,GAAG;IAClC,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,OAAO,EAAC,aAAa,EAAE,kBAAkB,EAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ declare enum ConversationStatus {
2
+ AI_CHAT = 0,
3
+ SUPPORTER_CHAT = 1,
4
+ RESOLVED = 2,
5
+ UNKNOWN = 3
6
+ }
7
+ declare enum MessageType {
8
+ USER = 0,
9
+ AI = 1,
10
+ SUPPORTER = 2,
11
+ SYSTEM = 3,
12
+ UNKNOWN = 4
13
+ }
14
+ export type { ConversationStatus, MessageType };
15
+ //# sourceMappingURL=conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../../src/types/conversation.ts"],"names":[],"mappings":"AAAA,aAAK,kBAAkB;IACrB,OAAO,IAAA;IACP,cAAc,IAAA;IACd,QAAQ,IAAA;IACR,OAAO,IAAA;CACR;AACD,aAAK,WAAW;IACd,IAAI,IAAA;IACJ,EAAE,IAAA;IACF,SAAS,IAAA;IACT,MAAM,IAAA;IACN,OAAO,IAAA;CACR;AACD,YAAY,EAAC,kBAAkB,EAAE,WAAW,EAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface SocketMessage {
2
+ type: "new_message" | "ai_response" | "conversation_status_change";
3
+ message: any;
4
+ status: string;
5
+ }
6
+ export type { SocketMessage };
7
+ //# sourceMappingURL=socket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../../src/types/socket.ts"],"names":[],"mappings":"AAAA,UAAU,aAAa;IACrB,IAAI,EAAE,aAAa,GAAG,aAAa,GAAG,4BAA4B,CAAC;IACnE,OAAO,EAAE,GAAG,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,YAAY,EAAC,aAAa,EAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Widget } from "../app.js";
2
+ declare global {
3
+ interface Window {
4
+ ModoChat: typeof Widget;
5
+ ModoWidget: typeof Widget;
6
+ getMWidget?: () => Widget;
7
+ }
8
+ }
9
+ export {};
10
+ //# sourceMappingURL=window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../../../src/types/window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,WAAW,CAAC;AAEjC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,QAAQ,EAAE,OAAO,MAAM,CAAC;QACxB,UAAU,EAAE,OAAO,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;KAC3B;CACF;AAGD,OAAO,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ declare const preloadAudio: (audioPath: string) => Promise<HTMLAudioElement>;
2
+ declare const playAudio: (audioPath: string) => Promise<void>;
3
+ export { playAudio, preloadAudio };
4
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../../../src/utils/audio.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,YAAY,GAAI,WAAW,MAAM,KAAG,OAAO,CAAC,gBAAgB,CAuBjE,CAAC;AAEF,QAAA,MAAM,SAAS,GAAU,WAAW,MAAM,kBAoCzC,CAAC;AAEF,OAAO,EAAC,SAAS,EAAE,YAAY,EAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare let getDocumentHead: () => Element;
2
+ export { getDocumentHead };
3
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,QAAA,IAAI,eAAe,eAElB,CAAC;AACF,OAAO,EAAC,eAAe,EAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { FetchPaginationRes } from "#src/types/app.js";
2
+ declare const fetchChatbot: (publicKey: string) => Promise<Record<string, any>>;
3
+ declare const fetchSendMessage: (chatbotId: number, content: string, uniqueId: string, conversationUuid?: string, phoneNumber?: string, options?: {
4
+ file?: File;
5
+ replyTo?: number;
6
+ }) => Promise<any>;
7
+ declare const fetchGetAccessTokenForSocket: (chatbotId: string, conversationUuid: string, uniqueId: string) => Promise<{
8
+ access_token: string;
9
+ conversation_uuid: string;
10
+ expires_in: number;
11
+ }>;
12
+ declare const fetchConversationMessages: (conversationUuid: string, chatbotUuid: string) => Promise<Record<string, any>>;
13
+ declare const fetchUpdateUserData: (chatbotUuid: string, uniqueId: string, userData: Record<string, any>) => Promise<any>;
14
+ declare const fetchReadMessage: (id: number) => Promise<any>;
15
+ declare const fetchMarkConversationAsRead: (conversationUuid: string, uniqueId: string) => Promise<any>;
16
+ declare const fetchMessageFeedback: (id: number, uniqueId: string, conversationUuid: string, liked: boolean) => Promise<any>;
17
+ declare const fetchConversations: (conversationUuid: string, uniqueId: string) => Promise<FetchPaginationRes<any>>;
18
+ export { fetchChatbot, fetchSendMessage, fetchGetAccessTokenForSocket, fetchConversationMessages, fetchUpdateUserData, fetchReadMessage, fetchMarkConversationAsRead, fetchMessageFeedback, fetchConversations };
19
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/utils/fetch.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AAErD,QAAA,MAAM,YAAY,GAAU,WAAW,MAAM,iCAE5C,CAAC;AAEF,QAAA,MAAM,gBAAgB,GACpB,WAAW,MAAM,EACjB,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,mBAAmB,MAAM,EACzB,cAAc,MAAM,EACpB,UAAU;IACR,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,iBAkBF,CAAC;AACF,QAAA,MAAM,4BAA4B,GAAU,WAAW,MAAM,EAAE,kBAAkB,MAAM,EAAE,UAAU,MAAM;kBACpE,MAAM;uBAAqB,MAAM;gBAAc,MAAM;EAQzF,CAAC;AACF,QAAA,MAAM,yBAAyB,GAAU,kBAAkB,MAAM,EAAE,aAAa,MAAM,iCAErF,CAAC;AACF,QAAA,MAAM,mBAAmB,GAAU,aAAa,MAAM,EAAE,UAAU,MAAM,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,iBAStG,CAAC;AACF,QAAA,MAAM,gBAAgB,GAAU,IAAI,MAAM,iBAIzC,CAAC;AACF,QAAA,MAAM,2BAA2B,GAAU,kBAAkB,MAAM,EAAE,UAAU,MAAM,iBAOpF,CAAC;AAEF,QAAA,MAAM,oBAAoB,GAAU,IAAI,MAAM,EAAE,UAAU,MAAM,EAAE,kBAAkB,MAAM,EAAE,OAAO,OAAO,iBAUzG,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAU,kBAAkB,MAAM,EAAE,UAAU,MAAM,qCAE3E,CAAC;AACF,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,4BAA4B,EAC5B,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAChB,2BAA2B,EAC3B,oBAAoB,EACpB,kBAAkB,EACnB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generates a random UUID v4
3
+ * @returns A random UUID string
4
+ */
5
+ declare const generateUUID: () => string;
6
+ export { generateUUID };
7
+ //# sourceMappingURL=uuid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../../../src/utils/uuid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,QAAA,MAAM,YAAY,QAAO,MAMxB,CAAC;AAEF,OAAO,EAAC,YAAY,EAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@modochats/widget",
3
+ "version": "0.1.0",
4
+ "description": "",
5
+ "main": "dist/src/app.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "dev": "tsx watch src/app.ts",
9
+ "dev:ts": "tsc --watch --noCheck",
10
+ "dev:rollup": "rollup --config rollup.dev.config.js --watch",
11
+ "dev:server": "live-server temp --port=3000 --host=localhost --open=/dev.html",
12
+ "dev:full": "concurrently \"yarn dev:ts\" \"yarn dev:rollup\" \"yarn dev:server\" --names \"tsc,rollup,server\" --prefix name ",
13
+ "build:types": "tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist/types",
14
+ "static": "tsx src/app.ts",
15
+ "compile": "npx tsc --noCheck",
16
+ "minify": "node scripts/terser-minify.js",
17
+ "rollup": "rollup --config rollup.config.js",
18
+ "build": "npm run compile && npm run minify && npm run rollup",
19
+ "build:cdn": "npm run build && node scripts/create-umd-bundle.js",
20
+ "render": "npm install && npm run build"
21
+ },
22
+ "dependencies": {
23
+ "@modochats/chat-client": "^0.3.0",
24
+ "@modochats/voice-client": "^0.2.2",
25
+ "marked": "^16.3.0",
26
+ "ofetch": "^1.5.1",
27
+ "tldts": "^7.0.17"
28
+ },
29
+ "devDependencies": {
30
+ "@rollup/plugin-commonjs": "^29.0.0",
31
+ "@rollup/plugin-node-resolve": "^16.0.3",
32
+ "@rollup/plugin-typescript": "^12.3.0",
33
+ "@types/node": "^24.10.1",
34
+ "concurrently": "^9.2.1",
35
+ "live-server": "^1.2.2",
36
+ "rollup": "^4.53.2",
37
+ "terser": "^5.44.1",
38
+ "tsx": "^4.20.6",
39
+ "typescript": "^5.9.3"
40
+ },
41
+ "imports": {
42
+ "#src/*": "./dist/src/*",
43
+ "#root/*": "./dist/*"
44
+ },
45
+ "engines": {
46
+ "node": ">=16.0.0"
47
+ },
48
+ "publishConfig": {
49
+ "access": "public"
50
+ },
51
+ "homepage": "https://github.com/modochats/webcomponent#readme",
52
+ "keywords": [
53
+ "modo",
54
+ "chat",
55
+ "ai",
56
+ "chatbot",
57
+ "websocket",
58
+ "real-time"
59
+ ],
60
+ "author": "Modo Team",
61
+ "license": "MIT",
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "https://github.com/modochats/chat-client"
65
+ },
66
+ "bugs": {
67
+ "url": "https://github.com/modochats/chat-client/issues"
68
+ },
69
+ "exports": {
70
+ ".": {
71
+ "types": "./dist/types/src/index.d.ts",
72
+ "import": "./dist/src/index.js"
73
+ }
74
+ },
75
+ "types": "dist/types/src/index.d.ts"
76
+ }
@@ -0,0 +1,18 @@
1
+ import nodeResolve from "@rollup/plugin-node-resolve";
2
+ import commonjs from "@rollup/plugin-commonjs";
3
+
4
+ export default {
5
+ input: "dist/src/app.js",
6
+ output: {
7
+ file: "temp/app.js",
8
+ format: "cjs"
9
+ },
10
+ // external: ["ofetch"], // Uncomment this if you want to keep ofetch external
11
+ plugins: [
12
+ nodeResolve({
13
+ browser: true,
14
+ preferBuiltins: false
15
+ }),
16
+ commonjs()
17
+ ]
18
+ };
@@ -0,0 +1,22 @@
1
+ import nodeResolve from "@rollup/plugin-node-resolve";
2
+ import commonjs from "@rollup/plugin-commonjs";
3
+
4
+ export default {
5
+ input: "dist/src/app.js", // Use compiled TypeScript output
6
+ output: {
7
+ file: "temp/app.dev.js",
8
+ format: "iife", // Better for browser development
9
+ name: "ModoWidget", // Global name for IIFE
10
+ sourcemap: true // Enable source maps for debugging
11
+ },
12
+ plugins: [
13
+ nodeResolve({
14
+ browser: true,
15
+ preferBuiltins: false
16
+ }),
17
+ commonjs()
18
+ ],
19
+ watch: {
20
+ clearScreen: false
21
+ }
22
+ };
@@ -0,0 +1,213 @@
1
+ import {promises as fs} from "fs";
2
+ import path from "path";
3
+ import {fileURLToPath} from "url";
4
+ import {minify} from "terser";
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+
9
+ async function createUMDBundle() {
10
+ const distDir = path.resolve(__dirname, "../dist");
11
+ const outputDir = path.resolve(__dirname, "../cdn-dist");
12
+
13
+ console.log("Creating UMD bundle...");
14
+ console.log("Dist directory:", distDir);
15
+ console.log("Output directory:", outputDir);
16
+
17
+ // Ensure output directory exists
18
+ await fs.mkdir(outputDir, {recursive: true});
19
+
20
+ // Read the main app file from rollup output
21
+ const appPath = path.join(distDir, "../temp/app.js");
22
+ let appCode = "";
23
+
24
+ try {
25
+ appCode = await fs.readFile(appPath, "utf8");
26
+ } catch (error) {
27
+ console.error("Error reading app.js from temp directory:", error);
28
+ // Fallback to dist/src/app.js if temp doesn't exist
29
+ const fallbackPath = path.join(distDir, "src/app.js");
30
+ try {
31
+ appCode = await fs.readFile(fallbackPath, "utf8");
32
+ } catch (fallbackError) {
33
+ console.error("Error reading app.js from dist directory:", fallbackError);
34
+ return;
35
+ }
36
+ }
37
+
38
+ // Clean up the app code
39
+ let cleanedAppCode = appCode;
40
+
41
+ // Remove 'use strict' from the beginning if it exists
42
+ cleanedAppCode = cleanedAppCode.replace(/^['"]use strict['"];\s*/, "");
43
+
44
+ // Check if Widget is properly defined and exported
45
+ const hasWidget = cleanedAppCode.includes("class Widget") || cleanedAppCode.includes("function Widget");
46
+ const hasWindowExport = cleanedAppCode.includes("window.Widget");
47
+
48
+ if (!hasWidget) {
49
+ console.error("Widget class not found in the bundle!");
50
+ return;
51
+ }
52
+
53
+ // Create UMD wrapper
54
+ const umdCode = `(function (global, factory) {
55
+ if (typeof exports === 'object' && typeof module !== 'undefined') {
56
+ module.exports = factory();
57
+ } else if (typeof define === 'function' && define.amd) {
58
+ define(factory);
59
+ } else {
60
+ global.ModoWebComponent = factory();
61
+ }
62
+ })(typeof globalThis !== 'undefined' ? globalThis : typeof self !== 'undefined' ? self : this, function () {
63
+ 'use strict';
64
+
65
+ ${cleanedAppCode}
66
+
67
+ // Return the ModoChat class for UMD usage
68
+ return typeof ModoChat !== 'undefined' ? ModoChat : (typeof window !== 'undefined' && window.ModoChat ? window.ModoChat : null);
69
+ });`;
70
+
71
+ // Write UMD bundle
72
+ const umdPath = path.join(outputDir, "modo-widget.js");
73
+ const legacyUmdPath = path.join(outputDir, "modo-web-component.js");
74
+ await fs.writeFile(umdPath, umdCode);
75
+ await fs.writeFile(legacyUmdPath, umdCode);
76
+ console.log("Created UMD bundle:", umdPath);
77
+
78
+ // Create minified version using Terser
79
+ console.log("Minifying UMD bundle...");
80
+ try {
81
+ const result = await minify(umdCode, {
82
+ sourceMap: false,
83
+ mangle: true,
84
+ compress: true,
85
+ keep_classnames: false,
86
+ keep_fnames: false
87
+ });
88
+
89
+ if (result.error) {
90
+ throw result.error;
91
+ }
92
+
93
+ if (result.code) {
94
+ const minPath = path.join(outputDir, "modo-widget.min.js");
95
+ const legacyMinPath = path.join(outputDir, "modo-web-component.min.js");
96
+ await fs.writeFile(minPath, result.code);
97
+ await fs.writeFile(legacyMinPath, result.code);
98
+ console.log("Created minified bundle:", minPath);
99
+ } else {
100
+ console.warn("No minified code generated. Using original code.");
101
+ const minPath = path.join(outputDir, "modo-widget.min.js");
102
+ const legacyMinPath = path.join(outputDir, "modo-web-component.min.js");
103
+ await fs.writeFile(minPath, umdCode);
104
+ await fs.writeFile(legacyMinPath, umdCode);
105
+ }
106
+ } catch (error) {
107
+ console.error("Error during minification:", error);
108
+ console.log("Falling back to original code for minified version...");
109
+ const minPath = path.join(outputDir, "modo-widget.min.js");
110
+ const legacyMinPath = path.join(outputDir, "modo-web-component.min.js");
111
+ await fs.writeFile(minPath, umdCode);
112
+ await fs.writeFile(legacyMinPath, umdCode);
113
+ }
114
+
115
+ // Copy dist folder
116
+ await copyDirectory(distDir, path.join(outputDir, "dist"));
117
+
118
+ // Create package.json for CDN
119
+ const packageJson = {
120
+ name: "modochat-widget",
121
+ version: "1.0.0",
122
+ description: "Modo Web Component - A lightweight web component library",
123
+ main: "modo-widget.js",
124
+ files: ["modo-widget.js", "modo-widget.min.js", "dist/"],
125
+ keywords: ["web-component", "modo", "javascript", "umd"],
126
+ author: "",
127
+ license: "ISC",
128
+ repository: {
129
+ type: "git",
130
+ url: "https://github.com/your-username/modochat-widget.git"
131
+ },
132
+ homepage: "https://github.com/your-username/modochat-widget#readme",
133
+ bugs: {
134
+ url: "https://github.com/your-username/modochat-widget/issues"
135
+ }
136
+ };
137
+
138
+ await fs.writeFile(path.join(outputDir, "package.json"), JSON.stringify(packageJson, null, 2));
139
+
140
+ // Create README for CDN
141
+ const readmeContent = `# Modo Web Component
142
+
143
+ A lightweight web component library.
144
+
145
+ ## CDN Usage
146
+
147
+ ### jsDelivr
148
+ \`\`\`html
149
+ <script src="https://cdn.jsdelivr.net/gh/your-username/modochat-widget@main/cdn-dist/modo-widget.min.js"></script>
150
+ \`\`\`
151
+
152
+ ### GitHub Raw
153
+ \`\`\`html
154
+ <script src="https://raw.githubusercontent.com/your-username/modochat-widget/main/cdn-dist/modo-widget.min.js"></script>
155
+ \`\`\`
156
+
157
+ ## Usage
158
+
159
+ \`\`\`javascript
160
+ // Initialize the chat widget
161
+ const chat = new ModoChat('your-public-key', {
162
+ position: 'right', // 'left' or 'right'
163
+ theme: 'dark', // 'dark' or 'light'
164
+ primaryColor: '#667eea',
165
+ title: 'پشتیبانی چت'
166
+ });
167
+ \`\`\`
168
+
169
+ ## Features
170
+
171
+ - 🌙 Dark/Light theme support
172
+ - 🌐 RTL (Persian/Farsi) language support
173
+ - 📱 Mobile responsive design
174
+ - 💬 Real-time chat functionality
175
+ - 🔗 WebSocket connection status
176
+ - 📝 Markdown message support
177
+
178
+ ## Files
179
+
180
+ - \`modo-widget.js\` - Development version
181
+ - \`modo-widget.min.js\` - Production version (minified)
182
+ - \`dist/\` - Full distribution files
183
+ `;
184
+
185
+ await fs.writeFile(path.join(outputDir, "README.md"), readmeContent);
186
+
187
+ console.log("UMD bundle created successfully!");
188
+ console.log("Files created:");
189
+ console.log("- modo-widget.js");
190
+ console.log("- modo-widget.min.js");
191
+ console.log("- dist/ (copied from build)");
192
+ console.log("- package.json");
193
+ console.log("- README.md");
194
+ }
195
+
196
+ async function copyDirectory(src, dest) {
197
+ await fs.mkdir(dest, {recursive: true});
198
+
199
+ const entries = await fs.readdir(src, {withFileTypes: true});
200
+
201
+ for (const entry of entries) {
202
+ const srcPath = path.join(src, entry.name);
203
+ const destPath = path.join(dest, entry.name);
204
+
205
+ if (entry.isDirectory()) {
206
+ await copyDirectory(srcPath, destPath);
207
+ } else {
208
+ await fs.copyFile(srcPath, destPath);
209
+ }
210
+ }
211
+ }
212
+
213
+ createUMDBundle().catch(console.error);
@@ -0,0 +1,112 @@
1
+ // scripts/minify.js
2
+ import {promises as fs} from "fs";
3
+ import path from "path";
4
+ import {fileURLToPath} from "url";
5
+ import {minify} from "terser";
6
+
7
+ // --- Configuration ---
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+ // Resolve the dist directory relative to the project root (assuming scripts/ is one level down)
11
+ const distDir = path.resolve(__dirname, "../dist");
12
+ // Set to true to minify files in subdirectories as well
13
+ const recursive = true;
14
+ // Set to true to keep the original file extension (e.g., file.js -> file.js)
15
+ // Set to false to add .min.js (e.g., file.js -> file.min.js) - Requires output modification
16
+ const overwriteOriginals = true; // WARNING: This will replace your original files in dist!
17
+ // --- End Configuration ---
18
+
19
+ async function findJsFiles(dir) {
20
+ let jsFiles = [];
21
+ try {
22
+ const entries = await fs.readdir(dir, {withFileTypes: true});
23
+ for (const entry of entries) {
24
+ const fullPath = path.join(dir, entry.name);
25
+ if (entry.isDirectory() && recursive) {
26
+ jsFiles = jsFiles.concat(await findJsFiles(fullPath));
27
+ } else if (entry.isFile() && entry.name.endsWith(".js") && !entry.name.endsWith(".min.js")) {
28
+ // Avoid minifying already minified files if using .min.js extension
29
+ jsFiles.push(fullPath);
30
+ }
31
+ }
32
+ } catch (err) {
33
+ // If distDir doesn't exist, treat it as no JS files found
34
+ if (err.code === "ENOENT") {
35
+ console.warn(`Warning: Directory not found: ${dir}`);
36
+ return [];
37
+ }
38
+ console.error(`Error reading directory ${dir}:`, err);
39
+ throw err; // Rethrow other errors
40
+ }
41
+ return jsFiles;
42
+ }
43
+
44
+ async function minifyFile(filePath) {
45
+ try {
46
+ const code = await fs.readFile(filePath, "utf8");
47
+ console.log(`Minifying: ${path.relative(distDir, filePath)}`);
48
+
49
+ const result = await minify(code, {
50
+ sourceMap: false, // Set to true or options object if you need source maps
51
+ mangle: true, // Enable variable name mangling
52
+ compress: true, // Enable compression options
53
+ // Add other Terser options here if needed:
54
+ // https://github.com/terser/terser#minify-options ,
55
+ keep_classnames: false,
56
+ keep_fnames: false
57
+ });
58
+
59
+ if (result.error) {
60
+ throw result.error; // Throw Terser specific errors
61
+ }
62
+
63
+ if (result.code) {
64
+ const outputPath = overwriteOriginals ? filePath : filePath.replace(/\.js$/, ".min.js"); // Example for adding .min.js
65
+
66
+ if (!overwriteOriginals && outputPath === filePath) {
67
+ console.warn(` -> Skipping write for ${filePath} as output path is the same and overwriteOriginals is false.`);
68
+ return; // Prevent accidental overwrite if logic fails
69
+ }
70
+
71
+ await fs.writeFile(outputPath, result.code, "utf8");
72
+ console.log(` -> Success: ${path.relative(distDir, outputPath)}`);
73
+ } else {
74
+ console.warn(` -> No code generated for ${filePath}. Skipping write.`);
75
+ }
76
+ } catch (error) {
77
+ console.error(`\nError minifying ${path.relative(distDir, filePath)}:`);
78
+ console.error(error);
79
+ // Decide if you want to stop the whole process on error or continue
80
+ // throw error; // Uncomment to stop on first error
81
+ }
82
+ }
83
+
84
+ async function runMinification() {
85
+ console.log(`Starting minification in: ${distDir}`);
86
+ console.log(`Recursive: ${recursive}, Overwrite Originals: ${overwriteOriginals}`);
87
+ console.log("---");
88
+
89
+ try {
90
+ const jsFiles = await findJsFiles(distDir);
91
+
92
+ if (jsFiles.length === 0) {
93
+ console.log("No .js files found to minify.");
94
+ return;
95
+ }
96
+
97
+ console.log(`Found ${jsFiles.length} .js file(s).`);
98
+
99
+ // Run minification tasks potentially in parallel (adjust if memory becomes an issue)
100
+ await Promise.all(jsFiles.map(filePath => minifyFile(filePath)));
101
+
102
+ console.log("---");
103
+ console.log("Minification process finished.");
104
+ } catch (error) {
105
+ console.error("\n---");
106
+ console.error("An error occurred during the minification process:", error);
107
+ process.exit(1); // Exit with an error code
108
+ }
109
+ }
110
+
111
+ // --- Execute the script ---
112
+ runMinification();