1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
odoo.define('im_livechat/static/src/models/thread/thread.js', function (require) {
'use strict';
const {
registerClassPatchModel,
registerInstancePatchModel,
} = require('mail/static/src/model/model_core.js');
registerClassPatchModel('mail.thread', 'im_livechat/static/src/models/thread/thread.js', {
//----------------------------------------------------------------------
// Public
//----------------------------------------------------------------------
/**
* @override
*/
convertData(data) {
const data2 = this._super(data);
if ('livechat_visitor' in data && data.livechat_visitor) {
if (!data2.members) {
data2.members = [];
}
// `livechat_visitor` without `id` is the anonymous visitor.
if (!data.livechat_visitor.id) {
/**
* Create partner derived from public partner and replace the
* public partner.
*
* Indeed the anonymous visitor is registered as a member of the
* channel as the public partner in the database to avoid
* polluting the contact list with many temporary partners.
*
* But the issue with public partner is that it is the same
* record for every livechat, whereas every correspondent should
* actually have its own visitor name, typing status, etc.
*
* Due to JS being temporary by nature there is no such notion
* of polluting the database, it is therefore acceptable and
* easier to handle one temporary partner per channel.
*/
data2.members.push(['unlink', this.env.messaging.publicPartners]);
const partner = this.env.models['mail.partner'].create(
Object.assign(
this.env.models['mail.partner'].convertData(data.livechat_visitor),
{ id: this.env.models['mail.partner'].getNextPublicId() }
)
);
data2.members.push(['link', partner]);
data2.correspondent = [['link', partner]];
} else {
const partnerData = this.env.models['mail.partner'].convertData(data.livechat_visitor);
data2.members.push(['insert', partnerData]);
data2.correspondent = [['insert', partnerData]];
}
}
return data2;
},
});
registerInstancePatchModel('mail.thread', 'im_livechat/static/src/models/thread/thread.js', {
//----------------------------------------------------------------------
// Private
//----------------------------------------------------------------------
/**
* @override
*/
_computeCorrespondent() {
if (this.channel_type === 'livechat') {
// livechat correspondent never change: always the public member.
return [];
}
return this._super();
},
/**
* @override
*/
_computeDisplayName() {
if (this.channel_type === 'livechat' && this.correspondent) {
if (this.correspondent.country) {
return `${this.correspondent.nameOrDisplayName} (${this.correspondent.country.name})`;
}
return this.correspondent.nameOrDisplayName;
}
return this._super();
},
/**
* @override
*/
_computeIsChatChannel() {
return this.channel_type === 'livechat' || this._super();
},
});
});
|