@blockspark/chat-widget 1.0.15 → 1.0.17

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 (181) hide show
  1. package/dist/{core/stateManager.esm.js → ChatWidget-DKfLes8T.js} +450 -4
  2. package/dist/ChatWidget-DKfLes8T.js.map +1 -0
  3. package/dist/ChatWidget-lvHzA07s.cjs +2 -0
  4. package/dist/ChatWidget-lvHzA07s.cjs.map +1 -0
  5. package/dist/index.cjs.js +1 -1
  6. package/dist/index.cjs.js.map +1 -1
  7. package/dist/index.esm.js +1357 -7
  8. package/dist/index.esm.js.map +1 -1
  9. package/dist/nuxt.cjs.js +1 -1
  10. package/dist/nuxt.esm.js +4 -5
  11. package/dist/nuxt.esm.js.map +1 -1
  12. package/dist/sanitize-D904jROs.cjs +4 -0
  13. package/dist/sanitize-D904jROs.cjs.map +1 -0
  14. package/dist/sanitize-O18C3eqP.js +2948 -0
  15. package/dist/sanitize-O18C3eqP.js.map +1 -0
  16. package/dist/services/chatService.d.ts.map +1 -1
  17. package/dist/utils/frameworkDetector.d.ts.map +1 -1
  18. package/dist/utils/sanitize.d.ts.map +1 -1
  19. package/dist/vue.cjs.js +1 -1
  20. package/dist/vue.esm.js +4 -5
  21. package/dist/vue.esm.js.map +1 -1
  22. package/package.json +14 -49
  23. package/dist/_virtual/_plugin-vue_export-helper.cjs.js +0 -2
  24. package/dist/_virtual/_plugin-vue_export-helper.cjs.js.map +0 -1
  25. package/dist/_virtual/_plugin-vue_export-helper.esm.js +0 -11
  26. package/dist/_virtual/_plugin-vue_export-helper.esm.js.map +0 -1
  27. package/dist/components/ChatWidget.cjs.js +0 -2
  28. package/dist/components/ChatWidget.cjs.js.map +0 -1
  29. package/dist/components/ChatWidget.esm.js +0 -1129
  30. package/dist/components/ChatWidget.esm.js.map +0 -1
  31. package/dist/components/ChatWidget.vue.cjs.js +0 -2
  32. package/dist/components/ChatWidget.vue.cjs.js.map +0 -1
  33. package/dist/components/ChatWidget.vue.cjs2.js +0 -2
  34. package/dist/components/ChatWidget.vue.cjs2.js.map +0 -1
  35. package/dist/components/ChatWidget.vue.esm.js +0 -8
  36. package/dist/components/ChatWidget.vue.esm.js.map +0 -1
  37. package/dist/components/ChatWidget.vue.esm2.js +0 -374
  38. package/dist/components/ChatWidget.vue.esm2.js.map +0 -1
  39. package/dist/composables/useChatWidget.cjs.js +0 -2
  40. package/dist/composables/useChatWidget.cjs.js.map +0 -1
  41. package/dist/composables/useChatWidget.esm.js +0 -75
  42. package/dist/composables/useChatWidget.esm.js.map +0 -1
  43. package/dist/core/stateManager.cjs.js +0 -2
  44. package/dist/core/stateManager.cjs.js.map +0 -1
  45. package/dist/core/stateManager.esm.js.map +0 -1
  46. package/dist/entry/vanilla.cjs.js +0 -2
  47. package/dist/entry/vanilla.cjs.js.map +0 -1
  48. package/dist/entry/vanilla.esm.js +0 -50
  49. package/dist/entry/vanilla.esm.js.map +0 -1
  50. package/dist/hooks/useChatMode.cjs.js +0 -2
  51. package/dist/hooks/useChatMode.cjs.js.map +0 -1
  52. package/dist/hooks/useChatMode.esm.js +0 -61
  53. package/dist/hooks/useChatMode.esm.js.map +0 -1
  54. package/dist/node_modules/jose/dist/browser/jws/compact/sign.cjs.js +0 -2
  55. package/dist/node_modules/jose/dist/browser/jws/compact/sign.cjs.js.map +0 -1
  56. package/dist/node_modules/jose/dist/browser/jws/compact/sign.esm.js +0 -21
  57. package/dist/node_modules/jose/dist/browser/jws/compact/sign.esm.js.map +0 -1
  58. package/dist/node_modules/jose/dist/browser/jws/flattened/sign.cjs.js +0 -2
  59. package/dist/node_modules/jose/dist/browser/jws/flattened/sign.cjs.js.map +0 -1
  60. package/dist/node_modules/jose/dist/browser/jws/flattened/sign.esm.js +0 -84
  61. package/dist/node_modules/jose/dist/browser/jws/flattened/sign.esm.js.map +0 -1
  62. package/dist/node_modules/jose/dist/browser/jwt/produce.cjs.js +0 -2
  63. package/dist/node_modules/jose/dist/browser/jwt/produce.cjs.js.map +0 -1
  64. package/dist/node_modules/jose/dist/browser/jwt/produce.esm.js +0 -72
  65. package/dist/node_modules/jose/dist/browser/jwt/produce.esm.js.map +0 -1
  66. package/dist/node_modules/jose/dist/browser/jwt/sign.cjs.js +0 -2
  67. package/dist/node_modules/jose/dist/browser/jwt/sign.cjs.js.map +0 -1
  68. package/dist/node_modules/jose/dist/browser/jwt/sign.esm.js +0 -22
  69. package/dist/node_modules/jose/dist/browser/jwt/sign.esm.js.map +0 -1
  70. package/dist/node_modules/jose/dist/browser/key/import.cjs.js +0 -2
  71. package/dist/node_modules/jose/dist/browser/key/import.cjs.js.map +0 -1
  72. package/dist/node_modules/jose/dist/browser/key/import.esm.js +0 -11
  73. package/dist/node_modules/jose/dist/browser/key/import.esm.js.map +0 -1
  74. package/dist/node_modules/jose/dist/browser/lib/buffer_utils.cjs.js +0 -2
  75. package/dist/node_modules/jose/dist/browser/lib/buffer_utils.cjs.js.map +0 -1
  76. package/dist/node_modules/jose/dist/browser/lib/buffer_utils.esm.js +0 -18
  77. package/dist/node_modules/jose/dist/browser/lib/buffer_utils.esm.js.map +0 -1
  78. package/dist/node_modules/jose/dist/browser/lib/check_key_type.cjs.js +0 -2
  79. package/dist/node_modules/jose/dist/browser/lib/check_key_type.cjs.js.map +0 -1
  80. package/dist/node_modules/jose/dist/browser/lib/check_key_type.esm.js +0 -77
  81. package/dist/node_modules/jose/dist/browser/lib/check_key_type.esm.js.map +0 -1
  82. package/dist/node_modules/jose/dist/browser/lib/crypto_key.cjs.js +0 -2
  83. package/dist/node_modules/jose/dist/browser/lib/crypto_key.cjs.js.map +0 -1
  84. package/dist/node_modules/jose/dist/browser/lib/crypto_key.esm.js +0 -101
  85. package/dist/node_modules/jose/dist/browser/lib/crypto_key.esm.js.map +0 -1
  86. package/dist/node_modules/jose/dist/browser/lib/epoch.cjs.js +0 -2
  87. package/dist/node_modules/jose/dist/browser/lib/epoch.cjs.js.map +0 -1
  88. package/dist/node_modules/jose/dist/browser/lib/epoch.esm.js +0 -5
  89. package/dist/node_modules/jose/dist/browser/lib/epoch.esm.js.map +0 -1
  90. package/dist/node_modules/jose/dist/browser/lib/invalid_key_input.cjs.js +0 -2
  91. package/dist/node_modules/jose/dist/browser/lib/invalid_key_input.cjs.js.map +0 -1
  92. package/dist/node_modules/jose/dist/browser/lib/invalid_key_input.esm.js +0 -32
  93. package/dist/node_modules/jose/dist/browser/lib/invalid_key_input.esm.js.map +0 -1
  94. package/dist/node_modules/jose/dist/browser/lib/is_disjoint.cjs.js +0 -2
  95. package/dist/node_modules/jose/dist/browser/lib/is_disjoint.cjs.js.map +0 -1
  96. package/dist/node_modules/jose/dist/browser/lib/is_disjoint.esm.js +0 -25
  97. package/dist/node_modules/jose/dist/browser/lib/is_disjoint.esm.js.map +0 -1
  98. package/dist/node_modules/jose/dist/browser/lib/is_jwk.cjs.js +0 -2
  99. package/dist/node_modules/jose/dist/browser/lib/is_jwk.cjs.js.map +0 -1
  100. package/dist/node_modules/jose/dist/browser/lib/is_jwk.esm.js +0 -20
  101. package/dist/node_modules/jose/dist/browser/lib/is_jwk.esm.js.map +0 -1
  102. package/dist/node_modules/jose/dist/browser/lib/is_object.cjs.js +0 -2
  103. package/dist/node_modules/jose/dist/browser/lib/is_object.cjs.js.map +0 -1
  104. package/dist/node_modules/jose/dist/browser/lib/is_object.esm.js +0 -20
  105. package/dist/node_modules/jose/dist/browser/lib/is_object.esm.js.map +0 -1
  106. package/dist/node_modules/jose/dist/browser/lib/secs.cjs.js +0 -2
  107. package/dist/node_modules/jose/dist/browser/lib/secs.cjs.js.map +0 -1
  108. package/dist/node_modules/jose/dist/browser/lib/secs.esm.js +0 -59
  109. package/dist/node_modules/jose/dist/browser/lib/secs.esm.js.map +0 -1
  110. package/dist/node_modules/jose/dist/browser/lib/validate_crit.cjs.js +0 -2
  111. package/dist/node_modules/jose/dist/browser/lib/validate_crit.cjs.js.map +0 -1
  112. package/dist/node_modules/jose/dist/browser/lib/validate_crit.esm.js +0 -34
  113. package/dist/node_modules/jose/dist/browser/lib/validate_crit.esm.js.map +0 -1
  114. package/dist/node_modules/jose/dist/browser/runtime/asn1.cjs.js +0 -2
  115. package/dist/node_modules/jose/dist/browser/runtime/asn1.cjs.js.map +0 -1
  116. package/dist/node_modules/jose/dist/browser/runtime/asn1.esm.js +0 -103
  117. package/dist/node_modules/jose/dist/browser/runtime/asn1.esm.js.map +0 -1
  118. package/dist/node_modules/jose/dist/browser/runtime/base64url.cjs.js +0 -2
  119. package/dist/node_modules/jose/dist/browser/runtime/base64url.cjs.js.map +0 -1
  120. package/dist/node_modules/jose/dist/browser/runtime/base64url.esm.js +0 -43
  121. package/dist/node_modules/jose/dist/browser/runtime/base64url.esm.js.map +0 -1
  122. package/dist/node_modules/jose/dist/browser/runtime/check_key_length.cjs.js +0 -2
  123. package/dist/node_modules/jose/dist/browser/runtime/check_key_length.cjs.js.map +0 -1
  124. package/dist/node_modules/jose/dist/browser/runtime/check_key_length.esm.js +0 -12
  125. package/dist/node_modules/jose/dist/browser/runtime/check_key_length.esm.js.map +0 -1
  126. package/dist/node_modules/jose/dist/browser/runtime/get_sign_verify_key.cjs.js +0 -2
  127. package/dist/node_modules/jose/dist/browser/runtime/get_sign_verify_key.cjs.js.map +0 -1
  128. package/dist/node_modules/jose/dist/browser/runtime/get_sign_verify_key.esm.js +0 -25
  129. package/dist/node_modules/jose/dist/browser/runtime/get_sign_verify_key.esm.js.map +0 -1
  130. package/dist/node_modules/jose/dist/browser/runtime/is_key_like.cjs.js +0 -2
  131. package/dist/node_modules/jose/dist/browser/runtime/is_key_like.cjs.js.map +0 -1
  132. package/dist/node_modules/jose/dist/browser/runtime/is_key_like.esm.js +0 -13
  133. package/dist/node_modules/jose/dist/browser/runtime/is_key_like.esm.js.map +0 -1
  134. package/dist/node_modules/jose/dist/browser/runtime/jwk_to_key.cjs.js +0 -2
  135. package/dist/node_modules/jose/dist/browser/runtime/jwk_to_key.cjs.js.map +0 -1
  136. package/dist/node_modules/jose/dist/browser/runtime/jwk_to_key.esm.js +0 -107
  137. package/dist/node_modules/jose/dist/browser/runtime/jwk_to_key.esm.js.map +0 -1
  138. package/dist/node_modules/jose/dist/browser/runtime/normalize_key.cjs.js +0 -2
  139. package/dist/node_modules/jose/dist/browser/runtime/normalize_key.cjs.js.map +0 -1
  140. package/dist/node_modules/jose/dist/browser/runtime/normalize_key.esm.js +0 -71
  141. package/dist/node_modules/jose/dist/browser/runtime/normalize_key.esm.js.map +0 -1
  142. package/dist/node_modules/jose/dist/browser/runtime/sign.cjs.js +0 -2
  143. package/dist/node_modules/jose/dist/browser/runtime/sign.cjs.js.map +0 -1
  144. package/dist/node_modules/jose/dist/browser/runtime/sign.esm.js +0 -14
  145. package/dist/node_modules/jose/dist/browser/runtime/sign.esm.js.map +0 -1
  146. package/dist/node_modules/jose/dist/browser/runtime/subtle_dsa.cjs.js +0 -2
  147. package/dist/node_modules/jose/dist/browser/runtime/subtle_dsa.cjs.js.map +0 -1
  148. package/dist/node_modules/jose/dist/browser/runtime/subtle_dsa.esm.js +0 -32
  149. package/dist/node_modules/jose/dist/browser/runtime/subtle_dsa.esm.js.map +0 -1
  150. package/dist/node_modules/jose/dist/browser/runtime/webcrypto.cjs.js +0 -2
  151. package/dist/node_modules/jose/dist/browser/runtime/webcrypto.cjs.js.map +0 -1
  152. package/dist/node_modules/jose/dist/browser/runtime/webcrypto.esm.js +0 -7
  153. package/dist/node_modules/jose/dist/browser/runtime/webcrypto.esm.js.map +0 -1
  154. package/dist/node_modules/jose/dist/browser/util/errors.cjs.js +0 -2
  155. package/dist/node_modules/jose/dist/browser/util/errors.cjs.js.map +0 -1
  156. package/dist/node_modules/jose/dist/browser/util/errors.esm.js +0 -131
  157. package/dist/node_modules/jose/dist/browser/util/errors.esm.js.map +0 -1
  158. package/dist/node_modules/react-dom/client.cjs.js +0 -2
  159. package/dist/node_modules/react-dom/client.cjs.js.map +0 -1
  160. package/dist/node_modules/react-dom/client.esm.js +0 -21
  161. package/dist/node_modules/react-dom/client.esm.js.map +0 -1
  162. package/dist/services/chatService.cjs.js +0 -2
  163. package/dist/services/chatService.cjs.js.map +0 -1
  164. package/dist/services/chatService.esm.js +0 -482
  165. package/dist/services/chatService.esm.js.map +0 -1
  166. package/dist/services/dialogflowClient.cjs.js +0 -2
  167. package/dist/services/dialogflowClient.cjs.js.map +0 -1
  168. package/dist/services/dialogflowClient.esm.js +0 -282
  169. package/dist/services/dialogflowClient.esm.js.map +0 -1
  170. package/dist/services/sessionManager.cjs.js +0 -2
  171. package/dist/services/sessionManager.cjs.js.map +0 -1
  172. package/dist/services/sessionManager.esm.js +0 -48
  173. package/dist/services/sessionManager.esm.js.map +0 -1
  174. package/dist/utils/frameworkDetector.cjs.js +0 -2
  175. package/dist/utils/frameworkDetector.cjs.js.map +0 -1
  176. package/dist/utils/frameworkDetector.esm.js +0 -125
  177. package/dist/utils/frameworkDetector.esm.js.map +0 -1
  178. package/dist/utils/sanitize.cjs.js +0 -2
  179. package/dist/utils/sanitize.cjs.js.map +0 -1
  180. package/dist/utils/sanitize.esm.js +0 -52
  181. package/dist/utils/sanitize.esm.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { createDialogflowSession, sendDialogflowMessage } from "../services/dialogflowClient.esm.js";
