odoo18/addons/bus/static/src/services/assets_watchdog_service.js

68 lines
2.4 KiB
JavaScript

/** @odoo-module **/
import { _t } from "@web/core/l10n/translation";
import { browser } from "@web/core/browser/browser";
import { registry } from "@web/core/registry";
import { session } from "@web/session";
export const assetsWatchdogService = {
dependencies: ["bus_service", "notification"],
start(env, { bus_service, notification }) {
let isNotificationDisplayed = false;
let bundleNotifTimerID = null;
bus_service.subscribe("bundle_changed", ({ server_version }) => {
if (server_version !== session.server_version) {
displayBundleChangedNotification();
}
});
bus_service.start();
/**
* Displays one notification on user's screen when assets have changed
*/
function displayBundleChangedNotification() {
if (!isNotificationDisplayed) {
// Wrap the notification inside a delay.
// The server may be overwhelmed with recomputing assets
// We wait until things settle down
browser.clearTimeout(bundleNotifTimerID);
bundleNotifTimerID = browser.setTimeout(() => {
notification.add(_t("The page appears to be out of date."), {
title: _t("Refresh"),
type: "warning",
sticky: true,
buttons: [
{
name: _t("Refresh"),
primary: true,
onClick: () => {
browser.location.reload();
},
},
],
onClose: () => {
isNotificationDisplayed = false;
},
});
isNotificationDisplayed = true;
}, getBundleNotificationDelay());
}
}
/**
* Computes a random delay to avoid hammering the server
* when bundles change with all the users reloading
* at the same time
*
* @return {number} delay in milliseconds
*/
function getBundleNotificationDelay() {
return 10000 + Math.floor(Math.random() * 50) * 1000;
}
},
};
registry.category("services").add("assetsWatchdog", assetsWatchdogService);