|
|
|
@@ -24,27 +24,55 @@ |
|
|
|
}; |
|
|
|
|
|
|
|
// Main function to embed the chatbot |
|
|
|
function embedChatbot() { |
|
|
|
async function embedChatbot() { |
|
|
|
if (!config || !config.token) { |
|
|
|
console.error(`${configKey} is empty or token is not provided`); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
async function compressAndEncodeBase64(input) { |
|
|
|
const uint8Array = new TextEncoder().encode(input); |
|
|
|
const compressedStream = new Response( |
|
|
|
new Blob([uint8Array]).stream().pipeThrough(new CompressionStream('gzip')) |
|
|
|
).arrayBuffer(); |
|
|
|
const compressedUint8Array = new Uint8Array(await compressedStream); |
|
|
|
return btoa(String.fromCharCode(...compressedUint8Array)); |
|
|
|
} |
|
|
|
|
|
|
|
async function getCompressedInputsFromConfig() { |
|
|
|
const inputs = config?.inputs || {}; |
|
|
|
const compressedInputs = {}; |
|
|
|
await Promise.all( |
|
|
|
Object.entries(inputs).map(async ([key, value]) => { |
|
|
|
compressedInputs[key] = await compressAndEncodeBase64(value); |
|
|
|
}) |
|
|
|
); |
|
|
|
return compressedInputs; |
|
|
|
} |
|
|
|
|
|
|
|
const params = new URLSearchParams(await getCompressedInputsFromConfig()); |
|
|
|
|
|
|
|
const baseUrl = |
|
|
|
config.baseUrl || `https://${config.isDev ? "dev." : ""}udify.app`; |
|
|
|
|
|
|
|
// pre-check the length of the URL |
|
|
|
const iframeUrl = `${baseUrl}/chatbot/${config.token}?${params}`; |
|
|
|
if(iframeUrl.length > 2048) { |
|
|
|
console.error("The URL is too long, please reduce the number of inputs to prevent the bot from failing to load"); |
|
|
|
} |
|
|
|
|
|
|
|
// Function to create the iframe for the chatbot |
|
|
|
function createIframe() { |
|
|
|
const iframe = document.createElement("iframe"); |
|
|
|
iframe.allow = "fullscreen;microphone"; |
|
|
|
iframe.title = "dify chatbot bubble window"; |
|
|
|
iframe.id = iframeId; |
|
|
|
iframe.src = `${baseUrl}/chatbot/${config.token}`; |
|
|
|
iframe.src = iframeUrl; |
|
|
|
iframe.style.cssText = ` |
|
|
|
border: none; position: fixed; flex-direction: column; justify-content: space-between; |
|
|
|
box-shadow: rgba(150, 150, 150, 0.2) 0px 10px 30px 0px, rgba(150, 150, 150, 0.2) 0px 0px 0px 1px; |
|
|
|
bottom: 5rem; right: 1rem; width: 24rem; max-width: calc(100vw - 2rem); height: 40rem; |
|
|
|
max-height: calc(100vh - 6rem); border-radius: 0.75rem; display: flex; z-index: 2147483647; |
|
|
|
border: none; position: fixed; flex-direction: column; justify-content: space-between; |
|
|
|
box-shadow: rgba(150, 150, 150, 0.2) 0px 10px 30px 0px, rgba(150, 150, 150, 0.2) 0px 0px 0px 1px; |
|
|
|
bottom: 5rem; right: 1rem; width: 24rem; max-width: calc(100vw - 2rem); height: 40rem; |
|
|
|
max-height: calc(100vh - 6rem); border-radius: 0.75rem; display: flex; z-index: 2147483647; |
|
|
|
overflow: hidden; left: unset; background-color: #F3F4F6; |
|
|
|
`; |
|
|
|
|
|
|
|
@@ -106,19 +134,19 @@ |
|
|
|
document.head.appendChild(styleSheet); |
|
|
|
styleSheet.sheet.insertRule(` |
|
|
|
#${containerDiv.id} { |
|
|
|
position: fixed; |
|
|
|
position: fixed; |
|
|
|
bottom: var(--${containerDiv.id}-bottom, 1rem); |
|
|
|
right: var(--${containerDiv.id}-right, 1rem); |
|
|
|
left: var(--${containerDiv.id}-left, unset); |
|
|
|
top: var(--${containerDiv.id}-top, unset); |
|
|
|
width: var(--${containerDiv.id}-width, 50px); |
|
|
|
height: var(--${containerDiv.id}-height, 50px); |
|
|
|
border-radius: var(--${containerDiv.id}-border-radius, 25px); |
|
|
|
border-radius: var(--${containerDiv.id}-border-radius, 25px); |
|
|
|
background-color: var(--${containerDiv.id}-bg-color, #155EEF); |
|
|
|
box-shadow: var(--${containerDiv.id}-box-shadow, rgba(0, 0, 0, 0.2) 0px 4px 8px 0px); |
|
|
|
cursor: pointer; |
|
|
|
z-index: 2147483647; |
|
|
|
transition: all 0.2s ease-in-out 0s; |
|
|
|
z-index: 2147483647; |
|
|
|
transition: all 0.2s ease-in-out 0s; |
|
|
|
} |
|
|
|
`); |
|
|
|
styleSheet.sheet.insertRule(` |
|
|
|
@@ -154,7 +182,8 @@ |
|
|
|
} else { |
|
|
|
document.addEventListener('keydown', handleEscKey); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
resetIframePosition(); |
|
|
|
}); |
|
|
|
|