From cece071dffcedf2ed14fa4d49ce1283db18ee0a5 Mon Sep 17 00:00:00 2001 From: Achilles Rasquinha Date: Thu, 22 Mar 2018 14:43:28 +0530 Subject: [PATCH] added website chat --- frappe/chat/website/__init__.py | 17 +++++ frappe/public/js/frappe/chat.js | 108 ++++++++++++++++++++------------ 2 files changed, 84 insertions(+), 41 deletions(-) create mode 100644 frappe/chat/website/__init__.py diff --git a/frappe/chat/website/__init__.py b/frappe/chat/website/__init__.py new file mode 100644 index 0000000000..fa302dbf27 --- /dev/null +++ b/frappe/chat/website/__init__.py @@ -0,0 +1,17 @@ +import frappe + +@frappe.whitelist(allow_guest = True) +def settings(): + dsettings = frappe.get_single('Website Settings') + response = dict( + socketio = dict( + port = frappe.conf.socketio_port + ), + enable_chat = dsettings.chat_enable, + welcome_message = dsettings.chat_welcome_message, + operators = [ + duser.user for duser in dsettings.chat_operators + ] + ) + + return response \ No newline at end of file diff --git a/frappe/public/js/frappe/chat.js b/frappe/public/js/frappe/chat.js index bd9ac37229..658f80a023 100644 --- a/frappe/public/js/frappe/chat.js +++ b/frappe/public/js/frappe/chat.js @@ -7,6 +7,11 @@ import hyper from '../lib/hyper.min' import './socketio_client' +import './ui/dialog' +import './ui/capture' + +import './misc/user' + /* eslint semi: "never" */ // Fuck semicolons - https://mislav.net/2010/05/semicolons @@ -25,7 +30,7 @@ import './socketio_client' * @see https://stackoverflow.com/a/32749533 * @todo Requires "transform-builtin-extend" for Babel 6 */ -frappe.Error = Error; +frappe.Error = Error // class extends Error { // constructor (message) { // super (message) @@ -42,7 +47,7 @@ frappe.Error = Error; /** * @description TypeError */ -frappe.TypeError = TypeError; +frappe.TypeError = TypeError // class extends frappe.Error { // constructor (message) { // super (message) @@ -2422,64 +2427,85 @@ frappe.notify = (string, options) => frappe.chat.render = (render = true, force = false) => { - frappe.log.info(`${render ? "Enable" : "Disable"} Chat for User.`); + frappe.log.info(`${render ? "Enable" : "Disable"} Chat for User.`) - // With the assumption, that there's only one navbar. - const $placeholder = $('.navbar .frappe-chat-dropdown'); - - // Render if frappe-chat-toggle doesn't exist. - if ( frappe.utils.is_empty($placeholder.has('.frappe-chat-toggle')) ) { - const $template = $(` - -
- -
-
- `); - - $placeholder.addClass('dropdown hidden'); - $placeholder.html($template); + const desk = 'desk' in frappe + if ( desk ) { + // With the assumption, that there's only one navbar. + const $placeholder = $('.navbar .frappe-chat-dropdown') + + // Render if frappe-chat-toggle doesn't exist. + if ( frappe.utils.is_empty($placeholder.has('.frappe-chat-toggle')) ) { + const $template = $(` + +
+ +
+
+ `) + + $placeholder.addClass('dropdown hidden') + $placeholder.html($template) + } + + if ( render ) { + $placeholder.removeClass('hidden') + } else { + $placeholder.addClass('hidden') + } } - - if ( render ) { - $placeholder.removeClass('hidden'); - } else { - $placeholder.addClass('hidden'); - } - + // Avoid re-renders. Once is enough. if ( !frappe.chatter || force ) { - frappe.chatter = new frappe.Chat({ target: '.navbar .frappe-chat-toggle' }); - frappe.chatter.render(); + frappe.chatter = new frappe.Chat({ + target: desk ? '.navbar .frappe-chat-toggle' : null + }) + frappe.chatter.render() } } frappe.chat.setup = () => { - if ( frappe.session.user !== 'Guest' ) { - frappe.log = frappe.Logger.get('frappe.chat'); - - frappe.log.info('Setting up frappe.chat'); - frappe.log.warn('TODO: Handle realtime System Settings update.'); - frappe.log.warn('TODO: frappe.chat. requires a storage.'); + frappe.log = frappe.Logger.get('frappe.chat') + frappe.log.info('Setting up frappe.chat') + frappe.log.warn('TODO: frappe.chat. requires a storage.') + const desk = 'desk' in frappe + if ( desk ) { // Create/Get Chat Profile for session User, retrieve enable_chat - frappe.log.info('Creating a Chat Profile.'); + frappe.log.info('Creating a Chat Profile.') + frappe.chat.profile.create('enable_chat').then(({ enable_chat }) => { frappe.log.info(`Chat Profile created for User ${frappe.session.user}.`) - const should_render = frappe.sys_defaults.enable_chat && enable_chat; - frappe.chat.render(should_render); - }); + if ( 'desk' in frappe ) { + const should_render = frappe.sys_defaults.enable_chat && enable_chat + + frappe.chat.render(should_render) + } + }) // Triggered when a User updates his/her Chat Profile. // Don't worry, enable_chat is broadcasted to this user only. No overhead. :) frappe.chat.profile.on.update((user, profile) => { if ( user === frappe.session.user && 'enable_chat' in profile ) { - frappe.log.warn(`Chat Profile update (Enable Chat - ${Boolean(profile.enable_chat)})`); - const should_render = frappe.sys_defaults.enable_chat && profile.enable_chat; - frappe.chat.render(should_render); + frappe.log.warn(`Chat Profile update (Enable Chat - ${Boolean(profile.enable_chat)})`) + const should_render = frappe.sys_defaults.enable_chat && profile.enable_chat + frappe.chat.render(should_render) } - }); + }) + } else { + // Website Settings. + frappe.log.info('Retrieving Chat Website Settings.') + frappe.chat.website.settings(["socketio", "enable_chat"]).then((settings) => { + frappe.log.info(`Chat Website Setting - ${JSON.stringify(settings)}`) + frappe.log.info(`Chat Website Setting - ${settings.enable_chat ? "Enable" : "Disable"}`) + + const should_render = settings.enable_chat + + frappe.socketio.init(settings.socketio.port) + + frappe.chat.render(should_render) + }) } }