From 220fbc2640aef6aa2d8aaed488a9e84827ed2e0f Mon Sep 17 00:00:00 2001 From: Rizky Date: Sun, 17 Dec 2023 11:35:35 +0700 Subject: [PATCH] wip fix --- app/srv/ws/sync/editor/parser/parse-js.ts | 6 +++ app/web/src/base/load/api/api-proxy.tsx | 30 ++++++++----- .../src/nova/ed/panel/popup/script/scope.tsx | 24 +++++++++- .../nova/ed/panel/popup/script/snippet.tsx | 20 +++++++++ .../src/nova/ed/panel/tree/node/item/name.tsx | 5 +++ app/web/src/nova/vi/render/script.tsx | 1 + .../src/nova/vi/render/script/passprop.tsx | 9 ++-- .../src/nova/vi/render/script/scope-meta.ts | 15 +++---- .../editor/panel/manager/site/site-mgr.tsx | 1 - app/web/src/utils/script/types/base.ts | 2 +- app/web/src/utils/script/typings.ts | 45 ++++++++++--------- 11 files changed, 108 insertions(+), 50 deletions(-) diff --git a/app/srv/ws/sync/editor/parser/parse-js.ts b/app/srv/ws/sync/editor/parser/parse-js.ts index 0e46245c..f15fde1b 100644 --- a/app/srv/ws/sync/editor/parser/parse-js.ts +++ b/app/srv/ws/sync/editor/parser/parse-js.ts @@ -80,6 +80,12 @@ export const parseJs = (meta: IMeta) => { value: code.substring(loc.start.index, loc.end.index), index: loc.start.index, }; + } else if (attr.value.loc) { + const loc = attr.value.loc as any; + passprop[attr.name.name] = { + value: code.substring(loc.start.index, loc.end.index), + index: loc.start.index, + }; } } } diff --git a/app/web/src/base/load/api/api-proxy.tsx b/app/web/src/base/load/api/api-proxy.tsx index efb9eb62..22612af4 100644 --- a/app/web/src/base/load/api/api-proxy.tsx +++ b/app/web/src/base/load/api/api-proxy.tsx @@ -4,7 +4,21 @@ import { loadApiProxyDef } from "./api-proxy-def"; export type ApiProxy = {}> = any; +const apiProxyPending: Record> = {}; + export const apiProxy = (api_url: string) => { + if (!w.prasiApi) { + w.prasiApi = {}; + } + + const base = new URL(api_url); + const base_url = `${base.protocol}//${base.host}`; + if (!w.prasiApi[base_url]) { + if (!apiProxyPending[base_url]) { + apiProxyPending[base_url] = loadApiProxyDef(base_url, false); + } + } + return new Proxy( {}, { @@ -16,20 +30,12 @@ export const apiProxy = (api_url: string) => { ) { return new Promise(async (resolve, reject) => { try { - let base_url = api_url; - if (typeof this?.api_url === "string") { - base_url = this.api_url; + let api_def = w.prasiApi[base_url]; + + if (!api_def) { + await apiProxyPending[base_url]; } - if (!w.prasiApi) { - w.prasiApi = {}; - } - - if (!w.prasiApi[base_url]) { - await loadApiProxyDef(base_url, false); - } - - const api_def = w.prasiApi[base_url]; if (api_def) { if (!api_def.apiEntry) api_def.apiEntry = {}; if (api_def.apiEntry && !api_def.apiEntry[actionName]) { diff --git a/app/web/src/nova/ed/panel/popup/script/scope.tsx b/app/web/src/nova/ed/panel/popup/script/scope.tsx index 091f3461..026e108e 100644 --- a/app/web/src/nova/ed/panel/popup/script/scope.tsx +++ b/app/web/src/nova/ed/panel/popup/script/scope.tsx @@ -42,13 +42,35 @@ export const declareScope = async ( if (def.local) { addScope({ monaco, - loc: { item_id: m.item.id, type: "item" }, + loc: { + item_id: m.item.id, + comp_id: m.parent?.comp_id, + type: "item", + }, source: `\ export const {}; declare global { const ${def.local.name} = ${def.local.value}; }`, }); + } else if (def.passprop) { + Object.keys(def.passprop).map((e) => { + if (e !== "idx" && e !== "key") { + addScope({ + monaco, + loc: { + item_id: m.item.id, + comp_id: m.parent?.comp_id, + type: "item", + }, + source: `\ +export const {}; +declare global { + const ${e} = null as any; +}`, + }); + } + }); } else if (def.props) { Object.keys(def.props).map((e) => { addScope({ diff --git a/app/web/src/nova/ed/panel/popup/script/snippet.tsx b/app/web/src/nova/ed/panel/popup/script/snippet.tsx index 6b502a49..a0a34f7a 100644 --- a/app/web/src/nova/ed/panel/popup/script/snippet.tsx +++ b/app/web/src/nova/ed/panel/popup/script/snippet.tsx @@ -39,6 +39,26 @@ effect={async (local) => { }} > <Local/> + {" "} + ); 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 8963dc9b..fe970524 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 @@ -42,6 +42,11 @@ export const EdTreeName = ({ }} onBlur={() => { item.name = local.rename; + + const mitem = node.data?.mitem; + if (mitem) { + mitem.set("name", item.name); + } p.ui.tree.rename_id = ""; p.render(); }} diff --git a/app/web/src/nova/vi/render/script.tsx b/app/web/src/nova/vi/render/script.tsx index 5b8077c6..cb7285c8 100644 --- a/app/web/src/nova/vi/render/script.tsx +++ b/app/web/src/nova/vi/render/script.tsx @@ -18,6 +18,7 @@ export const ViScript: FC<{ meta: IMeta; children: ReactNode }> = ({ const scope_meta = getScopeMeta({ meta: vi.meta }, meta); const scope = getScopeValue(scope_meta); + if (meta.item.component?.id) { viEvalProps(vi, meta, scope); } diff --git a/app/web/src/nova/vi/render/script/passprop.tsx b/app/web/src/nova/vi/render/script/passprop.tsx index 83c57a69..8de3bf50 100644 --- a/app/web/src/nova/vi/render/script/passprop.tsx +++ b/app/web/src/nova/vi/render/script/passprop.tsx @@ -13,14 +13,11 @@ export const createViPassProp = ( } for (const [k, v] of Object.entries(arg)) { + if (k === "key" || k === "idx") continue; + if (k !== "children") { delete meta.scope.val[k]; - meta.scope.val = { - ...meta.scope.val, - get [k]() { - return v; - }, - }; + meta.scope.val[k] = v; } } diff --git a/app/web/src/nova/vi/render/script/scope-meta.ts b/app/web/src/nova/vi/render/script/scope-meta.ts index 73696e78..adab7a77 100644 --- a/app/web/src/nova/vi/render/script/scope-meta.ts +++ b/app/web/src/nova/vi/render/script/scope-meta.ts @@ -21,21 +21,22 @@ export const getScopeMeta = ( } } - for (const meta of scopes_meta) { - const def = meta.scope.def; + for (const m of scopes_meta) { + const def = m.scope.def; if (def) { if (def.passprop) { for (const p of Object.keys(def.passprop)) { - scope_meta[p] = { type: "passprop", meta }; + console.log(meta.item.name, p, def.passprop) + scope_meta[p] = { type: "passprop", meta: m }; } } if (def.props) { for (const p of Object.keys(def.props)) { - scope_meta[p] = { type: "jsxprop", meta }; + scope_meta[p] = { type: "jsxprop", meta: m }; } } if (def.local) { - scope_meta[def.local.name] = { type: "local", meta }; + scope_meta[def.local.name] = { type: "local", meta: m }; } } } @@ -54,7 +55,3 @@ export const getScopeValue = (scope_meta: ReturnType) => { return scope; }; - -// export const getScope = (vi: { meta: VG["meta"] }, meta: IMeta) => { - -// }; diff --git a/app/web/src/render/editor/panel/manager/site/site-mgr.tsx b/app/web/src/render/editor/panel/manager/site/site-mgr.tsx index 24a43465..4ad35cb6 100644 --- a/app/web/src/render/editor/panel/manager/site/site-mgr.tsx +++ b/app/web/src/render/editor/panel/manager/site/site-mgr.tsx @@ -31,7 +31,6 @@ export const SiteManager = () => { }, }); - console.log(orgs); if (orgs) { orgs.push({ org: { diff --git a/app/web/src/utils/script/types/base.ts b/app/web/src/utils/script/types/base.ts index 9fd4aefa..31a1b02e 100644 --- a/app/web/src/utils/script/types/base.ts +++ b/app/web/src/utils/script/types/base.ts @@ -92,7 +92,7 @@ export const baseTypings = ` name: string; idx?: any; value: T; - children: (local: T & { render: () => void }) => any; + children: ReactNode; deps?: any[]; effect?: ( local: T & { render: () => void } diff --git a/app/web/src/utils/script/typings.ts b/app/web/src/utils/script/typings.ts index 731f1bd2..8090a2e1 100644 --- a/app/web/src/utils/script/typings.ts +++ b/app/web/src/utils/script/typings.ts @@ -19,43 +19,48 @@ export const monacoTypings = async ( if (!map.has(prop.values)) { map.set(prop.values, true); } else { - return; + return; } - if (w.prasiApi[p.site.api_url] && w.prasiApi[p.site.api_url].prismaTypes) { - const prisma = w.prasiApi[p.site.api_url].prismaTypes; + const prasi_api = w.prasiApi[p.site.api_url]; + if (prasi_api) { + if (prasi_api && prasi_api.prismaTypes) { + const prisma = prasi_api.prismaTypes; - register( - monaco, - `\ + if (prisma) { + register( + monaco, + `\ declare module "ts:runtime/index" { ${prisma["runtime/index.d.ts"]} }`, - `ts:runtime/index.d.ts` - ); + `ts:runtime/index.d.ts` + ); - register( - monaco, - `\ + register( + monaco, + `\ declare module "ts:runtime/library" { ${prisma["runtime/library.d.ts"]} }`, - `ts:runtime/library.d.ts` - ); + `ts:runtime/library.d.ts` + ); - register( - monaco, - `\ + register( + monaco, + `\ declare module "ts:prisma" { ${prisma["prisma.d.ts"].replace( `import * as runtime from './runtime/library';`, `import * as runtime from 'ts:runtime/library';` )} }`, - `ts:prisma.d.ts` - ); - - register(monaco, w.prasiApi[p.site.api_url].apiTypes, "ts:api.d.ts"); + `ts:prisma.d.ts` + ); + } + const api_types = prasi_api.apiTypes; + if (api_types) register(monaco, api_types, "ts:api.d.ts"); + } } monaco.languages.typescript.typescriptDefaults.setExtraLibs([