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

69 lines
2.4 KiB
JavaScript

/** @odoo-module **/
import { EventBus } from "@odoo/owl";
import { browser } from "@web/core/browser/browser";
import { registry } from "@web/core/registry";
export const presenceService = {
start(env) {
const LOCAL_STORAGE_PREFIX = "presence";
const bus = new EventBus();
let isOdooFocused = true;
let lastPresenceTime =
browser.localStorage.getItem(`${LOCAL_STORAGE_PREFIX}.lastPresence`) ||
luxon.DateTime.now().ts;
function onPresence() {
lastPresenceTime = luxon.DateTime.now().ts;
browser.localStorage.setItem(`${LOCAL_STORAGE_PREFIX}.lastPresence`, lastPresenceTime);
bus.trigger("presence");
}
function onFocusChange(isFocused) {
try {
isFocused = parent.document.hasFocus();
} catch {
// noop
}
isOdooFocused = isFocused;
browser.localStorage.setItem(`${LOCAL_STORAGE_PREFIX}.focus`, isOdooFocused);
if (isOdooFocused) {
lastPresenceTime = luxon.DateTime.now().ts;
env.bus.trigger("window_focus", isOdooFocused);
}
}
function onStorage({ key, newValue }) {
if (key === `${LOCAL_STORAGE_PREFIX}.focus`) {
isOdooFocused = JSON.parse(newValue);
env.bus.trigger("window_focus", newValue);
}
if (key === `${LOCAL_STORAGE_PREFIX}.lastPresence`) {
lastPresenceTime = JSON.parse(newValue);
bus.trigger("presence");
}
}
browser.addEventListener("storage", onStorage);
browser.addEventListener("focus", () => onFocusChange(true));
browser.addEventListener("blur", () => onFocusChange(false));
browser.addEventListener("pagehide", () => onFocusChange(false));
browser.addEventListener("click", onPresence);
browser.addEventListener("keydown", onPresence);
return {
bus,
getLastPresence() {
return lastPresenceTime;
},
isOdooFocused() {
return isOdooFocused;
},
getInactivityPeriod() {
return luxon.DateTime.now().ts - this.getLastPresence();
},
};
},
};
registry.category("services").add("presence", presenceService);