From 57044a6a0890bd23cc46d77ca37f18ac0476b797 Mon Sep 17 00:00:00 2001 From: Rizky Date: Tue, 26 Dec 2023 23:42:30 +0700 Subject: [PATCH] wip checkpoint --- app/srv/ws/sync/actions/page_load.ts | 24 ++++++-- app/web/package.json | 4 +- .../src/nova/ed/logic/tree/assign-mitem.ts | 54 ++++++++++++++++++ app/web/src/nova/ed/logic/tree/build.tsx | 45 +-------------- .../src/nova/ed/panel/tree/node/item/name.tsx | 2 +- app/web/src/nova/vi/meta/comp.tsx | 19 +++--- .../src/nova/vi/meta/comp/init-comp-load.tsx | 11 ++-- app/web/src/nova/vi/meta/comp/instantiate.tsx | 3 +- .../src/nova/vi/render/script/eval-script.tsx | 3 +- app/web/src/nova/vi/utils/types.ts | 2 +- app/web/src/utils/types/meta-fn.ts | 3 +- bun.lockb | Bin 266976 -> 267296 bytes 12 files changed, 102 insertions(+), 68 deletions(-) create mode 100644 app/web/src/nova/ed/logic/tree/assign-mitem.ts diff --git a/app/srv/ws/sync/actions/page_load.ts b/app/srv/ws/sync/actions/page_load.ts index 167552cb..cfd2afc4 100644 --- a/app/srv/ws/sync/actions/page_load.ts +++ b/app/srv/ws/sync/actions/page_load.ts @@ -1,4 +1,5 @@ import { EPage } from "../../../../web/src/nova/ed/logic/ed-global"; +import { assignMitem } from "../../../../web/src/nova/ed/logic/tree/assign-mitem"; import { initLoadComp } from "../../../../web/src/nova/vi/meta/comp/init-comp-load"; import { genMeta } from "../../../../web/src/nova/vi/meta/meta"; import { simplifyMeta } from "../../../../web/src/nova/vi/meta/simplify"; @@ -239,6 +240,10 @@ const scanMeta = async (doc: DPage, sync: SyncConnection) => { ); } + const transact = { + instances_check: {} as Record, + }; + for (const mitem of childs) { const item = mitem.toJSON() as IItem; entry.push(item.id); @@ -247,10 +252,21 @@ const scanMeta = async (doc: DPage, sync: SyncConnection) => { comps: mcomps, meta, on: { - visit(meta) { - if (!meta.parent?.comp_id) { - if (typeof meta.item.adv?.js === "string") { - meta.scope.def = parseJs(meta.item.adv?.js); + visit_component(item) { + if (!item.component?.instances) { + transact.instances_check[item.id] = true; + } + }, + visit(m) { + if (!m.parent?.comp_id) { + if (typeof m.item.adv?.js === "string") { + m.scope.def = parseJs(m.item.adv?.js); + } + } + + if (m.item.component?.id) { + if (transact.instances_check[m.item.id]) { + transact.instances_check[m.item.id] = m; } } }, diff --git a/app/web/package.json b/app/web/package.json index 0009ebc2..473868b8 100644 --- a/app/web/package.json +++ b/app/web/package.json @@ -19,7 +19,7 @@ "@qiwi/deep-proxy": "^2.0.3", "algoliasearch": "^4.22.0", "date-fns": "^2.30.0", - "fast-safe-stringify": "^2.1.1", + "safe-flat": "^2.1.0", "dbgen": "workspace:*", "downshift": "^8.2.3", "esbuild-wasm": "^0.19.10", @@ -105,4 +105,4 @@ "staticFiles": { "staticPath": "public" } -} +} \ No newline at end of file diff --git a/app/web/src/nova/ed/logic/tree/assign-mitem.ts b/app/web/src/nova/ed/logic/tree/assign-mitem.ts new file mode 100644 index 00000000..b8166435 --- /dev/null +++ b/app/web/src/nova/ed/logic/tree/assign-mitem.ts @@ -0,0 +1,54 @@ +import { IItem, MItem } from "../../../../utils/types/item"; +import { IMeta } from "../ed-global"; + +export const assignMitem = (arg: { + m: IMeta; + item: IItem; + mitem: MItem; + meta: Record; +}) => { + const { m, item, mitem, meta } = arg; + if (m.parent) { + if (m.parent.id === "root") { + if (m.item.id === item.id) { + m.mitem = mitem; + } + } else { + const parent = meta[m.parent.id]; + if (parent.mitem) { + parent.mitem.get("childs")?.forEach((child) => { + if (child.get("id") === m.item.id) { + m.mitem = child; + + if (m.item.component?.props) { + for (const [prop_name, v] of Object.entries( + m.item.component.props + )) { + const mprop = m.mitem + ?.get("component") + ?.get("props") + ?.get(prop_name); + if (v.content && mprop) { + const pmeta = meta[v.content.id]; + if (pmeta) { + pmeta.mitem = mprop.get("content"); + } + } + } + } + } + }); + } + } + } + + if (m.jsx_prop && m.parent?.instance_id) { + const parent = meta[m.parent?.instance_id]; + if (parent) { + const prop = parent.item.component?.props[m.jsx_prop.name]; + if (prop) { + prop.content = m.item; + } + } + } +}; diff --git a/app/web/src/nova/ed/logic/tree/build.tsx b/app/web/src/nova/ed/logic/tree/build.tsx index 3f66ddfa..09c52334 100644 --- a/app/web/src/nova/ed/logic/tree/build.tsx +++ b/app/web/src/nova/ed/logic/tree/build.tsx @@ -2,6 +2,7 @@ import { IItem, MItem } from "../../../../utils/types/item"; import { FMCompDef, FNCompDef } from "../../../../utils/types/meta-fn"; import { genMeta } from "../../../vi/meta/meta"; import { IMeta, PG, active } from "../ed-global"; +import { assignMitem } from "./assign-mitem"; import { pushTreeNode } from "./build/push-tree"; export const treeRebuild = async (p: PG, arg?: { note?: string }) => { @@ -45,49 +46,7 @@ export const treeRebuild = async (p: PG, arg?: { note?: string }) => { if (!is_layout) { pushTreeNode(p, m, meta, p.page.tree); - if (m.parent) { - if (m.parent.id === "root") { - if (m.item.id === item.id) { - m.mitem = mitem; - } - } else { - const parent = meta[m.parent.id]; - if (parent.mitem) { - parent.mitem.get("childs")?.forEach((child) => { - if (child.get("id") === m.item.id) { - m.mitem = child; - - if (m.item.component?.props) { - for (const [prop_name, v] of Object.entries( - m.item.component.props - )) { - const mprop = m.mitem - ?.get("component") - ?.get("props") - ?.get(prop_name); - if (v.content && mprop) { - const pmeta = meta[v.content.id]; - if (pmeta) { - pmeta.mitem = mprop.get("content"); - } - } - } - } - } - }); - } - } - } - - if (m.jsx_prop && m.parent?.instance_id) { - const parent = meta[m.parent?.instance_id]; - if (parent) { - const prop = parent.item.component?.props[m.jsx_prop.name]; - if (prop) { - prop.content = m.item; - } - } - } + assignMitem({ m, item, mitem, meta }); } }, }, diff --git a/app/web/src/nova/ed/panel/tree/node/item/name.tsx b/app/web/src/nova/ed/panel/tree/node/item/name.tsx index 1f1972a6..f50a5b97 100644 --- a/app/web/src/nova/ed/panel/tree/node/item/name.tsx +++ b/app/web/src/nova/ed/panel/tree/node/item/name.tsx @@ -98,7 +98,7 @@ export const EdTreeName = ({ ) : (
- {/*
{node.id} - {item.originalId}
*/} +
{node.id} - {item.originalId}
)} diff --git a/app/web/src/nova/vi/meta/comp.tsx b/app/web/src/nova/vi/meta/comp.tsx index 415d8c41..28a49e09 100644 --- a/app/web/src/nova/vi/meta/comp.tsx +++ b/app/web/src/nova/vi/meta/comp.tsx @@ -1,6 +1,6 @@ import { deepClone } from "web-utils"; import { GenMetaArg, GenMetaP, IMeta, ISimpleMeta } from "../utils/types"; -import { instantiate, walkChild } from "./comp/instantiate"; +import { instantiate } from "./comp/instantiate"; import { walkProp } from "./comp/walk-prop"; import { genMeta } from "./meta"; import { simplifyItemChild } from "./simplify"; @@ -10,7 +10,7 @@ export const genComp = (p: GenMetaP, arg: GenMetaArg) => { if (item.type === "item" && item.component?.id && arg.parent?.item.id) { let pcomp = p.comps[item.component.id]; if (p.on?.visit_component) { - p.on.visit_component(item.component.id); + p.on.visit_component(item); } if (!pcomp) { @@ -21,10 +21,15 @@ export const genComp = (p: GenMetaP, arg: GenMetaArg) => { let instance = {}; let instances: IMeta["instances"] = undefined; - const parent_instance = getParentInstance(p, arg, item.id); - - instance = parent_instance || {}; - instances = !parent_instance ? { [item.id]: instance } : undefined; + if (item.component.instances) { + instances = item.component.instances; + instance = instances[item.id] || {}; + instances[item.id] = instance; + } else { + const parent_instance = getParentInstance(p, arg, item.id); + instance = parent_instance || {}; + instances = !parent_instance ? { [item.id]: instance } : undefined; + } instantiate({ item, @@ -72,8 +77,6 @@ export const genComp = (p: GenMetaP, arg: GenMetaArg) => { if (prop.meta?.type === "content-element" && comp_id) { if (prop.content) { - walkChild(prop.content, instance); - genMeta( { ...p, smeta }, { diff --git a/app/web/src/nova/vi/meta/comp/init-comp-load.tsx b/app/web/src/nova/vi/meta/comp/init-comp-load.tsx index 3202a900..f7f62a79 100644 --- a/app/web/src/nova/vi/meta/comp/init-comp-load.tsx +++ b/app/web/src/nova/vi/meta/comp/init-comp-load.tsx @@ -13,10 +13,13 @@ export const initLoadComp = async ( { ...p, on: { - visit_component: (id) => { - if (!p.comps[id]) { - if (!_loaded || (_loaded && !_loaded.has(id))) { - comp_ids.add(id); + visit_component: ({ component }) => { + if (component) { + const { id } = component; + if (!p.comps[id]) { + if (!_loaded || (_loaded && !_loaded.has(id))) { + comp_ids.add(id); + } } } }, diff --git a/app/web/src/nova/vi/meta/comp/instantiate.tsx b/app/web/src/nova/vi/meta/comp/instantiate.tsx index 6093827d..2bc3bf11 100644 --- a/app/web/src/nova/vi/meta/comp/instantiate.tsx +++ b/app/web/src/nova/vi/meta/comp/instantiate.tsx @@ -22,7 +22,7 @@ export const instantiate = (arg: { if (item.component.props[k]) { newitem.component.props[k] = item.component.props[k]; } - + const content = newitem.component.props[k].content; if (content) { walkChild(content, ids); @@ -37,7 +37,6 @@ export const instantiate = (arg: { for (const [k, v] of Object.entries(newitem)) { (item as any)[k] = v; } - }; export const walkChild = ( diff --git a/app/web/src/nova/vi/render/script/eval-script.tsx b/app/web/src/nova/vi/render/script/eval-script.tsx index 30b51bc1..b51de23c 100644 --- a/app/web/src/nova/vi/render/script/eval-script.tsx +++ b/app/web/src/nova/vi/render/script/eval-script.tsx @@ -8,6 +8,7 @@ import { updatePropScope } from "./eval-prop"; import { createViLocal } from "./local"; import { createViPassProp } from "./passprop"; import hash_sum from "hash-sum"; +import { flatten } from "safe-flat"; export const viEvalScript = ( vi: { @@ -22,7 +23,7 @@ export const viEvalScript = ( if (vi.visit) vi.visit(meta, parts); - const mhash = hash_sum(passprop); + const mhash = hash_sum(flatten(passprop)); if (!meta.script) meta.script = {}; if (!meta.script[mhash]) { diff --git a/app/web/src/nova/vi/utils/types.ts b/app/web/src/nova/vi/utils/types.ts index a406f9c5..c948e0cf 100644 --- a/app/web/src/nova/vi/utils/types.ts +++ b/app/web/src/nova/vi/utils/types.ts @@ -9,7 +9,7 @@ export type GenMetaP = { meta: Record; comps: Record }>; on?: { - visit_component?: (id: string) => void; + visit_component?: (item: IItem) => void; visit?: (meta: IMeta) => void; item_exists?: (arg: { old: IMeta; new: IMeta }) => void; item_new?: (arg: { new: IMeta }) => void; diff --git a/app/web/src/utils/types/meta-fn.ts b/app/web/src/utils/types/meta-fn.ts index a98eaee7..ed4f11a6 100644 --- a/app/web/src/utils/types/meta-fn.ts +++ b/app/web/src/utils/types/meta-fn.ts @@ -1,7 +1,5 @@ import { TypedMap } from "yjs-types"; import { IItem, MItem } from "./item"; -import * as Y from "yjs"; -import { YText } from "yjs/dist/src/internals"; export type FNLayout = { dir: "row" | "col" | "row-reverse" | "col-reverse"; align: FNAlign; @@ -25,6 +23,7 @@ export type FNComponent = { loaded?: boolean; props: Record; ref_ids?: Record; + instances?: Record>; }; export type FNCompDef = { diff --git a/bun.lockb b/bun.lockb index 455ac6ce325dd2b3d087976cabb8d85a439a14a5..f4335ef4b3945a717e7421b9716bc759cc11f33b 100755 GIT binary patch delta 23369 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 delta 23346 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 V9qpahc=t71X2S-vc~#@x{|6;_9Dx7;