vue-intlayer
Version:
Easily internationalize i18n your Vue applications with type-safe multilingual content management.
31 lines (30 loc) • 1.07 kB
JavaScript
import { compareUrls as u } from "@intlayer/editor";
import { onScopeDispose as f, getCurrentInstance as d } from "vue";
import { useCommunicator as p } from "./communicator.mjs";
const o = /* @__PURE__ */ new Map();
let c = !1;
function m(e, t) {
let s = o.get(e);
s || (s = /* @__PURE__ */ new Set(), o.set(e, s)), s.add(t);
}
function l(e, t) {
const s = o.get(e);
s && (s.delete(t), s.size === 0 && o.delete(e));
}
function w(e, t) {
c || window && (window.addEventListener("message", (s) => {
const { type: n, data: i, senderId: a } = s.data ?? {};
n && a !== t && (!e || e.includes("*") || e.some((r) => u(r, s.origin))) && o.get(n)?.forEach((r) => r(i));
}), c = !0);
}
const L = (e, t) => {
const { allowedOrigins: s, postMessage: n, senderId: i } = p();
return w(s, i), t ? (m(e, t), f(() => l(e, t))) : d() || console.warn(
"useCrossFrameMessageListener called outside a component without a callback; nothing to listen for."
), (r) => {
n({ type: e, data: r, senderId: i });
};
};
export {
L as useCrossFrameMessageListener
};