embed-fbcmt-client
Version:
client package for embed-fbcmt
99 lines (96 loc) • 2.67 kB
JavaScript
// src/constants.ts
var defaults = {
color_scheme: "light",
lazy: false,
mobile: void 0,
num_posts: 10,
order_by: "reverse_time",
lang: "en_US",
origin: "*",
no_socket: false,
active: true,
no_popup: false
};
// src/client/main.ts
function setPropValue(el, prop, value, origin) {
if (origin === void 0) {
origin = value;
value = void 0;
}
return new Promise((resolve, reject) => {
const id = (Number.MAX_SAFE_INTEGER * Math.random()).toString(34);
const handler = (event) => {
if (event.data?.type === "res::fb:set_value" && id === event.data.id) {
const { code } = event.data;
if (typeof code !== "string")
return;
if (code.startsWith("success."))
resolve();
else if (code.startsWith("error."))
reject(Object.assign(new Error(code), { prop }));
else
console.warn("[res::fb:set_value]: invalid code error '%s'", code);
cancel();
}
};
let timeout = null;
const cancel = () => {
if (timeout)
clearTimeout(timeout);
window.removeEventListener("message", handler);
};
window.addEventListener("message", handler);
timeout = setTimeout(() => {
cancel();
reject(new Error("error.timeout" /* ERROR_TIMEOUT */));
}, 3e4);
const res = {
id,
type: "req::fb:set_value",
props: typeof prop === "object" ? prop : { [prop]: value }
};
if (el.contentWindow)
el.contentWindow.postMessage(res, origin ?? "*");
else
reject();
});
}
function listenEvent(el, cb) {
const handler = (event) => {
if (event.source !== el.contentWindow)
return;
if (event.data?.type !== "emit::fb_embed")
return;
const typeCode = getTypeCode(event.data.code);
if (!typeCode)
return;
cb({
type: typeCode,
code: event.data.code,
message: event.data.message
});
};
window.addEventListener("message", handler);
return () => window.removeEventListener("message", handler);
}
function listenResize(el, type, cb) {
const handler = (event) => {
if (event.source !== el.contentWindow)
return;
if (event.data?.type !== `update::fb_${type}`)
return;
cb(event.data.value);
};
window.addEventListener("message", handler);
return () => window.removeEventListener("message", handler);
}
function getTypeCode(code) {
if (code.startsWith("success."))
return "success";
if (code.startsWith("loading."))
return "loading";
if (code.startsWith("error."))
return "error";
return null;
}
export { defaults, getTypeCode, listenEvent, listenResize, setPropValue };