@blockspark/chat-widget 1.0.15 → 1.0.16
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.
- package/dist/{core/stateManager.esm.js → ChatWidget-CFvb5g7s.js} +450 -4
- package/dist/ChatWidget-CFvb5g7s.js.map +1 -0
- package/dist/ChatWidget-CdA7TymM.cjs +2 -0
- package/dist/ChatWidget-CdA7TymM.cjs.map +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +1357 -7
- package/dist/index.esm.js.map +1 -1
- package/dist/nuxt.cjs.js +1 -1
- package/dist/nuxt.esm.js +4 -5
- package/dist/nuxt.esm.js.map +1 -1
- package/dist/sanitize-DRKcO9o5.cjs +4 -0
- package/dist/sanitize-DRKcO9o5.cjs.map +1 -0
- package/dist/sanitize-NEykcppO.js +2835 -0
- package/dist/sanitize-NEykcppO.js.map +1 -0
- package/dist/utils/frameworkDetector.d.ts.map +1 -1
- package/dist/utils/sanitize.d.ts.map +1 -1
- package/dist/vue.cjs.js +1 -1
- package/dist/vue.esm.js +4 -5
- package/dist/vue.esm.js.map +1 -1
- package/package.json +14 -49
- package/dist/_virtual/_plugin-vue_export-helper.cjs.js +0 -2
- package/dist/_virtual/_plugin-vue_export-helper.cjs.js.map +0 -1
- package/dist/_virtual/_plugin-vue_export-helper.esm.js +0 -11
- package/dist/_virtual/_plugin-vue_export-helper.esm.js.map +0 -1
- package/dist/components/ChatWidget.cjs.js +0 -2
- package/dist/components/ChatWidget.cjs.js.map +0 -1
- package/dist/components/ChatWidget.esm.js +0 -1129
- package/dist/components/ChatWidget.esm.js.map +0 -1
- package/dist/components/ChatWidget.vue.cjs.js +0 -2
- package/dist/components/ChatWidget.vue.cjs.js.map +0 -1
- package/dist/components/ChatWidget.vue.cjs2.js +0 -2
- package/dist/components/ChatWidget.vue.cjs2.js.map +0 -1
- package/dist/components/ChatWidget.vue.esm.js +0 -8
- package/dist/components/ChatWidget.vue.esm.js.map +0 -1
- package/dist/components/ChatWidget.vue.esm2.js +0 -374
- package/dist/components/ChatWidget.vue.esm2.js.map +0 -1
- package/dist/composables/useChatWidget.cjs.js +0 -2
- package/dist/composables/useChatWidget.cjs.js.map +0 -1
- package/dist/composables/useChatWidget.esm.js +0 -75
- package/dist/composables/useChatWidget.esm.js.map +0 -1
- package/dist/core/stateManager.cjs.js +0 -2
- package/dist/core/stateManager.cjs.js.map +0 -1
- package/dist/core/stateManager.esm.js.map +0 -1
- package/dist/entry/vanilla.cjs.js +0 -2
- package/dist/entry/vanilla.cjs.js.map +0 -1
- package/dist/entry/vanilla.esm.js +0 -50
- package/dist/entry/vanilla.esm.js.map +0 -1
- package/dist/hooks/useChatMode.cjs.js +0 -2
- package/dist/hooks/useChatMode.cjs.js.map +0 -1
- package/dist/hooks/useChatMode.esm.js +0 -61
- package/dist/hooks/useChatMode.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/jws/compact/sign.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/jws/compact/sign.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/jws/compact/sign.esm.js +0 -21
- package/dist/node_modules/jose/dist/browser/jws/compact/sign.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/jws/flattened/sign.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/jws/flattened/sign.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/jws/flattened/sign.esm.js +0 -84
- package/dist/node_modules/jose/dist/browser/jws/flattened/sign.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/jwt/produce.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/jwt/produce.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/jwt/produce.esm.js +0 -72
- package/dist/node_modules/jose/dist/browser/jwt/produce.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/jwt/sign.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/jwt/sign.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/jwt/sign.esm.js +0 -22
- package/dist/node_modules/jose/dist/browser/jwt/sign.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/key/import.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/key/import.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/key/import.esm.js +0 -11
- package/dist/node_modules/jose/dist/browser/key/import.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/buffer_utils.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/lib/buffer_utils.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/buffer_utils.esm.js +0 -18
- package/dist/node_modules/jose/dist/browser/lib/buffer_utils.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/check_key_type.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/lib/check_key_type.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/check_key_type.esm.js +0 -77
- package/dist/node_modules/jose/dist/browser/lib/check_key_type.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/crypto_key.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/lib/crypto_key.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/crypto_key.esm.js +0 -101
- package/dist/node_modules/jose/dist/browser/lib/crypto_key.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/epoch.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/lib/epoch.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/epoch.esm.js +0 -5
- package/dist/node_modules/jose/dist/browser/lib/epoch.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/invalid_key_input.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/lib/invalid_key_input.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/invalid_key_input.esm.js +0 -32
- package/dist/node_modules/jose/dist/browser/lib/invalid_key_input.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/is_disjoint.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/lib/is_disjoint.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/is_disjoint.esm.js +0 -25
- package/dist/node_modules/jose/dist/browser/lib/is_disjoint.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/is_jwk.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/lib/is_jwk.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/is_jwk.esm.js +0 -20
- package/dist/node_modules/jose/dist/browser/lib/is_jwk.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/is_object.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/lib/is_object.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/is_object.esm.js +0 -20
- package/dist/node_modules/jose/dist/browser/lib/is_object.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/secs.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/lib/secs.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/secs.esm.js +0 -59
- package/dist/node_modules/jose/dist/browser/lib/secs.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/validate_crit.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/lib/validate_crit.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/lib/validate_crit.esm.js +0 -34
- package/dist/node_modules/jose/dist/browser/lib/validate_crit.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/asn1.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/runtime/asn1.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/asn1.esm.js +0 -103
- package/dist/node_modules/jose/dist/browser/runtime/asn1.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/base64url.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/runtime/base64url.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/base64url.esm.js +0 -43
- package/dist/node_modules/jose/dist/browser/runtime/base64url.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/check_key_length.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/runtime/check_key_length.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/check_key_length.esm.js +0 -12
- package/dist/node_modules/jose/dist/browser/runtime/check_key_length.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/get_sign_verify_key.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/runtime/get_sign_verify_key.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/get_sign_verify_key.esm.js +0 -25
- package/dist/node_modules/jose/dist/browser/runtime/get_sign_verify_key.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/is_key_like.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/runtime/is_key_like.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/is_key_like.esm.js +0 -13
- package/dist/node_modules/jose/dist/browser/runtime/is_key_like.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/jwk_to_key.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/runtime/jwk_to_key.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/jwk_to_key.esm.js +0 -107
- package/dist/node_modules/jose/dist/browser/runtime/jwk_to_key.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/normalize_key.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/runtime/normalize_key.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/normalize_key.esm.js +0 -71
- package/dist/node_modules/jose/dist/browser/runtime/normalize_key.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/sign.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/runtime/sign.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/sign.esm.js +0 -14
- package/dist/node_modules/jose/dist/browser/runtime/sign.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/subtle_dsa.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/runtime/subtle_dsa.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/subtle_dsa.esm.js +0 -32
- package/dist/node_modules/jose/dist/browser/runtime/subtle_dsa.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/webcrypto.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/runtime/webcrypto.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/runtime/webcrypto.esm.js +0 -7
- package/dist/node_modules/jose/dist/browser/runtime/webcrypto.esm.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/util/errors.cjs.js +0 -2
- package/dist/node_modules/jose/dist/browser/util/errors.cjs.js.map +0 -1
- package/dist/node_modules/jose/dist/browser/util/errors.esm.js +0 -131
- package/dist/node_modules/jose/dist/browser/util/errors.esm.js.map +0 -1
- package/dist/node_modules/react-dom/client.cjs.js +0 -2
- package/dist/node_modules/react-dom/client.cjs.js.map +0 -1
- package/dist/node_modules/react-dom/client.esm.js +0 -21
- package/dist/node_modules/react-dom/client.esm.js.map +0 -1
- package/dist/services/chatService.cjs.js +0 -2
- package/dist/services/chatService.cjs.js.map +0 -1
- package/dist/services/chatService.esm.js +0 -482
- package/dist/services/chatService.esm.js.map +0 -1
- package/dist/services/dialogflowClient.cjs.js +0 -2
- package/dist/services/dialogflowClient.cjs.js.map +0 -1
- package/dist/services/dialogflowClient.esm.js +0 -282
- package/dist/services/dialogflowClient.esm.js.map +0 -1
- package/dist/services/sessionManager.cjs.js +0 -2
- package/dist/services/sessionManager.cjs.js.map +0 -1
- package/dist/services/sessionManager.esm.js +0 -48
- package/dist/services/sessionManager.esm.js.map +0 -1
- package/dist/utils/frameworkDetector.cjs.js +0 -2
- package/dist/utils/frameworkDetector.cjs.js.map +0 -1
- package/dist/utils/frameworkDetector.esm.js +0 -125
- package/dist/utils/frameworkDetector.esm.js.map +0 -1
- package/dist/utils/sanitize.cjs.js +0 -2
- package/dist/utils/sanitize.cjs.js.map +0 -1
- package/dist/utils/sanitize.esm.js +0 -52
- package/dist/utils/sanitize.esm.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createChatService, ChatResolvedError } from "
|
|
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-NEykcppO.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
|
-
|
|
1357
|
+
ChatWidgetComponent as C,
|
|
1358
|
+
WidgetStateManager as W,
|
|
1359
|
+
useChatWidget as u
|
|
914
1360
|
};
|
|
915
|
-
//# sourceMappingURL=
|
|
1361
|
+
//# sourceMappingURL=ChatWidget-CFvb5g7s.js.map
|