### Problem Currently, the attachment button visibility in the widget uses both the SDK's `enableFileUpload` flag AND the inbox's attachment settings with an AND condition. This creates an issue for users who want to control attachments solely through inbox settings, since the SDK flag defaults to `true` even when not explicitly provided. **Before:** - SDK not set → `enableFileUpload: true` (default) + inbox setting = attachment shown only if both true - SDK set to false → `enableFileUpload: false` + inbox setting = attachment always hidden - SDK set to true → `enableFileUpload: true` + inbox setting = attachment shown only if both true This meant users couldn't rely solely on inbox settings when the SDK flag wasn't explicitly provided. ### Solution Changed the logic to prioritize explicit SDK configuration when provided, and fall back to inbox settings when not provided: **After:** - SDK not set → `enableFileUpload: undefined` → use inbox setting only - SDK set to false → `enableFileUpload: false` → hide attachment (SDK controls) - SDK set to true → `enableFileUpload: true` → show attachment (SDK controls) --------- Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
222 lines
7.0 KiB
JavaScript
Executable File
222 lines
7.0 KiB
JavaScript
Executable File
import Cookies from 'js-cookie';
|
|
import { IFrameHelper } from '../sdk/IFrameHelper';
|
|
import {
|
|
getBubbleView,
|
|
getDarkMode,
|
|
getWidgetStyle,
|
|
} from '../sdk/settingsHelper';
|
|
import {
|
|
computeHashForUserData,
|
|
getUserCookieName,
|
|
hasUserKeys,
|
|
} from '../sdk/cookieHelpers';
|
|
import {
|
|
addClasses,
|
|
removeClasses,
|
|
restoreWidgetInDOM,
|
|
} from '../sdk/DOMHelpers';
|
|
import { setCookieWithDomain } from '../sdk/cookieHelpers';
|
|
import { SDK_SET_BUBBLE_VISIBILITY } from 'shared/constants/sharedFrameEvents';
|
|
|
|
const runSDK = ({ baseUrl, websiteToken }) => {
|
|
if (window.$chatwoot) {
|
|
return;
|
|
}
|
|
|
|
// if this is a Rails Turbo app
|
|
document.addEventListener('turbo:before-render', event => {
|
|
// when morphing the page, this typically happens on reload like events
|
|
// say you update a "Customer" on a form and it reloads the page
|
|
// We have already added data-turbo-permananent to true. This
|
|
// will ensure that the widget it preserved
|
|
// Read more about morphing here: https://turbo.hotwired.dev/handbook/page_refreshes#morphing
|
|
// and peristing elements here: https://turbo.hotwired.dev/handbook/building#persisting-elements-across-page-loads
|
|
if (event.detail.renderMethod === 'morph') return;
|
|
|
|
restoreWidgetInDOM(event.detail.newBody);
|
|
});
|
|
|
|
if (window.Turbolinks) {
|
|
document.addEventListener('turbolinks:before-render', event => {
|
|
restoreWidgetInDOM(event.data.newBody);
|
|
});
|
|
}
|
|
|
|
// if this is an astro app
|
|
document.addEventListener('astro:before-swap', event =>
|
|
restoreWidgetInDOM(event.newDocument.body)
|
|
);
|
|
|
|
const chatwootSettings = window.chatwootSettings || {};
|
|
let locale = chatwootSettings.locale;
|
|
let baseDomain = chatwootSettings.baseDomain;
|
|
|
|
if (chatwootSettings.useBrowserLanguage) {
|
|
locale = window.navigator.language.replace('-', '_');
|
|
}
|
|
|
|
window.$chatwoot = {
|
|
baseUrl,
|
|
baseDomain,
|
|
hasLoaded: false,
|
|
hideMessageBubble: chatwootSettings.hideMessageBubble || false,
|
|
isOpen: false,
|
|
position: chatwootSettings.position === 'left' ? 'left' : 'right',
|
|
websiteToken,
|
|
locale,
|
|
useBrowserLanguage: chatwootSettings.useBrowserLanguage || false,
|
|
type: getBubbleView(chatwootSettings.type),
|
|
launcherTitle: chatwootSettings.launcherTitle || '',
|
|
showPopoutButton: chatwootSettings.showPopoutButton || false,
|
|
showUnreadMessagesDialog: chatwootSettings.showUnreadMessagesDialog ?? true,
|
|
widgetStyle: getWidgetStyle(chatwootSettings.widgetStyle) || 'standard',
|
|
resetTriggered: false,
|
|
darkMode: getDarkMode(chatwootSettings.darkMode),
|
|
welcomeTitle: chatwootSettings.welcomeTitle || '',
|
|
welcomeDescription: chatwootSettings.welcomeDescription || '',
|
|
availableMessage: chatwootSettings.availableMessage || '',
|
|
unavailableMessage: chatwootSettings.unavailableMessage || '',
|
|
enableFileUpload: chatwootSettings.enableFileUpload,
|
|
enableEmojiPicker: chatwootSettings.enableEmojiPicker ?? true,
|
|
enableEndConversation: chatwootSettings.enableEndConversation ?? true,
|
|
|
|
toggle(state) {
|
|
IFrameHelper.events.toggleBubble(state);
|
|
},
|
|
|
|
toggleBubbleVisibility(visibility) {
|
|
let widgetElm = document.querySelector('.woot--bubble-holder');
|
|
let widgetHolder = document.querySelector('.woot-widget-holder');
|
|
if (visibility === 'hide') {
|
|
addClasses(widgetHolder, 'woot-widget--without-bubble');
|
|
addClasses(widgetElm, 'woot-hidden');
|
|
window.$chatwoot.hideMessageBubble = true;
|
|
} else if (visibility === 'show') {
|
|
removeClasses(widgetElm, 'woot-hidden');
|
|
removeClasses(widgetHolder, 'woot-widget--without-bubble');
|
|
window.$chatwoot.hideMessageBubble = false;
|
|
}
|
|
IFrameHelper.sendMessage(SDK_SET_BUBBLE_VISIBILITY, {
|
|
hideMessageBubble: window.$chatwoot.hideMessageBubble,
|
|
});
|
|
},
|
|
|
|
popoutChatWindow() {
|
|
IFrameHelper.events.popoutChatWindow({
|
|
baseUrl: window.$chatwoot.baseUrl,
|
|
websiteToken: window.$chatwoot.websiteToken,
|
|
locale,
|
|
});
|
|
},
|
|
|
|
setUser(identifier, user) {
|
|
if (typeof identifier !== 'string' && typeof identifier !== 'number') {
|
|
throw new Error('Identifier should be a string or a number');
|
|
}
|
|
|
|
if (!hasUserKeys(user)) {
|
|
throw new Error(
|
|
'User object should have one of the keys [avatar_url, email, name]'
|
|
);
|
|
}
|
|
|
|
const userCookieName = getUserCookieName();
|
|
const existingCookieValue = Cookies.get(userCookieName);
|
|
const hashToBeStored = computeHashForUserData({ identifier, user });
|
|
if (hashToBeStored === existingCookieValue) {
|
|
return;
|
|
}
|
|
|
|
window.$chatwoot.identifier = identifier;
|
|
window.$chatwoot.user = user;
|
|
IFrameHelper.sendMessage('set-user', { identifier, user });
|
|
|
|
setCookieWithDomain(userCookieName, hashToBeStored, {
|
|
baseDomain,
|
|
});
|
|
},
|
|
|
|
setCustomAttributes(customAttributes = {}) {
|
|
if (!customAttributes || !Object.keys(customAttributes).length) {
|
|
throw new Error('Custom attributes should have atleast one key');
|
|
} else {
|
|
IFrameHelper.sendMessage('set-custom-attributes', { customAttributes });
|
|
}
|
|
},
|
|
|
|
deleteCustomAttribute(customAttribute = '') {
|
|
if (!customAttribute) {
|
|
throw new Error('Custom attribute is required');
|
|
} else {
|
|
IFrameHelper.sendMessage('delete-custom-attribute', {
|
|
customAttribute,
|
|
});
|
|
}
|
|
},
|
|
|
|
setConversationCustomAttributes(customAttributes = {}) {
|
|
if (!customAttributes || !Object.keys(customAttributes).length) {
|
|
throw new Error('Custom attributes should have atleast one key');
|
|
} else {
|
|
IFrameHelper.sendMessage('set-conversation-custom-attributes', {
|
|
customAttributes,
|
|
});
|
|
}
|
|
},
|
|
|
|
deleteConversationCustomAttribute(customAttribute = '') {
|
|
if (!customAttribute) {
|
|
throw new Error('Custom attribute is required');
|
|
} else {
|
|
IFrameHelper.sendMessage('delete-conversation-custom-attribute', {
|
|
customAttribute,
|
|
});
|
|
}
|
|
},
|
|
|
|
setLabel(label = '') {
|
|
IFrameHelper.sendMessage('set-label', { label });
|
|
},
|
|
|
|
removeLabel(label = '') {
|
|
IFrameHelper.sendMessage('remove-label', { label });
|
|
},
|
|
|
|
setLocale(localeToBeUsed = 'en') {
|
|
IFrameHelper.sendMessage('set-locale', { locale: localeToBeUsed });
|
|
},
|
|
|
|
setColorScheme(darkMode = 'light') {
|
|
IFrameHelper.sendMessage('set-color-scheme', {
|
|
darkMode: getDarkMode(darkMode),
|
|
});
|
|
},
|
|
|
|
reset() {
|
|
if (window.$chatwoot.isOpen) {
|
|
IFrameHelper.events.toggleBubble();
|
|
}
|
|
|
|
Cookies.remove('cw_conversation');
|
|
Cookies.remove(getUserCookieName());
|
|
|
|
const iframe = IFrameHelper.getAppFrame();
|
|
iframe.src = IFrameHelper.getUrl({
|
|
baseUrl: window.$chatwoot.baseUrl,
|
|
websiteToken: window.$chatwoot.websiteToken,
|
|
});
|
|
|
|
window.$chatwoot.resetTriggered = true;
|
|
},
|
|
};
|
|
|
|
IFrameHelper.createFrame({
|
|
baseUrl,
|
|
websiteToken,
|
|
});
|
|
};
|
|
|
|
window.chatwootSDK = {
|
|
run: runSDK,
|
|
};
|