This commit is contained in:
Rizky 2024-01-20 18:53:06 +07:00
parent 011aeabf44
commit 3dc25a8447
3 changed files with 88 additions and 82 deletions

View File

@ -15,7 +15,6 @@ RUN echo $DATABASE_URL
# RUN npm install -g node-gyp # RUN npm install -g node-gyp
# RUN npm install -g node-gyp-build-optional-packages # RUN npm install -g node-gyp-build-optional-packages
# RUN curl -fsSL https://bun.sh/install | bash -s "bun-v1.0.18" # RUN curl -fsSL https://bun.sh/install | bash -s "bun-v1.0.18"
# RUN ln -s $HOME/.bun/bin/bun /usr/local/bin/bun # RUN ln -s $HOME/.bun/bin/bun /usr/local/bin/bun

View File

@ -11,96 +11,101 @@ export const apiProxy = (api_url: string) => {
w.prasiApi = {}; w.prasiApi = {};
} }
const base = new URL(api_url); try {
const base_url = `${base.protocol}//${base.host}`; const base = new URL(api_url);
if (!w.prasiApi[base_url]) { const base_url = `${base.protocol}//${base.host}`;
if (!apiProxyLoaded[base_url]) { if (!w.prasiApi[base_url]) {
apiProxyLoaded[base_url] = loadApiProxyDef(base_url, true); if (!apiProxyLoaded[base_url]) {
apiProxyLoaded[base_url] = loadApiProxyDef(base_url, true);
}
} }
}
return new Proxy( return new Proxy(
{}, {},
{ {
get: (_, actionName: string) => { get: (_, actionName: string) => {
const createFn = (actionName: string) => { const createFn = (actionName: string) => {
return function ( return function (
this: { api_url: string } | undefined, this: { api_url: string } | undefined,
...rest: any ...rest: any
) { ) {
return new Promise<any>(async (resolve, reject) => { return new Promise<any>(async (resolve, reject) => {
try { try {
let api_ref = w.prasiApi[base_url]; let api_ref = w.prasiApi[base_url];
if ( if (
!api_ref && !api_ref &&
apiProxyLoaded && apiProxyLoaded &&
typeof apiProxyLoaded[base_url] === "object" typeof apiProxyLoaded[base_url] === "object"
) { ) {
await apiProxyLoaded[base_url]; await apiProxyLoaded[base_url];
api_ref = w.prasiApi[base_url]; api_ref = w.prasiApi[base_url];
}
if (api_ref) {
if (!api_ref.apiEntry) api_ref.apiEntry = {};
if (api_ref.apiEntry && !api_ref.apiEntry[actionName]) {
reject(
`API ${actionName.toString()} not found, existing API: \n - ${Object.keys(
api_ref || {}
).join("\n - ")}`
);
return;
} }
}
let actionUrl = api_ref.apiEntry[actionName].url; if (api_ref) {
const actionParams = api_ref.apiEntry[actionName].args; if (!api_ref.apiEntry) api_ref.apiEntry = {};
if (actionUrl && actionParams) { if (api_ref.apiEntry && !api_ref.apiEntry[actionName]) {
if (rest.length > 0 && actionParams.length > 0) { reject(
for (const [idx, p] of Object.entries(rest)) { `API ${actionName.toString()} not found, existing API: \n - ${Object.keys(
const paramName = actionParams[parseInt(idx)]; api_ref || {}
if (actionParams && actionParams.includes(paramName)) { ).join("\n - ")}`
if ( );
!!p && return;
typeof p !== "string" &&
typeof p !== "number"
) {
continue;
}
}
actionUrl = actionUrl.replace(`:${paramName}?`, p + "");
actionUrl = actionUrl.replace(`:${paramName}`, p + "");
} }
} }
const url = `${base_url}${actionUrl}`; let actionUrl = api_ref.apiEntry[actionName].url;
const actionParams = api_ref.apiEntry[actionName].args;
if (actionUrl && actionParams) {
if (rest.length > 0 && actionParams.length > 0) {
for (const [idx, p] of Object.entries(rest)) {
const paramName = actionParams[parseInt(idx)];
if (actionParams && actionParams.includes(paramName)) {
if (
!!p &&
typeof p !== "string" &&
typeof p !== "number"
) {
continue;
}
}
actionUrl = actionUrl.replace(`:${paramName}?`, p + "");
actionUrl = actionUrl.replace(`:${paramName}`, p + "");
}
}
const result = await fetchSendApi(url, rest); const url = `${base_url}${actionUrl}`;
resolve(result);
} else { const result = await fetchSendApi(url, rest);
console.error(`API Not Found: ${actionName.toString()}`); resolve(result);
} else {
console.error(`API Not Found: ${actionName.toString()}`);
}
} catch (e) {
reject(e);
} }
} catch (e) { });
reject(e); };
}
});
}; };
}; if (actionName === "then") {
if (actionName === "then") { return new Proxy(
return new Proxy( {},
{}, {
{ get: (_, actionName: string) => {
get: (_, actionName: string) => { return createFn(actionName);
return createFn(actionName); },
}, }
} );
); }
}
return createFn(actionName); return createFn(actionName);
}, },
} }
); );
} catch (e) {
console.warn("Init API failed for URL: ", JSON.stringify(api_url));
return null;
}
}; };
const fetchSendApi = async (url: string, params: any) => { const fetchSendApi = async (url: string, params: any) => {

View File

@ -1,4 +1,4 @@
import { FC, ReactNode } from "react"; import { FC, ReactNode, useEffect, useState } from "react";
import { useGlobal, useLocal } from "web-utils"; import { useGlobal, useLocal } from "web-utils";
import { IMeta } from "../../ed/logic/ed-global"; import { IMeta } from "../../ed/logic/ed-global";
import { ViGlobal } from "./global"; import { ViGlobal } from "./global";
@ -12,8 +12,10 @@ export const ViScript: FC<{
passprop?: any; passprop?: any;
}> = ({ meta, children, passprop }) => { }> = ({ meta, children, passprop }) => {
const vi = useGlobal(ViGlobal, "VI"); const vi = useGlobal(ViGlobal, "VI");
const local = useLocal({}); const [_, _set] = useState({});
meta.render = local.render; meta.render = () => {
_set({});
};
let _pass = passprop; let _pass = passprop;
if (meta.item.component?.id) { if (meta.item.component?.id) {