@retion-miniapp/sdk 0.1.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/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +135 -0
- package/dist/chunk-C2AZ33LI.cjs +175 -0
- package/dist/chunk-C2AZ33LI.cjs.map +1 -0
- package/dist/chunk-PVXYU6XK.js +165 -0
- package/dist/chunk-PVXYU6XK.js.map +1 -0
- package/dist/index.cjs +132 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +131 -0
- package/dist/index.d.ts +131 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/types-8g8OpZsj.d.cts +65 -0
- package/dist/types-8g8OpZsj.d.ts +65 -0
- package/dist/vue/index.cjs +19 -0
- package/dist/vue/index.cjs.map +1 -0
- package/dist/vue/index.d.cts +13 -0
- package/dist/vue/index.d.ts +13 -0
- package/dist/vue/index.js +17 -0
- package/dist/vue/index.js.map +1 -0
- package/package.json +97 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkC2AZ33LI_cjs = require('./chunk-C2AZ33LI.cjs');
|
|
4
|
+
|
|
5
|
+
// src/invoke.ts
|
|
6
|
+
var invoke = (method, params, options) => {
|
|
7
|
+
const promise = chunkC2AZ33LI_cjs.call(method, params);
|
|
8
|
+
if ((options == null ? void 0 : options.success) || (options == null ? void 0 : options.fail)) {
|
|
9
|
+
promise.then(options.success, (error) => {
|
|
10
|
+
var _a;
|
|
11
|
+
return (_a = options.fail) == null ? void 0 : _a.call(options, chunkC2AZ33LI_cjs.MiniAppError.from(error, method));
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
return promise;
|
|
15
|
+
};
|
|
16
|
+
var splitOptions = (options) => {
|
|
17
|
+
const { success, fail, ...params } = options;
|
|
18
|
+
return [params, { success, fail }];
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// src/version.ts
|
|
22
|
+
var SDK_VERSION = "0.1.0" ;
|
|
23
|
+
|
|
24
|
+
// src/apis/app.ts
|
|
25
|
+
var closeApp = (options) => invoke("closeApp", void 0, options);
|
|
26
|
+
var openWebview = (options) => {
|
|
27
|
+
var _a, _b;
|
|
28
|
+
const [params, callbacks] = splitOptions(options);
|
|
29
|
+
if (!/^https?:\/\//i.test((_a = params.url) != null ? _a : "")) {
|
|
30
|
+
const error = new chunkC2AZ33LI_cjs.MiniAppError(chunkC2AZ33LI_cjs.ErrorCode.INVALID_PARAMS, "url ph\u1EA3i b\u1EAFt \u0111\u1EA7u b\u1EB1ng http:// ho\u1EB7c https://", "openWebview");
|
|
31
|
+
(_b = callbacks.fail) == null ? void 0 : _b.call(callbacks, error);
|
|
32
|
+
return Promise.reject(error);
|
|
33
|
+
}
|
|
34
|
+
return invoke("openWebview", params, callbacks);
|
|
35
|
+
};
|
|
36
|
+
var showToast = (options) => {
|
|
37
|
+
const [params, callbacks] = splitOptions(options);
|
|
38
|
+
return invoke("showToast", params, callbacks);
|
|
39
|
+
};
|
|
40
|
+
var getSystemInfo = async (options) => {
|
|
41
|
+
var _a, _b, _c;
|
|
42
|
+
const base = { platform: "web", sdkVersion: SDK_VERSION, inHost: chunkC2AZ33LI_cjs.isInHost() };
|
|
43
|
+
if (!chunkC2AZ33LI_cjs.isInHost()) {
|
|
44
|
+
(_a = options == null ? void 0 : options.success) == null ? void 0 : _a.call(options, base);
|
|
45
|
+
return base;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const host = await invoke("getSystemInfo");
|
|
49
|
+
const result = { ...base, ...host, sdkVersion: SDK_VERSION, inHost: true };
|
|
50
|
+
(_b = options == null ? void 0 : options.success) == null ? void 0 : _b.call(options, result);
|
|
51
|
+
return result;
|
|
52
|
+
} catch (error) {
|
|
53
|
+
const normalized = chunkC2AZ33LI_cjs.MiniAppError.from(error, "getSystemInfo");
|
|
54
|
+
(_c = options == null ? void 0 : options.fail) == null ? void 0 : _c.call(options, normalized);
|
|
55
|
+
throw normalized;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
var notifyReady = () => chunkC2AZ33LI_cjs.notify("ready", { sdkVersion: SDK_VERSION });
|
|
59
|
+
|
|
60
|
+
// src/apis/user.ts
|
|
61
|
+
var getAccessToken = (options) => invoke("getAccessToken", void 0, options);
|
|
62
|
+
var getUserInfo = (options) => invoke("getUserInfo", void 0, options);
|
|
63
|
+
|
|
64
|
+
// src/apis/page.ts
|
|
65
|
+
var getPageInfo = (options) => invoke("getPageInfo", void 0, options);
|
|
66
|
+
|
|
67
|
+
// src/apis/chat.ts
|
|
68
|
+
var withText = (method, options) => {
|
|
69
|
+
var _a;
|
|
70
|
+
const [params, callbacks] = splitOptions(options);
|
|
71
|
+
if (typeof params.text !== "string" || !params.text.trim()) {
|
|
72
|
+
const error = new chunkC2AZ33LI_cjs.MiniAppError(chunkC2AZ33LI_cjs.ErrorCode.INVALID_PARAMS, "text kh\xF4ng \u0111\u01B0\u1EE3c r\u1ED7ng", method);
|
|
73
|
+
(_a = callbacks.fail) == null ? void 0 : _a.call(callbacks, error);
|
|
74
|
+
return Promise.reject(error);
|
|
75
|
+
}
|
|
76
|
+
return invoke(method, params, callbacks);
|
|
77
|
+
};
|
|
78
|
+
var sendMessage = (options) => withText("sendMessage", options);
|
|
79
|
+
var insertText = (options) => withText("insertText", options);
|
|
80
|
+
|
|
81
|
+
// src/apis/dev.ts
|
|
82
|
+
var setMockHandler = (handler) => {
|
|
83
|
+
chunkC2AZ33LI_cjs.getState().mock = handler;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// src/index.ts
|
|
87
|
+
if (typeof window !== "undefined") {
|
|
88
|
+
chunkC2AZ33LI_cjs.getState();
|
|
89
|
+
if (document.readyState === "loading") {
|
|
90
|
+
document.addEventListener("DOMContentLoaded", notifyReady, { once: true });
|
|
91
|
+
} else {
|
|
92
|
+
queueMicrotask(notifyReady);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
Object.defineProperty(exports, "ErrorCode", {
|
|
97
|
+
enumerable: true,
|
|
98
|
+
get: function () { return chunkC2AZ33LI_cjs.ErrorCode; }
|
|
99
|
+
});
|
|
100
|
+
Object.defineProperty(exports, "MiniAppError", {
|
|
101
|
+
enumerable: true,
|
|
102
|
+
get: function () { return chunkC2AZ33LI_cjs.MiniAppError; }
|
|
103
|
+
});
|
|
104
|
+
Object.defineProperty(exports, "PROTOCOL_VERSION", {
|
|
105
|
+
enumerable: true,
|
|
106
|
+
get: function () { return chunkC2AZ33LI_cjs.PROTOCOL_VERSION; }
|
|
107
|
+
});
|
|
108
|
+
Object.defineProperty(exports, "getRouteParams", {
|
|
109
|
+
enumerable: true,
|
|
110
|
+
get: function () { return chunkC2AZ33LI_cjs.getRouteParams; }
|
|
111
|
+
});
|
|
112
|
+
Object.defineProperty(exports, "isInHost", {
|
|
113
|
+
enumerable: true,
|
|
114
|
+
get: function () { return chunkC2AZ33LI_cjs.isInHost; }
|
|
115
|
+
});
|
|
116
|
+
Object.defineProperty(exports, "onContextChange", {
|
|
117
|
+
enumerable: true,
|
|
118
|
+
get: function () { return chunkC2AZ33LI_cjs.onContextChange; }
|
|
119
|
+
});
|
|
120
|
+
exports.SDK_VERSION = SDK_VERSION;
|
|
121
|
+
exports.closeApp = closeApp;
|
|
122
|
+
exports.getAccessToken = getAccessToken;
|
|
123
|
+
exports.getPageInfo = getPageInfo;
|
|
124
|
+
exports.getSystemInfo = getSystemInfo;
|
|
125
|
+
exports.getUserInfo = getUserInfo;
|
|
126
|
+
exports.insertText = insertText;
|
|
127
|
+
exports.openWebview = openWebview;
|
|
128
|
+
exports.sendMessage = sendMessage;
|
|
129
|
+
exports.setMockHandler = setMockHandler;
|
|
130
|
+
exports.showToast = showToast;
|
|
131
|
+
//# sourceMappingURL=index.cjs.map
|
|
132
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/invoke.ts","../src/version.ts","../src/apis/app.ts","../src/apis/user.ts","../src/apis/page.ts","../src/apis/chat.ts","../src/apis/dev.ts","../src/index.ts"],"names":["call","MiniAppError","ErrorCode","isInHost","notify","getState"],"mappings":"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","file":"index.cjs","sourcesContent":["import { call } from './bridge';\nimport { MiniAppError } from './errors';\nimport type { CallbackOptions } from './types';\n\n/**\n * Gọi API host, hỗ trợ cả 2 kiểu: `await api()` và `api({ success, fail })`.\n * Có callback `fail` → promise vẫn reject (người dùng await vẫn bắt được), nhưng không gây\n * \"unhandled rejection\" khi họ chỉ dùng callback.\n */\nexport const invoke = <T>(method: string, params?: unknown, options?: CallbackOptions<T>): Promise<T> => {\n const promise = call<T>(method, params);\n if (options?.success || options?.fail) {\n promise.then(options.success, (error: unknown) => options.fail?.(MiniAppError.from(error, method)));\n }\n return promise;\n};\n\n/** Tách callback ra khỏi object tham số: `{ url, success, fail }` → `[{ url }, { success, fail }]`. */\nexport const splitOptions = <P extends object, T>(\n options: P & CallbackOptions<T>,\n): [Omit<P, keyof CallbackOptions<T>>, CallbackOptions<T>] => {\n const { success, fail, ...params } = options;\n return [params, { success, fail }];\n};\n","declare const __SDK_VERSION__: string;\n\n/** Thay lúc build (tsup define) / test (vitest define) bằng version trong package.json. */\nexport const SDK_VERSION: string = typeof __SDK_VERSION__ === 'string' ? __SDK_VERSION__ : '0.0.0-dev';\n","import { isInHost, notify } from '../bridge';\nimport { ErrorCode, MiniAppError } from '../errors';\nimport { invoke, splitOptions } from '../invoke';\nimport type { CallbackOptions, SystemInfo } from '../types';\nimport { SDK_VERSION } from '../version';\n\n/** Đóng mini app. */\nexport const closeApp = (options?: CallbackOptions<void>): Promise<void> => invoke('closeApp', undefined, options);\n\n/** Mở link ngoài bằng trình duyệt trong app. Chỉ chấp nhận http(s). */\nexport const openWebview = (options: { url: string } & CallbackOptions<void>): Promise<void> => {\n const [params, callbacks] = splitOptions(options);\n if (!/^https?:\\/\\//i.test(params.url ?? '')) {\n const error = new MiniAppError(ErrorCode.INVALID_PARAMS, 'url phải bắt đầu bằng http:// hoặc https://', 'openWebview');\n callbacks.fail?.(error);\n return Promise.reject(error);\n }\n return invoke('openWebview', params, callbacks);\n};\n\n/** Hiện toast native. */\nexport const showToast = (options: { message: string } & CallbackOptions<void>): Promise<void> => {\n const [params, callbacks] = splitOptions(options);\n return invoke('showToast', params, callbacks);\n};\n\n/** Thông tin thiết bị / host. Ngoài app trả giá trị mặc định thay vì lỗi. */\nexport const getSystemInfo = async (options?: CallbackOptions<SystemInfo>): Promise<SystemInfo> => {\n const base: SystemInfo = { platform: 'web', sdkVersion: SDK_VERSION, inHost: isInHost() };\n if (!isInHost()) {\n options?.success?.(base);\n return base;\n }\n try {\n const host = await invoke<Partial<SystemInfo>>('getSystemInfo');\n const result: SystemInfo = { ...base, ...host, sdkVersion: SDK_VERSION, inHost: true };\n options?.success?.(result);\n return result;\n } catch (error) {\n const normalized = MiniAppError.from(error, 'getSystemInfo');\n options?.fail?.(normalized);\n throw normalized;\n }\n};\n\n/** @internal SDK tự gọi khi trang sẵn sàng — host đẩy context mới nhất nếu đổi trong lúc load. */\nexport const notifyReady = (): void => notify('ready', { sdkVersion: SDK_VERSION });\n","import { invoke } from '../invoke';\nimport type { CallbackOptions, UserInfo } from '../types';\n\n/**\n * Access token của mini app cho PAGE hiện tại (mỗi page 1 token). Host tự refresh →\n * gọi lại mỗi khi cần thay vì lưu lâu phía web.\n */\nexport const getAccessToken = (options?: CallbackOptions<string>): Promise<string> =>\n invoke('getAccessToken', undefined, options);\n\n/** Nhân viên đang đăng nhập app. */\nexport const getUserInfo = (options?: CallbackOptions<UserInfo>): Promise<UserInfo> =>\n invoke('getUserInfo', undefined, options);\n","import { invoke } from '../invoke';\nimport type { CallbackOptions, PageInfo } from '../types';\n\n/**\n * Page (kênh) đang mở mini app. Mini app được cài theo page — mỗi page có token, quyền,\n * dữ liệu riêng; host chạy 1 instance mini app cho mỗi page (đổi page = instance khác).\n */\nexport const getPageInfo = (options?: CallbackOptions<PageInfo>): Promise<PageInfo> =>\n invoke('getPageInfo', undefined, options);\n","import { ErrorCode, MiniAppError } from '../errors';\nimport { invoke, splitOptions } from '../invoke';\nimport type { CallbackOptions } from '../types';\n\ntype TextOptions = { text: string } & CallbackOptions<void>;\n\nconst withText = (method: string, options: TextOptions): Promise<void> => {\n const [params, callbacks] = splitOptions(options);\n if (typeof params.text !== 'string' || !params.text.trim()) {\n const error = new MiniAppError(ErrorCode.INVALID_PARAMS, 'text không được rỗng', method);\n callbacks.fail?.(error);\n return Promise.reject(error);\n }\n return invoke(method, params, callbacks);\n};\n\n/** Gửi tin nhắn vào conversation đang mở mini app. */\nexport const sendMessage = (options: TextOptions): Promise<void> => withText('sendMessage', options);\n\n/** Chèn text vào ô nhập chat (không gửi) — nhân viên tự sửa/gửi. */\nexport const insertText = (options: TextOptions): Promise<void> => withText('insertText', options);\n","import { getState } from '../bridge';\nimport type { MockHandler } from '../types';\n\n/**\n * Giả lập host khi dev trên trình duyệt. Không có tác dụng khi chạy trong app.\n * @example\n * if (import.meta.env.DEV) {\n * setMockHandler((method) => (method === 'getAccessToken' ? 'dev-token' : undefined));\n * }\n */\nexport const setMockHandler = (handler: MockHandler | null): void => {\n getState().mock = handler;\n};\n","import { getState } from './bridge';\nimport { notifyReady } from './apis/app';\n\nexport { getRouteParams, onContextChange } from './apis/route';\nexport { closeApp, openWebview, showToast, getSystemInfo } from './apis/app';\nexport { getAccessToken, getUserInfo } from './apis/user';\nexport { getPageInfo } from './apis/page';\nexport { sendMessage, insertText } from './apis/chat';\nexport { setMockHandler } from './apis/dev';\nexport { isInHost, PROTOCOL_VERSION } from './bridge';\nexport { MiniAppError, ErrorCode } from './errors';\nexport { SDK_VERSION } from './version';\nexport type { RouteParams, CallbackOptions, UserInfo, SystemInfo, PageInfo, MockHandler } from './types';\nexport type { HostInfo } from './bridge';\n\n// Khởi tạo bridge ngay khi import (host có thể đẩy event trước khi app gọi API nào),\n// rồi báo \"ready\" khi DOM sẵn sàng.\nif (typeof window !== 'undefined') {\n getState();\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', notifyReady, { once: true });\n } else {\n queueMicrotask(notifyReady);\n }\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { R as RouteParams, C as CallbackOptions, S as SystemInfo, U as UserInfo, P as PageInfo, M as MockHandler, a as MiniAppError } from './types-8g8OpZsj.cjs';
|
|
2
|
+
export { E as ErrorCode } from './types-8g8OpZsj.cjs';
|
|
3
|
+
|
|
4
|
+
type ContextListener = (next: RouteParams, prev: RouteParams) => void;
|
|
5
|
+
/**
|
|
6
|
+
* Param lúc mở mini app: query URL + context host inject (host ưu tiên).
|
|
7
|
+
* @example
|
|
8
|
+
* const { client_id, org_id } = getRouteParams();
|
|
9
|
+
*/
|
|
10
|
+
declare const getRouteParams: () => RouteParams;
|
|
11
|
+
/**
|
|
12
|
+
* Host đổi conversation mà KHÔNG reload mini app — chỉ xảy ra khi `miniapp.config.json`
|
|
13
|
+
* có `context_update: true`. Nếu không, host reload với query mới và getRouteParams() vẫn đúng.
|
|
14
|
+
* @returns hàm huỷ đăng ký
|
|
15
|
+
*/
|
|
16
|
+
declare const onContextChange: (listener: ContextListener) => (() => void);
|
|
17
|
+
|
|
18
|
+
/** Đóng mini app. */
|
|
19
|
+
declare const closeApp: (options?: CallbackOptions<void>) => Promise<void>;
|
|
20
|
+
/** Mở link ngoài bằng trình duyệt trong app. Chỉ chấp nhận http(s). */
|
|
21
|
+
declare const openWebview: (options: {
|
|
22
|
+
url: string;
|
|
23
|
+
} & CallbackOptions<void>) => Promise<void>;
|
|
24
|
+
/** Hiện toast native. */
|
|
25
|
+
declare const showToast: (options: {
|
|
26
|
+
message: string;
|
|
27
|
+
} & CallbackOptions<void>) => Promise<void>;
|
|
28
|
+
/** Thông tin thiết bị / host. Ngoài app trả giá trị mặc định thay vì lỗi. */
|
|
29
|
+
declare const getSystemInfo: (options?: CallbackOptions<SystemInfo>) => Promise<SystemInfo>;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Access token của mini app cho PAGE hiện tại (mỗi page 1 token). Host tự refresh →
|
|
33
|
+
* gọi lại mỗi khi cần thay vì lưu lâu phía web.
|
|
34
|
+
*/
|
|
35
|
+
declare const getAccessToken: (options?: CallbackOptions<string>) => Promise<string>;
|
|
36
|
+
/** Nhân viên đang đăng nhập app. */
|
|
37
|
+
declare const getUserInfo: (options?: CallbackOptions<UserInfo>) => Promise<UserInfo>;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Page (kênh) đang mở mini app. Mini app được cài theo page — mỗi page có token, quyền,
|
|
41
|
+
* dữ liệu riêng; host chạy 1 instance mini app cho mỗi page (đổi page = instance khác).
|
|
42
|
+
*/
|
|
43
|
+
declare const getPageInfo: (options?: CallbackOptions<PageInfo>) => Promise<PageInfo>;
|
|
44
|
+
|
|
45
|
+
type TextOptions = {
|
|
46
|
+
text: string;
|
|
47
|
+
} & CallbackOptions<void>;
|
|
48
|
+
/** Gửi tin nhắn vào conversation đang mở mini app. */
|
|
49
|
+
declare const sendMessage: (options: TextOptions) => Promise<void>;
|
|
50
|
+
/** Chèn text vào ô nhập chat (không gửi) — nhân viên tự sửa/gửi. */
|
|
51
|
+
declare const insertText: (options: TextOptions) => Promise<void>;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Giả lập host khi dev trên trình duyệt. Không có tác dụng khi chạy trong app.
|
|
55
|
+
* @example
|
|
56
|
+
* if (import.meta.env.DEV) {
|
|
57
|
+
* setMockHandler((method) => (method === 'getAccessToken' ? 'dev-token' : undefined));
|
|
58
|
+
* }
|
|
59
|
+
*/
|
|
60
|
+
declare const setMockHandler: (handler: MockHandler | null) => void;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Bridge web mini app ↔ host (app Retion). Nội bộ SDK — dev mini app không import trực tiếp.
|
|
64
|
+
*
|
|
65
|
+
* Giao thức v1
|
|
66
|
+
* web → host : ReactNativeWebView.postMessage(JSON.stringify(RequestMessage))
|
|
67
|
+
* host → web : window.__RETION_MINIAPP__.receive(ResponseMessage | EventMessage)
|
|
68
|
+
* host inject trước khi trang chạy:
|
|
69
|
+
* window.__RETION_MINIAPP_HOST__ = { protocol } ← đánh dấu host hỗ trợ SDK
|
|
70
|
+
* window.__RETION_MINIAPP_CONTEXT__ = RouteParams ← context ban đầu
|
|
71
|
+
*
|
|
72
|
+
* Chỉ có ReactNativeWebView KHÔNG đủ để coi là host: màn iframe cũ của app cũng là RN WebView
|
|
73
|
+
* nhưng không hiểu giao thức này (gọi API sẽ treo tới timeout). Thiếu marker → NOT_IN_HOST ngay.
|
|
74
|
+
*
|
|
75
|
+
* State đặt trên window (singleton): nhiều bản SDK trong cùng trang (trùng version trong
|
|
76
|
+
* node_modules) vẫn dùng chung 1 bridge thay vì ghi đè hàm receive của nhau.
|
|
77
|
+
*/
|
|
78
|
+
|
|
79
|
+
declare const PROTOCOL_VERSION = 1;
|
|
80
|
+
type ResponseMessage = {
|
|
81
|
+
id: string;
|
|
82
|
+
result?: unknown;
|
|
83
|
+
error?: undefined;
|
|
84
|
+
} | {
|
|
85
|
+
id: string;
|
|
86
|
+
error: {
|
|
87
|
+
code: string;
|
|
88
|
+
message: string;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
interface EventMessage {
|
|
92
|
+
event: string;
|
|
93
|
+
data?: unknown;
|
|
94
|
+
}
|
|
95
|
+
interface HostInfo {
|
|
96
|
+
/** Phiên bản giao thức host hỗ trợ. */
|
|
97
|
+
protocol: number;
|
|
98
|
+
}
|
|
99
|
+
type Listener = (data: unknown) => void;
|
|
100
|
+
interface Pending {
|
|
101
|
+
method: string;
|
|
102
|
+
resolve: (value: unknown) => void;
|
|
103
|
+
reject: (error: MiniAppError) => void;
|
|
104
|
+
timer: ReturnType<typeof setTimeout>;
|
|
105
|
+
}
|
|
106
|
+
interface BridgeState {
|
|
107
|
+
protocol: number;
|
|
108
|
+
seq: number;
|
|
109
|
+
pending: Map<string, Pending>;
|
|
110
|
+
listeners: Map<string, Set<Listener>>;
|
|
111
|
+
mock: MockHandler | null;
|
|
112
|
+
context: RouteParams;
|
|
113
|
+
receive: (message: ResponseMessage | EventMessage) => void;
|
|
114
|
+
}
|
|
115
|
+
declare global {
|
|
116
|
+
interface Window {
|
|
117
|
+
ReactNativeWebView?: {
|
|
118
|
+
postMessage: (message: string) => void;
|
|
119
|
+
};
|
|
120
|
+
__RETION_MINIAPP__?: BridgeState;
|
|
121
|
+
__RETION_MINIAPP_CONTEXT__?: RouteParams;
|
|
122
|
+
__RETION_MINIAPP_HOST__?: HostInfo;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** Đang chạy trong app Retion có hỗ trợ SDK (host đã inject marker + kênh postMessage). */
|
|
126
|
+
declare const isInHost: () => boolean;
|
|
127
|
+
|
|
128
|
+
/** Thay lúc build (tsup define) / test (vitest define) bằng version trong package.json. */
|
|
129
|
+
declare const SDK_VERSION: string;
|
|
130
|
+
|
|
131
|
+
export { CallbackOptions, type HostInfo, MiniAppError, MockHandler, PROTOCOL_VERSION, PageInfo, RouteParams, SDK_VERSION, SystemInfo, UserInfo, closeApp, getAccessToken, getPageInfo, getRouteParams, getSystemInfo, getUserInfo, insertText, isInHost, onContextChange, openWebview, sendMessage, setMockHandler, showToast };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { R as RouteParams, C as CallbackOptions, S as SystemInfo, U as UserInfo, P as PageInfo, M as MockHandler, a as MiniAppError } from './types-8g8OpZsj.js';
|
|
2
|
+
export { E as ErrorCode } from './types-8g8OpZsj.js';
|
|
3
|
+
|
|
4
|
+
type ContextListener = (next: RouteParams, prev: RouteParams) => void;
|
|
5
|
+
/**
|
|
6
|
+
* Param lúc mở mini app: query URL + context host inject (host ưu tiên).
|
|
7
|
+
* @example
|
|
8
|
+
* const { client_id, org_id } = getRouteParams();
|
|
9
|
+
*/
|
|
10
|
+
declare const getRouteParams: () => RouteParams;
|
|
11
|
+
/**
|
|
12
|
+
* Host đổi conversation mà KHÔNG reload mini app — chỉ xảy ra khi `miniapp.config.json`
|
|
13
|
+
* có `context_update: true`. Nếu không, host reload với query mới và getRouteParams() vẫn đúng.
|
|
14
|
+
* @returns hàm huỷ đăng ký
|
|
15
|
+
*/
|
|
16
|
+
declare const onContextChange: (listener: ContextListener) => (() => void);
|
|
17
|
+
|
|
18
|
+
/** Đóng mini app. */
|
|
19
|
+
declare const closeApp: (options?: CallbackOptions<void>) => Promise<void>;
|
|
20
|
+
/** Mở link ngoài bằng trình duyệt trong app. Chỉ chấp nhận http(s). */
|
|
21
|
+
declare const openWebview: (options: {
|
|
22
|
+
url: string;
|
|
23
|
+
} & CallbackOptions<void>) => Promise<void>;
|
|
24
|
+
/** Hiện toast native. */
|
|
25
|
+
declare const showToast: (options: {
|
|
26
|
+
message: string;
|
|
27
|
+
} & CallbackOptions<void>) => Promise<void>;
|
|
28
|
+
/** Thông tin thiết bị / host. Ngoài app trả giá trị mặc định thay vì lỗi. */
|
|
29
|
+
declare const getSystemInfo: (options?: CallbackOptions<SystemInfo>) => Promise<SystemInfo>;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Access token của mini app cho PAGE hiện tại (mỗi page 1 token). Host tự refresh →
|
|
33
|
+
* gọi lại mỗi khi cần thay vì lưu lâu phía web.
|
|
34
|
+
*/
|
|
35
|
+
declare const getAccessToken: (options?: CallbackOptions<string>) => Promise<string>;
|
|
36
|
+
/** Nhân viên đang đăng nhập app. */
|
|
37
|
+
declare const getUserInfo: (options?: CallbackOptions<UserInfo>) => Promise<UserInfo>;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Page (kênh) đang mở mini app. Mini app được cài theo page — mỗi page có token, quyền,
|
|
41
|
+
* dữ liệu riêng; host chạy 1 instance mini app cho mỗi page (đổi page = instance khác).
|
|
42
|
+
*/
|
|
43
|
+
declare const getPageInfo: (options?: CallbackOptions<PageInfo>) => Promise<PageInfo>;
|
|
44
|
+
|
|
45
|
+
type TextOptions = {
|
|
46
|
+
text: string;
|
|
47
|
+
} & CallbackOptions<void>;
|
|
48
|
+
/** Gửi tin nhắn vào conversation đang mở mini app. */
|
|
49
|
+
declare const sendMessage: (options: TextOptions) => Promise<void>;
|
|
50
|
+
/** Chèn text vào ô nhập chat (không gửi) — nhân viên tự sửa/gửi. */
|
|
51
|
+
declare const insertText: (options: TextOptions) => Promise<void>;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Giả lập host khi dev trên trình duyệt. Không có tác dụng khi chạy trong app.
|
|
55
|
+
* @example
|
|
56
|
+
* if (import.meta.env.DEV) {
|
|
57
|
+
* setMockHandler((method) => (method === 'getAccessToken' ? 'dev-token' : undefined));
|
|
58
|
+
* }
|
|
59
|
+
*/
|
|
60
|
+
declare const setMockHandler: (handler: MockHandler | null) => void;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Bridge web mini app ↔ host (app Retion). Nội bộ SDK — dev mini app không import trực tiếp.
|
|
64
|
+
*
|
|
65
|
+
* Giao thức v1
|
|
66
|
+
* web → host : ReactNativeWebView.postMessage(JSON.stringify(RequestMessage))
|
|
67
|
+
* host → web : window.__RETION_MINIAPP__.receive(ResponseMessage | EventMessage)
|
|
68
|
+
* host inject trước khi trang chạy:
|
|
69
|
+
* window.__RETION_MINIAPP_HOST__ = { protocol } ← đánh dấu host hỗ trợ SDK
|
|
70
|
+
* window.__RETION_MINIAPP_CONTEXT__ = RouteParams ← context ban đầu
|
|
71
|
+
*
|
|
72
|
+
* Chỉ có ReactNativeWebView KHÔNG đủ để coi là host: màn iframe cũ của app cũng là RN WebView
|
|
73
|
+
* nhưng không hiểu giao thức này (gọi API sẽ treo tới timeout). Thiếu marker → NOT_IN_HOST ngay.
|
|
74
|
+
*
|
|
75
|
+
* State đặt trên window (singleton): nhiều bản SDK trong cùng trang (trùng version trong
|
|
76
|
+
* node_modules) vẫn dùng chung 1 bridge thay vì ghi đè hàm receive của nhau.
|
|
77
|
+
*/
|
|
78
|
+
|
|
79
|
+
declare const PROTOCOL_VERSION = 1;
|
|
80
|
+
type ResponseMessage = {
|
|
81
|
+
id: string;
|
|
82
|
+
result?: unknown;
|
|
83
|
+
error?: undefined;
|
|
84
|
+
} | {
|
|
85
|
+
id: string;
|
|
86
|
+
error: {
|
|
87
|
+
code: string;
|
|
88
|
+
message: string;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
interface EventMessage {
|
|
92
|
+
event: string;
|
|
93
|
+
data?: unknown;
|
|
94
|
+
}
|
|
95
|
+
interface HostInfo {
|
|
96
|
+
/** Phiên bản giao thức host hỗ trợ. */
|
|
97
|
+
protocol: number;
|
|
98
|
+
}
|
|
99
|
+
type Listener = (data: unknown) => void;
|
|
100
|
+
interface Pending {
|
|
101
|
+
method: string;
|
|
102
|
+
resolve: (value: unknown) => void;
|
|
103
|
+
reject: (error: MiniAppError) => void;
|
|
104
|
+
timer: ReturnType<typeof setTimeout>;
|
|
105
|
+
}
|
|
106
|
+
interface BridgeState {
|
|
107
|
+
protocol: number;
|
|
108
|
+
seq: number;
|
|
109
|
+
pending: Map<string, Pending>;
|
|
110
|
+
listeners: Map<string, Set<Listener>>;
|
|
111
|
+
mock: MockHandler | null;
|
|
112
|
+
context: RouteParams;
|
|
113
|
+
receive: (message: ResponseMessage | EventMessage) => void;
|
|
114
|
+
}
|
|
115
|
+
declare global {
|
|
116
|
+
interface Window {
|
|
117
|
+
ReactNativeWebView?: {
|
|
118
|
+
postMessage: (message: string) => void;
|
|
119
|
+
};
|
|
120
|
+
__RETION_MINIAPP__?: BridgeState;
|
|
121
|
+
__RETION_MINIAPP_CONTEXT__?: RouteParams;
|
|
122
|
+
__RETION_MINIAPP_HOST__?: HostInfo;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** Đang chạy trong app Retion có hỗ trợ SDK (host đã inject marker + kênh postMessage). */
|
|
126
|
+
declare const isInHost: () => boolean;
|
|
127
|
+
|
|
128
|
+
/** Thay lúc build (tsup define) / test (vitest define) bằng version trong package.json. */
|
|
129
|
+
declare const SDK_VERSION: string;
|
|
130
|
+
|
|
131
|
+
export { CallbackOptions, type HostInfo, MiniAppError, MockHandler, PROTOCOL_VERSION, PageInfo, RouteParams, SDK_VERSION, SystemInfo, UserInfo, closeApp, getAccessToken, getPageInfo, getRouteParams, getSystemInfo, getUserInfo, insertText, isInHost, onContextChange, openWebview, sendMessage, setMockHandler, showToast };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { getState, notify, MiniAppError, ErrorCode, isInHost, call } from './chunk-PVXYU6XK.js';
|
|
2
|
+
export { ErrorCode, MiniAppError, PROTOCOL_VERSION, getRouteParams, isInHost, onContextChange } from './chunk-PVXYU6XK.js';
|
|
3
|
+
|
|
4
|
+
// src/invoke.ts
|
|
5
|
+
var invoke = (method, params, options) => {
|
|
6
|
+
const promise = call(method, params);
|
|
7
|
+
if ((options == null ? void 0 : options.success) || (options == null ? void 0 : options.fail)) {
|
|
8
|
+
promise.then(options.success, (error) => {
|
|
9
|
+
var _a;
|
|
10
|
+
return (_a = options.fail) == null ? void 0 : _a.call(options, MiniAppError.from(error, method));
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
return promise;
|
|
14
|
+
};
|
|
15
|
+
var splitOptions = (options) => {
|
|
16
|
+
const { success, fail, ...params } = options;
|
|
17
|
+
return [params, { success, fail }];
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// src/version.ts
|
|
21
|
+
var SDK_VERSION = "0.1.0" ;
|
|
22
|
+
|
|
23
|
+
// src/apis/app.ts
|
|
24
|
+
var closeApp = (options) => invoke("closeApp", void 0, options);
|
|
25
|
+
var openWebview = (options) => {
|
|
26
|
+
var _a, _b;
|
|
27
|
+
const [params, callbacks] = splitOptions(options);
|
|
28
|
+
if (!/^https?:\/\//i.test((_a = params.url) != null ? _a : "")) {
|
|
29
|
+
const error = new MiniAppError(ErrorCode.INVALID_PARAMS, "url ph\u1EA3i b\u1EAFt \u0111\u1EA7u b\u1EB1ng http:// ho\u1EB7c https://", "openWebview");
|
|
30
|
+
(_b = callbacks.fail) == null ? void 0 : _b.call(callbacks, error);
|
|
31
|
+
return Promise.reject(error);
|
|
32
|
+
}
|
|
33
|
+
return invoke("openWebview", params, callbacks);
|
|
34
|
+
};
|
|
35
|
+
var showToast = (options) => {
|
|
36
|
+
const [params, callbacks] = splitOptions(options);
|
|
37
|
+
return invoke("showToast", params, callbacks);
|
|
38
|
+
};
|
|
39
|
+
var getSystemInfo = async (options) => {
|
|
40
|
+
var _a, _b, _c;
|
|
41
|
+
const base = { platform: "web", sdkVersion: SDK_VERSION, inHost: isInHost() };
|
|
42
|
+
if (!isInHost()) {
|
|
43
|
+
(_a = options == null ? void 0 : options.success) == null ? void 0 : _a.call(options, base);
|
|
44
|
+
return base;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const host = await invoke("getSystemInfo");
|
|
48
|
+
const result = { ...base, ...host, sdkVersion: SDK_VERSION, inHost: true };
|
|
49
|
+
(_b = options == null ? void 0 : options.success) == null ? void 0 : _b.call(options, result);
|
|
50
|
+
return result;
|
|
51
|
+
} catch (error) {
|
|
52
|
+
const normalized = MiniAppError.from(error, "getSystemInfo");
|
|
53
|
+
(_c = options == null ? void 0 : options.fail) == null ? void 0 : _c.call(options, normalized);
|
|
54
|
+
throw normalized;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var notifyReady = () => notify("ready", { sdkVersion: SDK_VERSION });
|
|
58
|
+
|
|
59
|
+
// src/apis/user.ts
|
|
60
|
+
var getAccessToken = (options) => invoke("getAccessToken", void 0, options);
|
|
61
|
+
var getUserInfo = (options) => invoke("getUserInfo", void 0, options);
|
|
62
|
+
|
|
63
|
+
// src/apis/page.ts
|
|
64
|
+
var getPageInfo = (options) => invoke("getPageInfo", void 0, options);
|
|
65
|
+
|
|
66
|
+
// src/apis/chat.ts
|
|
67
|
+
var withText = (method, options) => {
|
|
68
|
+
var _a;
|
|
69
|
+
const [params, callbacks] = splitOptions(options);
|
|
70
|
+
if (typeof params.text !== "string" || !params.text.trim()) {
|
|
71
|
+
const error = new MiniAppError(ErrorCode.INVALID_PARAMS, "text kh\xF4ng \u0111\u01B0\u1EE3c r\u1ED7ng", method);
|
|
72
|
+
(_a = callbacks.fail) == null ? void 0 : _a.call(callbacks, error);
|
|
73
|
+
return Promise.reject(error);
|
|
74
|
+
}
|
|
75
|
+
return invoke(method, params, callbacks);
|
|
76
|
+
};
|
|
77
|
+
var sendMessage = (options) => withText("sendMessage", options);
|
|
78
|
+
var insertText = (options) => withText("insertText", options);
|
|
79
|
+
|
|
80
|
+
// src/apis/dev.ts
|
|
81
|
+
var setMockHandler = (handler) => {
|
|
82
|
+
getState().mock = handler;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// src/index.ts
|
|
86
|
+
if (typeof window !== "undefined") {
|
|
87
|
+
getState();
|
|
88
|
+
if (document.readyState === "loading") {
|
|
89
|
+
document.addEventListener("DOMContentLoaded", notifyReady, { once: true });
|
|
90
|
+
} else {
|
|
91
|
+
queueMicrotask(notifyReady);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export { SDK_VERSION, closeApp, getAccessToken, getPageInfo, getSystemInfo, getUserInfo, insertText, openWebview, sendMessage, setMockHandler, showToast };
|
|
96
|
+
//# sourceMappingURL=index.js.map
|
|
97
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/invoke.ts","../src/version.ts","../src/apis/app.ts","../src/apis/user.ts","../src/apis/page.ts","../src/apis/chat.ts","../src/apis/dev.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { call } from './bridge';\nimport { MiniAppError } from './errors';\nimport type { CallbackOptions } from './types';\n\n/**\n * Gọi API host, hỗ trợ cả 2 kiểu: `await api()` và `api({ success, fail })`.\n * Có callback `fail` → promise vẫn reject (người dùng await vẫn bắt được), nhưng không gây\n * \"unhandled rejection\" khi họ chỉ dùng callback.\n */\nexport const invoke = <T>(method: string, params?: unknown, options?: CallbackOptions<T>): Promise<T> => {\n const promise = call<T>(method, params);\n if (options?.success || options?.fail) {\n promise.then(options.success, (error: unknown) => options.fail?.(MiniAppError.from(error, method)));\n }\n return promise;\n};\n\n/** Tách callback ra khỏi object tham số: `{ url, success, fail }` → `[{ url }, { success, fail }]`. */\nexport const splitOptions = <P extends object, T>(\n options: P & CallbackOptions<T>,\n): [Omit<P, keyof CallbackOptions<T>>, CallbackOptions<T>] => {\n const { success, fail, ...params } = options;\n return [params, { success, fail }];\n};\n","declare const __SDK_VERSION__: string;\n\n/** Thay lúc build (tsup define) / test (vitest define) bằng version trong package.json. */\nexport const SDK_VERSION: string = typeof __SDK_VERSION__ === 'string' ? __SDK_VERSION__ : '0.0.0-dev';\n","import { isInHost, notify } from '../bridge';\nimport { ErrorCode, MiniAppError } from '../errors';\nimport { invoke, splitOptions } from '../invoke';\nimport type { CallbackOptions, SystemInfo } from '../types';\nimport { SDK_VERSION } from '../version';\n\n/** Đóng mini app. */\nexport const closeApp = (options?: CallbackOptions<void>): Promise<void> => invoke('closeApp', undefined, options);\n\n/** Mở link ngoài bằng trình duyệt trong app. Chỉ chấp nhận http(s). */\nexport const openWebview = (options: { url: string } & CallbackOptions<void>): Promise<void> => {\n const [params, callbacks] = splitOptions(options);\n if (!/^https?:\\/\\//i.test(params.url ?? '')) {\n const error = new MiniAppError(ErrorCode.INVALID_PARAMS, 'url phải bắt đầu bằng http:// hoặc https://', 'openWebview');\n callbacks.fail?.(error);\n return Promise.reject(error);\n }\n return invoke('openWebview', params, callbacks);\n};\n\n/** Hiện toast native. */\nexport const showToast = (options: { message: string } & CallbackOptions<void>): Promise<void> => {\n const [params, callbacks] = splitOptions(options);\n return invoke('showToast', params, callbacks);\n};\n\n/** Thông tin thiết bị / host. Ngoài app trả giá trị mặc định thay vì lỗi. */\nexport const getSystemInfo = async (options?: CallbackOptions<SystemInfo>): Promise<SystemInfo> => {\n const base: SystemInfo = { platform: 'web', sdkVersion: SDK_VERSION, inHost: isInHost() };\n if (!isInHost()) {\n options?.success?.(base);\n return base;\n }\n try {\n const host = await invoke<Partial<SystemInfo>>('getSystemInfo');\n const result: SystemInfo = { ...base, ...host, sdkVersion: SDK_VERSION, inHost: true };\n options?.success?.(result);\n return result;\n } catch (error) {\n const normalized = MiniAppError.from(error, 'getSystemInfo');\n options?.fail?.(normalized);\n throw normalized;\n }\n};\n\n/** @internal SDK tự gọi khi trang sẵn sàng — host đẩy context mới nhất nếu đổi trong lúc load. */\nexport const notifyReady = (): void => notify('ready', { sdkVersion: SDK_VERSION });\n","import { invoke } from '../invoke';\nimport type { CallbackOptions, UserInfo } from '../types';\n\n/**\n * Access token của mini app cho PAGE hiện tại (mỗi page 1 token). Host tự refresh →\n * gọi lại mỗi khi cần thay vì lưu lâu phía web.\n */\nexport const getAccessToken = (options?: CallbackOptions<string>): Promise<string> =>\n invoke('getAccessToken', undefined, options);\n\n/** Nhân viên đang đăng nhập app. */\nexport const getUserInfo = (options?: CallbackOptions<UserInfo>): Promise<UserInfo> =>\n invoke('getUserInfo', undefined, options);\n","import { invoke } from '../invoke';\nimport type { CallbackOptions, PageInfo } from '../types';\n\n/**\n * Page (kênh) đang mở mini app. Mini app được cài theo page — mỗi page có token, quyền,\n * dữ liệu riêng; host chạy 1 instance mini app cho mỗi page (đổi page = instance khác).\n */\nexport const getPageInfo = (options?: CallbackOptions<PageInfo>): Promise<PageInfo> =>\n invoke('getPageInfo', undefined, options);\n","import { ErrorCode, MiniAppError } from '../errors';\nimport { invoke, splitOptions } from '../invoke';\nimport type { CallbackOptions } from '../types';\n\ntype TextOptions = { text: string } & CallbackOptions<void>;\n\nconst withText = (method: string, options: TextOptions): Promise<void> => {\n const [params, callbacks] = splitOptions(options);\n if (typeof params.text !== 'string' || !params.text.trim()) {\n const error = new MiniAppError(ErrorCode.INVALID_PARAMS, 'text không được rỗng', method);\n callbacks.fail?.(error);\n return Promise.reject(error);\n }\n return invoke(method, params, callbacks);\n};\n\n/** Gửi tin nhắn vào conversation đang mở mini app. */\nexport const sendMessage = (options: TextOptions): Promise<void> => withText('sendMessage', options);\n\n/** Chèn text vào ô nhập chat (không gửi) — nhân viên tự sửa/gửi. */\nexport const insertText = (options: TextOptions): Promise<void> => withText('insertText', options);\n","import { getState } from '../bridge';\nimport type { MockHandler } from '../types';\n\n/**\n * Giả lập host khi dev trên trình duyệt. Không có tác dụng khi chạy trong app.\n * @example\n * if (import.meta.env.DEV) {\n * setMockHandler((method) => (method === 'getAccessToken' ? 'dev-token' : undefined));\n * }\n */\nexport const setMockHandler = (handler: MockHandler | null): void => {\n getState().mock = handler;\n};\n","import { getState } from './bridge';\nimport { notifyReady } from './apis/app';\n\nexport { getRouteParams, onContextChange } from './apis/route';\nexport { closeApp, openWebview, showToast, getSystemInfo } from './apis/app';\nexport { getAccessToken, getUserInfo } from './apis/user';\nexport { getPageInfo } from './apis/page';\nexport { sendMessage, insertText } from './apis/chat';\nexport { setMockHandler } from './apis/dev';\nexport { isInHost, PROTOCOL_VERSION } from './bridge';\nexport { MiniAppError, ErrorCode } from './errors';\nexport { SDK_VERSION } from './version';\nexport type { RouteParams, CallbackOptions, UserInfo, SystemInfo, PageInfo, MockHandler } from './types';\nexport type { HostInfo } from './bridge';\n\n// Khởi tạo bridge ngay khi import (host có thể đẩy event trước khi app gọi API nào),\n// rồi báo \"ready\" khi DOM sẵn sàng.\nif (typeof window !== 'undefined') {\n getState();\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', notifyReady, { once: true });\n } else {\n queueMicrotask(notifyReady);\n }\n}\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
declare const ErrorCode: {
|
|
2
|
+
/** Không chạy trong app Retion (vd mở trên trình duyệt) và không có mock handler. */
|
|
3
|
+
readonly NOT_IN_HOST: "NOT_IN_HOST";
|
|
4
|
+
/** Host không phản hồi trong thời gian chờ. */
|
|
5
|
+
readonly TIMEOUT: "TIMEOUT";
|
|
6
|
+
/** Host (phiên bản app hiện tại) chưa hỗ trợ API này. */
|
|
7
|
+
readonly NOT_SUPPORTED: "NOT_SUPPORTED";
|
|
8
|
+
/** Tham số truyền vào không hợp lệ. */
|
|
9
|
+
readonly INVALID_PARAMS: "INVALID_PARAMS";
|
|
10
|
+
/** User từ chối / huỷ thao tác. */
|
|
11
|
+
readonly USER_CANCELLED: "USER_CANCELLED";
|
|
12
|
+
/** Lỗi khác phía host. */
|
|
13
|
+
readonly HOST_ERROR: "HOST_ERROR";
|
|
14
|
+
};
|
|
15
|
+
type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode] | (string & {});
|
|
16
|
+
declare class MiniAppError extends Error {
|
|
17
|
+
readonly code: ErrorCode;
|
|
18
|
+
readonly method?: string;
|
|
19
|
+
constructor(code: ErrorCode, message: string, method?: string);
|
|
20
|
+
/** Chuẩn hoá lỗi từ host / mock (object thuần, Error, string) về MiniAppError. */
|
|
21
|
+
static from(error: unknown, method?: string): MiniAppError;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Param theo conversation mà host truyền khi mở mini app. */
|
|
25
|
+
interface RouteParams {
|
|
26
|
+
/** Page (kênh) đang mở mini app. Mỗi page là 1 instance mini app riêng. */
|
|
27
|
+
page_id?: string;
|
|
28
|
+
/** Khách hàng của conversation. Đổi trong cùng page → onContextChange (nếu context_update). */
|
|
29
|
+
client_id?: string;
|
|
30
|
+
org_id?: string;
|
|
31
|
+
message_id?: string;
|
|
32
|
+
comment_id?: string;
|
|
33
|
+
locale?: string;
|
|
34
|
+
is_page_admin?: string | number;
|
|
35
|
+
[key: string]: unknown;
|
|
36
|
+
}
|
|
37
|
+
/** Callback thay cho await (tuỳ chọn). */
|
|
38
|
+
interface CallbackOptions<T> {
|
|
39
|
+
success?: (result: T) => void;
|
|
40
|
+
fail?: (error: MiniAppError) => void;
|
|
41
|
+
}
|
|
42
|
+
type MockHandler = (method: string, params: unknown) => unknown;
|
|
43
|
+
interface UserInfo {
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
avatar?: string;
|
|
47
|
+
role?: string;
|
|
48
|
+
}
|
|
49
|
+
interface SystemInfo {
|
|
50
|
+
platform: 'ios' | 'android' | 'web';
|
|
51
|
+
/** Version app host (undefined khi chạy ngoài app). */
|
|
52
|
+
appVersion?: string;
|
|
53
|
+
sdkVersion: string;
|
|
54
|
+
inHost: boolean;
|
|
55
|
+
theme?: 'light' | 'dark';
|
|
56
|
+
}
|
|
57
|
+
interface PageInfo {
|
|
58
|
+
page_id: string;
|
|
59
|
+
name: string;
|
|
60
|
+
avatar?: string;
|
|
61
|
+
/** Kênh của page: facebook, zalo, instagram, chatwork, ... */
|
|
62
|
+
platform: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { type CallbackOptions as C, ErrorCode as E, type MockHandler as M, type PageInfo as P, type RouteParams as R, type SystemInfo as S, type UserInfo as U, MiniAppError as a };
|