@urga-panel/ur-panels-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +13 -0
- package/dist/ServiceManager.d.ts +26 -0
- package/dist/ServiceManager.js +351 -0
- package/dist/TestRun.d.ts +1 -0
- package/dist/TestRun.js +14 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +22 -0
- package/dist/services/abstract/apiService/ApiService.d.ts +17 -0
- package/dist/services/abstract/apiService/ApiService.js +33 -0
- package/dist/services/abstract/authServices/AuthService.d.ts +75 -0
- package/dist/services/abstract/authServices/AuthService.js +275 -0
- package/dist/services/abstract/authServices/Authorization.d.ts +0 -0
- package/dist/services/abstract/authServices/Authorization.js +0 -0
- package/dist/services/abstract/extensionServices/ExtensionService.d.ts +25 -0
- package/dist/services/abstract/extensionServices/ExtensionService.js +21 -0
- package/dist/services/abstract/pageServices/LayoutPageService.d.ts +17 -0
- package/dist/services/abstract/pageServices/LayoutPageService.js +32 -0
- package/dist/services/abstract/pageServices/PageServices.d.ts +20 -0
- package/dist/services/abstract/pageServices/PageServices.js +23 -0
- package/dist/services/abstract/pageServices/controllers/NSPageControllerService.d.ts +10 -0
- package/dist/services/abstract/pageServices/controllers/NSPageControllerService.js +18 -0
- package/dist/services/abstract/pageServices/controllers/PageControllerService.d.ts +27 -0
- package/dist/services/abstract/pageServices/controllers/PageControllerService.js +24 -0
- package/dist/services/abstract/pageServices/controllers/SVPageControllerService.d.ts +34 -0
- package/dist/services/abstract/pageServices/controllers/SVPageControllerService.js +73 -0
- package/dist/services/abstract/pageServices/pages/NsPageService.d.ts +26 -0
- package/dist/services/abstract/pageServices/pages/NsPageService.js +66 -0
- package/dist/services/abstract/project/ProjectInfoService.d.ts +42 -0
- package/dist/services/abstract/project/ProjectInfoService.js +72 -0
- package/dist/services/abstract/webviewServices/WVBackService.d.ts +18 -0
- package/dist/services/abstract/webviewServices/WVBackService.js +22 -0
- package/dist/services/abstract/webviewServices/WVFrontService.d.ts +21 -0
- package/dist/services/abstract/webviewServices/WVFrontService.js +54 -0
- package/dist/services/abstract/webviewServices/nv.d.ts +26 -0
- package/dist/services/abstract/webviewServices/nv.js +99 -0
- package/dist/services/main/fetchServices/FetchBrowserService.d.ts +19 -0
- package/dist/services/main/fetchServices/FetchBrowserService.js +26 -0
- package/dist/services/main/httpServices/RequestHandlerService.d.ts +46 -0
- package/dist/services/main/httpServices/RequestHandlerService.js +165 -0
- package/dist/services/main/remoteApiControllerService/RemoteApiControllerService.d.ts +36 -0
- package/dist/services/main/remoteApiControllerService/RemoteApiControllerService.js +42 -0
- package/dist/services/main/testServices/TestService.d.ts +19 -0
- package/dist/services/main/testServices/TestService.js +22 -0
- package/dist/services/main/testServices/TestService2.d.ts +18 -0
- package/dist/services/main/testServices/TestService2.js +20 -0
- package/dist/types/RegisterServiceInfo.d.ts +13 -0
- package/dist/types/RegisterServiceInfo.js +1 -0
- package/dist/types/Service.d.ts +32 -0
- package/dist/types/Service.js +43 -0
- package/dist/types/ServiceConstructor.d.ts +5 -0
- package/dist/types/ServiceConstructor.js +1 -0
- package/dist/types/ServiceEntry.d.ts +6 -0
- package/dist/types/ServiceEntry.js +1 -0
- package/dist/types/ServiceOts.d.ts +12 -0
- package/dist/types/ServiceOts.js +1 -0
- package/dist/types/ServiceRegisterInfo.d.ts +29 -0
- package/dist/types/ServiceRegisterInfo.js +25 -0
- package/dist/types/ServiceResponse.d.ts +13 -0
- package/dist/types/ServiceResponse.js +1 -0
- package/dist/types/ServiceSetupOptions.d.ts +3 -0
- package/dist/types/ServiceSetupOptions.js +1 -0
- package/dist/types/ServiceStatus.d.ts +1 -0
- package/dist/types/ServiceStatus.js +1 -0
- package/dist/types/_ServiceError.d.ts +5 -0
- package/dist/types/_ServiceError.js +1 -0
- package/jest.config.js +5 -0
- package/package.json +35 -0
- package/src/ServiceManager.ts +403 -0
- package/src/TestRun.ts +17 -0
- package/src/index.ts +26 -0
- package/src/services/abstract/apiService/ApiService.ts +51 -0
- package/src/services/abstract/authServices/AuthService.ts +364 -0
- package/src/services/abstract/authServices/Authorization.ts +0 -0
- package/src/services/abstract/extensionServices/ExtensionService.ts +50 -0
- package/src/services/abstract/pageServices/LayoutPageService.ts +49 -0
- package/src/services/abstract/pageServices/PageServices.ts +37 -0
- package/src/services/abstract/pageServices/controllers/NSPageControllerService.ts +23 -0
- package/src/services/abstract/pageServices/controllers/PageControllerService.ts +56 -0
- package/src/services/abstract/pageServices/controllers/SVPageControllerService.ts +104 -0
- package/src/services/abstract/pageServices/pages/NSPageService.ts +82 -0
- package/src/services/abstract/project/ProjectInfoService.ts +108 -0
- package/src/services/abstract/webviewServices/WVBackService.ts +34 -0
- package/src/services/abstract/webviewServices/WVFrontService.ts +71 -0
- package/src/services/abstract/webviewServices/nv.js +112 -0
- package/src/services/abstract/webviewServices/nv.ts +125 -0
- package/src/services/main/fetchServices/FetchBrowserService.ts +40 -0
- package/src/services/main/httpServices/RequestHandlerService.ts +207 -0
- package/src/services/main/remoteApiControllerService/RemoteApiControllerService.ts +70 -0
- package/src/services/main/testServices/TestService.ts +36 -0
- package/src/services/main/testServices/TestService2.ts +34 -0
- package/src/types/RegisterServiceInfo.ts +19 -0
- package/src/types/Service.ts +61 -0
- package/src/types/ServiceConstructor.ts +6 -0
- package/src/types/ServiceEntry.ts +10 -0
- package/src/types/ServiceOts.ts +17 -0
- package/src/types/ServiceRegisterInfo.ts +48 -0
- package/src/types/ServiceResponse.ts +13 -0
- package/src/types/ServiceSetupOptions.ts +5 -0
- package/src/types/ServiceStatus.ts +2 -0
- package/src/types/_ServiceError.ts +5 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Service } from "../../../../types/Service";
|
|
2
|
+
import { ServiceOts } from "../../../../types/ServiceOts";
|
|
3
|
+
import { ServiceResponse } from "../../../../types/ServiceResponse";
|
|
4
|
+
import { ServiceSetupOptions } from "../../../../types/ServiceSetupOptions";
|
|
5
|
+
|
|
6
|
+
export type PageOts = ServiceOts & {
|
|
7
|
+
usedService: {
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class NSPageService extends Service {
|
|
12
|
+
serviceInfo: { name: string; requiredServices: string[]; };
|
|
13
|
+
|
|
14
|
+
model: any;
|
|
15
|
+
page: any;
|
|
16
|
+
|
|
17
|
+
constructor(ots: PageOts) {
|
|
18
|
+
super({ ...ots });
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
protected async onSetup(options?: ServiceSetupOptions): Promise<ServiceResponse> {
|
|
22
|
+
this.log.OK("onSetup called", options);
|
|
23
|
+
return { status: "success", message: "setup complete" };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
protected async onStart(): Promise<ServiceResponse> {
|
|
27
|
+
this.log.OK("onStart called");
|
|
28
|
+
return { status: "success", message: "started" };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected async onStop(): Promise<ServiceResponse> {
|
|
32
|
+
this.log.OK("onStop called");
|
|
33
|
+
return { status: "success", message: "stopped" };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
protected async onDestroy(): Promise<ServiceResponse> {
|
|
37
|
+
this.log.OK("onDestroy called");
|
|
38
|
+
return { status: "success", message: "destroyed" };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
navigatingTo(callback: (args?: any) => void,
|
|
42
|
+
model:any ,args?: any) {
|
|
43
|
+
this.log.OK("navigatingTo called");
|
|
44
|
+
if (callback) callback(args);
|
|
45
|
+
|
|
46
|
+
if (model) {
|
|
47
|
+
this.model = model;
|
|
48
|
+
//ts-ignore
|
|
49
|
+
const page = args.object;
|
|
50
|
+
page.bindingContext = model;
|
|
51
|
+
this.page = page;
|
|
52
|
+
this.log.OK("Model set:", model);
|
|
53
|
+
} else {
|
|
54
|
+
this.log.WARN("No model provided");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
navigatedTo(callback: (args?: any) => void, args?: any) {
|
|
59
|
+
this.log.OK("navigatedTo called");
|
|
60
|
+
if (callback) callback(args);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
onLoaded(callback: (args?: any) => void, args?: any) {
|
|
64
|
+
this.log.OK("onLoaded called");
|
|
65
|
+
if (callback) callback(args);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
onUnloaded(callback: (args?: any) => void, args?: any) {
|
|
69
|
+
this.log.OK("onUnloaded called");
|
|
70
|
+
if (callback) callback(args);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
navigatingFrom(callback: (args?: any) => void, args?: any) {
|
|
74
|
+
this.log.OK("navigatingFrom called");
|
|
75
|
+
if (callback) callback(args);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
navigatedFrom(callback: (args?: any) => void, args?: any) {
|
|
79
|
+
this.log.OK("navigatedFrom called");
|
|
80
|
+
if (callback) callback(args);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Service } from "../../../types/Service";
|
|
2
|
+
import { ServiceOts } from "../../../types/ServiceOts";
|
|
3
|
+
import { ServiceResponse } from "../../../types/ServiceResponse";
|
|
4
|
+
import { ServiceSetupOptions } from "../../../types/ServiceSetupOptions";
|
|
5
|
+
import { PageService } from "../pageServices/PageServices";
|
|
6
|
+
|
|
7
|
+
export type ProjectsPages = {
|
|
8
|
+
[key: string]: {
|
|
9
|
+
icon: string; // Optional icon for the page
|
|
10
|
+
title: string;
|
|
11
|
+
slug: string;
|
|
12
|
+
description: string;
|
|
13
|
+
showInMenu: boolean;
|
|
14
|
+
showInMobile: boolean;
|
|
15
|
+
order: number;
|
|
16
|
+
group?: string;
|
|
17
|
+
service?: PageService; // Optional service name for custom handling
|
|
18
|
+
serviceRef: any;
|
|
19
|
+
userGroup?: string; // Optional user group for access control
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type ProjectInfoOts = ServiceOts & {
|
|
24
|
+
usedService: {
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
export abstract class ProjectInfoService extends Service {
|
|
30
|
+
|
|
31
|
+
static serviceInfo = {
|
|
32
|
+
name: "ProjectInfoService",
|
|
33
|
+
requiredServices: [],
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
abstract pages: ProjectsPages;
|
|
37
|
+
|
|
38
|
+
constructor(public ots: ProjectInfoOts) {
|
|
39
|
+
super({ ...ots });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected async onSetup(options?: ServiceSetupOptions): Promise<ServiceResponse> {
|
|
43
|
+
// Create a service for each page
|
|
44
|
+
Object.keys(this.pages).forEach(async tag => {
|
|
45
|
+
const service = this.ots.abilities.createChildService?.("ProjectPage-" + tag,
|
|
46
|
+
this.pages[tag].serviceRef || PageService
|
|
47
|
+
);
|
|
48
|
+
if (service) {
|
|
49
|
+
this.pages[tag].service = service as PageService;
|
|
50
|
+
}
|
|
51
|
+
await service.setup();
|
|
52
|
+
});
|
|
53
|
+
return { status: "success", message: "setup complete" };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected async onStart(): Promise<ServiceResponse> {
|
|
57
|
+
// Object.keys(this.pages).forEach(async tag => {
|
|
58
|
+
// const service = this.ots.abilities.createChildService?.("ProjectPage-"+tag);
|
|
59
|
+
// await service.start();
|
|
60
|
+
// });
|
|
61
|
+
return { status: "success", message: "started" };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
protected async onStop(): Promise<ServiceResponse> {
|
|
65
|
+
return { status: "success", message: "stopped" };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected async onDestroy(): Promise<ServiceResponse> {
|
|
69
|
+
return { status: "success", message: "destroyed" };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
getMenuPages(userGroup?: string): { [key: string]: ProjectsPages[string] } {
|
|
73
|
+
const result: { [key: string]: ProjectsPages[string] } = {};
|
|
74
|
+
Object.entries(this.pages).forEach(([key, page]) => {
|
|
75
|
+
if (page.showInMenu) {
|
|
76
|
+
if (userGroup && userGroup == 'admin') {
|
|
77
|
+
result[key] = page;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
if (userGroup) {
|
|
81
|
+
// Check if the page is accessible by the user group
|
|
82
|
+
if (page.userGroup === userGroup) {
|
|
83
|
+
result[key] = page;
|
|
84
|
+
}
|
|
85
|
+
} else {
|
|
86
|
+
result[key] = page;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
getMobilePages(limit: number = 4): { [key: string]: ProjectsPages[string] } {
|
|
96
|
+
const result: { [key: string]: ProjectsPages[string] } = {};
|
|
97
|
+
let count = 0;
|
|
98
|
+
for (const [key, page] of Object.entries(this.pages)) {
|
|
99
|
+
if (page.showInMobile) {
|
|
100
|
+
result[key] = page;
|
|
101
|
+
count++;
|
|
102
|
+
if (count >= limit) break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Service } from "../../../types/Service";
|
|
2
|
+
import { ServiceOts } from "../../../types/ServiceOts";
|
|
3
|
+
import { ServiceResponse } from "../../../types/ServiceResponse";
|
|
4
|
+
import { ServiceSetupOptions } from "../../../types/ServiceSetupOptions";
|
|
5
|
+
|
|
6
|
+
export type WVBackServiceOts = ServiceOts & {
|
|
7
|
+
usedService: {
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class WVBackService extends Service {
|
|
12
|
+
static serviceInfo = {
|
|
13
|
+
name: "WVBackService",
|
|
14
|
+
requiredServices: [],
|
|
15
|
+
}
|
|
16
|
+
protected async onSetup(options?: ServiceSetupOptions): Promise<ServiceResponse> {
|
|
17
|
+
|
|
18
|
+
return { status: "success", message: "onSetup complete" };
|
|
19
|
+
}
|
|
20
|
+
protected async onStart(): Promise<ServiceResponse> {
|
|
21
|
+
return { status: "success", message: "onStart complete" };
|
|
22
|
+
}
|
|
23
|
+
protected async onStop(): Promise<ServiceResponse> {
|
|
24
|
+
return { status: "success", message: "onStop complete" };
|
|
25
|
+
}
|
|
26
|
+
protected async onDestroy(): Promise<ServiceResponse> {
|
|
27
|
+
return { status: "success", message: "onDestroy complete" };
|
|
28
|
+
}
|
|
29
|
+
constructor(ots: WVBackServiceOts) {
|
|
30
|
+
super({ ...ots });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Service } from "../../../types/Service";
|
|
2
|
+
import { ServiceOts } from "../../../types/ServiceOts";
|
|
3
|
+
import { ServiceResponse } from "../../../types/ServiceResponse";
|
|
4
|
+
import { ServiceSetupOptions } from "../../../types/ServiceSetupOptions";
|
|
5
|
+
import { NSWebViewinterface } from "./nv";
|
|
6
|
+
export type WVFrontServiceOts = ServiceOts & {
|
|
7
|
+
usedService: {
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class WVFrontService extends Service {
|
|
12
|
+
static serviceInfo = {
|
|
13
|
+
name: "WVFrontService",
|
|
14
|
+
requiredServices: [],
|
|
15
|
+
}
|
|
16
|
+
protected async onSetup(options?: ServiceSetupOptions): Promise<ServiceResponse> {
|
|
17
|
+
|
|
18
|
+
this.oWebViewInterface = new NSWebViewinterface();
|
|
19
|
+
//@ts-ignore
|
|
20
|
+
window.nsWebViewInterface = this.oWebViewInterface;
|
|
21
|
+
this.oWebViewInterface.emit("loadFinished", "");
|
|
22
|
+
|
|
23
|
+
return { status: "success", message: "onSetup complete" };
|
|
24
|
+
}
|
|
25
|
+
protected async onStart(): Promise<ServiceResponse> {
|
|
26
|
+
return { status: "success", message: "onStart complete" };
|
|
27
|
+
}
|
|
28
|
+
protected async onStop(): Promise<ServiceResponse> {
|
|
29
|
+
return { status: "success", message: "onStop complete" };
|
|
30
|
+
}
|
|
31
|
+
protected async onDestroy(): Promise<ServiceResponse> {
|
|
32
|
+
return { status: "success", message: "onDestroy complete" };
|
|
33
|
+
}
|
|
34
|
+
public oWebViewInterface: NSWebViewinterface;
|
|
35
|
+
|
|
36
|
+
constructor(ots: WVFrontServiceOts) {
|
|
37
|
+
super({ ...ots });
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public async sendFetchRequest(url: string, options?: RequestInit): Promise<any> {
|
|
42
|
+
console.log("sendFetchRequest", url, options);
|
|
43
|
+
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
|
+
const callback = (args: any) => {
|
|
46
|
+
const param = args as unknown;
|
|
47
|
+
// Convert param to a Response object
|
|
48
|
+
debugger;
|
|
49
|
+
//@ts-ignore
|
|
50
|
+
const byteArray = Object.values(param._bodyBlob._buffer);
|
|
51
|
+
//@ts-ignore
|
|
52
|
+
const uint8 = new Uint8Array(byteArray);
|
|
53
|
+
//@ts-ignore
|
|
54
|
+
const text = new TextDecoder().decode(uint8);
|
|
55
|
+
const response = new Response(text,
|
|
56
|
+
{
|
|
57
|
+
status: 200,
|
|
58
|
+
headers: { "Content-Type": "application/json" }
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
debugger;
|
|
62
|
+
console.log("sendFetchRequest received", param);
|
|
63
|
+
this.oWebViewInterface.removeListener('sendFetchRequest', callback);
|
|
64
|
+
resolve(response);
|
|
65
|
+
};
|
|
66
|
+
this.oWebViewInterface.on('sendFetchRequest', callback);
|
|
67
|
+
this.oWebViewInterface.emit("sendFetchRequest", { url, options });
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
class NSWebViewinterface {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.eventListenerMap = {};
|
|
4
|
+
this._iosResponseMap = {};
|
|
5
|
+
this._iosCntResponseId = 0;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
_onNativeEvent(eventName, data) {
|
|
9
|
+
var lstEvtListeners = this.eventListenerMap[eventName] || [];
|
|
10
|
+
for (var _i = 0; _i < lstEvtListeners.length; _i++) {
|
|
11
|
+
var listener = lstEvtListeners[_i];
|
|
12
|
+
var retnVal = listener && listener(data);
|
|
13
|
+
if (retnVal === false) {
|
|
14
|
+
break;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
_callJSFunction(reqId, functionName, args) {
|
|
20
|
+
var _this = this;
|
|
21
|
+
var resolvedFn = _this._getResolvedFunction(functionName);
|
|
22
|
+
if(resolvedFn){
|
|
23
|
+
var retnVal = resolvedFn.apply(window, args);
|
|
24
|
+
if (retnVal && retnVal.then) {
|
|
25
|
+
retnVal.then(function (value) {
|
|
26
|
+
_this._sendJSCallResponse(reqId, value);
|
|
27
|
+
}, function(error){
|
|
28
|
+
_this._sendJSCallResponse(reqId, error, true);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this._sendJSCallResponse(reqId, retnVal);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
_getResolvedFunction(functionName) {
|
|
38
|
+
if(functionName && (functionName = functionName.trim()).length){
|
|
39
|
+
functionName = functionName.indexOf('window.') === 0 ? functionName.replace('window.', '') : functionName;
|
|
40
|
+
var arrFnPath = functionName.split('.');
|
|
41
|
+
var fn = window;
|
|
42
|
+
for(var i = 0; i < arrFnPath.length; i++){
|
|
43
|
+
if(!fn[arrFnPath[i]]){
|
|
44
|
+
fn = null;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
fn = fn[arrFnPath[i]];
|
|
48
|
+
}
|
|
49
|
+
return fn;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
_sendJSCallResponse(reqId, response, isError) {
|
|
54
|
+
var oResponse = {
|
|
55
|
+
reqId: reqId,
|
|
56
|
+
response: response || null,
|
|
57
|
+
isError: !!isError
|
|
58
|
+
};
|
|
59
|
+
this.emit('_jsCallResponse', oResponse);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
_createIFrame(src) {
|
|
63
|
+
var rootElm = document.documentElement;
|
|
64
|
+
var newFrameElm = document.createElement("IFRAME");
|
|
65
|
+
newFrameElm.setAttribute("src", src);
|
|
66
|
+
rootElm.appendChild(newFrameElm);
|
|
67
|
+
return newFrameElm;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
_emitEventToIOS(eventName, data) {
|
|
71
|
+
this._iosResponseMap[++this._iosCntResponseId] = data;
|
|
72
|
+
var metadata = { eventName: eventName, resId: this._iosCntResponseId };
|
|
73
|
+
var url = 'js2ios:' + JSON.stringify(metadata);
|
|
74
|
+
var iFrame = this._createIFrame(url);
|
|
75
|
+
iFrame.parentNode.removeChild(iFrame);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
_getIOSResponse(resId) {
|
|
79
|
+
var response = this._iosResponseMap[resId];
|
|
80
|
+
delete this._iosResponseMap[resId];
|
|
81
|
+
return response;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
_emitEventToAndroid(eventName, data) {
|
|
85
|
+
window.androidWebViewInterface.handleEventFromWebView(eventName, data);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
on(eventName, callback) {
|
|
89
|
+
var lstListeners = this.eventListenerMap[eventName] || (this.eventListenerMap[eventName] = []);
|
|
90
|
+
lstListeners.push(callback);
|
|
91
|
+
}
|
|
92
|
+
removeListener(eventName, callback) {
|
|
93
|
+
const listeners = this.eventListenerMap[eventName];
|
|
94
|
+
if (listeners) {
|
|
95
|
+
// Belirtilen geri çağırma işlevini kaldır
|
|
96
|
+
this.eventListenerMap[eventName] = listeners.filter(listener => listener !== callback);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
emit(eventName, data) {
|
|
101
|
+
var strData = typeof data === 'object' ? JSON.stringify(data) : data;
|
|
102
|
+
if (window.androidWebViewInterface) {
|
|
103
|
+
this._emitEventToAndroid(eventName, strData);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
this._emitEventToIOS(eventName, strData);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// NSWebViewinterface'i dışa aktar
|
|
112
|
+
export { NSWebViewinterface };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
type EventCallback = (data: any) => any;
|
|
2
|
+
|
|
3
|
+
declare global {
|
|
4
|
+
interface Window {
|
|
5
|
+
androidWebViewInterface?: {
|
|
6
|
+
handleEventFromWebView: (eventName: string, data: any) => void;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
class NSWebViewinterface {
|
|
12
|
+
private eventListenerMap: { [eventName: string]: EventCallback[] };
|
|
13
|
+
private _iosResponseMap: { [resId: number]: any };
|
|
14
|
+
private _iosCntResponseId: number;
|
|
15
|
+
|
|
16
|
+
constructor() {
|
|
17
|
+
this.eventListenerMap = {};
|
|
18
|
+
this._iosResponseMap = {};
|
|
19
|
+
this._iosCntResponseId = 0;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private _onNativeEvent(eventName: string, data: any): void {
|
|
23
|
+
const lstEvtListeners = this.eventListenerMap[eventName] || [];
|
|
24
|
+
for (let _i = 0; _i < lstEvtListeners.length; _i++) {
|
|
25
|
+
const listener = lstEvtListeners[_i];
|
|
26
|
+
const retnVal = listener && listener(data);
|
|
27
|
+
if (retnVal === false) {
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private _callJSFunction(reqId: number, functionName: string, args: any[]): void {
|
|
34
|
+
const resolvedFn = this._getResolvedFunction(functionName);
|
|
35
|
+
if(resolvedFn){
|
|
36
|
+
const retnVal = resolvedFn.apply(window, args);
|
|
37
|
+
if (retnVal && retnVal.then) {
|
|
38
|
+
retnVal.then(
|
|
39
|
+
(value: any) => this._sendJSCallResponse(reqId, value),
|
|
40
|
+
(error: any) => this._sendJSCallResponse(reqId, error, true)
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this._sendJSCallResponse(reqId, retnVal);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private _getResolvedFunction(functionName: string): Function | null {
|
|
50
|
+
if(functionName && (functionName = functionName.trim()).length){
|
|
51
|
+
functionName = functionName.indexOf('window.') === 0 ? functionName.replace('window.', '') : functionName;
|
|
52
|
+
const arrFnPath = functionName.split('.');
|
|
53
|
+
let fn: any = window;
|
|
54
|
+
for(let i = 0; i < arrFnPath.length; i++){
|
|
55
|
+
if(!fn[arrFnPath[i]]){
|
|
56
|
+
fn = null;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
fn = fn[arrFnPath[i]];
|
|
60
|
+
}
|
|
61
|
+
return typeof fn === 'function' ? fn : null;
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private _sendJSCallResponse(reqId: number, response: any, isError?: boolean): void {
|
|
67
|
+
const oResponse = {
|
|
68
|
+
reqId: reqId,
|
|
69
|
+
response: response ?? null,
|
|
70
|
+
isError: !!isError
|
|
71
|
+
};
|
|
72
|
+
this.emit('_jsCallResponse', oResponse);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private _createIFrame(src: string): HTMLIFrameElement {
|
|
76
|
+
const rootElm = document.documentElement;
|
|
77
|
+
const newFrameElm = document.createElement("IFRAME") as HTMLIFrameElement;
|
|
78
|
+
newFrameElm.setAttribute("src", src);
|
|
79
|
+
rootElm.appendChild(newFrameElm);
|
|
80
|
+
return newFrameElm;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private _emitEventToIOS(eventName: string, data: any): void {
|
|
84
|
+
this._iosResponseMap[++this._iosCntResponseId] = data;
|
|
85
|
+
const metadata = { eventName: eventName, resId: this._iosCntResponseId };
|
|
86
|
+
const url = 'js2ios:' + JSON.stringify(metadata);
|
|
87
|
+
const iFrame = this._createIFrame(url);
|
|
88
|
+
iFrame.parentNode?.removeChild(iFrame);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private _getIOSResponse(resId: number): any {
|
|
92
|
+
const response = this._iosResponseMap[resId];
|
|
93
|
+
delete this._iosResponseMap[resId];
|
|
94
|
+
return response;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private _emitEventToAndroid(eventName: string, data: any): void {
|
|
98
|
+
window.androidWebViewInterface?.handleEventFromWebView(eventName, data);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
public on(eventName: string, callback: EventCallback): void {
|
|
102
|
+
const lstListeners = this.eventListenerMap[eventName] || (this.eventListenerMap[eventName] = []);
|
|
103
|
+
lstListeners.push(callback);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public removeListener(eventName: string, callback: EventCallback): void {
|
|
107
|
+
const listeners = this.eventListenerMap[eventName];
|
|
108
|
+
if (listeners) {
|
|
109
|
+
// Belirtilen geri çağırma işlevini kaldır
|
|
110
|
+
this.eventListenerMap[eventName] = listeners.filter(listener => listener !== callback);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public emit(eventName: string, data: any): void {
|
|
115
|
+
const strData = typeof data === 'object' ? JSON.stringify(data) : data;
|
|
116
|
+
if (window.androidWebViewInterface) {
|
|
117
|
+
this._emitEventToAndroid(eventName, strData);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
this._emitEventToIOS(eventName, strData);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export { NSWebViewinterface };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Service } from "../../../types/Service";
|
|
2
|
+
import { ServiceOts } from "../../../types/ServiceOts";
|
|
3
|
+
import { ServiceResponse } from "../../../types/ServiceResponse";
|
|
4
|
+
import { ServiceSetupOptions } from "../../../types/ServiceSetupOptions";
|
|
5
|
+
|
|
6
|
+
export type FetchBrowserServiceOts = ServiceOts & {
|
|
7
|
+
usedService: {
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class FetchBrowserService extends Service {
|
|
12
|
+
static serviceInfo = {
|
|
13
|
+
name: "FetchBrowserService",
|
|
14
|
+
requiredServices: [],
|
|
15
|
+
}
|
|
16
|
+
protected async onSetup(options?: ServiceSetupOptions): Promise<ServiceResponse> {
|
|
17
|
+
|
|
18
|
+
return { status: "success", message: "onSetup complete" };
|
|
19
|
+
}
|
|
20
|
+
protected async onStart(): Promise<ServiceResponse> {
|
|
21
|
+
return { status: "success", message: "onStart complete" };
|
|
22
|
+
}
|
|
23
|
+
protected async onStop(): Promise<ServiceResponse> {
|
|
24
|
+
return { status: "success", message: "onStop complete" };
|
|
25
|
+
}
|
|
26
|
+
protected async onDestroy(): Promise<ServiceResponse> {
|
|
27
|
+
return { status: "success", message: "onDestroy complete" };
|
|
28
|
+
}
|
|
29
|
+
constructor(ots: FetchBrowserServiceOts) {
|
|
30
|
+
super({ ...ots });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public async sendFetchRequest(url: string, options?: RequestInit) {
|
|
34
|
+
const response = await fetch(url, options);
|
|
35
|
+
return response;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|