diff --git a/Dockerfile b/Dockerfile index cbf512cc..3a6a193a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,5 @@ FROM oven/bun:1.0.18-debian as base WORKDIR /app/prasi/repo -COPY . . RUN apt-get update RUN apt-get install git curl gnupg zip unzip -yq @@ -12,6 +11,8 @@ RUN apt-get install nodejs -yq RUN npm i -g @parcel/watcher node-gyp-build-optional-packages node-gyp pnpm RUN PATH="/usr/lib/node_modules/npm/bin:$PATH" + +COPY . . RUN bun install RUN bun run build diff --git a/app/srv/ws/sync/editor/code/prep-code.ts b/app/srv/ws/sync/editor/code/prep-code.ts index a8aef910..1aa7245b 100644 --- a/app/srv/ws/sync/editor/code/prep-code.ts +++ b/app/srv/ws/sync/editor/code/prep-code.ts @@ -40,7 +40,7 @@ export const prepCodeSnapshot = async (id_site: string, mode: CodeMode) => { doc.on("update", async (e, origin) => { const bin = Y.encodeStateAsUpdate(doc); - if (snap && snap.type === "code") { + if (typeof snap !== "undefined" && snap.type === "code") { snap.build[mode].bin = bin; snapshot.update({ id: id_site, diff --git a/app/web/src/nova/ed/logic/comp/load.tsx b/app/web/src/nova/ed/logic/comp/load.tsx index 21f2e89f..0dfa003a 100644 --- a/app/web/src/nova/ed/logic/comp/load.tsx +++ b/app/web/src/nova/ed/logic/comp/load.tsx @@ -10,6 +10,7 @@ import { pushTreeNode } from "../tree/build/push-tree"; import { isTextEditing } from "../active/is-editing"; import { assignMitem } from "../tree/assign-mitem"; import { createId } from "@paralleldrive/cuid2"; +import { waitUntil } from "web-utils"; export const loadcomp = { timeout: 0 as any, @@ -45,6 +46,8 @@ export const loadCompSnapshot = async ( comp_id: string, snapshot: Uint8Array ) => { + if (p.comp.list[comp_id]) return; + const doc = new Y.Doc() as DComp; Y.applyUpdate(doc as any, decompress(snapshot)); const mitem = doc.getMap("map").get("root"); @@ -102,8 +105,6 @@ export const loadCompSnapshot = async ( if (isTextEditing()) { return; } - treeRebuild(p, { note: "load-comp" }); - p.render(); } }, }; @@ -142,7 +143,7 @@ export const updateComponentMeta = async ( let result = Object.entries(comps); for (const [id_comp, comp] of result) { - if (comp && comp.snapshot) { + if (comp && comp.snapshot && !p.comp.list[id_comp]) { await loadCompSnapshot(p, id_comp, comp.snapshot); } } @@ -156,7 +157,7 @@ export const updateComponentMeta = async ( meta, mode: "comp", on: { - visit(m) { + async visit(m) { pushTreeNode(p, m, meta, tree); assignMitem({ diff --git a/app/web/src/nova/ed/logic/tree/build.tsx b/app/web/src/nova/ed/logic/tree/build.tsx index cbb93108..b9116d3c 100644 --- a/app/web/src/nova/ed/logic/tree/build.tsx +++ b/app/web/src/nova/ed/logic/tree/build.tsx @@ -58,12 +58,14 @@ export const treeRebuild = async (p: PG, arg?: { note?: string }) => { mitem, meta, new_prop_jsx(meta, mprops, prop_name, prop_val) { - transact.list.push(() => { - const map = new Y.Map(); - if (prop_val.content) prop_val.content.id = createId(); - syncronize(map, prop_val); - mprops.set(prop_name, map as any); - }); + // if (prop_val.meta?.type === "content-element") { + // transact.list.push(() => { + // const map = new Y.Map(); + // if (prop_val.content) prop_val.content.id = createId(); + // syncronize(map, prop_val); + // mprops.set(prop_name, map as any); + // }); + // } }, }); } diff --git a/app/web/src/nova/ed/panel/side/prop-master.tsx b/app/web/src/nova/ed/panel/side/prop-master.tsx index 76addb55..18d42ba0 100644 --- a/app/web/src/nova/ed/panel/side/prop-master.tsx +++ b/app/web/src/nova/ed/panel/side/prop-master.tsx @@ -5,7 +5,7 @@ import { PlaceholderRender, getBackendOptions, } from "@minoru/react-dnd-treeview"; -import { FC } from "react"; +import { FC, useState } from "react"; import { HTML5Backend } from "react-dnd-html5-backend"; import { useGlobal, useLocal } from "web-utils"; import { IItem } from "../../../../utils/types/item"; @@ -20,14 +20,19 @@ const propRef = { export const EdSidePropComp: FC<{ meta: IMeta }> = ({ meta }) => { const p = useGlobal(EDGlobal, "EDITOR"); - const local = useLocal({}); const item = meta?.item as IItem; + const [_, set] = useState({}); + const render = () => { + set({}); + }; + propPopover.render = render; if (!item) return null; const TypedTree = DNDTree; let filtered = [] as NodeModel[]; let mprops = meta.mitem?.get("component")?.get("props"); + if (!mprops) { const mcomp = meta.mitem?.get("component"); if (mcomp) { @@ -119,8 +124,8 @@ export const EdSidePropComp: FC<{ meta: IMeta }> = ({ meta }) => { render={(node, params) => ( )} rootId={"root"} diff --git a/app/web/src/nova/ed/panel/side/prop-master/prop-form.tsx b/app/web/src/nova/ed/panel/side/prop-master/prop-form.tsx index 35116431..e530f3f0 100644 --- a/app/web/src/nova/ed/panel/side/prop-master/prop-form.tsx +++ b/app/web/src/nova/ed/panel/side/prop-master/prop-form.tsx @@ -11,7 +11,7 @@ import { fillID } from "../../../logic/tree/fill-id"; export const propPopover = { name: "", - render: {} as Record void>, + render: () => {}, }; export const EdPropPopoverForm: FC<{ @@ -23,10 +23,30 @@ export const EdPropPopoverForm: FC<{ const mmeta = mprop.get("meta"); const local = useLocal({ name, + rename_timeout: null as any, }); if (!mmeta) return null; const type = mmeta.get("type"); + + const rename = () => { + const keys = Object.keys(mprop.parent?.toJSON()); + if ([...keys, ...invalidKeyword].includes(local.name)) { + alert(`Cannot use "${local.name}" as name`); + local.name = name; + local.render(); + return; + } + + mprop.doc?.transact(() => { + const parent = mprop.parent as TypedMap>; + parent.set(local.name, parent.get(name)?.clone() as any); + parent.delete(name); + }); + propPopover.name = local.name; + propPopover.render(); + }; + return (
{e.label} @@ -91,26 +112,12 @@ export const EdPropPopoverForm: FC<{ local.name = e.currentTarget.value .toLowerCase() .replace(/\W/gi, "_"); + local.render(); }} onBlur={() => { if (local.name !== name) { - const keys = Object.keys(mprop.parent?.toJSON()); - if ([...keys, ...invalidKeyword].includes(local.name)) { - alert(`Cannot use "${local.name}" as name`); - local.name = name; - local.render(); - return; - } - mprop.doc?.transact(() => { - const parent = mprop.parent as TypedMap< - Record - >; - parent.set(local.name, parent.get(name)?.clone() as any); - parent.delete(name); - }); - propPopover.name = local.name; - local.render(); + rename(); } }} onKeyDown={(e) => { diff --git a/app/web/src/nova/ed/panel/side/prop-master/tree-item.tsx b/app/web/src/nova/ed/panel/side/prop-master/tree-item.tsx index 5efb0582..1a23b112 100644 --- a/app/web/src/nova/ed/panel/side/prop-master/tree-item.tsx +++ b/app/web/src/nova/ed/panel/side/prop-master/tree-item.tsx @@ -20,7 +20,6 @@ export const EdPropCompTreeItem: FC<{ render: () => void; }> = ({ node, params, render }) => { const local = useLocal({ closing: false }); - propPopover.render[node.text] = local.render; if (node.id === "root") { return <>;