From 44dcd64aa9330020ca2db52598cd1379216194bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20K=C3=BChn?= Date: Tue, 10 May 2022 09:16:05 +0000 Subject: [PATCH] [IMP] mail: introduce MessageView/clockWatcher MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-2831082 closes odoo/odoo#90957 Signed-off-by: Sébastien Theys (seb) --- .../static/src/components/message/message.js | 19 +------------ .../static/src/components/message/message.xml | 2 +- .../mail/static/src/models/clock_watcher.js | 6 +++- addons/mail/static/src/models/message.js | 23 +-------------- addons/mail/static/src/models/message_view.js | 28 +++++++++++++++++++ 5 files changed, 36 insertions(+), 42 deletions(-) diff --git a/addons/mail/static/src/components/message/message.js b/addons/mail/static/src/components/message/message.js index e98aec87d70..342cfce74b8 100644 --- a/addons/mail/static/src/components/message/message.js +++ b/addons/mail/static/src/components/message/message.js @@ -8,7 +8,7 @@ import { registerMessagingComponent } from '@mail/utils/messaging_component'; import { _lt } from 'web.core'; import Popover from "web.Popover"; -const { Component, onWillUnmount, useRef } = owl; +const { Component, useRef } = owl; const READ_MORE = _lt("Read More"); const READ_LESS = _lt("Read Less"); @@ -41,12 +41,6 @@ export class Message extends Component { * To get checkbox state. */ this._checkboxRef = useRef('checkbox'); - /** - * Id of setInterval used to auto-update time elapsed of message at - * regular time. - */ - this._intervalId = undefined; - onWillUnmount(() => this._willUnmount()); /** * States the index of the last "read more" that was inserted. * Useful to remember the state for each "read more" even if their DOM @@ -64,10 +58,6 @@ export class Message extends Component { this._isReadMoreByIndex = new Map(); } - _willUnmount() { - clearInterval(this._intervalId); - } - //-------------------------------------------------------------------------- // Public //-------------------------------------------------------------------------- @@ -265,13 +255,6 @@ export class Message extends Component { message: this.messageView.message, }); } - this.messageView.message.refreshDateFromNow(); - clearInterval(this._intervalId); - this._intervalId = setInterval(() => { - if (this.messageView) { - this.messageView.message.refreshDateFromNow(); - } - }, 60 * 1000); } } diff --git a/addons/mail/static/src/components/message/message.xml b/addons/mail/static/src/components/message/message.xml index 95145bbe74e..85344106de4 100644 --- a/addons/mail/static/src/components/message/message.xml +++ b/addons/mail/static/src/components/message/message.xml @@ -94,7 +94,7 @@ - - + - diff --git a/addons/mail/static/src/models/clock_watcher.js b/addons/mail/static/src/models/clock_watcher.js index ca9a82a98e2..6a0a8a15fc3 100644 --- a/addons/mail/static/src/models/clock_watcher.js +++ b/addons/mail/static/src/models/clock_watcher.js @@ -8,7 +8,7 @@ import { one } from '@mail/model/model_field'; */ registerModel({ name: 'ClockWatcher', - identifyingFields: [['activityViewOwner']], + identifyingFields: [['activityViewOwner', 'messageViewOwner']], fields: { activityViewOwner: one('ActivityView', { inverse: 'clockWatcher', @@ -18,5 +18,9 @@ registerModel({ inverse: 'watchers', required: true, }), + messageViewOwner: one('MessageView', { + inverse: 'clockWatcher', + readonly: true, + }), }, }); diff --git a/addons/mail/static/src/models/message.js b/addons/mail/static/src/models/message.js index 24f09160566..9e00f5e0ca2 100644 --- a/addons/mail/static/src/models/message.js +++ b/addons/mail/static/src/models/message.js @@ -4,7 +4,7 @@ import { registerModel } from '@mail/model/model_core'; import { attr, many, one } from '@mail/model/model_field'; import { clear, insert, insertAndReplace, replace } from '@mail/model/model_field_command'; import emojis from '@mail/js/emojis'; -import { addLink, htmlToTextContentInline, parseAndTransform, timeFromNow } from '@mail/js/utils'; +import { addLink, htmlToTextContentInline, parseAndTransform } from '@mail/js/utils'; import { session } from '@web/session'; import { sprintf } from '@web/core/utils/strings'; @@ -242,12 +242,6 @@ registerModel({ }, }); }, - /** - * Refreshes the value of `dateFromNow` field to the "current now". - */ - refreshDateFromNow() { - this.update({ dateFromNow: this._computeDateFromNow() }); - }, /** * Removes the given reaction from this message. * @@ -377,15 +371,6 @@ registerModel({ } return this.date.format('LL'); }, - /** - * @returns {string} - */ - _computeDateFromNow() { - if (!this.date) { - return clear(); - } - return timeFromNow(this.date); - }, /** * @private * @returns {string|FieldCommand} @@ -740,12 +725,6 @@ registerModel({ dateDay: attr({ compute: '_computeDateDay', }), - /** - * States the time elapsed since date up to now. - */ - dateFromNow: attr({ - compute: '_computeDateFromNow', - }), /** * The date time of the message at current user locale time. */ diff --git a/addons/mail/static/src/models/message_view.js b/addons/mail/static/src/models/message_view.js index 08530e14506..949847641ae 100644 --- a/addons/mail/static/src/models/message_view.js +++ b/addons/mail/static/src/models/message_view.js @@ -182,6 +182,19 @@ registerModel({ _computeAuthorAvatarTitleText() { return this.env._t("Open chat"); }, + /** + * @returns {string} + */ + _computeDateFromNow() { + if (!this.message.date) { + return clear(); + } + const now = moment(this.clockWatcher.clock.date.getTime()); + if (now.diff(this.message.date, 'seconds') < 45) { + return this.env._t("now"); + } + return this.message.date.fromNow(); + }, /** * @private * @returns {string|FieldCommand} @@ -288,6 +301,15 @@ registerModel({ authorAvatarTitleText: attr({ compute: '_computeAuthorAvatarTitleText', }), + clockWatcher: one('ClockWatcher', { + default: insertAndReplace({ + clock: insertAndReplace({ + frequency: 60 * 1000, + }), + }), + inverse: 'messageViewOwner', + isCausal: true, + }), /** * States the component displaying this message view (if any). */ @@ -303,6 +325,12 @@ registerModel({ inverse: 'messageViewInEditing', isCausal: true, }), + /** + * States the time elapsed since date up to now. + */ + dateFromNow: attr({ + compute: '_computeDateFromNow', + }), /** * States the delete message confirm view that is displaying this * message view.