From 3e7e060964c8920edca36e726e507ad7ed1b9eb8 Mon Sep 17 00:00:00 2001 From: Rizky Date: Wed, 13 Dec 2023 03:06:04 +0700 Subject: [PATCH] wip fix --- app/web/src/nova/ed/ed-base.tsx | 2 + app/web/src/nova/ed/panel/main/main.tsx | 2 + app/web/src/nova/vi/load/load.tsx | 1 - app/web/src/nova/view/logic/meta/comp.tsx | 67 ++++++++++++------- .../nova/view/logic/meta/comp/instantiate.tsx | 37 +++++----- app/web/src/nova/view/logic/meta/meta.tsx | 9 +-- app/web/src/nova/view/logic/meta/ref-ids.tsx | 24 ------- app/web/src/nova/view/logic/meta/simplify.tsx | 10 ++- app/web/src/nova/view/logic/meta/types.ts | 5 +- app/web/src/utils/types/meta-fn.ts | 2 +- 10 files changed, 81 insertions(+), 78 deletions(-) delete mode 100644 app/web/src/nova/view/logic/meta/ref-ids.tsx diff --git a/app/web/src/nova/ed/ed-base.tsx b/app/web/src/nova/ed/ed-base.tsx index 92e1a05d..2dc50a9b 100644 --- a/app/web/src/nova/ed/ed-base.tsx +++ b/app/web/src/nova/ed/ed-base.tsx @@ -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"); diff --git a/app/web/src/nova/ed/panel/main/main.tsx b/app/web/src/nova/ed/panel/main/main.tsx index 3bdffe28..9382b4ea 100644 --- a/app/web/src/nova/ed/panel/main/main.tsx +++ b/app/web/src/nova/ed/panel/main/main.tsx @@ -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 ( -) => { +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]; + } + } +}; diff --git a/app/web/src/nova/view/logic/meta/comp/instantiate.tsx b/app/web/src/nova/view/logic/meta/comp/instantiate.tsx index 13844863..8a098e0c 100644 --- a/app/web/src/nova/view/logic/meta/comp/instantiate.tsx +++ b/app/web/src/nova/view/logic/meta/comp/instantiate.tsx @@ -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 -) => { - const newitem = structuredClone(comp); - if (newitem.component) { - newitem.component.ref_ids = {}; - } +export const instantiate = (arg: { + item: IItem; + comp: IItem; + ids: Record; +}) => { + 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) => { - if (!ref_ids[item.id]) { - ref_ids[item.id] = createId(); +const walkChild = ( + item: IItem, + ids: Exclude +) => { + 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); } } }; diff --git a/app/web/src/nova/view/logic/meta/meta.tsx b/app/web/src/nova/view/logic/meta/meta.tsx index 0d084dff..3ba07660 100644 --- a/app/web/src/nova/view/logic/meta/meta.tsx +++ b/app/web/src/nova/view/logic/meta/meta.tsx @@ -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, }, }); } diff --git a/app/web/src/nova/view/logic/meta/ref-ids.tsx b/app/web/src/nova/view/logic/meta/ref-ids.tsx deleted file mode 100644 index f5900c56..00000000 --- a/app/web/src/nova/view/logic/meta/ref-ids.tsx +++ /dev/null @@ -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 }; - } -}; diff --git a/app/web/src/nova/view/logic/meta/simplify.tsx b/app/web/src/nova/view/logic/meta/simplify.tsx index 27ec2378..5eb3bc2f 100644 --- a/app/web/src/nova/view/logic/meta/simplify.tsx +++ b/app/web/src/nova/view/logic/meta/simplify.tsx @@ -32,9 +32,13 @@ export const simplifyMeta = (allmeta: Record) => { 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, }; } diff --git a/app/web/src/nova/view/logic/meta/types.ts b/app/web/src/nova/view/logic/meta/types.ts index 42a9be71..380bab1a 100644 --- a/app/web/src/nova/view/logic/meta/types.ts +++ b/app/web/src/nova/view/logic/meta/types.ts @@ -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; + instances: Record>; }; parent?: { id: string; @@ -51,6 +51,7 @@ export type IMeta = { instance_id?: string; comp_id?: string; }; + instances?: Record>; jsx_prop?: { name: string; comp_id: string; diff --git a/app/web/src/utils/types/meta-fn.ts b/app/web/src/utils/types/meta-fn.ts index b03ccb4d..9128691a 100644 --- a/app/web/src/utils/types/meta-fn.ts +++ b/app/web/src/utils/types/meta-fn.ts @@ -24,7 +24,7 @@ export type FNComponent = { name: string; updated_at?: number; props: Record; - ref_ids: Record; + ref_ids?: Record; }; export type FNCompDef = {