93 lines
2.9 KiB
JavaScript
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();
|
|
},
|
|
});
|