@botonic/react
Version:
Build Chatbots using React
88 lines • 3.44 kB
JavaScript
import merge from 'lodash.merge';
import UAParser from 'ua-parser-js';
import { v7 as uuidv7 } from 'uuid';
import { WEBCHAT } from '../constants';
import { timeZoneToCountryCode } from '../time-zone-to-country-code';
import { getProperty } from './objects';
/**
* Returns the value of a property defined in bot's theme based on WEBCHAT.CUSTOM_PROPERTIES dictionary.
* It gives preference to nested defined properties (e.g.: header.style) over plain properties (e.g.: headerStyle).
* If property doesn't exist, returns the defaultValue.
*/
export const _getThemeProperty = (theme) => (property, defaultValue) => {
for (const [key, value] of Object.entries(WEBCHAT.CUSTOM_PROPERTIES)) {
if (value === property) {
const nestedProperty = getProperty(theme, value);
if (nestedProperty !== undefined)
return nestedProperty;
const plainProperty = getProperty(theme, key);
if (plainProperty !== undefined)
return plainProperty;
return defaultValue;
}
}
return undefined;
};
export const createUser = () => {
const parser = new UAParser();
const ua = parser.getResult();
let name = `${ua.os.name} ${ua.browser.name}`;
if (ua.device && ua.device.type)
name = `${ua.device.type} ${name}`;
return {
id: uuidv7(),
name,
};
};
export const initSession = (session) => {
var _a;
if (!session)
session = {};
const hasUserId = ((_a = session === null || session === void 0 ? void 0 : session.user) === null || _a === void 0 ? void 0 : _a.id) !== undefined;
if (!session.user || Object.keys(session.user).length === 0 || !hasUserId)
session.user = !hasUserId ? merge(session.user, createUser()) : createUser();
return session;
};
export function updateUserLocaleAndCountry(user) {
user.locale = getLocale(user);
user.country = getCountry(user);
user.system_locale = getSystemLocale(user);
return user;
}
function getLocale(user) {
var _a, _b;
if (user.locale) {
return user.locale;
}
return ((_a = user.extra_data) === null || _a === void 0 ? void 0 : _a.language)
? (_b = user.extra_data) === null || _b === void 0 ? void 0 : _b.language
: navigator.language;
}
function getCountry(user) {
var _a, _b;
if (user.country) {
return user.country;
}
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
const userCountry = timeZoneToCountryCode[timeZone];
return ((_a = user.extra_data) === null || _a === void 0 ? void 0 : _a.country)
? (_b = user.extra_data) === null || _b === void 0 ? void 0 : _b.country
: userCountry;
}
function getSystemLocale(user) {
if (user.system_locale) {
return user.system_locale;
}
return getLocale(user);
}
export const shouldKeepSessionOnReload = ({ initialDevSettings, devSettings, }) => !initialDevSettings || (devSettings && devSettings.keepSessionOnReload);
//TODO: Review param serverConfig if is of type ServerConfig this never have errorMessage
export const getServerErrorMessage = serverConfig => {
if (!serverConfig || !serverConfig.errorMessage)
return 'Connection issues';
if (typeof serverConfig.errorMessage === 'function') {
return serverConfig.errorMessage();
}
return serverConfig.errorMessage;
};
//# sourceMappingURL=webchat.js.map