2
- import { createChatService, ChatResolvedError } from "../services/chatService.esm.js";
1
+ import { ref, computed, onUnmounted, watch, defineComponent, nextTick, onMounted, openBlock, createElementBlock, mergeProps, unref, createElementVNode, toDisplayString, withModifiers, createCommentVNode, createTextVNode, Fragment, renderList, normalizeClass } from "vue";
2
+ import { c as createChatService, a as createDialogflowSession, C as ChatResolvedError, s as sendDialogflowMessage, b as safeLinkifyText } from "./sanitize-O18C3eqP.js";
3
3
  class WidgetStateManager {
4
4
  constructor(config) {
5
5
  this.listeners = /* @__PURE__ */ new Set();
@@ -909,7 +909,453 @@ class WidgetStateManager {
909
909
  this.listeners.clear();
910
910
  }
911
911
  }
912
+ function useChatWidget(config) {
913
+ const manager = new WidgetStateManager(config);
914
+ const state = ref(manager.getState());
915
+ const wsConnected = ref(false);
916
+ const agentTyping = ref(false);
917
+ const currentAgent = ref({ name: "Agent" });
918
+ const isConnectingToAgent = ref(false);
919
+ const unsubscribe = manager.subscribe((newState) => {
920
+ state.value = { ...newState };
921
+ const additional = manager.getAdditionalState();
922
+ wsConnected.value = additional.wsConnected;
923
+ agentTyping.value = additional.agentTyping;
924
+ currentAgent.value = additional.currentAgent;
925
+ isConnectingToAgent.value = additional.isConnectingToAgent;
926
+ });
927
+ const isOpen = computed(() => state.value.isOpen);
928
+ const messages = computed(() => state.value.messages);
929
+ const isLoading = computed(() => state.value.isLoading);
930
+ const error = computed(() => state.value.error);
931
+ const chatMode = computed(() => state.value.chatMode);
932
+ const openChat = async () => {
933
+ await manager.openChat();
934
+ };
935
+ const closeChat = () => {
936
+ manager.closeChat();
937
+ };
938
+ const sendMessage = async (text) => {
939
+ await manager.sendMessage(text);
940
+ };
941
+ const toggleChat = async () => {
942
+ await manager.toggleChat();
943
+ };
944
+ const setInputValue = (value) => {
945
+ manager.setInputValue(value);
946
+ };
947
+ const clearError = () => {
948
+ manager.clearError();
949
+ };
950
+ onUnmounted(() => {
951
+ unsubscribe();
952
+ manager.destroy();
953
+ });
954
+ watch(
955
+ () => config,
956
+ (newConfig) => {
957
+ manager.updateConfig(newConfig);
958
+ },
959
+ { deep: true }
960
+ );
961
+ return {
962
+ state,
963
+ isOpen,
964
+ messages,
965
+ isLoading,
966
+ error,
967
+ chatMode,
968
+ wsConnected,
969
+ agentTyping,
970
+ currentAgent,
971
+ isConnectingToAgent,
972
+ openChat,
973
+ closeChat,
974
+ sendMessage,
975
+ toggleChat,
976
+ setInputValue,
977
+ clearError,
978
+ manager
979
+ };
980
+ }
981
+ const _hoisted_1 = { class: "custom-welcome-header" };
982
+ const _hoisted_2 = { class: "custom-welcome-title" };
983
+ const _hoisted_3 = { class: "custom-welcome-message" };
984
+ const _hoisted_4 = { class: "custom-welcome-cta" };
985
+ const _hoisted_5 = {
986
+ key: 2,
987
+ class: "custom-chat-window"
988
+ };
989
+ const _hoisted_6 = { class: "custom-chat-header" };
990
+ const _hoisted_7 = { class: "custom-chat-header-content" };
991
+ const _hoisted_8 = { class: "custom-chat-title" };
992
+ const _hoisted_9 = { class: "custom-chat-subtitle" };
993
+ const _hoisted_10 = {
994
+ key: 0,
995
+ class: "custom-mode-indicator"
996
+ };
997
+ const _hoisted_11 = {
998
+ key: 0,
999
+ class: "custom-mode-badge"
1000
+ };
1001
+ const _hoisted_12 = {
1002
+ key: 1,
1003
+ class: "custom-agent-info"
1004
+ };
1005
+ const _hoisted_13 = { class: "custom-agent-name" };
1006
+ const _hoisted_14 = {
1007
+ key: 2,
1008
+ class: "custom-mode-badge"
1009
+ };
1010
+ const _hoisted_15 = {
1011
+ key: 0,
1012
+ class: "custom-chat-empty"
1013
+ };
1014
+ const _hoisted_16 = {
1015
+ key: 1,
1016
+ class: "custom-chat-empty"
1017
+ };
1018
+ const _hoisted_17 = ["innerHTML"];
1019
+ const _hoisted_18 = {
1020
+ key: 0,
1021
+ class: "custom-chips-container"
1022
+ };
1023
+ const _hoisted_19 = {
1024
+ key: 0,
1025
+ class: "custom-chips-group"
1026
+ };
1027
+ const _hoisted_20 = ["onClick"];
1028
+ const _hoisted_21 = {
1029
+ key: 0,
1030
+ class: "custom-chips-group"
1031
+ };
1032
+ const _hoisted_22 = ["onClick"];
1033
+ const _hoisted_23 = { class: "custom-message-time" };
1034
+ const _hoisted_24 = {
1035
+ key: 2,
1036
+ class: "custom-message custom-message-bot"
1037
+ };
1038
+ const _hoisted_25 = {
1039
+ key: 3,
1040
+ class: "custom-message custom-message-bot"
1041
+ };
1042
+ const _hoisted_26 = {
1043
+ key: 4,
1044
+ class: "custom-agent-typing-indicator"
1045
+ };
1046
+ const _hoisted_27 = ["value", "placeholder", "disabled"];
1047
+ const _hoisted_28 = ["disabled"];
1048
+ const _sfc_main = /* @__PURE__ */ defineComponent({
1049
+ ...{
1050
+ inheritAttrs: false
1051
+ // We handle attrs manually via v-bind="$attrs"
1052
+ },
1053
+ __name: "ChatWidget",
1054
+ props: {
1055
+ dfProjectId: {},
1056
+ dfLocation: {},
1057
+ dfAgentId: {},
1058
+ serviceAccountKey: {},
1059
+ accessToken: {},
1060
+ languageCode: {},
1061
+ backendBaseUrl: {},
1062
+ backendWsUrl: {},
1063
+ title: { default: "💬 BlockSpark AI Assistant" },
1064
+ subtitle: { default: "We're here to help" },
1065
+ welcomeTitle: { default: "👋 Welcome to BlockSpark" },
1066
+ welcomeMessage: { default: "My name is BlockSpark AI Assistant and I'll guide you." },
1067
+ welcomeCta: { default: "💬 Click here to start chatting!" },
1068
+ showWelcomePopup: { type: Boolean, default: true },
1069
+ welcomePopupDelay: { default: 1500 },
1070
+ fallbackWelcomeMessage: { default: "Hello! I'm BlockSpark AI Assistant. How can I help you today?" },
1071
+ inputPlaceholder: { default: "Type your message..." },
1072
+ emptyStateMessage: { default: "Hi! I'm BlockSpark AI Assistant. How can I help you today?" },
1073
+ debug: { type: Boolean, default: false }
1074
+ },
1075
+ setup(__props) {
1076
+ const props = __props;
1077
+ const {
1078
+ state,
1079
+ isOpen,
1080
+ messages,
1081
+ isLoading,
1082
+ error,
1083
+ chatMode,
1084
+ wsConnected,
1085
+ agentTyping,
1086
+ currentAgent,
1087
+ isConnectingToAgent: isConnectingToAgentFromComposable,
1088
+ openChat,
1089
+ closeChat,
1090
+ sendMessage,
1091
+ toggleChat,
1092
+ setInputValue,
1093
+ clearError,
1094
+ manager
1095
+ } = useChatWidget(props);
1096
+ const messagesEndRef = ref(null);
1097
+ const messagesContainer = ref(null);
1098
+ const config = computed(() => props);
1099
+ const isInitializing = computed(() => {
1100
+ return state.value.isLoading && state.value.messages.length === 0 && !state.value.sessionId;
1101
+ });
1102
+ const isStartingNewChat = computed(() => {
1103
+ return false;
1104
+ });
1105
+ const isConnectingToAgent = isConnectingToAgentFromComposable;
1106
+ watch(
1107
+ () => messages.value.length,
1108
+ () => {
1109
+ nextTick(() => {
1110
+ messagesEndRef.value?.scrollIntoView({ behavior: "smooth" });
1111
+ });
1112
+ }
1113
+ );
1114
+ const handleOpenChat = async () => {
1115
+ if (!state.value.isOpen) {
1116
+ state.value.isOpen = true;
1117
+ state.value.showWelcomePopup = false;
1118
+ }
1119
+ await openChat();
1120
+ };
1121
+ const handleCloseChat = () => {
1122
+ closeChat();
1123
+ };
1124
+ const handleCloseWelcomePopup = () => {
1125
+ manager.closeWelcomePopup();
1126
+ };
1127
+ const handleInput = (event) => {
1128
+ const target = event.target;
1129
+ setInputValue(target.value);
1130
+ };
1131
+ const handleSubmit = async (event) => {
1132
+ event.preventDefault();
1133
+ if (state.value.inputValue.trim()) {
1134
+ await sendMessage(state.value.inputValue);
1135
+ }
1136
+ };
1137
+ const handleChipClick = async (chipText, payload) => {
1138
+ const messageToSend = chipText || payload || "";
1139
+ await sendMessage(messageToSend);
1140
+ };
1141
+ const formatTime = (date) => {
1142
+ return date.toLocaleTimeString([], {
1143
+ hour: "2-digit",
1144
+ minute: "2-digit"
1145
+ });
1146
+ };
1147
+ const isHandoffMessage = (text) => {
1148
+ return text.includes("👤") || text.includes("being connected") || text.includes("live support agent") || text.includes("transfer your conversation");
1149
+ };
1150
+ onMounted(() => {
1151
+ if (config.value.showWelcomePopup && typeof window !== "undefined") {
1152
+ manager.initializeWelcomePopup();
1153
+ }
1154
+ });
1155
+ return (_ctx, _cache) => {
1156
+ return openBlock(), createElementBlock("div", mergeProps({ class: "custom-chat-widget" }, _ctx.$attrs), [
1157
+ unref(state).showWelcomePopup && !unref(state).isOpen ? (openBlock(), createElementBlock("div", {
1158
+ key: 0,
1159
+ class: "custom-welcome-popup",
1160
+ onClick: handleOpenChat
1161
+ }, [
1162
+ createElementVNode("div", _hoisted_1, [
1163
+ createElementVNode("div", _hoisted_2, toDisplayString(config.value.welcomeTitle), 1),
1164
+ createElementVNode("button", {
1165
+ class: "custom-close-popup",
1166
+ onClick: withModifiers(handleCloseWelcomePopup, ["stop"]),
1167
+ "aria-label": "Close welcome popup"
1168
+ }, " × ")
1169
+ ]),
1170
+ createElementVNode("div", _hoisted_3, toDisplayString(config.value.welcomeMessage), 1),
1171
+ createElementVNode("div", _hoisted_4, toDisplayString(config.value.welcomeCta), 1)
1172
+ ])) : createCommentVNode("", true),
1173
+ !unref(state).isOpen ? (openBlock(), createElementBlock("button", {
1174
+ key: 1,
1175
+ class: "custom-chat-toggle-btn",
1176
+ onClick: handleOpenChat,
1177
+ "aria-label": "Open chat"
1178
+ }, [..._cache[0] || (_cache[0] = [
1179
+ createElementVNode("svg", {
1180
+ width: "24",
1181
+ height: "24",
1182
+ viewBox: "0 0 24 24",
1183
+ fill: "none",
1184
+ stroke: "currentColor",
1185
+ "stroke-width": "2",
1186
+ "stroke-linecap": "round",
1187
+ "stroke-linejoin": "round"
1188
+ }, [
1189
+ createElementVNode("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })
1190
+ ], -1)
1191
+ ])])) : createCommentVNode("", true),
1192
+ unref(state).isOpen ? (openBlock(), createElementBlock("div", _hoisted_5, [
1193
+ createElementVNode("div", _hoisted_6, [
1194
+ createElementVNode("div", _hoisted_7, [
1195
+ createElementVNode("div", _hoisted_8, toDisplayString(config.value.title), 1),
1196
+ createElementVNode("div", _hoisted_9, [
1197
+ createTextVNode(toDisplayString(config.value.subtitle) + " ", 1),
1198
+ unref(state).chatMode === "human" ? (openBlock(), createElementBlock("span", _hoisted_10, " • " + toDisplayString(unref(wsConnected) ? "🟢 Connected" : "🟡 Connecting..."), 1)) : createCommentVNode("", true)
1199
+ ]),
1200
+ unref(state).chatMode === "human" ? (openBlock(), createElementBlock("div", _hoisted_11, " Human Support Mode ")) : createCommentVNode("", true),
1201
+ unref(state).chatMode === "human" ? (openBlock(), createElementBlock("div", _hoisted_12, [
1202
+ _cache[1] || (_cache[1] = createElementVNode("span", { class: "custom-agent-label" }, "Agent:", -1)),
1203
+ createElementVNode("span", _hoisted_13, toDisplayString(unref(currentAgent).name), 1)
1204
+ ])) : createCommentVNode("", true),
1205
+ unref(state).chatMode === "ai" ? (openBlock(), createElementBlock("div", _hoisted_14, " Bot Mode ")) : createCommentVNode("", true)
1206
+ ]),
1207
+ createElementVNode("button", {
1208
+ class: "custom-chat-close-btn",
1209
+ onClick: handleCloseChat,
1210
+ "aria-label": "Close chat"
1211
+ }, " × ")
1212
+ ]),
1213
+ createElementVNode("div", {
1214
+ class: "custom-chat-messages",
1215
+ ref_key: "messagesContainer",
1216
+ ref: messagesContainer
1217
+ }, [
1218
+ isInitializing.value && unref(state).messages.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_15, [..._cache[2] || (_cache[2] = [
1219
+ createElementVNode("div", { class: "custom-typing-indicator" }, [
1220
+ createElementVNode("span"),
1221
+ createElementVNode("span"),
1222
+ createElementVNode("span")
1223
+ ], -1),
1224
+ createElementVNode("p", null, "Initializing chat...", -1)
1225
+ ])])) : !isInitializing.value && unref(state).messages.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_16, [
1226
+ _cache[3] || (_cache[3] = createElementVNode("div", { class: "custom-chat-empty-icon" }, "👋", -1)),
1227
+ createElementVNode("p", null, toDisplayString(config.value.emptyStateMessage), 1)
1228
+ ])) : createCommentVNode("", true),
1229
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(state).messages, (message) => {
1230
+ return openBlock(), createElementBlock("div", {
1231
+ key: message.id,
1232
+ class: normalizeClass([
1233
+ "custom-message",
1234
+ `custom-message-${message.sender}`,
1235
+ { "custom-handoff-message": isHandoffMessage(message.text) }
1236
+ ])
1237
+ }, [
1238
+ createElementVNode("div", {
1239
+ class: normalizeClass(["custom-message-content", { "custom-handoff-content": isHandoffMessage(message.text) }]),
1240
+ innerHTML: unref(safeLinkifyText)(message.text).replace(/\n/g, "<br>")
1241
+ }, null, 10, _hoisted_17),
1242
+ message.richContent && Array.isArray(message.richContent) && message.richContent.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_18, [
1243
+ (openBlock(true), createElementBlock(Fragment, null, renderList(message.richContent, (contentGroup, groupIndex) => {
1244
+ return openBlock(), createElementBlock(Fragment, { key: groupIndex }, [
1245
+ !Array.isArray(contentGroup) ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
1246
+ contentGroup.type === "chips" && contentGroup.options ? (openBlock(), createElementBlock("div", _hoisted_19, [
1247
+ (openBlock(true), createElementBlock(Fragment, null, renderList(contentGroup.options, (chip, chipIndex) => {
1248
+ return openBlock(), createElementBlock("button", {
1249
+ key: chipIndex,
1250
+ class: "custom-chip-button",
1251
+ type: "button",
1252
+ onClick: ($event) => handleChipClick(chip.text, chip.payload)
1253
+ }, toDisplayString(chip.text), 9, _hoisted_20);
1254
+ }), 128))
1255
+ ])) : createCommentVNode("", true)
1256
+ ], 64)) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(contentGroup, (content, contentIndex) => {
1257
+ return openBlock(), createElementBlock(Fragment, {
1258
+ key: `${groupIndex}-${contentIndex}`
1259
+ }, [
1260
+ content.type === "chips" && content.options ? (openBlock(), createElementBlock("div", _hoisted_21, [
1261
+ (openBlock(true), createElementBlock(Fragment, null, renderList(content.options, (chip, chipIndex) => {
1262
+ return openBlock(), createElementBlock("button", {
1263
+ key: chipIndex,
1264
+ class: "custom-chip-button",
1265
+ type: "button",
1266
+ onClick: ($event) => handleChipClick(chip.text, chip.payload)
1267
+ }, toDisplayString(chip.text), 9, _hoisted_22);
1268
+ }), 128))
1269
+ ])) : createCommentVNode("", true)
1270
+ ], 64);
1271
+ }), 128))
1272
+ ], 64);
1273
+ }), 128))
1274
+ ])) : createCommentVNode("", true),
1275
+ createElementVNode("div", _hoisted_23, toDisplayString(formatTime(message.timestamp)), 1)
1276
+ ], 2);
1277
+ }), 128)),
1278
+ unref(state).isLoading ? (openBlock(), createElementBlock("div", _hoisted_24, [..._cache[4] || (_cache[4] = [
1279
+ createElementVNode("div", { class: "custom-typing-indicator" }, [
1280
+ createElementVNode("span"),
1281
+ createElementVNode("span"),
1282
+ createElementVNode("span")
1283
+ ], -1)
1284
+ ])])) : createCommentVNode("", true),
1285
+ unref(isConnectingToAgent) ? (openBlock(), createElementBlock("div", _hoisted_25, [..._cache[5] || (_cache[5] = [
1286
+ createElementVNode("div", { class: "custom-typing-indicator" }, [
1287
+ createElementVNode("span"),
1288
+ createElementVNode("span"),
1289
+ createElementVNode("span")
1290
+ ], -1),
1291
+ createElementVNode("div", { class: "custom-message-content" }, " Connecting to agent... ", -1)
1292
+ ])])) : createCommentVNode("", true),
1293
+ unref(state).chatMode === "human" && unref(agentTyping) ? (openBlock(), createElementBlock("div", _hoisted_26, [..._cache[6] || (_cache[6] = [
1294
+ createElementVNode("span", { class: "custom-typing-dots" }, [
1295
+ createElementVNode("span"),
1296
+ createElementVNode("span"),
1297
+ createElementVNode("span")
1298
+ ], -1),
1299
+ createElementVNode("span", { class: "custom-typing-text" }, "Agent is typing...", -1)
1300
+ ])])) : createCommentVNode("", true),
1301
+ createElementVNode("div", {
1302
+ ref_key: "messagesEndRef",
1303
+ ref: messagesEndRef
1304
+ }, null, 512)
1305
+ ], 512),
1306
+ createElementVNode("form", {
1307
+ class: "custom-chat-input-form",
1308
+ onSubmit: withModifiers(handleSubmit, ["prevent"])
1309
+ }, [
1310
+ createElementVNode("input", {
1311
+ type: "text",
1312
+ class: "custom-chat-input",
1313
+ value: unref(state).inputValue,
1314
+ onInput: handleInput,
1315
+ placeholder: config.value.inputPlaceholder,
1316
+ disabled: unref(state).isLoading || isInitializing.value || isStartingNewChat.value
1317
+ }, null, 40, _hoisted_27),
1318
+ createElementVNode("button", {
1319
+ type: "submit",
1320
+ class: "custom-chat-send-btn",
1321
+ disabled: !unref(state).inputValue.trim() || unref(state).isLoading || isInitializing.value || isStartingNewChat.value
1322
+ }, [..._cache[7] || (_cache[7] = [
1323
+ createElementVNode("svg", {
1324
+ width: "20",
1325
+ height: "20",
1326
+ viewBox: "0 0 24 24",
1327
+ fill: "none",
1328
+ stroke: "currentColor",
1329
+ "stroke-width": "2",
1330
+ "stroke-linecap": "round",
1331
+ "stroke-linejoin": "round"
1332
+ }, [
1333
+ createElementVNode("line", {
1334
+ x1: "22",
1335
+ y1: "2",
1336
+ x2: "11",
1337
+ y2: "13"
1338
+ }),
1339
+ createElementVNode("polygon", { points: "22 2 15 22 11 13 2 9 22 2" })
1340
+ ], -1)
1341
+ ])], 8, _hoisted_28)
1342
+ ], 32)
1343
+ ])) : createCommentVNode("", true)
1344
+ ], 16);
1345
+ };
1346
+ }
1347
+ });
1348
+ const _export_sfc = (sfc, props) => {
1349
+ const target = sfc.__vccOpts || sfc;
1350
+ for (const [key, val] of props) {
1351
+ target[key] = val;
1352
+ }
1353
+ return target;
1354
+ };
1355
+ const ChatWidgetComponent = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-0d32fcf4"]]);
912
1356
  export {
913
- WidgetStateManager
1357
+ ChatWidgetComponent as C,
1358
+ WidgetStateManager as W,
1359
+ useChatWidget as u
914
1360
  };
915
- //# sourceMappingURL=stateManager.esm.js.map
1361
+ //# sourceMappingURL=ChatWidget-DKfLes8T.js.map