@nwebui/react-niagara-core
Version:
React Niagara Core
71 lines • 2.16 kB
JavaScript
import { useEffect, useState } from "react";
import * as baja from "@nwebui/bajascript";
export default function useComponent(ordOrComp, base, subscribe = true) {
const [comp, setComp] = useState();
const [update, setUpdate] = useState(0);
useEffect(() => {
async function resolve(ord, base) {
ord = await convertOrd(ord, base);
const bord = new baja.Ord(ord);
const comp = (await bord.get());
await comp.loadSlots();
setComp(comp);
}
if (!ordOrComp) {
return;
}
if (typeof ordOrComp == "string") {
resolve(ordOrComp, base);
}
else {
setComp(ordOrComp);
}
}, [base, ordOrComp]);
useEffect(() => {
function onChange() {
setUpdate((v) => v + 1);
}
async function doSubscribe(comp) {
await comp.loadSlots();
if (subscribe) {
await sub.subscribe(comp);
}
comp.addListener("changed", onChange);
}
if (!comp) {
return;
}
const sub = new baja.Subscriber();
doSubscribe(comp);
return () => {
comp.removeListener("changed", onChange);
sub.unsubscribeAll();
};
}, [comp, subscribe]);
return [comp, update];
}
async function convertOrd(ord, base) {
if (base) {
if (typeof base === "string") {
return [base, ord].join("|");
}
else {
for (const b of base) {
let joined = [b, ord].join("|").replace("|slot:", "/");
if (joined.startsWith("slot:/")) {
joined = "station:|" + joined;
}
try {
await new baja.Ord(joined).resolve();
return joined;
}
catch (e) {
// empty
}
}
return ord;
}
}
return ord;
}
//# sourceMappingURL=useComponent.js.map