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-build-optional-packages
# RUN curl -fsSL https://bun.sh/install | bash -s "bun-v1.0.18"
# 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 = {};
}
const base = new URL(api_url);
const base_url = `${base.protocol}//${base.host}`;
if (!w.prasiApi[base_url]) {
if (!apiProxyLoaded[base_url]) {
apiProxyLoaded[base_url] = loadApiProxyDef(base_url, true);
try {
const base = new URL(api_url);
const base_url = `${base.protocol}//${base.host}`;
if (!w.prasiApi[base_url]) {
if (!apiProxyLoaded[base_url]) {
apiProxyLoaded[base_url] = loadApiProxyDef(base_url, true);
}
}
}
return new Proxy(
{},
{
get: (_, actionName: string) => {
const createFn = (actionName: string) => {
return function (
this: { api_url: string } | undefined,
...rest: any
) {
return new Promise<any>(async (resolve, reject) => {
try {
let api_ref = w.prasiApi[base_url];
return new Proxy(
{},
{
get: (_, actionName: string) => {
const createFn = (actionName: string) => {
return function (
this: { api_url: string } | undefined,
...rest: any
) {
return new Promise<any>(async (resolve, reject) => {
try {
let api_ref = w.prasiApi[base_url];
if (
!api_ref &&
apiProxyLoaded &&
typeof apiProxyLoaded[base_url] === "object"
) {
await apiProxyLoaded[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;
if (
!api_ref &&
apiProxyLoaded &&
typeof apiProxyLoaded[base_url] === "object"
) {
await apiProxyLoaded[base_url];
api_ref = w.prasiApi[base_url];
}
}
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 + "");
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;
}
}
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);
resolve(result);
} else {
console.error(`API Not Found: ${actionName.toString()}`);
const url = `${base_url}${actionUrl}`;
const result = await fetchSendApi(url, rest);
resolve(result);
} else {
console.error(`API Not Found: ${actionName.toString()}`);
}
} catch (e) {
reject(e);
}
} catch (e) {
reject(e);
}
});
});
};
};
};
if (actionName === "then") {
return new Proxy(
{},
{
get: (_, actionName: string) => {
return createFn(actionName);
},
}
);
}
if (actionName === "then") {
return new Proxy(
{},
{
get: (_, actionName: string) => {
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) => {

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