This commit is contained in:
Rizky 2023-12-13 03:06:04 +07:00
parent b3f76211c8
commit 3e7e060964
10 changed files with 81 additions and 78 deletions

View File

@ -16,6 +16,8 @@ import { EdPopPage } from "./panel/popup/page/page-popup";
import { EdPopScript } from "./panel/popup/script/pop-script";
import { EdPopSite } from "./panel/popup/site/site-popup";
import { EdMain } from "./panel/main/main";
import { ViGlobal } from "../vi/render/global";
import { viLoad } from "../vi/load/load";
export const EdBase = () => {
const p = useGlobal(EDGlobal, "EDITOR");

View File

@ -1,9 +1,11 @@
import { useGlobal } from "web-utils";
import { Vi } from "../../../vi/vi";
import { EDGlobal } from "../../logic/ed-global";
import { ViGlobal } from "../../../vi/render/global";
export const EdMain = () => {
const p = useGlobal(EDGlobal, "EDITOR");
return (
<Vi
meta={p.page.meta}

View File

@ -1,4 +1,3 @@
import { createAPI } from "../../../utils/script/init-api";
import { VG } from "../render/global";
import { viLoadLegacy } from "./load-legacy";

View File

@ -1,15 +1,10 @@
import { instantiate } from "./comp/instantiate";
import { walkProp } from "./comp/walk-prop";
import { genMeta } from "./meta";
import { applyRefIds } from "./ref-ids";
import { simplifyItemChild } from "./simplify";
import { GenMetaArg, GenMetaP, IMeta } from "./types";
export const genComp = (
p: GenMetaP,
arg: GenMetaArg,
r: ReturnType<typeof applyRefIds>
) => {
export const genComp = (p: GenMetaP, arg: GenMetaArg) => {
const { item } = arg;
if (item.type === "item" && item.component?.id && arg.parent?.item.id) {
let pcomp = p.comps[item.component.id];
@ -22,34 +17,46 @@ export const genComp = (
}
if (pcomp) {
const ref_ids = r?.ref_ids || item.component?.ref_ids || {};
let smeta_instances: IMeta["instances"] = undefined;
if (p.smeta && p.smeta[item.id]) {
const smeta = p.smeta[item.id];
if (smeta && smeta.comp) {
smeta_instances = smeta.comp.instances;
}
}
instantiate(item, pcomp.comp, ref_ids);
let instance = {};
let instances: IMeta["instances"] = undefined;
if (!smeta_instances) {
const parent_instance = getParentInstance(p, arg, item.id);
instance = parent_instance || {};
instances = !parent_instance ? { [item.id]: instance } : undefined;
} else {
instance = smeta_instances[item.id];
instances = smeta_instances;
}
instantiate({
item,
comp: pcomp.comp,
ids: instance,
});
const meta: IMeta = {
item: simplifyItemChild(item),
parent: {
id: arg.parent.item.id,
instance_id: arg.parent?.instance?.id,
comp_id: arg.parent?.comp?.id,
},
scope: {
def: {
props: {},
},
},
instances,
scope: {},
};
walkProp({
item,
pcomp,
each(name, prop) {
if (meta.scope.def?.props) {
meta.scope.def.props[name] = {
value: prop.valueBuilt,
visible: false,
};
}
const comp_id = item.component?.id;
if (
prop.meta?.type === "content-element" &&
@ -67,7 +74,6 @@ export const genComp = (
parent: {
item,
comp: pcomp.comp,
instance: arg.parent?.instance || item,
},
});
}
@ -92,17 +98,30 @@ export const genComp = (
p.on.visit(meta);
}
for (const [k, v] of Object.entries(item.childs)) {
for (const child of Object.values(item.childs)) {
genMeta(p, {
item: v,
item: child,
is_root: false,
parent: {
item,
instance_id: item.id,
comp: pcomp.comp,
instance: arg.parent?.instance || item,
},
});
}
}
}
};
const getParentInstance = (p: GenMetaP, arg: GenMetaArg, id: string) => {
if (arg.parent?.instance_id && p.meta[arg.parent?.instance_id]) {
const parent_instance = p.meta[arg.parent?.instance_id];
if (parent_instance.instances) {
if (!parent_instance.instances[id]) {
parent_instance.instances[id] = {};
}
return parent_instance.instances[id];
}
}
};

View File

@ -1,15 +1,17 @@
import { createId } from "@paralleldrive/cuid2";
import { deepClone } from "web-utils";
import { IItem } from "../../../../../utils/types/item";
import { createId } from "@paralleldrive/cuid2";
import { FNComponent } from "../../../../../utils/types/meta-fn";
export const instantiate = (
item: IItem,
comp: IItem,
ref_ids: Record<string, string>
) => {
const newitem = structuredClone(comp);
if (newitem.component) {
newitem.component.ref_ids = {};
}
export const instantiate = (arg: {
item: IItem;
comp: IItem;
ids: Record<string, string>;
}) => {
const { item, comp, ids } = arg;
const newitem = deepClone(comp);
walkChild(newitem, ids);
if (item.id) {
newitem.id = item.id;
@ -19,8 +21,6 @@ export const instantiate = (
newitem.component = item.component;
}
walkChild(newitem, ref_ids);
for (const key of Object.keys(item)) {
delete (item as any)[key];
}
@ -30,16 +30,19 @@ export const instantiate = (
}
};
const walkChild = (item: IItem, ref_ids: Record<string, string>) => {
if (!ref_ids[item.id]) {
ref_ids[item.id] = createId();
const walkChild = (
item: IItem,
ids: Exclude<FNComponent["ref_ids"], undefined>
) => {
if (!ids[item.id]) {
ids[item.id] = createId();
}
item.id = ref_ids[item.id];
item.id = ids[item.id];
if (item.childs) {
for (const child of item.childs) {
walkChild(child as IItem, ref_ids);
walkChild(child as IItem, ids);
}
}
};

View File

@ -1,6 +1,5 @@
import { IItem } from "../../../../utils/types/item";
import { genComp } from "./comp";
import { applyRefIds } from "./ref-ids";
import { simplifyItemChild } from "./simplify";
import { GenMetaArg, GenMetaP, IMeta } from "./types";
@ -10,12 +9,10 @@ export const genMeta = (p: GenMetaP, arg: GenMetaArg) => {
};
wrapper(() => {
const { parent } = arg;
const item = arg.item as IItem;
const r = applyRefIds(item, parent);
if (item.type === "item" && item.component?.id) {
genComp(p, arg, r);
genComp(p, arg);
return;
}
@ -31,7 +28,7 @@ export const genMeta = (p: GenMetaP, arg: GenMetaArg) => {
jsx_prop: arg.jsx_prop,
parent: {
id: arg.parent?.item.id || "root",
instance_id: arg.parent?.instance?.id,
instance_id: arg.parent?.instance_id,
comp_id: arg.parent?.comp?.id,
},
scope,
@ -61,8 +58,8 @@ export const genMeta = (p: GenMetaP, arg: GenMetaArg) => {
is_root: false,
parent: {
item,
instance_id: arg.parent?.instance_id,
comp: arg.parent?.comp,
instance: arg.parent?.instance,
},
});
}

View File

@ -1,24 +0,0 @@
import { createId } from "@paralleldrive/cuid2";
import { IContent, MContent } from "../../../../utils/types/general";
import { IItem } from "../../../../utils/types/item";
export const applyRefIds = (item: IContent, parent?: { instance?: IItem }) => {
const instance = parent?.instance;
if (instance && instance.component) {
const ref_ids = instance.component.ref_ids;
if (ref_ids) {
if (!ref_ids[item.id]) {
ref_ids[item.id] = createId();
}
if (ref_ids[item.id]) {
if (!item.originalId) item.originalId = item.id;
item.id = ref_ids[item.id];
}
}
return { ref_ids };
}
};

View File

@ -32,9 +32,13 @@ export const simplifyMeta = (allmeta: Record<string, IMeta>) => {
instance_id: meta.parent.instance_id,
}
: undefined,
comp: meta.item.component?.id
? { id: meta.item.component.id, ref_ids: meta.item.component.ref_ids }
: undefined,
comp:
meta.item.component && meta.instances
? {
id: meta.item.component.id,
instances: meta.instances,
}
: undefined,
scope: meta.scope.def,
};
}

View File

@ -24,8 +24,8 @@ export type GenMetaArg = {
jsx_prop?: IMeta["jsx_prop"];
parent?: {
item: IItem;
instance_id?: string;
comp?: IItem;
instance?: IItem;
};
};
@ -33,7 +33,7 @@ export type ISimpleMeta = {
id: string;
comp?: {
id: string;
ref_ids: Record<string, string>;
instances: Record<string, Record<string, string>>;
};
parent?: {
id: string;
@ -51,6 +51,7 @@ export type IMeta = {
instance_id?: string;
comp_id?: string;
};
instances?: Record<string, Record<string, string>>;
jsx_prop?: {
name: string;
comp_id: string;

View File

@ -24,7 +24,7 @@ export type FNComponent = {
name: string;
updated_at?: number;
props: Record<string, FNCompDef>;
ref_ids: Record<string, string>;
ref_ids?: Record<string, string>;
};
export type FNCompDef = {