wip fix
This commit is contained in:
parent
0960724075
commit
a3e770bfed
|
|
@ -2,7 +2,6 @@ import { compress, decompress } from "wasm-gzip";
|
||||||
import { PG } from "./ed-global";
|
import { PG } from "./ed-global";
|
||||||
import { loadSite } from "./ed-site";
|
import { loadSite } from "./ed-site";
|
||||||
import { treeRebuild } from "./tree/build";
|
import { treeRebuild } from "./tree/build";
|
||||||
import { loadCompSnapshot } from "./tree/sync-walk-comp";
|
|
||||||
|
|
||||||
export const edRoute = async (p: PG) => {
|
export const edRoute = async (p: PG) => {
|
||||||
if (p.status === "ready" || p.status === "init") {
|
if (p.status === "ready" || p.status === "init") {
|
||||||
|
|
@ -50,7 +49,7 @@ export const reloadPage = async (p: PG, page_id: string, note: string) => {
|
||||||
if (remotePage.comps) {
|
if (remotePage.comps) {
|
||||||
for (const [id_comp, c] of Object.entries(remotePage.comps)) {
|
for (const [id_comp, c] of Object.entries(remotePage.comps)) {
|
||||||
if (c && c.snapshot) {
|
if (c && c.snapshot) {
|
||||||
await loadCompSnapshot(p, id_comp, c.snapshot);
|
// await loadCompSnapshot(p, id_comp, c.snapshot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,189 +0,0 @@
|
||||||
// import { createId } from "@paralleldrive/cuid2";
|
|
||||||
// import { deepClone } from "web-utils";
|
|
||||||
// import { IContent } from "../../../../utils/types/general";
|
|
||||||
// import { IItem } from "../../../../utils/types/item";
|
|
||||||
// import { FNComponent } from "../../../../utils/types/meta-fn";
|
|
||||||
// import { IMeta, PG } from "../ed-global";
|
|
||||||
|
|
||||||
// export const walkLoad = async (
|
|
||||||
// p: { map: PG["comp"]["map"] },
|
|
||||||
// item: IContent,
|
|
||||||
// loaded: Set<string>,
|
|
||||||
// loadComponent: (id: string) => Promise<boolean>
|
|
||||||
// ) => {
|
|
||||||
// if (item.type === "item" && item.component?.id) {
|
|
||||||
// const id = item.component?.id;
|
|
||||||
// const comp = item.component as FNComponent;
|
|
||||||
|
|
||||||
// if (id && comp) {
|
|
||||||
// const isFirstLoaded = !loaded.has(id);
|
|
||||||
// loaded.add(id);
|
|
||||||
// if (!p.map[id]) {
|
|
||||||
// await loadComponent(comp.id);
|
|
||||||
// }
|
|
||||||
// if (p.map[id] && isFirstLoaded) {
|
|
||||||
// await walkLoad(p, p.map[id].item, loaded, loadComponent);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// for (const [propName, prop] of Object.entries(comp.props || {})) {
|
|
||||||
// if (prop.meta?.type === "content-element") {
|
|
||||||
// const mprop = comp.props[propName];
|
|
||||||
// if (mprop) {
|
|
||||||
// const mcontent = mprop.content;
|
|
||||||
// if (mcontent) {
|
|
||||||
// await walkLoad(p, mcontent, loaded, loadComponent);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (item.type !== "text") {
|
|
||||||
// await Promise.all(
|
|
||||||
// item.childs.map((e) => walkLoad(p, e, loaded, loadComponent))
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// };
|
|
||||||
|
|
||||||
// export const walkMap = (
|
|
||||||
// p: {
|
|
||||||
// meta: Record<string, IMeta>;
|
|
||||||
// comps: Record<string, { id: string; item: IItem }>;
|
|
||||||
// },
|
|
||||||
// arg: {
|
|
||||||
// isLayout: boolean;
|
|
||||||
// item: IContent;
|
|
||||||
// parent_item: { id: string };
|
|
||||||
// portal: {
|
|
||||||
// in: Record<string, IMeta>;
|
|
||||||
// out: Record<string, IMeta>;
|
|
||||||
// };
|
|
||||||
// each?: (meta: IMeta) => void;
|
|
||||||
// parent_comp?: { id: string; comp_id: string };
|
|
||||||
// }
|
|
||||||
// ) => {
|
|
||||||
// const { parent_item, parent_comp } = arg;
|
|
||||||
|
|
||||||
// let override_id = "";
|
|
||||||
// const id = arg.item.id;
|
|
||||||
|
|
||||||
// if (parent_comp && id) {
|
|
||||||
// const cmeta = p.meta[parent_comp.id];
|
|
||||||
// if (cmeta && cmeta.item.type === "item") {
|
|
||||||
// const comp = cmeta.item.component;
|
|
||||||
// if (comp) {
|
|
||||||
// const ref_ids = comp.ref_ids;
|
|
||||||
// if (ref_ids) {
|
|
||||||
// let ref_id = ref_ids[id];
|
|
||||||
// if (!ref_id) {
|
|
||||||
// ref_id = createId();
|
|
||||||
// ref_ids[id] = ref_id;
|
|
||||||
// }
|
|
||||||
// override_id = ref_id;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// let item = arg.item;
|
|
||||||
// if (override_id) {
|
|
||||||
// item.id = override_id;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// const item_comp = item.type === "item" ? item.component : null;
|
|
||||||
|
|
||||||
// if (item_comp && item_comp.id && parent_item.id !== "root") {
|
|
||||||
// const comp_ref = p.comps[item_comp.id];
|
|
||||||
|
|
||||||
// if (!comp_ref) {
|
|
||||||
// console.error("Component failed to load: ", item_comp.id);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// const mcomp = comp_ref.item;
|
|
||||||
|
|
||||||
// if (mcomp) {
|
|
||||||
// let ref_ids: Record<string, string> = item_comp.ref_ids;
|
|
||||||
// if (!ref_ids) {
|
|
||||||
// ref_ids = {};
|
|
||||||
// item_comp.ref_ids = ref_ids;
|
|
||||||
// }
|
|
||||||
// const original_id = item.id;
|
|
||||||
// item = deepClone(mcomp);
|
|
||||||
// item.id = original_id;
|
|
||||||
|
|
||||||
// const meta: IMeta = {
|
|
||||||
// item,
|
|
||||||
// parent_item,
|
|
||||||
// idexed_scope: {},
|
|
||||||
// is_layout: arg.isLayout,
|
|
||||||
// };
|
|
||||||
// if (item.name.startsWith("⬅")) {
|
|
||||||
// arg.portal.in[item.name] = meta;
|
|
||||||
// }
|
|
||||||
// if (item.name.startsWith("⮕")) {
|
|
||||||
// arg.portal.out[item.name] = meta;
|
|
||||||
// }
|
|
||||||
// if (arg.each) arg.each(meta);
|
|
||||||
// p.meta[item.id] = meta;
|
|
||||||
|
|
||||||
// if (item_comp.props) {
|
|
||||||
// for (const [k, mprop] of Object.entries(item_comp.props)) {
|
|
||||||
// if (mprop.meta?.type === "content-element" && mprop.content) {
|
|
||||||
// walkMap(p, {
|
|
||||||
// isLayout: arg.isLayout,
|
|
||||||
// item: mprop.content,
|
|
||||||
// parent_item: { id: item.id },
|
|
||||||
// portal: arg.portal,
|
|
||||||
// parent_comp: { id: item.id, comp_id: item_comp.id },
|
|
||||||
// each: arg.each,
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// for (const c of mcomp.childs) {
|
|
||||||
// walkMap(p, {
|
|
||||||
// isLayout: arg.isLayout,
|
|
||||||
// item: c,
|
|
||||||
// parent_item: { id: item.id },
|
|
||||||
// portal: arg.portal,
|
|
||||||
// parent_comp: { id: item.id, comp_id: item_comp.id },
|
|
||||||
// each: arg.each,
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// const meta: IMeta = {
|
|
||||||
// item,
|
|
||||||
// parent_item,
|
|
||||||
// idexed_scope: {},
|
|
||||||
// parent_comp,
|
|
||||||
// is_layout: arg.isLayout,
|
|
||||||
// };
|
|
||||||
// if (item.name.startsWith("⬅")) {
|
|
||||||
// arg.portal.in[item.name] = meta;
|
|
||||||
// }
|
|
||||||
// if (item.name.startsWith("⮕")) {
|
|
||||||
// arg.portal.out[item.name] = meta;
|
|
||||||
// }
|
|
||||||
// if (arg.each) arg.each(meta);
|
|
||||||
// p.meta[item.id] = meta;
|
|
||||||
|
|
||||||
// if (item.type !== "text") {
|
|
||||||
// for (const c of item.childs) {
|
|
||||||
// if (c) {
|
|
||||||
// walkMap(p, {
|
|
||||||
// isLayout: arg.isLayout,
|
|
||||||
// item: c,
|
|
||||||
// parent_item: { id: item.id },
|
|
||||||
// portal: arg.portal,
|
|
||||||
// parent_comp,
|
|
||||||
// each: arg.each,
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// };
|
|
||||||
|
|
@ -1,122 +0,0 @@
|
||||||
import { NodeModel } from "@minoru/react-dnd-treeview";
|
|
||||||
import { compress, decompress } from "wasm-gzip";
|
|
||||||
import { MItem } from "../../../../utils/types/item";
|
|
||||||
import { DComp } from "../../../../utils/types/root";
|
|
||||||
import { IMeta, IScope, PG, active } from "../ed-global";
|
|
||||||
import { treeRebuild } from "./build";
|
|
||||||
import {
|
|
||||||
loadComponent,
|
|
||||||
loadcomp,
|
|
||||||
syncWalkLoad,
|
|
||||||
syncWalkMap,
|
|
||||||
} from "./sync-walk";
|
|
||||||
import { waitUntil } from "web-utils";
|
|
||||||
|
|
||||||
export const loadCompSnapshot = async (
|
|
||||||
p: PG,
|
|
||||||
id_comp: string,
|
|
||||||
snapshot: Uint8Array
|
|
||||||
) => {
|
|
||||||
const doc = new Y.Doc() as DComp;
|
|
||||||
Y.applyUpdate(doc as any, decompress(snapshot));
|
|
||||||
const mitem = doc.getMap("map").get("root");
|
|
||||||
if (mitem) {
|
|
||||||
if (typeof p.comp.list[id_comp]?.on_update === "function") {
|
|
||||||
doc.off("update", p.comp.list[id_comp].on_update);
|
|
||||||
}
|
|
||||||
|
|
||||||
p.comp.list[id_comp] = {
|
|
||||||
comp: { id: id_comp, snapshot },
|
|
||||||
doc,
|
|
||||||
} as any;
|
|
||||||
|
|
||||||
const { tree, meta } = await walkCompTree(p, mitem, id_comp);
|
|
||||||
p.comp.list[id_comp] = {
|
|
||||||
...p.comp.list[id_comp],
|
|
||||||
meta,
|
|
||||||
tree,
|
|
||||||
async on_update(bin, origin) {
|
|
||||||
if (origin === "sv_remote" || origin === "local") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await p.sync.yjs.sv_local(
|
|
||||||
"comp",
|
|
||||||
id_comp,
|
|
||||||
Buffer.from(compress(bin))
|
|
||||||
);
|
|
||||||
|
|
||||||
if (res) {
|
|
||||||
const diff_local = Y.encodeStateAsUpdate(
|
|
||||||
doc as any,
|
|
||||||
decompress(res.sv)
|
|
||||||
);
|
|
||||||
Y.applyUpdate(doc as any, decompress(res.diff), "local");
|
|
||||||
const mitem = doc.getMap("map").get("root");
|
|
||||||
if (mitem) {
|
|
||||||
const { tree, meta } = await walkCompTree(p, mitem, id_comp);
|
|
||||||
p.comp.list[id_comp].tree = tree;
|
|
||||||
p.comp.list[id_comp].meta = meta;
|
|
||||||
await treeRebuild(p);
|
|
||||||
|
|
||||||
if (active.comp_id === id_comp) {
|
|
||||||
p.comp.tree = tree;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await p.sync.yjs.diff_local(
|
|
||||||
"comp",
|
|
||||||
id_comp,
|
|
||||||
Buffer.from(compress(diff_local))
|
|
||||||
);
|
|
||||||
p.render();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
doc.on("update", p.comp.list[id_comp].on_update);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const walkCompTree = async (p: PG, mitem: MItem, comp_id: string) => {
|
|
||||||
const tree: NodeModel<IMeta>[] = [];
|
|
||||||
const meta = {};
|
|
||||||
const portal = {
|
|
||||||
in: {} as Record<string, IMeta>,
|
|
||||||
out: {} as Record<string, IMeta>,
|
|
||||||
};
|
|
||||||
syncWalkLoad(p, mitem, (id) => loadComponent(p, id));
|
|
||||||
mitem.doc?.transact(() => {
|
|
||||||
syncWalkMap(
|
|
||||||
{
|
|
||||||
note: "walk-comp",
|
|
||||||
comps: p.comp.list,
|
|
||||||
item_loading: p.ui.tree.item_loading,
|
|
||||||
meta,
|
|
||||||
tree,
|
|
||||||
component_not_found(id) {
|
|
||||||
setTimeout(() => {
|
|
||||||
if (loadcomp.pending.has(id) || p.comp.list[id]) {
|
|
||||||
waitUntil(() => !loadcomp.pending.has(id)).then(async () => {
|
|
||||||
walkCompTree(p, mitem, comp_id);
|
|
||||||
|
|
||||||
const { tree, meta } = await walkCompTree(p, mitem, comp_id);
|
|
||||||
p.comp.list[comp_id].tree = tree;
|
|
||||||
p.comp.list[comp_id].meta = meta;
|
|
||||||
p.render();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, 100);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
mitem,
|
|
||||||
is_layout: false,
|
|
||||||
parent_item: { id: "root" },
|
|
||||||
portal,
|
|
||||||
tree_root_id: "root",
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
return { tree, meta };
|
|
||||||
};
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
||||||
import { createId } from "@paralleldrive/cuid2";
|
|
||||||
import { TypedMap } from "yjs-types";
|
|
||||||
import { MItem } from "../../../../utils/types/item";
|
|
||||||
import {
|
|
||||||
FMCompDef,
|
|
||||||
FMComponent,
|
|
||||||
FNCompDef,
|
|
||||||
FNComponent,
|
|
||||||
} from "../../../../utils/types/meta-fn";
|
|
||||||
|
|
||||||
export const ensurePropContent = (mprop: FMCompDef, k: string) => {
|
|
||||||
let mcontent = mprop.get("content");
|
|
||||||
if (!mcontent) {
|
|
||||||
const newcontent = new Y.Map();
|
|
||||||
syncronize(newcontent, {
|
|
||||||
id: createId(),
|
|
||||||
name: k,
|
|
||||||
type: "item",
|
|
||||||
dim: { w: "full", h: "full" },
|
|
||||||
childs: [],
|
|
||||||
adv: {
|
|
||||||
css: "",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
mprop.set("content", newcontent as MItem);
|
|
||||||
mcontent = mprop.get("content");
|
|
||||||
}
|
|
||||||
return mcontent;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const ensureMItemProps = (
|
|
||||||
mitem_comp: FMComponent,
|
|
||||||
item_comp: FNComponent
|
|
||||||
) => {
|
|
||||||
let mitem_props = mitem_comp.get("props");
|
|
||||||
if (!mitem_props) {
|
|
||||||
mitem_comp.set("props", new Y.Map() as any);
|
|
||||||
mitem_props = mitem_comp.get("props");
|
|
||||||
}
|
|
||||||
if (!item_comp.props) {
|
|
||||||
item_comp.props = {};
|
|
||||||
}
|
|
||||||
return mitem_props;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const ensureMProp = (
|
|
||||||
mitem_props: TypedMap<Record<string, FMCompDef>>,
|
|
||||||
k: string,
|
|
||||||
v: FNCompDef
|
|
||||||
) => {
|
|
||||||
let mprop = mitem_props.get(k);
|
|
||||||
if (!mprop) {
|
|
||||||
const newprop = new Y.Map();
|
|
||||||
syncronize(newprop, v);
|
|
||||||
mitem_props.set(k, newprop as FMCompDef);
|
|
||||||
mprop = mitem_props.get(k);
|
|
||||||
}
|
|
||||||
return mprop;
|
|
||||||
};
|
|
||||||
|
|
@ -1,389 +0,0 @@
|
||||||
import { NodeModel } from "@minoru/react-dnd-treeview";
|
|
||||||
import { createId } from "@paralleldrive/cuid2";
|
|
||||||
import { TypedArray } from "yjs-types";
|
|
||||||
import { MContent } from "../../../../utils/types/general";
|
|
||||||
import { IItem, MItem } from "../../../../utils/types/item";
|
|
||||||
import { FNCompDef, FNComponent } from "../../../../utils/types/meta-fn";
|
|
||||||
import { MSection } from "../../../../utils/types/section";
|
|
||||||
import { IMeta, IScope, PG } from "../ed-global";
|
|
||||||
import { loadCompSnapshot } from "./sync-walk-comp";
|
|
||||||
import {
|
|
||||||
ensureMItemProps,
|
|
||||||
ensureMProp,
|
|
||||||
ensurePropContent,
|
|
||||||
} from "./sync-walk-utils";
|
|
||||||
|
|
||||||
const comp_added = new Set<string>();
|
|
||||||
|
|
||||||
export const syncWalkLoad = async (
|
|
||||||
p: PG,
|
|
||||||
mitem: MItem,
|
|
||||||
loadComponent: (id: string) => Promise<boolean>
|
|
||||||
) => {
|
|
||||||
const mcomp = mitem.get("component");
|
|
||||||
if (mcomp) {
|
|
||||||
const id = mcomp.get("id");
|
|
||||||
if (id && !comp_added.has(id)) {
|
|
||||||
comp_added.add(id);
|
|
||||||
const comp = mcomp.toJSON() as FNComponent;
|
|
||||||
if (!p.comp.list[id]) {
|
|
||||||
loadComponent(comp.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
const pcomp = p.comp.list[id];
|
|
||||||
if (pcomp) {
|
|
||||||
const pitem = pcomp.doc.getMap("map").get("root");
|
|
||||||
if (pitem) {
|
|
||||||
await syncWalkLoad(p, pitem, loadComponent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (const [propName, prop] of Object.entries(comp.props || {})) {
|
|
||||||
if (prop.meta?.type === "content-element") {
|
|
||||||
const mprop = mcomp.get("props")?.get(propName);
|
|
||||||
if (mprop) {
|
|
||||||
const mcontent = ensurePropContent(mprop, propName);
|
|
||||||
if (mcontent) {
|
|
||||||
await syncWalkLoad(p, mcontent, loadComponent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const e of mitem.get("childs")?.map((e) => e) || []) {
|
|
||||||
await syncWalkLoad(p, e, loadComponent);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const syncWalkMap = (
|
|
||||||
p: {
|
|
||||||
note?: string;
|
|
||||||
item_loading: PG["ui"]["tree"]["item_loading"];
|
|
||||||
tree?: NodeModel<IMeta>[];
|
|
||||||
comps: PG["comp"]["list"];
|
|
||||||
meta: Record<string, IMeta>;
|
|
||||||
component_not_found?: (comp_id: string) => void;
|
|
||||||
scope?: null | IScope;
|
|
||||||
},
|
|
||||||
arg: {
|
|
||||||
is_layout: boolean;
|
|
||||||
mitem: MItem | MSection;
|
|
||||||
portal: {
|
|
||||||
in: Record<string, IMeta>;
|
|
||||||
out: Record<string, IMeta>;
|
|
||||||
};
|
|
||||||
parent_item: IMeta["parent_item"];
|
|
||||||
parent_mcomp?: IMeta["parent_mcomp"];
|
|
||||||
jsx_prop_name?: string;
|
|
||||||
jsx_prop_root?: boolean;
|
|
||||||
skip_add_tree?: boolean;
|
|
||||||
tree_root_id: string;
|
|
||||||
each?: (meta: IMeta) => void;
|
|
||||||
}
|
|
||||||
) => {
|
|
||||||
const { mitem, parent_item } = arg;
|
|
||||||
if (typeof mitem.get !== "function") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const item = {} as unknown as IItem;
|
|
||||||
|
|
||||||
let override_id = "";
|
|
||||||
const id = mitem.get("id");
|
|
||||||
|
|
||||||
let skip_tree = arg.skip_add_tree;
|
|
||||||
let skip_tree_child = skip_tree;
|
|
||||||
if (id && p.item_loading.includes(id)) {
|
|
||||||
skip_tree_child = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
let mapped = false;
|
|
||||||
if (arg.parent_mcomp && id) {
|
|
||||||
const fcomp = arg.parent_mcomp.minstance.get("component");
|
|
||||||
if (fcomp) {
|
|
||||||
const ref_ids = fcomp.get("ref_ids");
|
|
||||||
|
|
||||||
if (ref_ids) {
|
|
||||||
let ref_id = ref_ids.get(id);
|
|
||||||
|
|
||||||
if (!ref_id) {
|
|
||||||
ref_id = createId();
|
|
||||||
ref_ids.set(id, ref_id);
|
|
||||||
}
|
|
||||||
override_id = ref_id;
|
|
||||||
mapItem(mitem, item, ref_ids.toJSON());
|
|
||||||
mapped = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mapped) {
|
|
||||||
mapItem(mitem, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof item.name !== "string") return;
|
|
||||||
|
|
||||||
if (override_id) {
|
|
||||||
if (!item.originalId) item.originalId = item.id;
|
|
||||||
item.id = override_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arg.jsx_prop_name) {
|
|
||||||
const pitem = p.meta[arg.parent_item.id].item;
|
|
||||||
if (pitem.type === "item" && pitem.component) {
|
|
||||||
const pprop = pitem.component.props[arg.jsx_prop_name];
|
|
||||||
if (pprop.content) {
|
|
||||||
pprop.content.id = item.id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const item_comp = item.component;
|
|
||||||
const mitem_comp = mitem.get("component");
|
|
||||||
const metaNotFound = () => {
|
|
||||||
if (!skip_tree && p.tree) {
|
|
||||||
p.tree.push({
|
|
||||||
id: item.id,
|
|
||||||
parent: arg.tree_root_id === parent_item.id ? "root" : parent_item.id,
|
|
||||||
text: item.name,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (item_comp && item_comp.id && parent_item.id !== "root") {
|
|
||||||
if (!p.comps[item_comp.id]) {
|
|
||||||
if (p.component_not_found) {
|
|
||||||
p.component_not_found(item_comp.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let ref_comp = p.comps[item_comp.id];
|
|
||||||
|
|
||||||
if (ref_comp && mitem_comp) {
|
|
||||||
const mcomp = ref_comp.doc.getMap("map").get("root");
|
|
||||||
|
|
||||||
const minstance = arg.parent_mcomp
|
|
||||||
? arg.parent_mcomp.minstance
|
|
||||||
: (mitem as MItem);
|
|
||||||
|
|
||||||
let mref_ids = minstance.get("component")?.get("ref_ids");
|
|
||||||
|
|
||||||
if (!mref_ids) {
|
|
||||||
minstance.get("component")?.set("ref_ids", new Y.Map() as any);
|
|
||||||
mref_ids = minstance.get("component")?.get("ref_ids");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mcomp) {
|
|
||||||
const old_id = item.id;
|
|
||||||
const ref_ids = mref_ids?.toJSON() || {};
|
|
||||||
mapItem(mcomp, item, ref_ids);
|
|
||||||
item.id = old_id;
|
|
||||||
|
|
||||||
const meta: IMeta = {
|
|
||||||
item,
|
|
||||||
mitem: mitem as MItem,
|
|
||||||
parent_item,
|
|
||||||
parent_mcomp: arg.parent_mcomp,
|
|
||||||
indexed_scope: {},
|
|
||||||
is_layout: arg.is_layout,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (item.name.startsWith("⬅")) {
|
|
||||||
arg.portal.in[item.name] = meta;
|
|
||||||
}
|
|
||||||
if (item.name.startsWith("⮕")) {
|
|
||||||
arg.portal.out[item.name] = meta;
|
|
||||||
}
|
|
||||||
if (arg.each) arg.each(meta);
|
|
||||||
p.meta[item.id] = meta;
|
|
||||||
|
|
||||||
if (!skip_tree && p.tree) {
|
|
||||||
p.tree.push({
|
|
||||||
id: item.id,
|
|
||||||
parent:
|
|
||||||
arg.tree_root_id === parent_item.id ? "root" : parent_item.id,
|
|
||||||
text: item.name,
|
|
||||||
data: meta,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const mprops = mcomp.get("component")?.get("props")?.toJSON() as Record<
|
|
||||||
string,
|
|
||||||
FNCompDef
|
|
||||||
>;
|
|
||||||
const propvis = {};
|
|
||||||
if (mprops) {
|
|
||||||
const mitem_comp = mitem.get("component");
|
|
||||||
if (mitem_comp) {
|
|
||||||
const mitem_props = ensureMItemProps(mitem_comp, item_comp);
|
|
||||||
if (mitem_props) {
|
|
||||||
for (const [k, v] of Object.entries(mprops)) {
|
|
||||||
const mprop = ensureMProp(mitem_props, k, v);
|
|
||||||
if (mprop) {
|
|
||||||
item_comp.props[k] = mprop.toJSON() as FNCompDef;
|
|
||||||
if (meta.item.type === "item" && meta.item.component) {
|
|
||||||
meta.item.component.props[k] = item_comp.props[k];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mprop && v.meta?.type === "content-element") {
|
|
||||||
const mcontent = ensurePropContent(mprop, k);
|
|
||||||
item_comp.props[k].content = mcontent?.toJSON() as IItem;
|
|
||||||
if (meta.item.type === "item" && meta.item.component) {
|
|
||||||
meta.item.component.props[k].content =
|
|
||||||
item_comp.props[k].content;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mcontent) {
|
|
||||||
syncWalkMap(p, {
|
|
||||||
is_layout: arg.is_layout,
|
|
||||||
tree_root_id: arg.tree_root_id,
|
|
||||||
mitem: mcontent,
|
|
||||||
jsx_prop_name: k,
|
|
||||||
jsx_prop_root: true,
|
|
||||||
parent_mcomp: { minstance, meta, mcomp },
|
|
||||||
parent_item: { id: item.id, mitem: mitem as MItem },
|
|
||||||
portal: arg.portal,
|
|
||||||
skip_add_tree: skip_tree_child,
|
|
||||||
each: arg.each,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const childs = mcomp.get("childs")?.map((e) => e) || [];
|
|
||||||
|
|
||||||
for (const e of childs) {
|
|
||||||
syncWalkMap(p, {
|
|
||||||
is_layout: arg.is_layout,
|
|
||||||
tree_root_id: arg.tree_root_id,
|
|
||||||
mitem: e,
|
|
||||||
parent_item: { id: item.id, mitem: mitem as MItem },
|
|
||||||
parent_mcomp: { minstance, meta, mcomp },
|
|
||||||
skip_add_tree: true,
|
|
||||||
portal: arg.portal,
|
|
||||||
each: arg.each,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
metaNotFound();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const meta: IMeta = {
|
|
||||||
is_layout: arg.is_layout,
|
|
||||||
item,
|
|
||||||
jsx_prop_name: arg.jsx_prop_name,
|
|
||||||
jsx_prop_root: arg.jsx_prop_root,
|
|
||||||
mitem: mitem as MItem,
|
|
||||||
parent_item,
|
|
||||||
parent_mcomp: arg.parent_mcomp,
|
|
||||||
indexed_scope: {},
|
|
||||||
};
|
|
||||||
|
|
||||||
if (item.name.startsWith("⬅")) {
|
|
||||||
arg.portal.in[item.name] = meta;
|
|
||||||
}
|
|
||||||
if (item.name.startsWith("⮕")) {
|
|
||||||
arg.portal.out[item.name] = meta;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arg.each) arg.each(meta);
|
|
||||||
p.meta[item.id] = meta;
|
|
||||||
|
|
||||||
if (!skip_tree && p.tree) {
|
|
||||||
p.tree.push({
|
|
||||||
id: item.id,
|
|
||||||
parent: arg.tree_root_id === parent_item.id ? "root" : parent_item.id,
|
|
||||||
text: item.name,
|
|
||||||
data: meta,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const childs = mitem.get("childs")?.map((e) => e) || [];
|
|
||||||
|
|
||||||
for (const e of childs) {
|
|
||||||
syncWalkMap(p, {
|
|
||||||
is_layout: arg.is_layout,
|
|
||||||
tree_root_id: arg.tree_root_id,
|
|
||||||
mitem: e,
|
|
||||||
jsx_prop_name: arg.jsx_prop_name,
|
|
||||||
parent_item: { id: item.id, mitem: mitem as MItem },
|
|
||||||
parent_mcomp: arg.parent_mcomp,
|
|
||||||
portal: arg.portal,
|
|
||||||
skip_add_tree: skip_tree_child,
|
|
||||||
each: arg.each,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const loadcomp = {
|
|
||||||
timeout: 0 as any,
|
|
||||||
pending: new Set<string>(),
|
|
||||||
};
|
|
||||||
|
|
||||||
export const loadComponent = async (p: PG, id_comp: string) => {
|
|
||||||
return new Promise<boolean>((resolve) => {
|
|
||||||
if (p.comp.list[id_comp]) {
|
|
||||||
resolve(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
loadcomp.pending.add(id_comp);
|
|
||||||
clearTimeout(loadcomp.timeout);
|
|
||||||
loadcomp.timeout = setTimeout(async () => {
|
|
||||||
const comps = await p.sync.comp.load([...loadcomp.pending]);
|
|
||||||
let result = Object.entries(comps);
|
|
||||||
|
|
||||||
for (const [id_comp, comp] of result) {
|
|
||||||
for (const cur of Object.values(comp)) {
|
|
||||||
if (cur && cur.snapshot) {
|
|
||||||
await loadCompSnapshot(p, id_comp, cur.snapshot, cur.scope);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
loadcomp.pending.clear();
|
|
||||||
resolve(result.length > 0);
|
|
||||||
}, 150);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const mapItem = (
|
|
||||||
mitem: MContent,
|
|
||||||
item: any,
|
|
||||||
ref_ids?: Record<string, string>
|
|
||||||
) => {
|
|
||||||
mitem.forEach((e, k) => {
|
|
||||||
if (k !== "childs") {
|
|
||||||
let val = e;
|
|
||||||
if (typeof e === "object" && e) {
|
|
||||||
if ((e as any).toJSON) {
|
|
||||||
val = e.toJSON() as any;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (k !== "originalId") item[k] = val;
|
|
||||||
} else {
|
|
||||||
item[k] = [];
|
|
||||||
const childs = e as unknown as TypedArray<{}>;
|
|
||||||
childs.forEach((c) => {
|
|
||||||
if (typeof c.get === "function") {
|
|
||||||
if (ref_ids) {
|
|
||||||
const id = ref_ids[c.get("id")];
|
|
||||||
if (id) {
|
|
||||||
item[k].push({ id });
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
item[k].push({ id: c.get("id") });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
@ -7,7 +7,6 @@ import { ISection, MSection } from "../../../../../utils/types/section";
|
||||||
import { EDGlobal, active } from "../../../logic/ed-global";
|
import { EDGlobal, active } from "../../../logic/ed-global";
|
||||||
import { getMetaById } from "../../../logic/tree/build";
|
import { getMetaById } from "../../../logic/tree/build";
|
||||||
import { fillID } from "../../../logic/tree/fill-id";
|
import { fillID } from "../../../logic/tree/fill-id";
|
||||||
import { loadComponent } from "../../../logic/tree/sync-walk";
|
|
||||||
import { TopBtn } from "../top-btn";
|
import { TopBtn } from "../top-btn";
|
||||||
|
|
||||||
export const EdCompPicker = () => {
|
export const EdCompPicker = () => {
|
||||||
|
|
@ -19,7 +18,7 @@ export const EdCompPicker = () => {
|
||||||
p.ui.popup.comp.open = async (comp_id) => {
|
p.ui.popup.comp.open = async (comp_id) => {
|
||||||
let comp_ref = p.comp.list[comp_id];
|
let comp_ref = p.comp.list[comp_id];
|
||||||
if (!comp_ref) {
|
if (!comp_ref) {
|
||||||
await loadComponent(p, comp_id);
|
// await loadComponent(p, comp_id);
|
||||||
comp_ref = p.comp.list[comp_id];
|
comp_ref = p.comp.list[comp_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import { produceCSS } from "../../../../../utils/css/gen";
|
||||||
import { IItem } from "../../../../../utils/types/item";
|
import { IItem } from "../../../../../utils/types/item";
|
||||||
import { IText } from "../../../../../utils/types/text";
|
import { IText } from "../../../../../utils/types/text";
|
||||||
import { EDGlobal, PG, active } from "../../../logic/ed-global";
|
import { EDGlobal, PG, active } from "../../../logic/ed-global";
|
||||||
import { loadComponent } from "../../../logic/tree/sync-walk";
|
// import { loadComponent } from "../../../logic/tree/sync-walk";
|
||||||
import { EdCompPreviewTree } from "./comp-preview-tree";
|
import { EdCompPreviewTree } from "./comp-preview-tree";
|
||||||
import { compPicker, reloadCompPicker } from "./comp-reload";
|
import { compPicker, reloadCompPicker } from "./comp-reload";
|
||||||
|
|
||||||
|
|
@ -19,9 +19,9 @@ export const EdCompPreview = () => {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!p.comp.list[comp_id] && !!comp_id) {
|
if (!p.comp.list[comp_id] && !!comp_id) {
|
||||||
loadComponent(p, comp_id).then(() => {
|
// loadComponent(p, comp_id).then(() => {
|
||||||
p.render();
|
// p.render();
|
||||||
});
|
// });
|
||||||
}
|
}
|
||||||
}, [comp_id]);
|
}, [comp_id]);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue