Files
Odoo-Modules/fusion_ringcentral/static/src/js/rc_phone_widget.js
gsinghpal e8e554de95 changes
2026-02-23 00:32:20 -05:00

93 lines
2.9 KiB
JavaScript

/** @odoo-module **/
import { registry } from "@web/core/registry";
import { session } from "@web/session";
import { rpc } from "@web/core/network/rpc";
const RC_ADAPTER_URL = "https://apps.ringcentral.com/integration/ringcentral-embeddable/latest/adapter.js";
let rcWidgetLoaded = false;
async function loadRcWidget() {
if (rcWidgetLoaded) return;
let config;
try {
config = await rpc("/ringcentral/widget-config", {});
console.log("[RC Widget] Config received:", JSON.stringify(config));
} catch (e) {
console.error("[RC Widget] Failed to fetch config:", e);
return;
}
if (!config || !config.enabled || !config.client_id) {
console.warn("[RC Widget] Widget disabled or missing client_id", config);
return;
}
rcWidgetLoaded = true;
const script = document.createElement("script");
const params = new URLSearchParams({
clientId: config.client_id,
appServer: config.app_server || "https://app.ringcentral.com",
disableInactiveTabCallEvent: "1",
});
console.log("[RC Widget] Loading adapter with params:", params.toString());
script.src = `${RC_ADAPTER_URL}?${params.toString()}`;
document.head.appendChild(script);
window.addEventListener("message", (e) => {
if (!e.data) return;
switch (e.data.type) {
case "rc-login-status-notify":
window.__rcLoggedIn = e.data.loggedIn;
break;
case "rc-active-call-notify":
window.__rcActiveCall = e.data.call;
break;
case "rc-call-end-notify":
_logCallToOdoo(e.data.call);
break;
case "rc-adapter-syncPresence":
window.__rcPresence = {
dndStatus: e.data.dndStatus,
userStatus: e.data.userStatus,
telephonyStatus: e.data.telephonyStatus,
};
window.dispatchEvent(new CustomEvent("rc-presence-changed", {
detail: window.__rcPresence,
}));
break;
}
});
}
async function _logCallToOdoo(call) {
if (!call) return;
try {
await rpc("/web/dataset/call_kw", {
model: "rc.call.history",
method: "create",
args: [{
rc_session_id: String(call.sessionId || ""),
direction: (call.direction || "").toLowerCase() === "inbound" ? "inbound" : "outbound",
from_number: call.from || "",
to_number: call.to || "",
duration: call.duration || 0,
status: call.duration > 0 ? "answered" : "missed",
}],
kwargs: {},
});
} catch {
// Silently fail -- cron will catch it
}
}
registry.category("services").add("rc_phone_widget", {
start() {
loadRcWidget();
},
});