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 { EdPopScript } from "./panel/popup/script/pop-script";
import { EdPopSite } from "./panel/popup/site/site-popup"; import { EdPopSite } from "./panel/popup/site/site-popup";
import { EdMain } from "./panel/main/main"; import { EdMain } from "./panel/main/main";
import { ViGlobal } from "../vi/render/global";
import { viLoad } from "../vi/load/load";
export const EdBase = () => { export const EdBase = () => {
const p = useGlobal(EDGlobal, "EDITOR"); const p = useGlobal(EDGlobal, "EDITOR");

View File

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

View File

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

View File

@ -1,15 +1,10 @@
import { instantiate } from "./comp/instantiate"; import { instantiate } from "./comp/instantiate";
import { walkProp } from "./comp/walk-prop"; import { walkProp } from "./comp/walk-prop";
import { genMeta } from "./meta"; import { genMeta } from "./meta";
import { applyRefIds } from "./ref-ids";
import { simplifyItemChild } from "./simplify"; import { simplifyItemChild } from "./simplify";
import { GenMetaArg, GenMetaP, IMeta } from "./types"; import { GenMetaArg, GenMetaP, IMeta } from "./types";
export const genComp = ( export const genComp = (p: GenMetaP, arg: GenMetaArg) => {
p: GenMetaP,
arg: GenMetaArg,
r: ReturnType<typeof applyRefIds>
) => {
const { item } = arg; const { item } = arg;
if (item.type === "item" && item.component?.id && arg.parent?.item.id) { if (item.type === "item" && item.component?.id && arg.parent?.item.id) {
let pcomp = p.comps[item.component.id]; let pcomp = p.comps[item.component.id];
@ -22,34 +17,46 @@ export const genComp = (
} }
if (pcomp) { 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 = { const meta: IMeta = {
item: simplifyItemChild(item), item: simplifyItemChild(item),
parent: { parent: {
id: arg.parent.item.id, id: arg.parent.item.id,
instance_id: arg.parent?.instance?.id,
comp_id: arg.parent?.comp?.id, comp_id: arg.parent?.comp?.id,
}, },
scope: { instances,
def: { scope: {},
props: {},
},
},
}; };
walkProp({ walkProp({
item, item,
pcomp, pcomp,
each(name, prop) { each(name, prop) {
if (meta.scope.def?.props) {
meta.scope.def.props[name] = {
value: prop.valueBuilt,
visible: false,
};
}
const comp_id = item.component?.id; const comp_id = item.component?.id;
if ( if (
prop.meta?.type === "content-element" && prop.meta?.type === "content-element" &&
@ -67,7 +74,6 @@ export const genComp = (
parent: { parent: {
item, item,
comp: pcomp.comp, comp: pcomp.comp,
instance: arg.parent?.instance || item,
}, },
}); });
} }
@ -92,17 +98,30 @@ export const genComp = (
p.on.visit(meta); p.on.visit(meta);
} }
for (const [k, v] of Object.entries(item.childs)) { for (const child of Object.values(item.childs)) {
genMeta(p, { genMeta(p, {
item: v, item: child,
is_root: false, is_root: false,
parent: { parent: {
item, item,
instance_id: item.id,
comp: pcomp.comp, 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 { IItem } from "../../../../../utils/types/item";
import { createId } from "@paralleldrive/cuid2";
import { FNComponent } from "../../../../../utils/types/meta-fn";
export const instantiate = ( export const instantiate = (arg: {
item: IItem, item: IItem;
comp: IItem, comp: IItem;
ref_ids: Record<string, string> ids: Record<string, string>;
) => { }) => {
const newitem = structuredClone(comp); const { item, comp, ids } = arg;
if (newitem.component) { const newitem = deepClone(comp);
newitem.component.ref_ids = {};
} walkChild(newitem, ids);
if (item.id) { if (item.id) {
newitem.id = item.id; newitem.id = item.id;
@ -19,8 +21,6 @@ export const instantiate = (
newitem.component = item.component; newitem.component = item.component;
} }
walkChild(newitem, ref_ids);
for (const key of Object.keys(item)) { for (const key of Object.keys(item)) {
delete (item as any)[key]; delete (item as any)[key];
} }
@ -30,16 +30,19 @@ export const instantiate = (
} }
}; };
const walkChild = (item: IItem, ref_ids: Record<string, string>) => { const walkChild = (
if (!ref_ids[item.id]) { item: IItem,
ref_ids[item.id] = createId(); 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) { if (item.childs) {
for (const child of 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 { IItem } from "../../../../utils/types/item";
import { genComp } from "./comp"; import { genComp } from "./comp";
import { applyRefIds } from "./ref-ids";
import { simplifyItemChild } from "./simplify"; import { simplifyItemChild } from "./simplify";
import { GenMetaArg, GenMetaP, IMeta } from "./types"; import { GenMetaArg, GenMetaP, IMeta } from "./types";
@ -10,12 +9,10 @@ export const genMeta = (p: GenMetaP, arg: GenMetaArg) => {
}; };
wrapper(() => { wrapper(() => {
const { parent } = arg;
const item = arg.item as IItem; const item = arg.item as IItem;
const r = applyRefIds(item, parent);
if (item.type === "item" && item.component?.id) { if (item.type === "item" && item.component?.id) {
genComp(p, arg, r); genComp(p, arg);
return; return;
} }
@ -31,7 +28,7 @@ export const genMeta = (p: GenMetaP, arg: GenMetaArg) => {
jsx_prop: arg.jsx_prop, jsx_prop: arg.jsx_prop,
parent: { parent: {
id: arg.parent?.item.id || "root", id: arg.parent?.item.id || "root",
instance_id: arg.parent?.instance?.id, instance_id: arg.parent?.instance_id,
comp_id: arg.parent?.comp?.id, comp_id: arg.parent?.comp?.id,
}, },
scope, scope,
@ -61,8 +58,8 @@ export const genMeta = (p: GenMetaP, arg: GenMetaArg) => {
is_root: false, is_root: false,
parent: { parent: {
item, item,
instance_id: arg.parent?.instance_id,
comp: arg.parent?.comp, 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,8 +32,12 @@ export const simplifyMeta = (allmeta: Record<string, IMeta>) => {
instance_id: meta.parent.instance_id, instance_id: meta.parent.instance_id,
} }
: undefined, : undefined,
comp: meta.item.component?.id comp:
? { id: meta.item.component.id, ref_ids: meta.item.component.ref_ids } meta.item.component && meta.instances
? {
id: meta.item.component.id,
instances: meta.instances,
}
: undefined, : undefined,
scope: meta.scope.def, scope: meta.scope.def,
}; };

View File

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

View File

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