prasi-bun/app/web/src/render/live/logic/mobile.ts

166 lines
4.4 KiB
TypeScript

import { w } from "../../../utils/script/init-api";
import { PG } from "./global";
type NOTIF_ARG = {
user_id: any;
body: string;
title: string;
data?: any;
};
export const registerMobile = () => {
const default_mobile = {
send: () => {},
bind: (p: PG) => {},
notif: {
register: (user_id: string) => {},
send: async (data: NOTIF_ARG) => {
const p = getP();
if (p) {
return await p.script.api._notif("send", {
type: "send",
id:
typeof data.user_id === "string"
? data.user_id
: data.user_id.toString(),
body: data.body,
title: data.title,
data: data.data,
});
}
},
onTap: (data: NOTIF_ARG) => {},
onReceive: (data: NOTIF_ARG) => {},
},
};
let config = { notif_token: "", p: null as null | PG };
const getP = () => {
const p = config.p;
if (p && p.site && p.site.api_url) {
const api = w.prasiApi[p.site.api_url];
if (
api &&
api.apiEntry &&
api.apiEntry._notif &&
p.script &&
p.script.api
) {
return p;
}
}
};
if (window.parent) {
window.addEventListener("message", async ({ data: raw }) => {
if (typeof raw === "object" && raw.mobile) {
console.log("capacitor", raw);
const data = raw as unknown as
| {
type: "notification-token";
token: string;
}
| { type: "notification-tap"; notif: NOTIF_ARG }
| { type: "notification-receive"; notif: NOTIF_ARG };
const waitUntil = async (fn: () => boolean) => {
if (!notifObject.notif.onTap) {
let ival = null as any;
let i = 0;
await new Promise(() => {
ival = setInterval(() => {
i++;
if (i > 20) {
clearInterval(ival);
}
if (fn()) {
clearInterval(ival);
}
}, 500);
});
return;
}
};
switch (data.type) {
case "notification-token":
config.notif_token = data.token;
break;
case "notification-tap":
if (!notifObject.notif.onTap) {
waitUntil(() => {
if (notifObject.notif.onTap) {
notifObject.notif.onTap(data.notif);
return true;
}
return false;
});
return;
}
if (notifObject.notif.onTap) {
notifObject.notif.onTap(data.notif);
}
break;
case "notification-receive":
if (!notifObject.notif.onReceive) {
waitUntil(() => {
if (notifObject.notif.onReceive) {
notifObject.notif.onReceive(data.notif);
return true;
}
return false;
});
}
if (notifObject.notif.onReceive) {
notifObject.notif.onReceive(data.notif);
}
break;
}
}
});
const notifObject = {
send: (msg: { type: "ready" }) => {
window.parent.postMessage({ mobile: true, ...msg }, "*");
},
bind(p: PG) {
config.p = p;
},
config,
notif: {
register: async (user_id: any) => {
const p = getP();
if (p) {
return await p.script.api._notif("register", {
type: "register",
id: typeof user_id === "string" ? user_id : user_id.toString(),
token: config.notif_token,
});
}
},
send: async (data: NOTIF_ARG) => {
const p = getP();
if (p) {
return await p.script.api._notif("send", {
type: "send",
id:
typeof data.user_id === "string"
? data.user_id
: data.user_id.toString(),
body: data.body,
title: data.title,
data: data.data,
});
}
},
onTap: null as null | typeof default_mobile.notif.onTap,
onReceive: null as null | typeof default_mobile.notif.onReceive,
},
};
return notifObject;
}
return {
...default_mobile,
};
};