86 lines
3.4 KiB
JavaScript
86 lines
3.4 KiB
JavaScript
/** @odoo-module **/
|
|
|
|
import '@im_livechat/../tests/helpers/mock_server'; // ensure mail overrides are applied first
|
|
|
|
import { patch } from "@web/core/utils/patch";
|
|
import { MockServer } from "@web/../tests/helpers/mock_server";
|
|
|
|
patch(MockServer.prototype, 'website_livechat', {
|
|
/**
|
|
* @override
|
|
*/
|
|
async _performRPC(route, args) {
|
|
if (route === '/web/dataset/call_button') {
|
|
return this._mockCallButton(args);
|
|
}
|
|
return this._super(route, args);
|
|
},
|
|
/**
|
|
* Simulate a 'call_button' operation from a view.
|
|
*
|
|
* @override
|
|
*/
|
|
_mockCallButton({ args, kwargs, method, model }) {
|
|
if (model === 'website.visitor' && method === 'action_send_chat_request') {
|
|
return this._mockWebsiteVisitorActionSendChatRequest(args[0]);
|
|
}
|
|
return this._super(...arguments);
|
|
},
|
|
/**
|
|
* Overrides to add visitor information to livechat channels.
|
|
*
|
|
* @override
|
|
*/
|
|
_mockMailChannelChannelInfo(ids) {
|
|
const channelInfos = this._super(...arguments);
|
|
for (const channelInfo of channelInfos) {
|
|
const channel = this.getRecords('mail.channel', [['id', '=', channelInfo.id]])[0];
|
|
if (channel.channel_type === 'livechat' && channelInfo.livechat_visitor_id) {
|
|
const visitor = this.getRecords('website.visitor', [['id', '=', channelInfo.livechat_visitor_id]])[0];
|
|
const country = this.getRecords('res.country', [['id', '=', visitor.country_id]])[0];
|
|
channelInfo.visitor = {
|
|
country_code: country && country.code,
|
|
country_id: country && country.id,
|
|
display_name: visitor.display_name,
|
|
history: visitor.history, // TODO should be computed
|
|
id: visitor.id,
|
|
is_connected: visitor.is_connected,
|
|
lang_name: visitor.lang_name,
|
|
partner_id: visitor.partner_id,
|
|
website_name: visitor.website_name,
|
|
};
|
|
}
|
|
}
|
|
return channelInfos;
|
|
},
|
|
/**
|
|
* @private
|
|
* @param {integer[]} ids
|
|
*/
|
|
_mockWebsiteVisitorActionSendChatRequest(ids) {
|
|
const visitors = this.getRecords('website.visitor', [['id', 'in', ids]]);
|
|
for (const visitor of visitors) {
|
|
const country = visitor.country_id
|
|
? this.getRecords('res.country', [['id', '=', visitor.country_id]])
|
|
: undefined;
|
|
const visitor_name = `${visitor.display_name}${country ? `(${country.name})` : ''}`;
|
|
const membersToAdd = [[0, 0, { partner_id: this.currentPartnerId }]];
|
|
if (visitor.partner_id) {
|
|
membersToAdd.push([0, 0, { partner_id: visitor.partner_id }]);
|
|
} else {
|
|
membersToAdd.push([0, 0, { partner_id: this.publicPartnerId }]);
|
|
}
|
|
const livechatId = this.pyEnv['mail.channel'].create({
|
|
anonymous_name: visitor_name,
|
|
channel_member_ids: membersToAdd,
|
|
channel_type: 'livechat',
|
|
livechat_operator_id: this.currentPartnerId,
|
|
});
|
|
// notify operator
|
|
this.pyEnv['bus.bus']._sendone(this.currentPartner, 'website_livechat.send_chat_request',
|
|
this._mockMailChannelChannelInfo([livechatId])[0]
|
|
);
|
|
}
|
|
},
|
|
});
|