@retion-miniapp/react-native 0.7.1 → 0.7.3
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/dist/index.d.mts +11 -2
- package/dist/index.d.ts +11 -2
- package/dist/index.js +7 -7
- package/dist/index.mjs +7 -7
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -155,10 +155,14 @@ interface MiniAppNativeHandlers {
|
|
|
155
155
|
params?: Record<string, unknown>;
|
|
156
156
|
}, context: MiniAppHandlerContext) => Promise<void> | void;
|
|
157
157
|
}
|
|
158
|
+
/** Kiểu rung web gửi qua haptic() — trùng tên trigger của react-native-haptic-feedback. */
|
|
159
|
+
type MiniAppHapticType = 'selection' | 'impactLight' | 'impactMedium' | 'impactHeavy' | 'rigid' | 'soft' | 'notificationSuccess' | 'notificationWarning' | 'notificationError';
|
|
158
160
|
/** Hành vi bridge phụ thuộc ứng dụng. */
|
|
159
161
|
interface MiniAppBridgeOptions {
|
|
160
162
|
/** Web gọi showToast(). Không truyền → bỏ qua. */
|
|
161
163
|
showToast?: (message: string) => void;
|
|
164
|
+
/** Web gọi haptic(type) (lệnh 1 chiều). Không truyền → bỏ qua. */
|
|
165
|
+
haptic?: (type: MiniAppHapticType) => void;
|
|
162
166
|
/** Web gọi openWebview(url). Mặc định Linking.openURL. */
|
|
163
167
|
openUrl?: (url: string) => Promise<void> | void;
|
|
164
168
|
/** Trả cho web qua getSystemInfo(). */
|
|
@@ -279,6 +283,11 @@ interface MiniAppHostProps {
|
|
|
279
283
|
* (vd. container có nền / hiệu ứng riêng muốn nhìn xuyên qua vùng web trống).
|
|
280
284
|
*/
|
|
281
285
|
opaque_background?: boolean;
|
|
286
|
+
/**
|
|
287
|
+
* Mini app được nhúng mini app khác bằng iframe nạp từ máy (`getLocalMiniApp(app_id).entry_uri`) —
|
|
288
|
+
* vd Sảnh merchant mở app con. Mặc định false: WebView chỉ đọc được thư mục của chính nó (iOS).
|
|
289
|
+
*/
|
|
290
|
+
allow_embedded_miniapps?: boolean;
|
|
282
291
|
/** WebView đã tải xong tài liệu local. Hữu ích để app cha ẩn launch splash sau khi mini app sẵn sàng hiện. */
|
|
283
292
|
onWebLoadEnd?: (event: {
|
|
284
293
|
app_id: string;
|
|
@@ -286,7 +295,7 @@ interface MiniAppHostProps {
|
|
|
286
295
|
url: string;
|
|
287
296
|
}) => void;
|
|
288
297
|
}
|
|
289
|
-
declare const _default: React.MemoExoticComponent<({ container, splash, is_dark, bridge, close_on_back, opaque_background, onWebLoadEnd }: MiniAppHostProps) => React.JSX.Element | null>;
|
|
298
|
+
declare const _default: React.MemoExoticComponent<({ container, splash, is_dark, bridge, close_on_back, opaque_background, allow_embedded_miniapps, onWebLoadEnd }: MiniAppHostProps) => React.JSX.Element | null>;
|
|
290
299
|
|
|
291
300
|
interface OpenMiniAppArgs {
|
|
292
301
|
app: MiniAppLaunch;
|
|
@@ -480,4 +489,4 @@ declare class BridgeError extends Error {
|
|
|
480
489
|
constructor(code: string, message: string);
|
|
481
490
|
}
|
|
482
491
|
|
|
483
|
-
export { DefaultMiniAppSplash, MINIAPP_PLATFORM_URL, type MiniAppBridgeOptions, type MiniAppCatalogEntry, type MiniAppCatalogItem, type MiniAppChannel, type MiniAppConfig, type MiniAppContainerProps, type MiniAppContext, type MiniAppDownloadState, type MiniAppDownloadStatus, type MiniAppDownloadTask, type MiniAppEvent, type MiniAppFileSystem, type MiniAppHandlerContext, _default as MiniAppHost, type MiniAppHostData, BridgeError as MiniAppHostError, type MiniAppHostProps, type MiniAppKeepAlive, type MiniAppLaunch, type MiniAppLocalBundle, type MiniAppManifest, type MiniAppNativeHandlers, type MiniAppPaymentRequest, type MiniAppPaymentResult, type MiniAppPermission, type MiniAppSplashProps, type MiniAppStorage, type MiniAppSyncResult, type MiniAppUpdate, type OpenMiniAppArgs, closeMiniApp, configureMiniApp, createMmkvStorage, createRnfsFileSystem, ensureMiniApp, getLocalMiniApp, getMiniAppCatalog, getMiniAppCatalogEntry, getMiniAppStatuses, getMiniAppUpdate, onMiniAppEvent, openMiniApp, pauseMiniApp, pauseMiniAppDownloads, preloadMiniApp, restoreMiniApp, resumeMiniApp, resumeMiniAppDownloads, sendEventToWeb, syncMiniAppCatalog, uninstallMiniApp, updateMiniApp, useMiniAppDownload, useMiniAppDownloadsPaused };
|
|
492
|
+
export { DefaultMiniAppSplash, MINIAPP_PLATFORM_URL, type MiniAppBridgeOptions, type MiniAppCatalogEntry, type MiniAppCatalogItem, type MiniAppChannel, type MiniAppConfig, type MiniAppContainerProps, type MiniAppContext, type MiniAppDownloadState, type MiniAppDownloadStatus, type MiniAppDownloadTask, type MiniAppEvent, type MiniAppFileSystem, type MiniAppHandlerContext, type MiniAppHapticType, _default as MiniAppHost, type MiniAppHostData, BridgeError as MiniAppHostError, type MiniAppHostProps, type MiniAppKeepAlive, type MiniAppLaunch, type MiniAppLocalBundle, type MiniAppManifest, type MiniAppNativeHandlers, type MiniAppPaymentRequest, type MiniAppPaymentResult, type MiniAppPermission, type MiniAppSplashProps, type MiniAppStorage, type MiniAppSyncResult, type MiniAppUpdate, type OpenMiniAppArgs, closeMiniApp, configureMiniApp, createMmkvStorage, createRnfsFileSystem, ensureMiniApp, getLocalMiniApp, getMiniAppCatalog, getMiniAppCatalogEntry, getMiniAppStatuses, getMiniAppUpdate, onMiniAppEvent, openMiniApp, pauseMiniApp, pauseMiniAppDownloads, preloadMiniApp, restoreMiniApp, resumeMiniApp, resumeMiniAppDownloads, sendEventToWeb, syncMiniAppCatalog, uninstallMiniApp, updateMiniApp, useMiniAppDownload, useMiniAppDownloadsPaused };
|
package/dist/index.d.ts
CHANGED
|
@@ -155,10 +155,14 @@ interface MiniAppNativeHandlers {
|
|
|
155
155
|
params?: Record<string, unknown>;
|
|
156
156
|
}, context: MiniAppHandlerContext) => Promise<void> | void;
|
|
157
157
|
}
|
|
158
|
+
/** Kiểu rung web gửi qua haptic() — trùng tên trigger của react-native-haptic-feedback. */
|
|
159
|
+
type MiniAppHapticType = 'selection' | 'impactLight' | 'impactMedium' | 'impactHeavy' | 'rigid' | 'soft' | 'notificationSuccess' | 'notificationWarning' | 'notificationError';
|
|
158
160
|
/** Hành vi bridge phụ thuộc ứng dụng. */
|
|
159
161
|
interface MiniAppBridgeOptions {
|
|
160
162
|
/** Web gọi showToast(). Không truyền → bỏ qua. */
|
|
161
163
|
showToast?: (message: string) => void;
|
|
164
|
+
/** Web gọi haptic(type) (lệnh 1 chiều). Không truyền → bỏ qua. */
|
|
165
|
+
haptic?: (type: MiniAppHapticType) => void;
|
|
162
166
|
/** Web gọi openWebview(url). Mặc định Linking.openURL. */
|
|
163
167
|
openUrl?: (url: string) => Promise<void> | void;
|
|
164
168
|
/** Trả cho web qua getSystemInfo(). */
|
|
@@ -279,6 +283,11 @@ interface MiniAppHostProps {
|
|
|
279
283
|
* (vd. container có nền / hiệu ứng riêng muốn nhìn xuyên qua vùng web trống).
|
|
280
284
|
*/
|
|
281
285
|
opaque_background?: boolean;
|
|
286
|
+
/**
|
|
287
|
+
* Mini app được nhúng mini app khác bằng iframe nạp từ máy (`getLocalMiniApp(app_id).entry_uri`) —
|
|
288
|
+
* vd Sảnh merchant mở app con. Mặc định false: WebView chỉ đọc được thư mục của chính nó (iOS).
|
|
289
|
+
*/
|
|
290
|
+
allow_embedded_miniapps?: boolean;
|
|
282
291
|
/** WebView đã tải xong tài liệu local. Hữu ích để app cha ẩn launch splash sau khi mini app sẵn sàng hiện. */
|
|
283
292
|
onWebLoadEnd?: (event: {
|
|
284
293
|
app_id: string;
|
|
@@ -286,7 +295,7 @@ interface MiniAppHostProps {
|
|
|
286
295
|
url: string;
|
|
287
296
|
}) => void;
|
|
288
297
|
}
|
|
289
|
-
declare const _default: React.MemoExoticComponent<({ container, splash, is_dark, bridge, close_on_back, opaque_background, onWebLoadEnd }: MiniAppHostProps) => React.JSX.Element | null>;
|
|
298
|
+
declare const _default: React.MemoExoticComponent<({ container, splash, is_dark, bridge, close_on_back, opaque_background, allow_embedded_miniapps, onWebLoadEnd }: MiniAppHostProps) => React.JSX.Element | null>;
|
|
290
299
|
|
|
291
300
|
interface OpenMiniAppArgs {
|
|
292
301
|
app: MiniAppLaunch;
|
|
@@ -480,4 +489,4 @@ declare class BridgeError extends Error {
|
|
|
480
489
|
constructor(code: string, message: string);
|
|
481
490
|
}
|
|
482
491
|
|
|
483
|
-
export { DefaultMiniAppSplash, MINIAPP_PLATFORM_URL, type MiniAppBridgeOptions, type MiniAppCatalogEntry, type MiniAppCatalogItem, type MiniAppChannel, type MiniAppConfig, type MiniAppContainerProps, type MiniAppContext, type MiniAppDownloadState, type MiniAppDownloadStatus, type MiniAppDownloadTask, type MiniAppEvent, type MiniAppFileSystem, type MiniAppHandlerContext, _default as MiniAppHost, type MiniAppHostData, BridgeError as MiniAppHostError, type MiniAppHostProps, type MiniAppKeepAlive, type MiniAppLaunch, type MiniAppLocalBundle, type MiniAppManifest, type MiniAppNativeHandlers, type MiniAppPaymentRequest, type MiniAppPaymentResult, type MiniAppPermission, type MiniAppSplashProps, type MiniAppStorage, type MiniAppSyncResult, type MiniAppUpdate, type OpenMiniAppArgs, closeMiniApp, configureMiniApp, createMmkvStorage, createRnfsFileSystem, ensureMiniApp, getLocalMiniApp, getMiniAppCatalog, getMiniAppCatalogEntry, getMiniAppStatuses, getMiniAppUpdate, onMiniAppEvent, openMiniApp, pauseMiniApp, pauseMiniAppDownloads, preloadMiniApp, restoreMiniApp, resumeMiniApp, resumeMiniAppDownloads, sendEventToWeb, syncMiniAppCatalog, uninstallMiniApp, updateMiniApp, useMiniAppDownload, useMiniAppDownloadsPaused };
|
|
492
|
+
export { DefaultMiniAppSplash, MINIAPP_PLATFORM_URL, type MiniAppBridgeOptions, type MiniAppCatalogEntry, type MiniAppCatalogItem, type MiniAppChannel, type MiniAppConfig, type MiniAppContainerProps, type MiniAppContext, type MiniAppDownloadState, type MiniAppDownloadStatus, type MiniAppDownloadTask, type MiniAppEvent, type MiniAppFileSystem, type MiniAppHandlerContext, type MiniAppHapticType, _default as MiniAppHost, type MiniAppHostData, BridgeError as MiniAppHostError, type MiniAppHostProps, type MiniAppKeepAlive, type MiniAppLaunch, type MiniAppLocalBundle, type MiniAppManifest, type MiniAppNativeHandlers, type MiniAppPaymentRequest, type MiniAppPaymentResult, type MiniAppPermission, type MiniAppSplashProps, type MiniAppStorage, type MiniAppSyncResult, type MiniAppUpdate, type OpenMiniAppArgs, closeMiniApp, configureMiniApp, createMmkvStorage, createRnfsFileSystem, ensureMiniApp, getLocalMiniApp, getMiniAppCatalog, getMiniAppCatalogEntry, getMiniAppStatuses, getMiniAppUpdate, onMiniAppEvent, openMiniApp, pauseMiniApp, pauseMiniAppDownloads, preloadMiniApp, restoreMiniApp, resumeMiniApp, resumeMiniAppDownloads, sendEventToWeb, syncMiniAppCatalog, uninstallMiniApp, updateMiniApp, useMiniAppDownload, useMiniAppDownloadsPaused };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var Gt=Object.create;var ge=Object.defineProperty;var Xt=Object.getOwnPropertyDescriptor;var Zt=Object.getOwnPropertyNames;var en=Object.getPrototypeOf,tn=Object.prototype.hasOwnProperty;var nn=(e,t)=>{for(var n in t)ge(e,n,{get:t[n],enumerable:!0})},Ye=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Zt(t))!tn.call(e,s)&&s!==n&&ge(e,s,{get:()=>t[s],enumerable:!(r=Xt(t,s))||r.enumerable});return e};var Qe=(e,t,n)=>(n=e!=null?Gt(en(e)):{},Ye(t||!e||!e.__esModule?ge(n,"default",{value:e,enumerable:!0}):n,e)),rn=e=>Ye(ge({},"__esModule",{value:!0}),e);var _n={};nn(_n,{DefaultMiniAppSplash:()=>Ue,MINIAPP_PLATFORM_URL:()=>fe,MiniAppHost:()=>Ht,MiniAppHostError:()=>T,closeMiniApp:()=>te,configureMiniApp:()=>Xe,createMmkvStorage:()=>tt,createRnfsFileSystem:()=>et,ensureMiniApp:()=>le,getLocalMiniApp:()=>b,getMiniAppCatalog:()=>Bt,getMiniAppCatalogEntry:()=>ne,getMiniAppStatuses:()=>Ct,getMiniAppUpdate:()=>Be,onMiniAppEvent:()=>Pt,openMiniApp:()=>St,pauseMiniApp:()=>Dt,pauseMiniAppDownloads:()=>$t,preloadMiniApp:()=>bt,restoreMiniApp:()=>It,resumeMiniApp:()=>Lt,resumeMiniAppDownloads:()=>Nt,sendEventToWeb:()=>vt,syncMiniAppCatalog:()=>Re,uninstallMiniApp:()=>kt,updateMiniApp:()=>Ft,useMiniAppDownload:()=>xe,useMiniAppDownloadsPaused:()=>Tt});module.exports=rn(_n);var fe="https://retion-miniapp-platform.vercel.app",X=null,Ge=new Set,Xe=e=>{X=e,Ge.forEach(t=>t())},R=()=>{if(!X)throw new Error("[miniapp] Ch\u01B0a g\u1ECDi configureMiniApp()");return X},Ze=e=>{Ge.add(e),X&&e()},F=(...e)=>{X!=null&&X.debug&&console.log("[miniapp]",...e)};var et=(e,t)=>({document_dir:e.DocumentDirectoryPath,cache_dir:e.CachesDirectoryPath,exists:n=>e.exists(n),mkdir:n=>e.mkdir(n),remove:n=>e.unlink(n).catch(()=>{}),listDir:n=>e.readDir(n).then(r=>r.map(s=>s.name)).catch(()=>[]),sha256:n=>e.hash(n,"sha256"),unzip:async(n,r)=>{await t(n,r)},download:({url:n,to_file:r,onProgress:s})=>{let{jobId:o,promise:c}=e.downloadFile({fromUrl:n,toFile:r,progressInterval:250,begin:()=>{},progress:({bytesWritten:l,contentLength:i})=>s==null?void 0:s(l,i)});return{promise:c.then(({statusCode:l})=>({status:l})),cancel:()=>e.stopDownload(o)}}}),tt=e=>({getString:t=>e.getString(t),setString:(t,n)=>e.set(t,n)});var g=Qe(require("react")),_=require("react-native"),Vt=Qe(require("react-native-webview"));var he=require("react-native"),Ae=1,T=class extends Error{constructor(n,r){super(r);this.code=n}},rt=e=>{try{let t=JSON.parse(e);return(t==null?void 0:t.__retion)===Ae&&typeof t.method=="string"?t:null}catch{return null}},me=e=>`window.__RETION_MINIAPP__ && window.__RETION_MINIAPP__.receive(${JSON.stringify(e)}); true;`,it=(e,t)=>me({id:e,result:t}),ot=(e,t)=>me({id:e,error:{code:t.code,message:t.message}}),ke=e=>me({event:"context",data:e});var st=()=>`(function () {
|
|
2
2
|
var post = function (level, args) {
|
|
3
3
|
try {
|
|
4
4
|
var parts = [];
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
else if (typeof a === 'object') { try { parts.push(JSON.stringify(a).slice(0, 800)); } catch (e) { parts.push(String(a)); } }
|
|
9
9
|
else { parts.push(String(a)); }
|
|
10
10
|
}
|
|
11
|
-
window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({ __retion: ${
|
|
11
|
+
window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({ __retion: ${Ae}, method: 'log', level: level, text: parts.join(' ') }));
|
|
12
12
|
} catch (e) {}
|
|
13
13
|
};
|
|
14
14
|
['log', 'info', 'warn', 'error'].forEach(function (level) {
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
window.addEventListener('unhandledrejection', function (e) { post('error', ['[unhandledrejection]', e.reason]); });
|
|
20
20
|
// Kh\xF4ng log query (c\xF3 th\u1EC3 ch\u1EE9a token) \u2014 ch\u1EC9 \u0111\u01B0\u1EDDng d\u1EABn + route.
|
|
21
21
|
post('info', ['[page] ' + location.pathname + location.hash]);
|
|
22
|
-
})(); true;`,
|
|
22
|
+
})(); true;`,at=()=>`(function () {
|
|
23
23
|
function atTop(el) {
|
|
24
24
|
for (var n = el; n && n !== document.documentElement; n = n.parentElement) {
|
|
25
25
|
if (n.scrollTop > 0) { return false; }
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
function report(at_top) {
|
|
31
31
|
if (at_top === last) { return; }
|
|
32
32
|
last = at_top;
|
|
33
|
-
window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({ __retion: ${
|
|
33
|
+
window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({ __retion: ${Ae}, method: 'touchAtTop', at_top: at_top }));
|
|
34
34
|
}
|
|
35
35
|
document.addEventListener('touchstart', function (e) { report(atTop(e.target)); }, { capture: true, passive: true });
|
|
36
36
|
// Cu\u1ED9n r\u1EDDi \u0111\u1EA7u trang \u2192 b\xE1o ngay, kh\xF4ng \u0111\u1EE3i l\u1EA7n ch\u1EA1m sau (tr\xE1nh host d\xF9ng gi\xE1 tr\u1ECB c\u0169 "\u0111ang \u1EDF \u0111\u1EA7u").
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
var el = e.target === document ? document.documentElement : e.target;
|
|
39
39
|
if (el && el.scrollTop > 0) { report(false); }
|
|
40
40
|
}, { capture: true, passive: true });
|
|
41
|
-
})(); true;`,
|
|
42
|
-
${ke(e)}`},
|
|
41
|
+
})(); true;`,pt=e=>me({event:e}),ct=(e,t)=>{let n=lt(t);return`try { history.replaceState(history.state, '', location.pathname + ${JSON.stringify(n?`?${n}`:"")} + location.hash); } catch (e) {}
|
|
42
|
+
${ke(e)}`},lt=e=>Object.entries(e).filter(([,t])=>t!=null&&t!=="").map(([t,n])=>`${encodeURIComponent(t)}=${encodeURIComponent(String(n))}`).join("&"),ut=(e,t={})=>{let n=lt(t);return`window.__RETION_MINIAPP_HOST__ = { protocol: ${Ae} };
|
|
43
43
|
window.__RETION_MINIAPP_CONTEXT__ = ${JSON.stringify(e)};
|
|
44
44
|
${n?`try { history.replaceState(history.state, '', location.pathname + '?' + ${JSON.stringify(n)} + location.hash); } catch (e) {}`:""}
|
|
45
|
-
true;`},lt={partner:"partner_token",chatbox:"chatbox_token"},ut=(e,t)=>{let n={...e};for(let r of Object.values(lt))t.includes(r)||delete n[r];return n},Pe=new Set,et=async(e,t)=>{if(Pe.has(e))throw new R("BUSY",`${e} \u0111ang ch\u1EA1y \u2014 ch\u1EDD l\u01B0\u1EE3t tr\u01B0\u1EDBc xong`);Pe.add(e);try{return await t()}finally{Pe.delete(e)}},Ce=(e,t)=>{if(typeof e!="string"||!e)throw new R("INVALID_PARAMS",`Thi\u1EBFu ${t}`);return e},dt=async({method:e,params:t},{getHostData:n,getPermissions:r,is_dark:s,close:i,app_id:c,instance_id:l,options:o})=>{var M,d,L,b;let g=o==null?void 0:o.handlers,A={app_id:c,instance_id:l,close:i},v=()=>new R("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF \u1EE9ng d\u1EE5ng n\xE0y`);switch(e){case"requestPayment":{let f=g==null?void 0:g.requestPayment;if(!f)throw v();let a=t==null?void 0:t.amount;if(typeof a!="number"||!Number.isFinite(a)||a<=0)throw new R("INVALID_PARAMS","amount ph\u1EA3i l\xE0 s\u1ED1 > 0");let T={...t,amount:a,currency:Ce(t==null?void 0:t.currency,"currency")};return et(e,()=>f(T,A))}case"printImage":{let f=g==null?void 0:g.printImage;if(!f)throw v();let a=Ce(t==null?void 0:t.image,"image");await et(e,()=>f({image:a},A));return}case"openScreen":if(!(g!=null&&g.openScreen))throw v();await g.openScreen({screen:Ce(t==null?void 0:t.screen,"screen"),params:t==null?void 0:t.params},A);return;case"closeApp":i();return;case"openWebview":{let f=String((M=t==null?void 0:t.url)!=null?M:"");if(!/^https?:\/\//i.test(f))throw new R("INVALID_PARAMS","url ph\u1EA3i l\xE0 http(s)");await(o!=null&&o.openUrl?o.openUrl(f):fe.Linking.openURL(f));return}case"showToast":(L=o==null?void 0:o.showToast)==null||L.call(o,String((d=t==null?void 0:t.message)!=null?d:""));return;case"getSystemInfo":return{platform:fe.Platform.OS==="ios"?"ios":"android",appVersion:(b=o==null?void 0:o.app_version)!=null?b:"",theme:s?"dark":"light"};case"getAccessToken":{let f=n().access_token;if(!f)throw new R("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return f}case"getToken":{let f=t==null?void 0:t.type;if(f==="access"){let j=n().access_token;if(!j)throw new R("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return j}if(f!=="partner"&&f!=="chatbox")throw new R("HOST_ERROR",`Lo\u1EA1i token kh\xF4ng h\u1EE3p l\u1EC7: ${String(f)}`);let a=lt[f];if(!r().includes(a))throw new R("PERMISSION_DENIED",`Mini app ch\u01B0a \u0111\u01B0\u1EE3c c\u1EA5p quy\u1EC1n ${a} (Console \u2192 Quy\u1EC1n l\u1EA5y token)`);let T=f==="partner"?n().partner_token:n().chatbox_token;if(!T)throw new R("HOST_ERROR",`Kh\xF4ng c\xF3 ${a}`);return T}case"getUserInfo":{let f=n().user;if(!f)throw new R("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin nh\xE2n vi\xEAn");return f}case"getPageInfo":{let f=n().page;if(!f)throw new R("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin page");return f}case"sendMessage":case"insertText":throw new R("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF phi\xEAn b\u1EA3n app n\xE0y`);default:throw new R("NOT_SUPPORTED",`API kh\xF4ng t\u1ED3n t\u1EA1i: ${e}`)}};var Oe=e=>`bundle:${e}`,Ie=()=>`${E().file_system.document_dir}/miniapps`,ht=(e,t,n="index.html",r=!1,s=[])=>{let i=`${Ie()}/${e}/${t}`;return{app_id:e,version:t,dir:i,entry_uri:`file://${i}/${n}`,context_update:r,permissions:s}},gt=e=>{var t;E().storage.setString(Oe(e.app_id),JSON.stringify({version:e.version,entry:e.entry,context_update:!!e.context_update,permissions:(t=e.permissions)!=null?t:[]}))},nn=(e,t)=>/^https?:\/\//.test(t)?t:`${e.replace(/[^/]*$/,"")}${t}`,S=e=>{let t=E().storage.getString(Oe(e));if(!t)return null;try{let{version:n,entry:r,context_update:s,permissions:i}=JSON.parse(t);return ht(e,n,r,!!s,Array.isArray(i)?i:[])}catch{return null}},H=e=>E().file_system.exists(e.entry_uri.replace("file://","")),De=async e=>{let t=S(e.app_id);return(t==null?void 0:t.version)===e.version&&await H(t)},rn=async(e,t)=>{let n=E().file_system,r=`${Ie()}/${e}`,s=await n.listDir(r).catch(()=>[]);await Promise.all(s.filter(i=>!t.includes(i)).map(i=>n.remove(`${r}/${i}`).catch(()=>{})))},At=async e=>{var t;await((t=ae[e])==null?void 0:t.catch(()=>{})),E().storage.setString(Oe(e),""),await E().file_system.remove(`${Ie()}/${e}`).catch(()=>{})},ee=class extends Error{constructor(){super("cancelled"),this.name="MiniAppInstallCancelled"}},ae={},Le=(e,{base_url:t,onProgress:n}={})=>{var M;let r=E().file_system,s=null,i=!1,c=`${r.cache_dir}/${e.app_id}-${e.version}.zip`,l=()=>{if(i)throw new ee},o=async()=>{var b;l();let d=S(e.app_id);if((d==null?void 0:d.version)===e.version&&await r.exists(d.dir))return gt(e),S(e.app_id);l();let L=r.download({url:t?nn(t,e.bundle_url):e.bundle_url,to_file:c,onProgress:(f,a)=>{var j;let T=a>0?a:(j=e.size)!=null?j:0;T>0&&(n==null||n(Math.min(1,f/T)))}});s=L;try{let{status:f}=await L.promise;if(l(),f!==200)throw new Error(`bundle ${f}`);if(e.sha256)if(r.sha256){if(await r.sha256(c)!==e.sha256)throw new Error("sha256 mismatch")}else N("b\u1ECF qua ki\u1EC3m tra sha256 (file_system kh\xF4ng c\xF3 sha256)",e.app_id);l();let a=ht(e.app_id,e.version,e.entry,!!e.context_update,(b=e.permissions)!=null?b:[]);return await r.remove(a.dir).catch(()=>{}),await r.mkdir(a.dir),await r.unzip(c,a.dir),gt(e),rn(e.app_id,[e.version,d==null?void 0:d.version].filter(Boolean)),a}catch(f){throw i?new ee:f}finally{s=null,r.remove(c).catch(()=>{})}},A=((M=ae[e.app_id])!=null?M:Promise.resolve()).catch(()=>{}).then(o),v=A.catch(()=>{});return ae[e.app_id]=v,v.then(()=>{ae[e.app_id]===v&&delete ae[e.app_id]}),{promise:A,cancel:()=>{i=!0,s==null||s.cancel()}}},se={},on=__DEV__?0:60*1e3,ft={},mt=(e,t)=>{var r,s;let n=S(e);return n&&Date.now()-((r=ft[t])!=null?r:0)<on?Promise.resolve(n):((s=se[e])!=null||(se[e]=(async()=>{let i=await fetch(t,{headers:{"Cache-Control":"no-cache"}});if(!i.ok)throw new Error(`manifest ${i.status}`);let c=await i.json(),l=await Le(c,{base_url:t}).promise;return ft[t]=Date.now(),l})().catch(i=>(console.warn("[miniapp] sync failed",e,i==null?void 0:i.message),S(e))).finally(()=>{se[e]=void 0})),se[e])};var me=new Map,Mt=(e,t)=>(me.set(e,t),()=>{me.get(e)===t&&me.delete(e)}),yt=(e,t)=>{let n=me.get(e);return n?n(t):!1};var Me=require("react"),ye=e=>{let t=e,n=new Set;return{getState:()=>t,setState:r=>{let s=typeof r=="function"?r(t):r;t={...t,...s},n.forEach(i=>i())},subscribe:r=>(n.add(r),()=>{n.delete(r)})}},V=(e,t,n=Object.is)=>{let r=(0,Me.useRef)(null),s=()=>{let i=e.getState(),c=r.current;if(c&&c.state===i&&c.selector===t)return c.value;let l=t(i),o=c&&n(c.value,l)?c.value:l;return r.current={state:i,selector:t,value:o},o};return(0,Me.useSyncExternalStore)(e.subscribe,s)};var F=ye({active_key:null,instances:{}}),wt=({app:e,instance_id:t,context:n={},url_params:r={},host_data:s={}},i)=>{var l;let c=(l=E().keep_alive)==null?void 0:l.max_webviews;F.setState(o=>{let g=t!=null?t:e.app_id,A={...o.instances,[g]:{key:g,app:e,context:n,url_params:r,host_data:s,last_used_at:Date.now()}},v=Object.keys(A);return c&&c>0&&v.length>c&&v.filter(M=>M!==g).sort((M,d)=>A[M].last_used_at-A[d].last_used_at).slice(0,v.length-c).forEach(M=>{delete A[M]}),i?{active_key:g,instances:A}:{instances:A}})},vt=e=>wt(e,!0),_t=e=>wt(e,!1),te=()=>F.setState({active_key:null}),we=e=>{F.setState(t=>{if(t.active_key===e||!t.instances[e])return{};let n={...t.instances};return delete n[e],{instances:n}})};var St="catalog",sn="paused_apps",an="removed_apps",pn=10*1e3,cn=2,ln=3e3,un=()=>{var e;try{return JSON.parse((e=E().storage.getString(St))!=null?e:"{}")}catch{return{}}},y=ye({catalog:{},downloads:{},pause_reasons:[],updates:{},apply_ticks:{}}),bt=e=>{var t;return!!((t=E().manual_update)!=null&&t.includes(e))},Se=new Set,xt=e=>{let t=new Set,n=()=>E().storage.setString(e,JSON.stringify([...t]));return{has:r=>t.has(r),values:()=>[...t],add:r=>t.has(r)?!1:(t.add(r),n(),!0),delete:r=>t.delete(r)?(n(),!0):!1,load:()=>{var r;t.clear();try{let s=JSON.parse((r=E().storage.getString(e))!=null?r:"[]");Array.isArray(s)&&s.forEach(i=>{typeof i=="string"&&t.add(i)})}catch{}}}},J=xt(sn),Y=xt(an);Ge(()=>{J.load(),Y.load();let e=un(),t={};Object.keys(e).filter(n=>!Y.has(n)).forEach(n=>{let r=S(n);r?t[n]={status:"installed",progress:1,version:r.version,has_local:!0}:J.has(n)&&(t[n]={status:"paused",progress:0,version:e[n].version,has_local:!1})}),y.setState({catalog:e,downloads:t})});var be=e=>V(y,t=>e?t.downloads[e]:void 0),Et=()=>V(y,e=>e.pause_reasons.length>0),B=(...e)=>N("queue",...e),P=[],W={},m=null,ve=new Set,Z={},$e=new Set,K=e=>{$e.forEach(t=>{try{t(e)}catch(n){console.warn("[miniapp-queue] event listener error",n==null?void 0:n.message)}})},Rt=e=>($e.add(e),()=>{$e.delete(e)}),Tt=()=>y.getState().downloads,k=(e,t)=>{let n=!!S(e),r=y.getState().downloads[e],s=t.status==="downloading"&&n?"updating":t.status,i={...r!=null?r:{status:"queued",progress:0},...t,...s?{status:s}:{},has_local:n};y.setState(c=>({downloads:{...c.downloads,[e]:i}})),(r==null?void 0:r.status)!==i.status||(r==null?void 0:r.version)!==i.version||(r==null?void 0:r.has_local)!==i.has_local?K({type:"status_change",app_id:e,state:i}):r.progress!==i.progress&&K({type:"progress",app_id:e,progress:i.progress,version:i.version})},_e=(e,t)=>{var n;(n=Z[e])==null||n.forEach(r=>r(t)),delete Z[e]},dn=()=>y.getState().pause_reasons.length>0,z=e=>{var l;if(m)return;let t=e?P.indexOf(e):dn()?-1:P.findIndex(o=>!J.has(o));if(t<0||t>=P.length)return;let[n]=P.splice(t,1),r=y.getState().catalog[n];if(!r){_e(n,S(n)),z();return}let s=Date.now();W[n]=((l=W[n])!=null?l:0)+1,k(n,{status:"downloading",progress:0,version:r.version,error:void 0});let i=0,c=Le(r,{onProgress:o=>{let g=Math.floor(o*100);g!==i&&(i=g,k(n,{progress:g/100,version:r.version}))}});m={app_id:n,handle:c,forced:!!e},B("start",n,r.version,e?"(forced)":""),c.promise.then(o=>{B("installed",n,r.version,`${Date.now()-s}ms`),k(n,{status:"installed",progress:1,version:r.version}),_e(n,o)}).catch(o=>{var A;if(o instanceof ee){if(ve.has(n))return;B("paused",n),W[n]-=1,P.unshift(n),k(n,{status:J.has(n)?"paused":"queued",progress:0,version:r.version});return}let g=String((A=o==null?void 0:o.message)!=null?A:o);if(console.warn("[miniapp-queue] failed",n,g),W[n]<cn){k(n,{status:"queued",progress:0,version:r.version,error:g}),setTimeout(()=>{var v;P.includes(n)||(m==null?void 0:m.app_id)===n||(P.push(n),z((v=Z[n])!=null&&v.length?n:void 0))},ln);return}k(n,{status:"failed",progress:0,version:r.version,error:g}),_e(n,S(n))}).finally(()=>{m=null;let o=P.find(g=>{var A;return(A=Z[g])==null?void 0:A.length});z(o)})},xe=(e,{front:t=!1}={})=>{if((m==null?void 0:m.app_id)===e)return;let n=P.indexOf(e);if(n>=0){if(!t)return;P.splice(n,1)}t?P.unshift(e):P.push(e)},gn=async e=>{let{host_id:t,client_token:n}=E(),r=new AbortController,s=setTimeout(()=>r.abort(),pn);try{let i=`${ge}/api/hosts/${encodeURIComponent(t)}/miniapps?channel=${e}`,c=await fetch(i,{headers:{Authorization:`Bearer ${n}`,"Cache-Control":"no-cache"},signal:r.signal});if(!c.ok)throw new Error(`host list ${e} ${c.status}`);return(await c.json()).apps.map(o=>({...o,channel:e}))}finally{clearTimeout(s)}},pe=null,Ee=()=>(pe!=null||(pe=(async()=>{var t;let e=Date.now();try{let n=await Promise.all(E().channels.map(gn)),r={};[...n].reverse().flat().forEach(o=>{r[o.app_id]=o});let s=Object.keys(y.getState().catalog).filter(o=>!r[o]);E().storage.setString(St,JSON.stringify(r)),y.setState({catalog:r}),await Promise.all(s.map(o=>Pt(o,{by_user:!1}))),s.forEach(o=>Y.delete(o));let i=Object.keys(r).filter(o=>!Y.has(o)),c=[],l={};for(let o of i.map(g=>r[g])){if(await De(o)){k(o.app_id,{status:"installed",progress:1,version:o.version});continue}let g=S(o.app_id);if(bt(o.app_id)&&!Se.has(o.app_id)&&g&&await H(g)){k(o.app_id,{status:"installed",progress:1,version:g.version}),l[o.app_id]={app_id:o.app_id,current_version:g.version,next_version:o.version};continue}c.push(o)}return y.setState({updates:l}),c.forEach(o=>{W[o.app_id]=0,k(o.app_id,{status:J.has(o.app_id)?"paused":"queued",progress:0,version:o.version,error:void 0}),xe(o.app_id)}),B("catalog",i.length,"apps, outdated",c.map(o=>o.app_id),"removed",s,`${Date.now()-e}ms`),K({type:"sync_complete",app_ids:i,removed:s}),Object.values(l).forEach(o=>K({type:"update_available",...o})),z(),{ok:!0,app_ids:i,removed:s}}catch(n){let r=String((n==null?void 0:n.name)==="AbortError"?"timeout":(t=n==null?void 0:n.message)!=null?t:n);return console.warn("[miniapp-queue] sync catalog failed",r),K({type:"sync_failed",error:r}),{ok:!1,error:r}}finally{pe=null}})()),pe),Pt=async(e,{by_user:t})=>{var s,i,c,l;if(t&&Y.add(e),ve.has(e))return;ve.add(e),J.delete(e);let n=P.indexOf(e);n>=0&&P.splice(n,1),(m==null?void 0:m.app_id)===e&&m.handle.cancel();let r=(l=(c=(s=y.getState().downloads[e])==null?void 0:s.version)!=null?c:(i=S(e))==null?void 0:i.version)!=null?l:"";k(e,{status:"uninstalling",progress:0,version:r}),await At(e),we(e),y.setState(o=>{let g={...o.downloads};return delete g[e],{downloads:g}}),delete W[e],ve.delete(e),_e(e,null),B("uninstalled",e,t?"(user)":"(not in list)"),K({type:"uninstalled",app_id:e})},Ct=e=>Pt(e,{by_user:!0}),kt=e=>{let t=ne(e);return t?(Y.delete(e),(m==null?void 0:m.app_id)===e||P.includes(e)||(W[e]=0,k(e,{status:J.has(e)?"paused":"queued",progress:0,version:t.version,error:void 0}),xe(e),z(),B("restore",e)),!0):!1},Ot=e=>{if(J.has(e))return;if(J.add(e),B("pause app",e),(m==null?void 0:m.app_id)===e&&!m.forced){m.handle.cancel();return}let t=y.getState().downloads[e];P.includes(e)&&t&&k(e,{status:"paused",progress:0,version:t.version})},It=e=>{if(!J.delete(e))return;B("resume app",e);let t=y.getState().downloads[e];(t==null?void 0:t.status)==="paused"&&!P.includes(e)&&ne(e)&&(W[e]=0,xe(e)),P.includes(e)&&t&&k(e,{status:"queued",progress:0,version:t.version}),z()},Dt=e=>{let{pause_reasons:t}=y.getState();t.includes(e)||(y.setState({pause_reasons:[...t,e]}),B("pause",e),t.length===0&&K({type:"pause_change",paused:!0,reasons:[e]}),m&&!m.forced&&m.handle.cancel())},Lt=e=>{let{pause_reasons:t}=y.getState();if(!t.includes(e))return;let n=t.filter(r=>r!==e);y.setState({pause_reasons:n}),B("resume",e),n.length===0&&K({type:"pause_change",paused:!1,reasons:n}),z()},Ne=e=>y.getState().updates[e],$t=async e=>{var n,r;let t=Ne(e);Se.add(e);try{let s=await ce(e),i=(r=t==null?void 0:t.next_version)!=null?r:(n=ne(e))==null?void 0:n.version;return!s||!i||s.version!==i?!1:(y.setState(c=>{var o;let l={...c.updates};return delete l[e],{updates:l,apply_ticks:{...c.apply_ticks,[e]:((o=c.apply_ticks[e])!=null?o:0)+1}}}),B("updated",e,t==null?void 0:t.current_version,"\u2192",s.version),!0)}finally{Se.delete(e)}},Nt=()=>Object.values(y.getState().catalog).map(e=>({...e,installed:!!S(e.app_id),removed_by_user:Y.has(e.app_id)})),ne=e=>y.getState().catalog[e],ce=async e=>{let t=ne(e);if(!t)return;if(J.delete(e),Y.delete(e),await De(t))return S(e);let n=S(e);if(bt(e)&&!Se.has(e)&&n&&await H(n))return n;let r=new Promise(s=>{var i;((i=Z[e])!=null?i:Z[e]=[]).push(s)});return(m==null?void 0:m.app_id)===e?m.forced=!0:(W[e]=0,xe(e,{front:!0}),m&&!m.forced?m.handle.cancel():z(e)),r};var _=require("react/jsx-runtime"),Fe=e=>(e!=null?e:"").replace(/\?[^#]*/,""),Ft=0,fn=()=>{let e=new Set;return{emit:t=>e.forEach(n=>n(t)),subscribe:t=>(e.add(t),()=>{e.delete(t)})}},hn=u.default.memo(({instance_key:e,is_active:t,is_front:n,is_dark:r,reload_tick:s,web_at_top:i,splash:c,bridge:l,opaque_background:o,onWebLoadEnd:g})=>{var qe,He;let A=(0,u.useRef)(null),v=(0,u.useRef)(!1),M=V(F,p=>p.instances[e]),d=M==null?void 0:M.app.app_id,L=M==null?void 0:M.app.manifest_url,b=M==null?void 0:M.context,f=M==null?void 0:M.url_params,[a,T]=(0,u.useState)(()=>d?S(d):null),[j,re]=(0,u.useState)(!1),[Vt,Je]=(0,u.useState)(0),[Wt,oe]=(0,u.useState)(0),[jt,O]=(0,u.useState)(!1),U=(0,u.useRef)(null),Ue=p=>{U.current&&clearTimeout(U.current),U.current=setTimeout(()=>{U.current=null,O(!0)},p)};(0,u.useEffect)(()=>()=>{U.current&&clearTimeout(U.current)},[]),(0,u.useEffect)(()=>{if(!d||!t&&a)return;let p=!0;return re(!1),(async()=>{let h=S(d),C=h?await H(h):!1;if(!p||(T(C?$=>!$||$.version!==h.version||$.permissions.join(",")!==h.permissions.join(",")?h:$:null),__DEV__&&Date.now()-Ft>1e4&&(Ft=Date.now(),await Ee()),!p))return;let q=await ce(d),Q=q!==void 0?q:L?await mt(d,L):S(d);if(p){if(!Q){re(!0);return}T($=>$!=null?$:Q)}})(),()=>{p=!1}},[t,d,L,Vt]),(0,u.useEffect)(()=>Mt(e,p=>A.current?(A.current.postMessage(p),!0):!1),[e]);let qt=V(y,p=>{let h=d?p.downloads[d]:void 0;return(h==null?void 0:h.status)==="installed"?h.version:void 0});(0,u.useEffect)(()=>{if(t||!d||!a)return;let p=S(d);if(!p||p.version===a.version)return;let h=!0;return H(p).then(C=>{!h||!C||(N(`webview:${e}`,"\u0111\u1ED5i bundle (\u1EA9n)",a.version,"\u2192",p.version),T(p))}),()=>{h=!1}},[t,d,qt,a==null?void 0:a.version]);let Ve=V(y,p=>{var h;return d&&(h=p.apply_ticks[d])!=null?h:0});(0,u.useEffect)(()=>{if(!Ve||!d)return;let p=S(d);if(!p||p.version===(a==null?void 0:a.version))return;let h=!0;return H(p).then(C=>{!h||!C||(N(`webview:${e}`,"c\u1EADp nh\u1EADt",a==null?void 0:a.version,"\u2192",p.version),O(!1),T(p))}),()=>{h=!1}},[Ve]),(0,u.useEffect)(()=>{var C;let p=(C=E().keep_alive)==null?void 0:C.idle_close_ms;if(t||!p||p<=0)return;let h=setTimeout(()=>{we(e)},p);return()=>clearTimeout(h)},[t,e]),(0,u.useEffect)(()=>{s>0&&(re(!1),O(!1),oe(p=>p+1),Je(p=>p+1))},[s]);let We=(0,u.useRef)(t);(0,u.useEffect)(()=>{var p;We.current!==t&&(We.current=t,v.current&&((p=A.current)==null||p.injectJavaScript(st(t?"resumed":"paused"))))},[t]);let le=`${(qe=a==null?void 0:a.version)!=null?qe:"none"}:${(He=a==null?void 0:a.permissions.join(","))!=null?He:""}:${Wt}`,ie=(0,u.useMemo)(()=>JSON.stringify([b!=null?b:{},f!=null?f:{}]),[b,f]),Re=(0,u.useMemo)(()=>{var p;return ut(f!=null?f:{},(p=a==null?void 0:a.permissions)!=null?p:[])},[ie,a==null?void 0:a.permissions]),Ht=(0,u.useMemo)(()=>ct(b!=null?b:{},Re)+it()+(E().debug?ot():""),[Re]),ue=(0,u.useRef)(null),je=(0,u.useRef)(null);(0,u.useEffect)(()=>{var h,C,q;if(!a)return;if(je.current!==le){je.current=le,ue.current=ie;return}if(ue.current===ie)return;let p=((C=JSON.parse((h=ue.current)!=null?h:"[]")[0])!=null?C:{}).org_id;if(ue.current=ie,p===(b==null?void 0:b.org_id)&&v.current){O(!1),Ue(1500),(q=A.current)==null||q.injectJavaScript(at(b!=null?b:{},Re));return}O(!1),oe(Q=>Q+1)},[ie,a,le]);let Kt=(0,u.useCallback)(async p=>{var C,q,Q,$,Te;let h=tt(p.nativeEvent.data);if(!h){if(d&&(l!=null&&l.onWebEvent))try{Promise.resolve(l.onWebEvent(p.nativeEvent.data,{app_id:d,instance_id:e})).catch(x=>{console.warn("[miniapp] onWebEvent l\u1ED7i",d,x)})}catch(x){console.warn("[miniapp] onWebEvent l\u1ED7i",d,x)}return}if(h.method==="log"){let{level:x,text:I}=h;N(`web:${e}`,x!=null?x:"log",I!=null?I:"");return}if(h.method==="pong"){U.current||O(!0);return}if(h.method==="touchAtTop"){i.emit(!!h.at_top);return}if(h.method==="contextApplied"){U.current&&clearTimeout(U.current),U.current=null,O(!0);return}if(h.method==="ready"){v.current=!0,O(!0);let x=(C=F.getState().instances[e])==null?void 0:C.context;x&&((q=A.current)==null||q.injectJavaScript(ke(x)));return}try{let x=await dt(h,{getHostData:()=>{var I,G;return(G=(I=F.getState().instances[e])==null?void 0:I.host_data)!=null?G:{}},getPermissions:()=>{var I,G;return d?(G=(I=S(d))==null?void 0:I.permissions)!=null?G:[]:[]},is_dark:r,close:te,app_id:d!=null?d:"",instance_id:e,options:l});h.id&&((Q=A.current)==null||Q.injectJavaScript(nt(h.id,x)))}catch(x){if(!h.id)return;let I=x==null?void 0:x.code,G=x instanceof R?x:new R(typeof I=="string"?I:"HOST_ERROR",String(($=x==null?void 0:x.message)!=null?$:x));(Te=A.current)==null||Te.injectJavaScript(rt(h.id,G))}},[e,r,d,i,l]),zt=(0,u.useCallback)(()=>{re(!1),oe(p=>p+1),Je(p=>p+1)},[]);return(0,_.jsxs)(w.View,{style:[w.StyleSheet.absoluteFill,o&&{backgroundColor:r?"#09090B":"#FFFFFF"},!n&&D.behind],pointerEvents:t?"auto":"none",children:[a?(0,_.jsx)(Jt.default,{ref:A,source:{uri:a.entry_uri},originWhitelist:["*"],allowingReadAccessToURL:`file://${a.dir}`,allowFileAccess:!0,allowFileAccessFromFileURLs:!0,allowUniversalAccessFromFileURLs:!0,injectedJavaScriptBeforeContentLoaded:Ht,onMessage:Kt,bounces:!1,overScrollMode:"never",onLoadStart:p=>{N(`webview:${e}`,"load start",Fe(p.nativeEvent.url)),v.current=!1,O(!1)},onError:p=>{N(`webview:${e}`,"load error",Fe(p.nativeEvent.url),p.nativeEvent.description),re(!0),O(!1)},onLoadEnd:p=>{let h=p.nativeEvent.url;N(`webview:${e}`,"load end",Fe(h)),d&&(g==null||g({app_id:d,instance_id:e,url:h})),Ue(1500)},onContentProcessDidTerminate:()=>{v.current=!1,O(!1),oe(p=>p+1)},onRenderProcessGone:()=>(v.current=!1,O(!1),oe(p=>p+1),!0),style:D.webview},le):null,M&&(0,_.jsx)(mn,{visible:!a||!jt,interactive:j,children:(0,_.jsx)(An,{splash:c,app:M.app,is_dark:r,error:j,has_bundle:!!a,retry:zt})})]})}),An=u.default.memo(({splash:e,app:t,is_dark:n,error:r,has_bundle:s,retry:i})=>{let c=e,l=be(t.app_id),o=r?"error":!s&&(l==null?void 0:l.status)==="downloading"?"downloading":"loading";return(0,_.jsx)(c,{app:t,is_dark:n,status:o,progress:o==="downloading"?l==null?void 0:l.progress:void 0,retry:i})}),mn=({visible:e,interactive:t,children:n})=>{let r=(0,u.useRef)(new w.Animated.Value(e?1:0)).current,[s,i]=(0,u.useState)(e);return(0,u.useEffect)(()=>{if(e){i(!0),r.setValue(1);return}let c=w.Animated.timing(r,{toValue:0,duration:180,useNativeDriver:!0});return c.start(({finished:l})=>{l&&i(!1)}),()=>c.stop()},[e,r]),s?(0,_.jsx)(w.Animated.View,{style:[w.StyleSheet.absoluteFill,{opacity:r}],pointerEvents:t?"auto":"none",children:n}):null},Be=({app:e,is_dark:t,status:n,progress:r,retry:s})=>{let i=t?"#FAFAFA":"#18181B";return(0,_.jsxs)(w.View,{style:[D.splash,{backgroundColor:t?"#09090B":"#FFFFFF"}],children:[(0,_.jsx)(w.View,{style:[D.splash_icon,{backgroundColor:t?"#18181B":"#F4F4F5"}],children:e.icon?(0,_.jsx)(w.Image,{source:{uri:e.icon},style:D.splash_icon_image}):(0,_.jsx)(w.Text,{style:D.splash_letter,children:(e.name||"?").slice(0,1).toUpperCase()})}),(0,_.jsx)(w.Text,{style:[D.splash_name,{color:i}],children:e.name}),n==="error"?(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(w.Text,{style:D.splash_hint,children:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c mini app"}),(0,_.jsx)(w.TouchableOpacity,{activeOpacity:.7,style:[D.retry_button,{backgroundColor:t?"#27272A":"#F4F4F5"}],onPress:s,children:(0,_.jsx)(w.Text,{style:[D.retry_text,{color:i}],children:"Th\u1EED l\u1EA1i"})})]}):(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(w.ActivityIndicator,{style:D.splash_spinner,color:t?"#A1A1AA":"#71717A"}),n==="downloading"&&(0,_.jsxs)(w.Text,{style:D.splash_hint,children:["\u0110ang t\u1EA3i mini app",r?` ${Math.round(r*100)}%`:"\u2026"]})]})]})},Bt=(e,t)=>{let n=(0,u.useRef)(t),r=(0,u.useRef)(!1);__DEV__&&!r.current&&n.current!==t&&(r.current=!0,console.warn(`[miniapp] MiniAppHost prop "${e}" \u0111\u1ED5i gi\u1EEFa c\xE1c l\u1EA7n render \u2192 m\u1ECDi WebView b\u1ECB mount l\u1EA1i. Khai b\xE1o component b\xEAn ngo\xE0i render.`))},Mn=({container:e,splash:t=Be,is_dark:n=!1,bridge:r,close_on_back:s=!0,opaque_background:i=!0,onWebLoadEnd:c})=>{Bt("container",e),Bt("splash",t);let l=e,o=V(F,a=>a.active_key),g=(0,u.useRef)(o);o&&(g.current=o);let A=V(F,a=>Object.keys(a.instances).join("|")),v=V(F,a=>{var T;return a.active_key?(T=a.instances[a.active_key])==null?void 0:T.app.name:void 0}),M=(0,u.useMemo)(()=>A?A.split("|"):[],[A]),[d,L]=(0,u.useState)({}),b=(0,u.useRef)(fn()).current;(0,u.useEffect)(()=>{if(!o||!s)return;let a=w.BackHandler.addEventListener("hardwareBackPress",()=>(te(),!0));return()=>a.remove()},[o,s]);let f=(0,u.useCallback)(()=>{let a=F.getState().active_key;a&&L(T=>({...T,[a]:(T[a]||0)+1}))},[]);return M.length?(0,_.jsx)(l,{visible:!!o,title:v!=null?v:"",is_dark:n,close:te,reload:f,subscribeWebAtTop:b.subscribe,children:M.map(a=>(0,_.jsx)(hn,{instance_key:a,is_active:o===a,is_front:(o!=null?o:g.current)===a,is_dark:n,reload_tick:d[a]||0,web_at_top:b,splash:t,bridge:r,opaque_background:i,onWebLoadEnd:c},a))}):null},D=w.StyleSheet.create({webview:{flex:1,backgroundColor:"transparent"},behind:{zIndex:-1},splash:{flex:1,alignItems:"center",justifyContent:"center",gap:12},splash_icon:{width:72,height:72,borderRadius:20,alignItems:"center",justifyContent:"center",overflow:"hidden"},splash_icon_image:{width:72,height:72},splash_letter:{fontSize:28,fontWeight:"700",color:"#1D4ED8"},splash_name:{fontSize:16,fontWeight:"600"},splash_hint:{color:"#71717A"},splash_spinner:{marginTop:8},retry_button:{marginTop:4,paddingHorizontal:20,paddingVertical:10,borderRadius:999},retry_text:{fontWeight:"600"}}),Ut=u.default.memo(Mn);0&&(module.exports={DefaultMiniAppSplash,MINIAPP_PLATFORM_URL,MiniAppHost,MiniAppHostError,closeMiniApp,configureMiniApp,createMmkvStorage,createRnfsFileSystem,ensureMiniApp,getLocalMiniApp,getMiniAppCatalog,getMiniAppCatalogEntry,getMiniAppStatuses,getMiniAppUpdate,onMiniAppEvent,openMiniApp,pauseMiniApp,pauseMiniAppDownloads,preloadMiniApp,restoreMiniApp,resumeMiniApp,resumeMiniAppDownloads,sendEventToWeb,syncMiniAppCatalog,uninstallMiniApp,updateMiniApp,useMiniAppDownload,useMiniAppDownloadsPaused});
|
|
45
|
+
true;`},dt={partner:"partner_token",chatbox:"chatbox_token"},gt=(e,t)=>{let n={...e};for(let r of Object.values(dt))t.includes(r)||delete n[r];return n},Ce=new Set,nt=async(e,t)=>{if(Ce.has(e))throw new T("BUSY",`${e} \u0111ang ch\u1EA1y \u2014 ch\u1EDD l\u01B0\u1EE3t tr\u01B0\u1EDBc xong`);Ce.add(e);try{return await t()}finally{Ce.delete(e)}},on=new Set(["selection","impactLight","impactMedium","impactHeavy","rigid","soft","notificationSuccess","notificationWarning","notificationError"]),Oe=(e,t)=>{if(typeof e!="string"||!e)throw new T("INVALID_PARAMS",`Thi\u1EBFu ${t}`);return e},ft=async({method:e,params:t},{getHostData:n,getPermissions:r,is_dark:s,close:o,app_id:c,instance_id:l,options:i})=>{var x,m,h,$,w;let u=i==null?void 0:i.handlers,y={app_id:c,instance_id:l,close:o},M=()=>new T("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF \u1EE9ng d\u1EE5ng n\xE0y`);switch(e){case"requestPayment":{let d=u==null?void 0:u.requestPayment;if(!d)throw M();let a=t==null?void 0:t.amount;if(typeof a!="number"||!Number.isFinite(a)||a<=0)throw new T("INVALID_PARAMS","amount ph\u1EA3i l\xE0 s\u1ED1 > 0");let P={...t,amount:a,currency:Oe(t==null?void 0:t.currency,"currency")};return nt(e,()=>d(P,y))}case"printImage":{let d=u==null?void 0:u.printImage;if(!d)throw M();let a=Oe(t==null?void 0:t.image,"image");await nt(e,()=>d({image:a},y));return}case"openScreen":if(!(u!=null&&u.openScreen))throw M();await u.openScreen({screen:Oe(t==null?void 0:t.screen,"screen"),params:t==null?void 0:t.params},y);return;case"closeApp":o();return;case"openWebview":{let d=String((x=t==null?void 0:t.url)!=null?x:"");if(!/^https?:\/\//i.test(d))throw new T("INVALID_PARAMS","url ph\u1EA3i l\xE0 http(s)");await(i!=null&&i.openUrl?i.openUrl(d):he.Linking.openURL(d));return}case"showToast":(h=i==null?void 0:i.showToast)==null||h.call(i,String((m=t==null?void 0:t.message)!=null?m:""));return;case"haptic":{let d=on.has(t==null?void 0:t.type)?t.type:"selection";($=i==null?void 0:i.haptic)==null||$.call(i,d);return}case"getSystemInfo":return{platform:he.Platform.OS==="ios"?"ios":"android",appVersion:(w=i==null?void 0:i.app_version)!=null?w:"",theme:s?"dark":"light"};case"getAccessToken":{let d=n().access_token;if(!d)throw new T("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return d}case"getToken":{let d=t==null?void 0:t.type;if(d==="access"){let re=n().access_token;if(!re)throw new T("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return re}if(d!=="partner"&&d!=="chatbox")throw new T("HOST_ERROR",`Lo\u1EA1i token kh\xF4ng h\u1EE3p l\u1EC7: ${String(d)}`);let a=dt[d];if(!r().includes(a))throw new T("PERMISSION_DENIED",`Mini app ch\u01B0a \u0111\u01B0\u1EE3c c\u1EA5p quy\u1EC1n ${a} (Console \u2192 Quy\u1EC1n l\u1EA5y token)`);let P=d==="partner"?n().partner_token:n().chatbox_token;if(!P)throw new T("HOST_ERROR",`Kh\xF4ng c\xF3 ${a}`);return P}case"getUserInfo":{let d=n().user;if(!d)throw new T("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin nh\xE2n vi\xEAn");return d}case"getPageInfo":{let d=n().page;if(!d)throw new T("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin page");return d}case"sendMessage":case"insertText":throw new T("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF phi\xEAn b\u1EA3n app n\xE0y`);default:throw new T("NOT_SUPPORTED",`API kh\xF4ng t\u1ED3n t\u1EA1i: ${e}`)}};var Ie=e=>`bundle:${e}`,De=()=>`${R().file_system.document_dir}/miniapps`,Le=De,mt=(e,t,n="index.html",r=!1,s=[])=>{let o=`${Le()}/${e}/${t}`;return{app_id:e,version:t,dir:o,entry_uri:`file://${o}/${n}`,context_update:r,permissions:s}},ht=e=>{var t;R().storage.setString(Ie(e.app_id),JSON.stringify({version:e.version,entry:e.entry,context_update:!!e.context_update,permissions:(t=e.permissions)!=null?t:[]}))},sn=(e,t)=>/^https?:\/\//.test(t)?t:`${e.replace(/[^/]*$/,"")}${t}`,b=e=>{let t=R().storage.getString(Ie(e));if(!t)return null;try{let{version:n,entry:r,context_update:s,permissions:o}=JSON.parse(t);return mt(e,n,r,!!s,Array.isArray(o)?o:[])}catch{return null}},q=e=>R().file_system.exists(e.entry_uri.replace("file://","")),$e=async e=>{let t=b(e.app_id);return(t==null?void 0:t.version)===e.version&&await q(t)},an=async(e,t)=>{let n=R().file_system,r=`${Le()}/${e}`,s=await n.listDir(r).catch(()=>[]);await Promise.all(s.filter(o=>!t.includes(o)).map(o=>n.remove(`${r}/${o}`).catch(()=>{})))},Mt=async e=>{var t;await((t=pe[e])==null?void 0:t.catch(()=>{})),R().storage.setString(Ie(e),""),await R().file_system.remove(`${Le()}/${e}`).catch(()=>{})},ee=class extends Error{constructor(){super("cancelled"),this.name="MiniAppInstallCancelled"}},pe={},Ne=(e,{base_url:t,onProgress:n}={})=>{var x;let r=R().file_system,s=null,o=!1,c=`${r.cache_dir}/${e.app_id}-${e.version}.zip`,l=()=>{if(o)throw new ee},i=async()=>{var $;l();let m=b(e.app_id);if((m==null?void 0:m.version)===e.version&&await r.exists(m.dir))return ht(e),b(e.app_id);l();let h=r.download({url:t?sn(t,e.bundle_url):e.bundle_url,to_file:c,onProgress:(w,d)=>{var P;let a=d>0?d:(P=e.size)!=null?P:0;a>0&&(n==null||n(Math.min(1,w/a)))}});s=h;try{let{status:w}=await h.promise;if(l(),w!==200)throw new Error(`bundle ${w}`);if(e.sha256)if(r.sha256){if(await r.sha256(c)!==e.sha256)throw new Error("sha256 mismatch")}else F("b\u1ECF qua ki\u1EC3m tra sha256 (file_system kh\xF4ng c\xF3 sha256)",e.app_id);l();let d=mt(e.app_id,e.version,e.entry,!!e.context_update,($=e.permissions)!=null?$:[]);return await r.remove(d.dir).catch(()=>{}),await r.mkdir(d.dir),await r.unzip(c,d.dir),ht(e),an(e.app_id,[e.version,m==null?void 0:m.version].filter(Boolean)),d}catch(w){throw o?new ee:w}finally{s=null,r.remove(c).catch(()=>{})}},y=((x=pe[e.app_id])!=null?x:Promise.resolve()).catch(()=>{}).then(i),M=y.catch(()=>{});return pe[e.app_id]=M,M.then(()=>{pe[e.app_id]===M&&delete pe[e.app_id]}),{promise:y,cancel:()=>{o=!0,s==null||s.cancel()}}},ae={},pn=__DEV__?0:60*1e3,At={},yt=(e,t)=>{var r,s;let n=b(e);return n&&Date.now()-((r=At[t])!=null?r:0)<pn?Promise.resolve(n):((s=ae[e])!=null||(ae[e]=(async()=>{let o=await fetch(t,{headers:{"Cache-Control":"no-cache"}});if(!o.ok)throw new Error(`manifest ${o.status}`);let c=await o.json(),l=await Ne(c,{base_url:t}).promise;return At[t]=Date.now(),l})().catch(o=>(console.warn("[miniapp] sync failed",e,o==null?void 0:o.message),b(e))).finally(()=>{ae[e]=void 0})),ae[e])};var Me=new Map,wt=(e,t)=>(Me.set(e,t),()=>{Me.get(e)===t&&Me.delete(e)}),vt=(e,t)=>{let n=Me.get(e);return n?n(t):!1};var ye=require("react"),we=e=>{let t=e,n=new Set;return{getState:()=>t,setState:r=>{let s=typeof r=="function"?r(t):r;t={...t,...s},n.forEach(o=>o())},subscribe:r=>(n.add(r),()=>{n.delete(r)})}},H=(e,t,n=Object.is)=>{let r=(0,ye.useRef)(null),s=()=>{let o=e.getState(),c=r.current;if(c&&c.state===o&&c.selector===t)return c.value;let l=t(o),i=c&&n(c.value,l)?c.value:l;return r.current={state:o,selector:t,value:i},i};return(0,ye.useSyncExternalStore)(e.subscribe,s)};var B=we({active_key:null,instances:{}}),_t=({app:e,instance_id:t,context:n={},url_params:r={},host_data:s={}},o)=>{var l;let c=(l=R().keep_alive)==null?void 0:l.max_webviews;B.setState(i=>{let u=t!=null?t:e.app_id,y={...i.instances,[u]:{key:u,app:e,context:n,url_params:r,host_data:s,last_used_at:Date.now()}},M=Object.keys(y);return c&&c>0&&M.length>c&&M.filter(x=>x!==u).sort((x,m)=>y[x].last_used_at-y[m].last_used_at).slice(0,M.length-c).forEach(x=>{delete y[x]}),o?{active_key:u,instances:y}:{instances:y}})},St=e=>_t(e,!0),bt=e=>_t(e,!1),te=()=>B.setState({active_key:null}),ve=e=>{B.setState(t=>{if(t.active_key===e||!t.instances[e])return{};let n={...t.instances};return delete n[e],{instances:n}})};var xt="catalog",cn="paused_apps",ln="removed_apps",un=10*1e3,dn=2,gn=3e3,fn=()=>{var e;try{return JSON.parse((e=R().storage.getString(xt))!=null?e:"{}")}catch{return{}}},v=we({catalog:{},downloads:{},pause_reasons:[],updates:{},apply_ticks:{}}),Et=e=>{var t;return!!((t=R().manual_update)!=null&&t.includes(e))},be=new Set,Rt=e=>{let t=new Set,n=()=>R().storage.setString(e,JSON.stringify([...t]));return{has:r=>t.has(r),values:()=>[...t],add:r=>t.has(r)?!1:(t.add(r),n(),!0),delete:r=>t.delete(r)?(n(),!0):!1,load:()=>{var r;t.clear();try{let s=JSON.parse((r=R().storage.getString(e))!=null?r:"[]");Array.isArray(s)&&s.forEach(o=>{typeof o=="string"&&t.add(o)})}catch{}}}},U=Rt(cn),Y=Rt(ln);Ze(()=>{U.load(),Y.load();let e=fn(),t={};Object.keys(e).filter(n=>!Y.has(n)).forEach(n=>{let r=b(n);r?t[n]={status:"installed",progress:1,version:r.version,has_local:!0}:U.has(n)&&(t[n]={status:"paused",progress:0,version:e[n].version,has_local:!1})}),v.setState({catalog:e,downloads:t})});var xe=e=>H(v,t=>e?t.downloads[e]:void 0),Tt=()=>H(v,e=>e.pause_reasons.length>0),J=(...e)=>F("queue",...e),C=[],W={},A=null,_e=new Set,Z={},Fe=new Set,K=e=>{Fe.forEach(t=>{try{t(e)}catch(n){console.warn("[miniapp-queue] event listener error",n==null?void 0:n.message)}})},Pt=e=>(Fe.add(e),()=>{Fe.delete(e)}),Ct=()=>v.getState().downloads,k=(e,t)=>{let n=!!b(e),r=v.getState().downloads[e],s=t.status==="downloading"&&n?"updating":t.status,o={...r!=null?r:{status:"queued",progress:0},...t,...s?{status:s}:{},has_local:n};v.setState(c=>({downloads:{...c.downloads,[e]:o}})),(r==null?void 0:r.status)!==o.status||(r==null?void 0:r.version)!==o.version||(r==null?void 0:r.has_local)!==o.has_local?K({type:"status_change",app_id:e,state:o}):r.progress!==o.progress&&K({type:"progress",app_id:e,progress:o.progress,version:o.version})},Se=(e,t)=>{var n;(n=Z[e])==null||n.forEach(r=>r(t)),delete Z[e]},hn=()=>v.getState().pause_reasons.length>0,z=e=>{var l;if(A)return;let t=e?C.indexOf(e):hn()?-1:C.findIndex(i=>!U.has(i));if(t<0||t>=C.length)return;let[n]=C.splice(t,1),r=v.getState().catalog[n];if(!r){Se(n,b(n)),z();return}let s=Date.now();W[n]=((l=W[n])!=null?l:0)+1,k(n,{status:"downloading",progress:0,version:r.version,error:void 0});let o=0,c=Ne(r,{onProgress:i=>{let u=Math.floor(i*100);u!==o&&(o=u,k(n,{progress:u/100,version:r.version}))}});A={app_id:n,handle:c,forced:!!e},J("start",n,r.version,e?"(forced)":""),c.promise.then(i=>{J("installed",n,r.version,`${Date.now()-s}ms`),k(n,{status:"installed",progress:1,version:r.version}),Se(n,i)}).catch(i=>{var y;if(i instanceof ee){if(_e.has(n))return;J("paused",n),W[n]-=1,C.unshift(n),k(n,{status:U.has(n)?"paused":"queued",progress:0,version:r.version});return}let u=String((y=i==null?void 0:i.message)!=null?y:i);if(console.warn("[miniapp-queue] failed",n,u),W[n]<dn){k(n,{status:"queued",progress:0,version:r.version,error:u}),setTimeout(()=>{var M;C.includes(n)||(A==null?void 0:A.app_id)===n||(C.push(n),z((M=Z[n])!=null&&M.length?n:void 0))},gn);return}k(n,{status:"failed",progress:0,version:r.version,error:u}),Se(n,b(n))}).finally(()=>{A=null;let i=C.find(u=>{var y;return(y=Z[u])==null?void 0:y.length});z(i)})},Ee=(e,{front:t=!1}={})=>{if((A==null?void 0:A.app_id)===e)return;let n=C.indexOf(e);if(n>=0){if(!t)return;C.splice(n,1)}t?C.unshift(e):C.push(e)},An=async e=>{let{host_id:t,client_token:n}=R(),r=new AbortController,s=setTimeout(()=>r.abort(),un);try{let o=`${fe}/api/hosts/${encodeURIComponent(t)}/miniapps?channel=${e}`,c=await fetch(o,{headers:{Authorization:`Bearer ${n}`,"Cache-Control":"no-cache"},signal:r.signal});if(!c.ok)throw new Error(`host list ${e} ${c.status}`);return(await c.json()).apps.map(i=>({...i,channel:e}))}finally{clearTimeout(s)}},ce=null,Re=()=>(ce!=null||(ce=(async()=>{var t;let e=Date.now();try{let n=await Promise.all(R().channels.map(An)),r={};[...n].reverse().flat().forEach(i=>{r[i.app_id]=i});let s=Object.keys(v.getState().catalog).filter(i=>!r[i]);R().storage.setString(xt,JSON.stringify(r)),v.setState({catalog:r}),await Promise.all(s.map(i=>Ot(i,{by_user:!1}))),s.forEach(i=>Y.delete(i));let o=Object.keys(r).filter(i=>!Y.has(i)),c=[],l={};for(let i of o.map(u=>r[u])){if(await $e(i)){k(i.app_id,{status:"installed",progress:1,version:i.version});continue}let u=b(i.app_id);if(Et(i.app_id)&&!be.has(i.app_id)&&u&&await q(u)){k(i.app_id,{status:"installed",progress:1,version:u.version}),l[i.app_id]={app_id:i.app_id,current_version:u.version,next_version:i.version};continue}c.push(i)}return v.setState({updates:l}),c.forEach(i=>{W[i.app_id]=0,k(i.app_id,{status:U.has(i.app_id)?"paused":"queued",progress:0,version:i.version,error:void 0}),Ee(i.app_id)}),J("catalog",o.length,"apps, outdated",c.map(i=>i.app_id),"removed",s,`${Date.now()-e}ms`),K({type:"sync_complete",app_ids:o,removed:s}),Object.values(l).forEach(i=>K({type:"update_available",...i})),z(),{ok:!0,app_ids:o,removed:s}}catch(n){let r=String((n==null?void 0:n.name)==="AbortError"?"timeout":(t=n==null?void 0:n.message)!=null?t:n);return console.warn("[miniapp-queue] sync catalog failed",r),K({type:"sync_failed",error:r}),{ok:!1,error:r}}finally{ce=null}})()),ce),Ot=async(e,{by_user:t})=>{var s,o,c,l;if(t&&Y.add(e),_e.has(e))return;_e.add(e),U.delete(e);let n=C.indexOf(e);n>=0&&C.splice(n,1),(A==null?void 0:A.app_id)===e&&A.handle.cancel();let r=(l=(c=(s=v.getState().downloads[e])==null?void 0:s.version)!=null?c:(o=b(e))==null?void 0:o.version)!=null?l:"";k(e,{status:"uninstalling",progress:0,version:r}),await Mt(e),ve(e),v.setState(i=>{let u={...i.downloads};return delete u[e],{downloads:u}}),delete W[e],_e.delete(e),Se(e,null),J("uninstalled",e,t?"(user)":"(not in list)"),K({type:"uninstalled",app_id:e})},kt=e=>Ot(e,{by_user:!0}),It=e=>{let t=ne(e);return t?(Y.delete(e),(A==null?void 0:A.app_id)===e||C.includes(e)||(W[e]=0,k(e,{status:U.has(e)?"paused":"queued",progress:0,version:t.version,error:void 0}),Ee(e),z(),J("restore",e)),!0):!1},Dt=e=>{if(U.has(e))return;if(U.add(e),J("pause app",e),(A==null?void 0:A.app_id)===e&&!A.forced){A.handle.cancel();return}let t=v.getState().downloads[e];C.includes(e)&&t&&k(e,{status:"paused",progress:0,version:t.version})},Lt=e=>{if(!U.delete(e))return;J("resume app",e);let t=v.getState().downloads[e];(t==null?void 0:t.status)==="paused"&&!C.includes(e)&&ne(e)&&(W[e]=0,Ee(e)),C.includes(e)&&t&&k(e,{status:"queued",progress:0,version:t.version}),z()},$t=e=>{let{pause_reasons:t}=v.getState();t.includes(e)||(v.setState({pause_reasons:[...t,e]}),J("pause",e),t.length===0&&K({type:"pause_change",paused:!0,reasons:[e]}),A&&!A.forced&&A.handle.cancel())},Nt=e=>{let{pause_reasons:t}=v.getState();if(!t.includes(e))return;let n=t.filter(r=>r!==e);v.setState({pause_reasons:n}),J("resume",e),n.length===0&&K({type:"pause_change",paused:!1,reasons:n}),z()},Be=e=>v.getState().updates[e],Ft=async e=>{var n,r;let t=Be(e);be.add(e);try{let s=await le(e),o=(r=t==null?void 0:t.next_version)!=null?r:(n=ne(e))==null?void 0:n.version;return!s||!o||s.version!==o?!1:(v.setState(c=>{var i;let l={...c.updates};return delete l[e],{updates:l,apply_ticks:{...c.apply_ticks,[e]:((i=c.apply_ticks[e])!=null?i:0)+1}}}),J("updated",e,t==null?void 0:t.current_version,"\u2192",s.version),!0)}finally{be.delete(e)}},Bt=()=>Object.values(v.getState().catalog).map(e=>({...e,installed:!!b(e.app_id),removed_by_user:Y.has(e.app_id)})),ne=e=>v.getState().catalog[e],le=async e=>{let t=ne(e);if(!t)return;if(U.delete(e),Y.delete(e),await $e(t))return b(e);let n=b(e);if(Et(e)&&!be.has(e)&&n&&await q(n))return n;let r=new Promise(s=>{var o;((o=Z[e])!=null?o:Z[e]=[]).push(s)});return(A==null?void 0:A.app_id)===e?A.forced=!0:(W[e]=0,Ee(e,{front:!0}),A&&!A.forced?A.handle.cancel():z(e)),r};var S=require("react/jsx-runtime"),Je=e=>(e!=null?e:"").replace(/\?[^#]*/,""),Jt=0,mn=()=>{let e=new Set;return{emit:t=>e.forEach(n=>n(t)),subscribe:t=>(e.add(t),()=>{e.delete(t)})}},Mn=g.default.memo(({instance_key:e,is_active:t,is_front:n,is_dark:r,reload_tick:s,web_at_top:o,splash:c,bridge:l,opaque_background:i,allow_embedded_miniapps:u,onWebLoadEnd:y})=>{var Ke,ze;let M=(0,g.useRef)(null),x=(0,g.useRef)(!1),m=H(B,p=>p.instances[e]),h=m==null?void 0:m.app.app_id,$=m==null?void 0:m.app.manifest_url,w=m==null?void 0:m.context,d=m==null?void 0:m.url_params,[a,P]=(0,g.useState)(()=>h?b(h):null),[re,ie]=(0,g.useState)(!1),[Wt,Ve]=(0,g.useState)(0),[jt,oe]=(0,g.useState)(0),[qt,I]=(0,g.useState)(!1),V=(0,g.useRef)(null),He=p=>{V.current&&clearTimeout(V.current),V.current=setTimeout(()=>{V.current=null,I(!0)},p)};(0,g.useEffect)(()=>()=>{V.current&&clearTimeout(V.current)},[]),(0,g.useEffect)(()=>{if(!h||!t&&a)return;let p=!0;return ie(!1),(async()=>{let f=b(h),O=f?await q(f):!1;if(!p||(P(O?N=>!N||N.version!==f.version||N.permissions.join(",")!==f.permissions.join(",")?f:N:null),__DEV__&&Date.now()-Jt>1e4&&(Jt=Date.now(),await Re()),!p))return;let j=await le(h),Q=j!==void 0?j:$?await yt(h,$):b(h);if(p){if(!Q){ie(!0);return}P(N=>N!=null?N:Q)}})(),()=>{p=!1}},[t,h,$,Wt]),(0,g.useEffect)(()=>wt(e,p=>M.current?(M.current.postMessage(p),!0):!1),[e]);let Kt=H(v,p=>{let f=h?p.downloads[h]:void 0;return(f==null?void 0:f.status)==="installed"?f.version:void 0});(0,g.useEffect)(()=>{if(t||!h||!a)return;let p=b(h);if(!p||p.version===a.version)return;let f=!0;return q(p).then(O=>{!f||!O||(F(`webview:${e}`,"\u0111\u1ED5i bundle (\u1EA9n)",a.version,"\u2192",p.version),P(p))}),()=>{f=!1}},[t,h,Kt,a==null?void 0:a.version]);let We=H(v,p=>{var f;return h&&(f=p.apply_ticks[h])!=null?f:0});(0,g.useEffect)(()=>{if(!We||!h)return;let p=b(h);if(!p||p.version===(a==null?void 0:a.version))return;let f=!0;return q(p).then(O=>{!f||!O||(F(`webview:${e}`,"c\u1EADp nh\u1EADt",a==null?void 0:a.version,"\u2192",p.version),I(!1),P(p))}),()=>{f=!1}},[We]),(0,g.useEffect)(()=>{var O;let p=(O=R().keep_alive)==null?void 0:O.idle_close_ms;if(t||!p||p<=0)return;let f=setTimeout(()=>{ve(e)},p);return()=>clearTimeout(f)},[t,e]),(0,g.useEffect)(()=>{s>0&&(ie(!1),I(!1),oe(p=>p+1),Ve(p=>p+1))},[s]);let je=(0,g.useRef)(t);(0,g.useEffect)(()=>{var p;je.current!==t&&(je.current=t,x.current&&((p=M.current)==null||p.injectJavaScript(pt(t?"resumed":"paused"))))},[t]);let ue=`${(Ke=a==null?void 0:a.version)!=null?Ke:"none"}:${(ze=a==null?void 0:a.permissions.join(","))!=null?ze:""}:${jt}`,se=(0,g.useMemo)(()=>JSON.stringify([w!=null?w:{},d!=null?d:{}]),[w,d]),Te=(0,g.useMemo)(()=>{var p;return gt(d!=null?d:{},(p=a==null?void 0:a.permissions)!=null?p:[])},[se,a==null?void 0:a.permissions]),zt=(0,g.useMemo)(()=>ut(w!=null?w:{},Te)+at()+(R().debug?st():""),[Te]),de=(0,g.useRef)(null),qe=(0,g.useRef)(null);(0,g.useEffect)(()=>{var f,O,j;if(!a)return;if(qe.current!==ue){qe.current=ue,de.current=se;return}if(de.current===se)return;let p=((O=JSON.parse((f=de.current)!=null?f:"[]")[0])!=null?O:{}).org_id;if(de.current=se,p===(w==null?void 0:w.org_id)&&x.current){I(!1),He(1500),(j=M.current)==null||j.injectJavaScript(ct(w!=null?w:{},Te));return}I(!1),oe(Q=>Q+1)},[se,a,ue]);let Yt=(0,g.useCallback)(async p=>{var O,j,Q,N,Pe;let f=rt(p.nativeEvent.data);if(!f){if(h&&(l!=null&&l.onWebEvent))try{Promise.resolve(l.onWebEvent(p.nativeEvent.data,{app_id:h,instance_id:e})).catch(E=>{console.warn("[miniapp] onWebEvent l\u1ED7i",h,E)})}catch(E){console.warn("[miniapp] onWebEvent l\u1ED7i",h,E)}return}if(f.method==="log"){let{level:E,text:D}=f;F(`web:${e}`,E!=null?E:"log",D!=null?D:"");return}if(f.method==="pong"){V.current||I(!0);return}if(f.method==="touchAtTop"){o.emit(!!f.at_top);return}if(f.method==="contextApplied"){V.current&&clearTimeout(V.current),V.current=null,I(!0);return}if(f.method==="ready"){x.current=!0,I(!0);let E=(O=B.getState().instances[e])==null?void 0:O.context;E&&((j=M.current)==null||j.injectJavaScript(ke(E)));return}try{let E=await ft(f,{getHostData:()=>{var D,G;return(G=(D=B.getState().instances[e])==null?void 0:D.host_data)!=null?G:{}},getPermissions:()=>{var D,G;return h?(G=(D=b(h))==null?void 0:D.permissions)!=null?G:[]:[]},is_dark:r,close:te,app_id:h!=null?h:"",instance_id:e,options:l});f.id&&((Q=M.current)==null||Q.injectJavaScript(it(f.id,E)))}catch(E){if(!f.id)return;let D=E==null?void 0:E.code,G=E instanceof T?E:new T(typeof D=="string"?D:"HOST_ERROR",String((N=E==null?void 0:E.message)!=null?N:E));(Pe=M.current)==null||Pe.injectJavaScript(ot(f.id,G))}},[e,r,h,o,l]),Qt=(0,g.useCallback)(()=>{ie(!1),oe(p=>p+1),Ve(p=>p+1)},[]);return(0,S.jsxs)(_.View,{style:[_.StyleSheet.absoluteFill,i&&{backgroundColor:r?"#09090B":"#FFFFFF"},!n&&L.behind],pointerEvents:t?"auto":"none",children:[a?(0,S.jsx)(Vt.default,{ref:M,source:{uri:a.entry_uri},originWhitelist:["*"],allowingReadAccessToURL:`file://${u?De():a.dir}`,allowFileAccess:!0,allowFileAccessFromFileURLs:!0,allowUniversalAccessFromFileURLs:!0,injectedJavaScriptBeforeContentLoaded:zt,onMessage:Yt,bounces:!1,overScrollMode:"never",onLoadStart:p=>{F(`webview:${e}`,"load start",Je(p.nativeEvent.url)),x.current=!1,I(!1)},onError:p=>{F(`webview:${e}`,"load error",Je(p.nativeEvent.url),p.nativeEvent.description),ie(!0),I(!1)},onLoadEnd:p=>{let f=p.nativeEvent.url;F(`webview:${e}`,"load end",Je(f)),h&&(y==null||y({app_id:h,instance_id:e,url:f})),He(1500)},onContentProcessDidTerminate:()=>{x.current=!1,I(!1),oe(p=>p+1)},onRenderProcessGone:()=>(x.current=!1,I(!1),oe(p=>p+1),!0),style:L.webview},ue):null,m&&(0,S.jsx)(wn,{visible:!a||!qt,interactive:re,children:(0,S.jsx)(yn,{splash:c,app:m.app,is_dark:r,error:re,has_bundle:!!a,retry:Qt})})]})}),yn=g.default.memo(({splash:e,app:t,is_dark:n,error:r,has_bundle:s,retry:o})=>{let c=e,l=xe(t.app_id),i=r?"error":!s&&(l==null?void 0:l.status)==="downloading"?"downloading":"loading";return(0,S.jsx)(c,{app:t,is_dark:n,status:i,progress:i==="downloading"?l==null?void 0:l.progress:void 0,retry:o})}),wn=({visible:e,interactive:t,children:n})=>{let r=(0,g.useRef)(new _.Animated.Value(e?1:0)).current,[s,o]=(0,g.useState)(e);return(0,g.useEffect)(()=>{if(e){o(!0),r.setValue(1);return}let c=_.Animated.timing(r,{toValue:0,duration:180,useNativeDriver:!0});return c.start(({finished:l})=>{l&&o(!1)}),()=>c.stop()},[e,r]),s?(0,S.jsx)(_.Animated.View,{style:[_.StyleSheet.absoluteFill,{opacity:r}],pointerEvents:t?"auto":"none",children:n}):null},Ue=({app:e,is_dark:t,status:n,progress:r,retry:s})=>{let o=t?"#FAFAFA":"#18181B";return(0,S.jsxs)(_.View,{style:[L.splash,{backgroundColor:t?"#09090B":"#FFFFFF"}],children:[(0,S.jsx)(_.View,{style:[L.splash_icon,{backgroundColor:t?"#18181B":"#F4F4F5"}],children:e.icon?(0,S.jsx)(_.Image,{source:{uri:e.icon},style:L.splash_icon_image}):(0,S.jsx)(_.Text,{style:L.splash_letter,children:(e.name||"?").slice(0,1).toUpperCase()})}),(0,S.jsx)(_.Text,{style:[L.splash_name,{color:o}],children:e.name}),n==="error"?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(_.Text,{style:L.splash_hint,children:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c mini app"}),(0,S.jsx)(_.TouchableOpacity,{activeOpacity:.7,style:[L.retry_button,{backgroundColor:t?"#27272A":"#F4F4F5"}],onPress:s,children:(0,S.jsx)(_.Text,{style:[L.retry_text,{color:o}],children:"Th\u1EED l\u1EA1i"})})]}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(_.ActivityIndicator,{style:L.splash_spinner,color:t?"#A1A1AA":"#71717A"}),n==="downloading"&&(0,S.jsxs)(_.Text,{style:L.splash_hint,children:["\u0110ang t\u1EA3i mini app",r?` ${Math.round(r*100)}%`:"\u2026"]})]})]})},Ut=(e,t)=>{let n=(0,g.useRef)(t),r=(0,g.useRef)(!1);__DEV__&&!r.current&&n.current!==t&&(r.current=!0,console.warn(`[miniapp] MiniAppHost prop "${e}" \u0111\u1ED5i gi\u1EEFa c\xE1c l\u1EA7n render \u2192 m\u1ECDi WebView b\u1ECB mount l\u1EA1i. Khai b\xE1o component b\xEAn ngo\xE0i render.`))},vn=({container:e,splash:t=Ue,is_dark:n=!1,bridge:r,close_on_back:s=!0,opaque_background:o=!0,allow_embedded_miniapps:c=!1,onWebLoadEnd:l})=>{Ut("container",e),Ut("splash",t);let i=e,u=H(B,a=>a.active_key),y=(0,g.useRef)(u);u&&(y.current=u);let M=H(B,a=>Object.keys(a.instances).join("|")),x=H(B,a=>{var P;return a.active_key?(P=a.instances[a.active_key])==null?void 0:P.app.name:void 0}),m=(0,g.useMemo)(()=>M?M.split("|"):[],[M]),[h,$]=(0,g.useState)({}),w=(0,g.useRef)(mn()).current;(0,g.useEffect)(()=>{if(!u||!s)return;let a=_.BackHandler.addEventListener("hardwareBackPress",()=>(te(),!0));return()=>a.remove()},[u,s]);let d=(0,g.useCallback)(()=>{let a=B.getState().active_key;a&&$(P=>({...P,[a]:(P[a]||0)+1}))},[]);return m.length?(0,S.jsx)(i,{visible:!!u,title:x!=null?x:"",is_dark:n,close:te,reload:d,subscribeWebAtTop:w.subscribe,children:m.map(a=>(0,S.jsx)(Mn,{instance_key:a,is_active:u===a,is_front:(u!=null?u:y.current)===a,is_dark:n,reload_tick:h[a]||0,web_at_top:w,splash:t,bridge:r,opaque_background:o,allow_embedded_miniapps:c,onWebLoadEnd:l},a))}):null},L=_.StyleSheet.create({webview:{flex:1,backgroundColor:"transparent"},behind:{zIndex:-1},splash:{flex:1,alignItems:"center",justifyContent:"center",gap:12},splash_icon:{width:72,height:72,borderRadius:20,alignItems:"center",justifyContent:"center",overflow:"hidden"},splash_icon_image:{width:72,height:72},splash_letter:{fontSize:28,fontWeight:"700",color:"#1D4ED8"},splash_name:{fontSize:16,fontWeight:"600"},splash_hint:{color:"#71717A"},splash_spinner:{marginTop:8},retry_button:{marginTop:4,paddingHorizontal:20,paddingVertical:10,borderRadius:999},retry_text:{fontWeight:"600"}}),Ht=g.default.memo(vn);0&&(module.exports={DefaultMiniAppSplash,MINIAPP_PLATFORM_URL,MiniAppHost,MiniAppHostError,closeMiniApp,configureMiniApp,createMmkvStorage,createRnfsFileSystem,ensureMiniApp,getLocalMiniApp,getMiniAppCatalog,getMiniAppCatalogEntry,getMiniAppStatuses,getMiniAppUpdate,onMiniAppEvent,openMiniApp,pauseMiniApp,pauseMiniAppDownloads,preloadMiniApp,restoreMiniApp,resumeMiniApp,resumeMiniAppDownloads,sendEventToWeb,syncMiniAppCatalog,uninstallMiniApp,updateMiniApp,useMiniAppDownload,useMiniAppDownloadsPaused});
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var Te="https://retion-miniapp-platform.vercel.app",X=null,Ze=new Set,Nt=e=>{X=e,Ze.forEach(t=>t())},b=()=>{if(!X)throw new Error("[miniapp] Ch\u01B0a g\u1ECDi configureMiniApp()");return X},et=e=>{Ze.add(e),X&&e()},$=(...e)=>{X!=null&&X.debug&&console.log("[miniapp]",...e)};var Ft=(e,t)=>({document_dir:e.DocumentDirectoryPath,cache_dir:e.CachesDirectoryPath,exists:n=>e.exists(n),mkdir:n=>e.mkdir(n),remove:n=>e.unlink(n).catch(()=>{}),listDir:n=>e.readDir(n).then(r=>r.map(a=>a.name)).catch(()=>[]),sha256:n=>e.hash(n,"sha256"),unzip:async(n,r)=>{await t(n,r)},download:({url:n,to_file:r,onProgress:a})=>{let{jobId:o,promise:c}=e.downloadFile({fromUrl:n,toFile:r,progressInterval:250,begin:()=>{},progress:({bytesWritten:l,contentLength:i})=>a==null?void 0:a(l,i)});return{promise:c.then(({statusCode:l})=>({status:l})),cancel:()=>e.stopDownload(o)}}}),Bt=e=>({getString:t=>e.getString(t),setString:(t,n)=>e.set(t,n)});import We,{useCallback as Ve,useEffect as J,useMemo as xe,useRef as U,useState as ee}from"react";import{ActivityIndicator as mn,Animated as Je,BackHandler as Mn,Image as yn,StyleSheet as je,Text as ue,TouchableOpacity as wn,View as He}from"react-native";import vn from"react-native-webview";import{Linking as Jt,Platform as Ut}from"react-native";var he=1,x=class extends Error{constructor(n,r){super(r);this.code=n}},nt=e=>{try{let t=JSON.parse(e);return(t==null?void 0:t.__retion)===he&&typeof t.method=="string"?t:null}catch{return null}},Ae=e=>`window.__RETION_MINIAPP__ && window.__RETION_MINIAPP__.receive(${JSON.stringify(e)}); true;`,rt=(e,t)=>Ae({id:e,result:t}),it=(e,t)=>Ae({id:e,error:{code:t.code,message:t.message}}),Oe=e=>Ae({event:"context",data:e});var ot=()=>`(function () {
|
|
2
2
|
var post = function (level, args) {
|
|
3
3
|
try {
|
|
4
4
|
var parts = [];
|
|
@@ -8,7 +8,7 @@ var Re="https://retion-miniapp-platform.vercel.app",X=null,Ge=new Set,Lt=e=>{X=e
|
|
|
8
8
|
else if (typeof a === 'object') { try { parts.push(JSON.stringify(a).slice(0, 800)); } catch (e) { parts.push(String(a)); } }
|
|
9
9
|
else { parts.push(String(a)); }
|
|
10
10
|
}
|
|
11
|
-
window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({ __retion: ${
|
|
11
|
+
window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({ __retion: ${he}, method: 'log', level: level, text: parts.join(' ') }));
|
|
12
12
|
} catch (e) {}
|
|
13
13
|
};
|
|
14
14
|
['log', 'info', 'warn', 'error'].forEach(function (level) {
|
|
@@ -19,7 +19,7 @@ var Re="https://retion-miniapp-platform.vercel.app",X=null,Ge=new Set,Lt=e=>{X=e
|
|
|
19
19
|
window.addEventListener('unhandledrejection', function (e) { post('error', ['[unhandledrejection]', e.reason]); });
|
|
20
20
|
// Kh\xF4ng log query (c\xF3 th\u1EC3 ch\u1EE9a token) \u2014 ch\u1EC9 \u0111\u01B0\u1EDDng d\u1EABn + route.
|
|
21
21
|
post('info', ['[page] ' + location.pathname + location.hash]);
|
|
22
|
-
})(); true;`,
|
|
22
|
+
})(); true;`,st=()=>`(function () {
|
|
23
23
|
function atTop(el) {
|
|
24
24
|
for (var n = el; n && n !== document.documentElement; n = n.parentElement) {
|
|
25
25
|
if (n.scrollTop > 0) { return false; }
|
|
@@ -30,7 +30,7 @@ var Re="https://retion-miniapp-platform.vercel.app",X=null,Ge=new Set,Lt=e=>{X=e
|
|
|
30
30
|
function report(at_top) {
|
|
31
31
|
if (at_top === last) { return; }
|
|
32
32
|
last = at_top;
|
|
33
|
-
window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({ __retion: ${
|
|
33
|
+
window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({ __retion: ${he}, method: 'touchAtTop', at_top: at_top }));
|
|
34
34
|
}
|
|
35
35
|
document.addEventListener('touchstart', function (e) { report(atTop(e.target)); }, { capture: true, passive: true });
|
|
36
36
|
// Cu\u1ED9n r\u1EDDi \u0111\u1EA7u trang \u2192 b\xE1o ngay, kh\xF4ng \u0111\u1EE3i l\u1EA7n ch\u1EA1m sau (tr\xE1nh host d\xF9ng gi\xE1 tr\u1ECB c\u0169 "\u0111ang \u1EDF \u0111\u1EA7u").
|
|
@@ -38,8 +38,8 @@ var Re="https://retion-miniapp-platform.vercel.app",X=null,Ge=new Set,Lt=e=>{X=e
|
|
|
38
38
|
var el = e.target === document ? document.documentElement : e.target;
|
|
39
39
|
if (el && el.scrollTop > 0) { report(false); }
|
|
40
40
|
}, { capture: true, passive: true });
|
|
41
|
-
})(); true;`,
|
|
42
|
-
${
|
|
41
|
+
})(); true;`,at=e=>Ae({event:e}),pt=(e,t)=>{let n=ct(t);return`try { history.replaceState(history.state, '', location.pathname + ${JSON.stringify(n?`?${n}`:"")} + location.hash); } catch (e) {}
|
|
42
|
+
${Oe(e)}`},ct=e=>Object.entries(e).filter(([,t])=>t!=null&&t!=="").map(([t,n])=>`${encodeURIComponent(t)}=${encodeURIComponent(String(n))}`).join("&"),lt=(e,t={})=>{let n=ct(t);return`window.__RETION_MINIAPP_HOST__ = { protocol: ${he} };
|
|
43
43
|
window.__RETION_MINIAPP_CONTEXT__ = ${JSON.stringify(e)};
|
|
44
44
|
${n?`try { history.replaceState(history.state, '', location.pathname + '?' + ${JSON.stringify(n)} + location.hash); } catch (e) {}`:""}
|
|
45
|
-
true;`},ct={partner:"partner_token",chatbox:"chatbox_token"},lt=(e,t)=>{let n={...e};for(let r of Object.values(ct))t.includes(r)||delete n[r];return n},Te=new Set,Ze=async(e,t)=>{if(Te.has(e))throw new x("BUSY",`${e} \u0111ang ch\u1EA1y \u2014 ch\u1EDD l\u01B0\u1EE3t tr\u01B0\u1EDBc xong`);Te.add(e);try{return await t()}finally{Te.delete(e)}},Pe=(e,t)=>{if(typeof e!="string"||!e)throw new x("INVALID_PARAMS",`Thi\u1EBFu ${t}`);return e},ut=async({method:e,params:t},{getHostData:n,getPermissions:r,is_dark:a,close:i,app_id:c,instance_id:l,options:o})=>{var m,u,I,v;let d=o==null?void 0:o.handlers,h={app_id:c,instance_id:l,close:i},y=()=>new x("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF \u1EE9ng d\u1EE5ng n\xE0y`);switch(e){case"requestPayment":{let g=d==null?void 0:d.requestPayment;if(!g)throw y();let s=t==null?void 0:t.amount;if(typeof s!="number"||!Number.isFinite(s)||s<=0)throw new x("INVALID_PARAMS","amount ph\u1EA3i l\xE0 s\u1ED1 > 0");let b={...t,amount:s,currency:Pe(t==null?void 0:t.currency,"currency")};return Ze(e,()=>g(b,h))}case"printImage":{let g=d==null?void 0:d.printImage;if(!g)throw y();let s=Pe(t==null?void 0:t.image,"image");await Ze(e,()=>g({image:s},h));return}case"openScreen":if(!(d!=null&&d.openScreen))throw y();await d.openScreen({screen:Pe(t==null?void 0:t.screen,"screen"),params:t==null?void 0:t.params},h);return;case"closeApp":i();return;case"openWebview":{let g=String((m=t==null?void 0:t.url)!=null?m:"");if(!/^https?:\/\//i.test(g))throw new x("INVALID_PARAMS","url ph\u1EA3i l\xE0 http(s)");await(o!=null&&o.openUrl?o.openUrl(g):Ft.openURL(g));return}case"showToast":(I=o==null?void 0:o.showToast)==null||I.call(o,String((u=t==null?void 0:t.message)!=null?u:""));return;case"getSystemInfo":return{platform:Bt.OS==="ios"?"ios":"android",appVersion:(v=o==null?void 0:o.app_version)!=null?v:"",theme:a?"dark":"light"};case"getAccessToken":{let g=n().access_token;if(!g)throw new x("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return g}case"getToken":{let g=t==null?void 0:t.type;if(g==="access"){let j=n().access_token;if(!j)throw new x("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return j}if(g!=="partner"&&g!=="chatbox")throw new x("HOST_ERROR",`Lo\u1EA1i token kh\xF4ng h\u1EE3p l\u1EC7: ${String(g)}`);let s=ct[g];if(!r().includes(s))throw new x("PERMISSION_DENIED",`Mini app ch\u01B0a \u0111\u01B0\u1EE3c c\u1EA5p quy\u1EC1n ${s} (Console \u2192 Quy\u1EC1n l\u1EA5y token)`);let b=g==="partner"?n().partner_token:n().chatbox_token;if(!b)throw new x("HOST_ERROR",`Kh\xF4ng c\xF3 ${s}`);return b}case"getUserInfo":{let g=n().user;if(!g)throw new x("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin nh\xE2n vi\xEAn");return g}case"getPageInfo":{let g=n().page;if(!g)throw new x("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin page");return g}case"sendMessage":case"insertText":throw new x("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF phi\xEAn b\u1EA3n app n\xE0y`);default:throw new x("NOT_SUPPORTED",`API kh\xF4ng t\u1ED3n t\u1EA1i: ${e}`)}};var ke=e=>`bundle:${e}`,Oe=()=>`${S().file_system.document_dir}/miniapps`,ft=(e,t,n="index.html",r=!1,a=[])=>{let i=`${Oe()}/${e}/${t}`;return{app_id:e,version:t,dir:i,entry_uri:`file://${i}/${n}`,context_update:r,permissions:a}},dt=e=>{var t;S().storage.setString(ke(e.app_id),JSON.stringify({version:e.version,entry:e.entry,context_update:!!e.context_update,permissions:(t=e.permissions)!=null?t:[]}))},Jt=(e,t)=>/^https?:\/\//.test(t)?t:`${e.replace(/[^/]*$/,"")}${t}`,w=e=>{let t=S().storage.getString(ke(e));if(!t)return null;try{let{version:n,entry:r,context_update:a,permissions:i}=JSON.parse(t);return ft(e,n,r,!!a,Array.isArray(i)?i:[])}catch{return null}},H=e=>S().file_system.exists(e.entry_uri.replace("file://","")),Ie=async e=>{let t=w(e.app_id);return(t==null?void 0:t.version)===e.version&&await H(t)},Ut=async(e,t)=>{let n=S().file_system,r=`${Oe()}/${e}`,a=await n.listDir(r).catch(()=>[]);await Promise.all(a.filter(i=>!t.includes(i)).map(i=>n.remove(`${r}/${i}`).catch(()=>{})))},ht=async e=>{var t;await((t=se[e])==null?void 0:t.catch(()=>{})),S().storage.setString(ke(e),""),await S().file_system.remove(`${Oe()}/${e}`).catch(()=>{})},te=class extends Error{constructor(){super("cancelled"),this.name="MiniAppInstallCancelled"}},se={},De=(e,{base_url:t,onProgress:n}={})=>{var m;let r=S().file_system,a=null,i=!1,c=`${r.cache_dir}/${e.app_id}-${e.version}.zip`,l=()=>{if(i)throw new te},o=async()=>{var v;l();let u=w(e.app_id);if((u==null?void 0:u.version)===e.version&&await r.exists(u.dir))return dt(e),w(e.app_id);l();let I=r.download({url:t?Jt(t,e.bundle_url):e.bundle_url,to_file:c,onProgress:(g,s)=>{var j;let b=s>0?s:(j=e.size)!=null?j:0;b>0&&(n==null||n(Math.min(1,g/b)))}});a=I;try{let{status:g}=await I.promise;if(l(),g!==200)throw new Error(`bundle ${g}`);if(e.sha256)if(r.sha256){if(await r.sha256(c)!==e.sha256)throw new Error("sha256 mismatch")}else L("b\u1ECF qua ki\u1EC3m tra sha256 (file_system kh\xF4ng c\xF3 sha256)",e.app_id);l();let s=ft(e.app_id,e.version,e.entry,!!e.context_update,(v=e.permissions)!=null?v:[]);return await r.remove(s.dir).catch(()=>{}),await r.mkdir(s.dir),await r.unzip(c,s.dir),dt(e),Ut(e.app_id,[e.version,u==null?void 0:u.version].filter(Boolean)),s}catch(g){throw i?new te:g}finally{a=null,r.remove(c).catch(()=>{})}},h=((m=se[e.app_id])!=null?m:Promise.resolve()).catch(()=>{}).then(o),y=h.catch(()=>{});return se[e.app_id]=y,y.then(()=>{se[e.app_id]===y&&delete se[e.app_id]}),{promise:h,cancel:()=>{i=!0,a==null||a.cancel()}}},ie={},Vt=__DEV__?0:60*1e3,gt={},At=(e,t)=>{var r,a;let n=w(e);return n&&Date.now()-((r=gt[t])!=null?r:0)<Vt?Promise.resolve(n):((a=ie[e])!=null||(ie[e]=(async()=>{let i=await fetch(t,{headers:{"Cache-Control":"no-cache"}});if(!i.ok)throw new Error(`manifest ${i.status}`);let c=await i.json(),l=await De(c,{base_url:t}).promise;return gt[t]=Date.now(),l})().catch(i=>(console.warn("[miniapp] sync failed",e,i==null?void 0:i.message),w(e))).finally(()=>{ie[e]=void 0})),ie[e])};var Ae=new Map,mt=(e,t)=>(Ae.set(e,t),()=>{Ae.get(e)===t&&Ae.delete(e)}),Wt=(e,t)=>{let n=Ae.get(e);return n?n(t):!1};import{useRef as jt,useSyncExternalStore as qt}from"react";var me=e=>{let t=e,n=new Set;return{getState:()=>t,setState:r=>{let a=typeof r=="function"?r(t):r;t={...t,...a},n.forEach(i=>i())},subscribe:r=>(n.add(r),()=>{n.delete(r)})}},V=(e,t,n=Object.is)=>{let r=jt(null),a=()=>{let i=e.getState(),c=r.current;if(c&&c.state===i&&c.selector===t)return c.value;let l=t(i),o=c&&n(c.value,l)?c.value:l;return r.current={state:i,selector:t,value:o},o};return qt(e.subscribe,a)};var $=me({active_key:null,instances:{}}),Mt=({app:e,instance_id:t,context:n={},url_params:r={},host_data:a={}},i)=>{var l;let c=(l=S().keep_alive)==null?void 0:l.max_webviews;$.setState(o=>{let d=t!=null?t:e.app_id,h={...o.instances,[d]:{key:d,app:e,context:n,url_params:r,host_data:a,last_used_at:Date.now()}},y=Object.keys(h);return c&&c>0&&y.length>c&&y.filter(m=>m!==d).sort((m,u)=>h[m].last_used_at-h[u].last_used_at).slice(0,y.length-c).forEach(m=>{delete h[m]}),i?{active_key:d,instances:h}:{instances:h}})},Ht=e=>Mt(e,!0),Kt=e=>Mt(e,!1),ae=()=>$.setState({active_key:null}),Me=e=>{$.setState(t=>{if(t.active_key===e||!t.instances[e])return{};let n={...t.instances};return delete n[e],{instances:n}})};var yt="catalog",zt="paused_apps",Yt="removed_apps",Qt=10*1e3,Gt=2,Xt=3e3,Zt=()=>{var e;try{return JSON.parse((e=S().storage.getString(yt))!=null?e:"{}")}catch{return{}}},M=me({catalog:{},downloads:{},pause_reasons:[],updates:{},apply_ticks:{}}),wt=e=>{var t;return!!((t=S().manual_update)!=null&&t.includes(e))},ve=new Set,vt=e=>{let t=new Set,n=()=>S().storage.setString(e,JSON.stringify([...t]));return{has:r=>t.has(r),values:()=>[...t],add:r=>t.has(r)?!1:(t.add(r),n(),!0),delete:r=>t.delete(r)?(n(),!0):!1,load:()=>{var r;t.clear();try{let a=JSON.parse((r=S().storage.getString(e))!=null?r:"[]");Array.isArray(a)&&a.forEach(i=>{typeof i=="string"&&t.add(i)})}catch{}}}},F=vt(zt),Y=vt(Yt);Xe(()=>{F.load(),Y.load();let e=Zt(),t={};Object.keys(e).filter(n=>!Y.has(n)).forEach(n=>{let r=w(n);r?t[n]={status:"installed",progress:1,version:r.version,has_local:!0}:F.has(n)&&(t[n]={status:"paused",progress:0,version:e[n].version,has_local:!1})}),M.setState({catalog:e,downloads:t})});var $e=e=>V(M,t=>e?t.downloads[e]:void 0),en=()=>V(M,e=>e.pause_reasons.length>0),N=(...e)=>L("queue",...e),E=[],W={},A=null,ye=new Set,Z={},Le=new Set,K=e=>{Le.forEach(t=>{try{t(e)}catch(n){console.warn("[miniapp-queue] event listener error",n==null?void 0:n.message)}})},tn=e=>(Le.add(e),()=>{Le.delete(e)}),nn=()=>M.getState().downloads,P=(e,t)=>{let n=!!w(e),r=M.getState().downloads[e],a=t.status==="downloading"&&n?"updating":t.status,i={...r!=null?r:{status:"queued",progress:0},...t,...a?{status:a}:{},has_local:n};M.setState(c=>({downloads:{...c.downloads,[e]:i}})),(r==null?void 0:r.status)!==i.status||(r==null?void 0:r.version)!==i.version||(r==null?void 0:r.has_local)!==i.has_local?K({type:"status_change",app_id:e,state:i}):r.progress!==i.progress&&K({type:"progress",app_id:e,progress:i.progress,version:i.version})},we=(e,t)=>{var n;(n=Z[e])==null||n.forEach(r=>r(t)),delete Z[e]},rn=()=>M.getState().pause_reasons.length>0,z=e=>{var l;if(A)return;let t=e?E.indexOf(e):rn()?-1:E.findIndex(o=>!F.has(o));if(t<0||t>=E.length)return;let[n]=E.splice(t,1),r=M.getState().catalog[n];if(!r){we(n,w(n)),z();return}let a=Date.now();W[n]=((l=W[n])!=null?l:0)+1,P(n,{status:"downloading",progress:0,version:r.version,error:void 0});let i=0,c=De(r,{onProgress:o=>{let d=Math.floor(o*100);d!==i&&(i=d,P(n,{progress:d/100,version:r.version}))}});A={app_id:n,handle:c,forced:!!e},N("start",n,r.version,e?"(forced)":""),c.promise.then(o=>{N("installed",n,r.version,`${Date.now()-a}ms`),P(n,{status:"installed",progress:1,version:r.version}),we(n,o)}).catch(o=>{var h;if(o instanceof te){if(ye.has(n))return;N("paused",n),W[n]-=1,E.unshift(n),P(n,{status:F.has(n)?"paused":"queued",progress:0,version:r.version});return}let d=String((h=o==null?void 0:o.message)!=null?h:o);if(console.warn("[miniapp-queue] failed",n,d),W[n]<Gt){P(n,{status:"queued",progress:0,version:r.version,error:d}),setTimeout(()=>{var y;E.includes(n)||(A==null?void 0:A.app_id)===n||(E.push(n),z((y=Z[n])!=null&&y.length?n:void 0))},Xt);return}P(n,{status:"failed",progress:0,version:r.version,error:d}),we(n,w(n))}).finally(()=>{A=null;let o=E.find(d=>{var h;return(h=Z[d])==null?void 0:h.length});z(o)})},_e=(e,{front:t=!1}={})=>{if((A==null?void 0:A.app_id)===e)return;let n=E.indexOf(e);if(n>=0){if(!t)return;E.splice(n,1)}t?E.unshift(e):E.push(e)},on=async e=>{let{host_id:t,client_token:n}=S(),r=new AbortController,a=setTimeout(()=>r.abort(),Qt);try{let i=`${Re}/api/hosts/${encodeURIComponent(t)}/miniapps?channel=${e}`,c=await fetch(i,{headers:{Authorization:`Bearer ${n}`,"Cache-Control":"no-cache"},signal:r.signal});if(!c.ok)throw new Error(`host list ${e} ${c.status}`);return(await c.json()).apps.map(o=>({...o,channel:e}))}finally{clearTimeout(a)}},pe=null,Ne=()=>(pe!=null||(pe=(async()=>{var t;let e=Date.now();try{let n=await Promise.all(S().channels.map(on)),r={};[...n].reverse().flat().forEach(o=>{r[o.app_id]=o});let a=Object.keys(M.getState().catalog).filter(o=>!r[o]);S().storage.setString(yt,JSON.stringify(r)),M.setState({catalog:r}),await Promise.all(a.map(o=>_t(o,{by_user:!1}))),a.forEach(o=>Y.delete(o));let i=Object.keys(r).filter(o=>!Y.has(o)),c=[],l={};for(let o of i.map(d=>r[d])){if(await Ie(o)){P(o.app_id,{status:"installed",progress:1,version:o.version});continue}let d=w(o.app_id);if(wt(o.app_id)&&!ve.has(o.app_id)&&d&&await H(d)){P(o.app_id,{status:"installed",progress:1,version:d.version}),l[o.app_id]={app_id:o.app_id,current_version:d.version,next_version:o.version};continue}c.push(o)}return M.setState({updates:l}),c.forEach(o=>{W[o.app_id]=0,P(o.app_id,{status:F.has(o.app_id)?"paused":"queued",progress:0,version:o.version,error:void 0}),_e(o.app_id)}),N("catalog",i.length,"apps, outdated",c.map(o=>o.app_id),"removed",a,`${Date.now()-e}ms`),K({type:"sync_complete",app_ids:i,removed:a}),Object.values(l).forEach(o=>K({type:"update_available",...o})),z(),{ok:!0,app_ids:i,removed:a}}catch(n){let r=String((n==null?void 0:n.name)==="AbortError"?"timeout":(t=n==null?void 0:n.message)!=null?t:n);return console.warn("[miniapp-queue] sync catalog failed",r),K({type:"sync_failed",error:r}),{ok:!1,error:r}}finally{pe=null}})()),pe),_t=async(e,{by_user:t})=>{var a,i,c,l;if(t&&Y.add(e),ye.has(e))return;ye.add(e),F.delete(e);let n=E.indexOf(e);n>=0&&E.splice(n,1),(A==null?void 0:A.app_id)===e&&A.handle.cancel();let r=(l=(c=(a=M.getState().downloads[e])==null?void 0:a.version)!=null?c:(i=w(e))==null?void 0:i.version)!=null?l:"";P(e,{status:"uninstalling",progress:0,version:r}),await ht(e),Me(e),M.setState(o=>{let d={...o.downloads};return delete d[e],{downloads:d}}),delete W[e],ye.delete(e),we(e,null),N("uninstalled",e,t?"(user)":"(not in list)"),K({type:"uninstalled",app_id:e})},sn=e=>_t(e,{by_user:!0}),an=e=>{let t=ce(e);return t?(Y.delete(e),(A==null?void 0:A.app_id)===e||E.includes(e)||(W[e]=0,P(e,{status:F.has(e)?"paused":"queued",progress:0,version:t.version,error:void 0}),_e(e),z(),N("restore",e)),!0):!1},pn=e=>{if(F.has(e))return;if(F.add(e),N("pause app",e),(A==null?void 0:A.app_id)===e&&!A.forced){A.handle.cancel();return}let t=M.getState().downloads[e];E.includes(e)&&t&&P(e,{status:"paused",progress:0,version:t.version})},cn=e=>{if(!F.delete(e))return;N("resume app",e);let t=M.getState().downloads[e];(t==null?void 0:t.status)==="paused"&&!E.includes(e)&&ce(e)&&(W[e]=0,_e(e)),E.includes(e)&&t&&P(e,{status:"queued",progress:0,version:t.version}),z()},ln=e=>{let{pause_reasons:t}=M.getState();t.includes(e)||(M.setState({pause_reasons:[...t,e]}),N("pause",e),t.length===0&&K({type:"pause_change",paused:!0,reasons:[e]}),A&&!A.forced&&A.handle.cancel())},un=e=>{let{pause_reasons:t}=M.getState();if(!t.includes(e))return;let n=t.filter(r=>r!==e);M.setState({pause_reasons:n}),N("resume",e),n.length===0&&K({type:"pause_change",paused:!1,reasons:n}),z()},St=e=>M.getState().updates[e],dn=async e=>{var n,r;let t=St(e);ve.add(e);try{let a=await Se(e),i=(r=t==null?void 0:t.next_version)!=null?r:(n=ce(e))==null?void 0:n.version;return!a||!i||a.version!==i?!1:(M.setState(c=>{var o;let l={...c.updates};return delete l[e],{updates:l,apply_ticks:{...c.apply_ticks,[e]:((o=c.apply_ticks[e])!=null?o:0)+1}}}),N("updated",e,t==null?void 0:t.current_version,"\u2192",a.version),!0)}finally{ve.delete(e)}},gn=()=>Object.values(M.getState().catalog).map(e=>({...e,installed:!!w(e.app_id),removed_by_user:Y.has(e.app_id)})),ce=e=>M.getState().catalog[e],Se=async e=>{let t=ce(e);if(!t)return;if(F.delete(e),Y.delete(e),await Ie(t))return w(e);let n=w(e);if(wt(e)&&!ve.has(e)&&n&&await H(n))return n;let r=new Promise(a=>{var i;((i=Z[e])!=null?i:Z[e]=[]).push(a)});return(A==null?void 0:A.app_id)===e?A.forced=!0:(W[e]=0,_e(e,{front:!0}),A&&!A.forced?A.handle.cancel():z(e)),r};import{Fragment as Et,jsx as R,jsxs as ue}from"react/jsx-runtime";var Be=e=>(e!=null?e:"").replace(/\?[^#]*/,""),bt=0,yn=()=>{let e=new Set;return{emit:t=>e.forEach(n=>n(t)),subscribe:t=>(e.add(t),()=>{e.delete(t)})}},wn=Ve.memo(({instance_key:e,is_active:t,is_front:n,is_dark:r,reload_tick:a,web_at_top:i,splash:c,bridge:l,opaque_background:o,onWebLoadEnd:d})=>{var Ye,Qe;let h=J(null),y=J(!1),m=V($,p=>p.instances[e]),u=m==null?void 0:m.app.app_id,I=m==null?void 0:m.app.manifest_url,v=m==null?void 0:m.context,g=m==null?void 0:m.url_params,[s,b]=ee(()=>u?w(u):null),[j,ne]=ee(!1),[Tt,je]=ee(0),[Pt,re]=ee(0),[Ct,C]=ee(!1),U=J(null),qe=p=>{U.current&&clearTimeout(U.current),U.current=setTimeout(()=>{U.current=null,C(!0)},p)};B(()=>()=>{U.current&&clearTimeout(U.current)},[]),B(()=>{if(!u||!t&&s)return;let p=!0;return ne(!1),(async()=>{let f=w(u),T=f?await H(f):!1;if(!p||(b(T?D=>!D||D.version!==f.version||D.permissions.join(",")!==f.permissions.join(",")?f:D:null),__DEV__&&Date.now()-bt>1e4&&(bt=Date.now(),await Ne()),!p))return;let q=await Se(u),Q=q!==void 0?q:I?await At(u,I):w(u);if(p){if(!Q){ne(!0);return}b(D=>D!=null?D:Q)}})(),()=>{p=!1}},[t,u,I,Tt]),B(()=>mt(e,p=>h.current?(h.current.postMessage(p),!0):!1),[e]);let kt=V(M,p=>{let f=u?p.downloads[u]:void 0;return(f==null?void 0:f.status)==="installed"?f.version:void 0});B(()=>{if(t||!u||!s)return;let p=w(u);if(!p||p.version===s.version)return;let f=!0;return H(p).then(T=>{!f||!T||(L(`webview:${e}`,"\u0111\u1ED5i bundle (\u1EA9n)",s.version,"\u2192",p.version),b(p))}),()=>{f=!1}},[t,u,kt,s==null?void 0:s.version]);let He=V(M,p=>{var f;return u&&(f=p.apply_ticks[u])!=null?f:0});B(()=>{if(!He||!u)return;let p=w(u);if(!p||p.version===(s==null?void 0:s.version))return;let f=!0;return H(p).then(T=>{!f||!T||(L(`webview:${e}`,"c\u1EADp nh\u1EADt",s==null?void 0:s.version,"\u2192",p.version),C(!1),b(p))}),()=>{f=!1}},[He]),B(()=>{var T;let p=(T=S().keep_alive)==null?void 0:T.idle_close_ms;if(t||!p||p<=0)return;let f=setTimeout(()=>{Me(e)},p);return()=>clearTimeout(f)},[t,e]),B(()=>{a>0&&(ne(!1),C(!1),re(p=>p+1),je(p=>p+1))},[a]);let Ke=J(t);B(()=>{var p;Ke.current!==t&&(Ke.current=t,y.current&&((p=h.current)==null||p.injectJavaScript(it(t?"resumed":"paused"))))},[t]);let de=`${(Ye=s==null?void 0:s.version)!=null?Ye:"none"}:${(Qe=s==null?void 0:s.permissions.join(","))!=null?Qe:""}:${Pt}`,oe=be(()=>JSON.stringify([v!=null?v:{},g!=null?g:{}]),[v,g]),xe=be(()=>{var p;return lt(g!=null?g:{},(p=s==null?void 0:s.permissions)!=null?p:[])},[oe,s==null?void 0:s.permissions]),Ot=be(()=>pt(v!=null?v:{},xe)+ot()+(S().debug?rt():""),[xe]),ge=J(null),ze=J(null);B(()=>{var f,T,q;if(!s)return;if(ze.current!==de){ze.current=de,ge.current=oe;return}if(ge.current===oe)return;let p=((T=JSON.parse((f=ge.current)!=null?f:"[]")[0])!=null?T:{}).org_id;if(ge.current=oe,p===(v==null?void 0:v.org_id)&&y.current){C(!1),qe(1500),(q=h.current)==null||q.injectJavaScript(st(v!=null?v:{},xe));return}C(!1),re(Q=>Q+1)},[oe,s,de]);let It=Je(async p=>{var T,q,Q,D,Ee;let f=et(p.nativeEvent.data);if(!f){if(u&&(l!=null&&l.onWebEvent))try{Promise.resolve(l.onWebEvent(p.nativeEvent.data,{app_id:u,instance_id:e})).catch(_=>{console.warn("[miniapp] onWebEvent l\u1ED7i",u,_)})}catch(_){console.warn("[miniapp] onWebEvent l\u1ED7i",u,_)}return}if(f.method==="log"){let{level:_,text:k}=f;L(`web:${e}`,_!=null?_:"log",k!=null?k:"");return}if(f.method==="pong"){U.current||C(!0);return}if(f.method==="touchAtTop"){i.emit(!!f.at_top);return}if(f.method==="contextApplied"){U.current&&clearTimeout(U.current),U.current=null,C(!0);return}if(f.method==="ready"){y.current=!0,C(!0);let _=(T=$.getState().instances[e])==null?void 0:T.context;_&&((q=h.current)==null||q.injectJavaScript(Ce(_)));return}try{let _=await ut(f,{getHostData:()=>{var k,G;return(G=(k=$.getState().instances[e])==null?void 0:k.host_data)!=null?G:{}},getPermissions:()=>{var k,G;return u?(G=(k=w(u))==null?void 0:k.permissions)!=null?G:[]:[]},is_dark:r,close:ae,app_id:u!=null?u:"",instance_id:e,options:l});f.id&&((Q=h.current)==null||Q.injectJavaScript(tt(f.id,_)))}catch(_){if(!f.id)return;let k=_==null?void 0:_.code,G=_ instanceof x?_:new x(typeof k=="string"?k:"HOST_ERROR",String((D=_==null?void 0:_.message)!=null?D:_));(Ee=h.current)==null||Ee.injectJavaScript(nt(f.id,G))}},[e,r,u,i,l]),Dt=Je(()=>{ne(!1),re(p=>p+1),je(p=>p+1)},[]);return ue(Ue,{style:[We.absoluteFill,o&&{backgroundColor:r?"#09090B":"#FFFFFF"},!n&&O.behind],pointerEvents:t?"auto":"none",children:[s?R(Mn,{ref:h,source:{uri:s.entry_uri},originWhitelist:["*"],allowingReadAccessToURL:`file://${s.dir}`,allowFileAccess:!0,allowFileAccessFromFileURLs:!0,allowUniversalAccessFromFileURLs:!0,injectedJavaScriptBeforeContentLoaded:Ot,onMessage:It,bounces:!1,overScrollMode:"never",onLoadStart:p=>{L(`webview:${e}`,"load start",Be(p.nativeEvent.url)),y.current=!1,C(!1)},onError:p=>{L(`webview:${e}`,"load error",Be(p.nativeEvent.url),p.nativeEvent.description),ne(!0),C(!1)},onLoadEnd:p=>{let f=p.nativeEvent.url;L(`webview:${e}`,"load end",Be(f)),u&&(d==null||d({app_id:u,instance_id:e,url:f})),qe(1500)},onContentProcessDidTerminate:()=>{y.current=!1,C(!1),re(p=>p+1)},onRenderProcessGone:()=>(y.current=!1,C(!1),re(p=>p+1),!0),style:O.webview},de):null,m&&R(_n,{visible:!s||!Ct,interactive:j,children:R(vn,{splash:c,app:m.app,is_dark:r,error:j,has_bundle:!!s,retry:Dt})})]})}),vn=Ve.memo(({splash:e,app:t,is_dark:n,error:r,has_bundle:a,retry:i})=>{let c=e,l=$e(t.app_id),o=r?"error":!a&&(l==null?void 0:l.status)==="downloading"?"downloading":"loading";return R(c,{app:t,is_dark:n,status:o,progress:o==="downloading"?l==null?void 0:l.progress:void 0,retry:i})}),_n=({visible:e,interactive:t,children:n})=>{let r=J(new Fe.Value(e?1:0)).current,[a,i]=ee(e);return B(()=>{if(e){i(!0),r.setValue(1);return}let c=Fe.timing(r,{toValue:0,duration:180,useNativeDriver:!0});return c.start(({finished:l})=>{l&&i(!1)}),()=>c.stop()},[e,r]),a?R(Fe.View,{style:[We.absoluteFill,{opacity:r}],pointerEvents:t?"auto":"none",children:n}):null},Rt=({app:e,is_dark:t,status:n,progress:r,retry:a})=>{let i=t?"#FAFAFA":"#18181B";return ue(Ue,{style:[O.splash,{backgroundColor:t?"#09090B":"#FFFFFF"}],children:[R(Ue,{style:[O.splash_icon,{backgroundColor:t?"#18181B":"#F4F4F5"}],children:e.icon?R(An,{source:{uri:e.icon},style:O.splash_icon_image}):R(le,{style:O.splash_letter,children:(e.name||"?").slice(0,1).toUpperCase()})}),R(le,{style:[O.splash_name,{color:i}],children:e.name}),n==="error"?ue(Et,{children:[R(le,{style:O.splash_hint,children:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c mini app"}),R(mn,{activeOpacity:.7,style:[O.retry_button,{backgroundColor:t?"#27272A":"#F4F4F5"}],onPress:a,children:R(le,{style:[O.retry_text,{color:i}],children:"Th\u1EED l\u1EA1i"})})]}):ue(Et,{children:[R(fn,{style:O.splash_spinner,color:t?"#A1A1AA":"#71717A"}),n==="downloading"&&ue(le,{style:O.splash_hint,children:["\u0110ang t\u1EA3i mini app",r?` ${Math.round(r*100)}%`:"\u2026"]})]})]})},xt=(e,t)=>{let n=J(t),r=J(!1);__DEV__&&!r.current&&n.current!==t&&(r.current=!0,console.warn(`[miniapp] MiniAppHost prop "${e}" \u0111\u1ED5i gi\u1EEFa c\xE1c l\u1EA7n render \u2192 m\u1ECDi WebView b\u1ECB mount l\u1EA1i. Khai b\xE1o component b\xEAn ngo\xE0i render.`))},Sn=({container:e,splash:t=Rt,is_dark:n=!1,bridge:r,close_on_back:a=!0,opaque_background:i=!0,onWebLoadEnd:c})=>{xt("container",e),xt("splash",t);let l=e,o=V($,s=>s.active_key),d=J(o);o&&(d.current=o);let h=V($,s=>Object.keys(s.instances).join("|")),y=V($,s=>{var b;return s.active_key?(b=s.instances[s.active_key])==null?void 0:b.app.name:void 0}),m=be(()=>h?h.split("|"):[],[h]),[u,I]=ee({}),v=J(yn()).current;B(()=>{if(!o||!a)return;let s=hn.addEventListener("hardwareBackPress",()=>(ae(),!0));return()=>s.remove()},[o,a]);let g=Je(()=>{let s=$.getState().active_key;s&&I(b=>({...b,[s]:(b[s]||0)+1}))},[]);return m.length?R(l,{visible:!!o,title:y!=null?y:"",is_dark:n,close:ae,reload:g,subscribeWebAtTop:v.subscribe,children:m.map(s=>R(wn,{instance_key:s,is_active:o===s,is_front:(o!=null?o:d.current)===s,is_dark:n,reload_tick:u[s]||0,web_at_top:v,splash:t,bridge:r,opaque_background:i,onWebLoadEnd:c},s))}):null},O=We.create({webview:{flex:1,backgroundColor:"transparent"},behind:{zIndex:-1},splash:{flex:1,alignItems:"center",justifyContent:"center",gap:12},splash_icon:{width:72,height:72,borderRadius:20,alignItems:"center",justifyContent:"center",overflow:"hidden"},splash_icon_image:{width:72,height:72},splash_letter:{fontSize:28,fontWeight:"700",color:"#1D4ED8"},splash_name:{fontSize:16,fontWeight:"600"},splash_hint:{color:"#71717A"},splash_spinner:{marginTop:8},retry_button:{marginTop:4,paddingHorizontal:20,paddingVertical:10,borderRadius:999},retry_text:{fontWeight:"600"}}),bn=Ve.memo(Sn);export{Rt as DefaultMiniAppSplash,Re as MINIAPP_PLATFORM_URL,bn as MiniAppHost,x as MiniAppHostError,ae as closeMiniApp,Lt as configureMiniApp,Nt as createMmkvStorage,$t as createRnfsFileSystem,Se as ensureMiniApp,w as getLocalMiniApp,gn as getMiniAppCatalog,ce as getMiniAppCatalogEntry,nn as getMiniAppStatuses,St as getMiniAppUpdate,tn as onMiniAppEvent,Ht as openMiniApp,pn as pauseMiniApp,ln as pauseMiniAppDownloads,Kt as preloadMiniApp,an as restoreMiniApp,cn as resumeMiniApp,un as resumeMiniAppDownloads,Wt as sendEventToWeb,Ne as syncMiniAppCatalog,sn as uninstallMiniApp,dn as updateMiniApp,$e as useMiniAppDownload,en as useMiniAppDownloadsPaused};
|
|
45
|
+
true;`},ut={partner:"partner_token",chatbox:"chatbox_token"},dt=(e,t)=>{let n={...e};for(let r of Object.values(ut))t.includes(r)||delete n[r];return n},Pe=new Set,tt=async(e,t)=>{if(Pe.has(e))throw new x("BUSY",`${e} \u0111ang ch\u1EA1y \u2014 ch\u1EDD l\u01B0\u1EE3t tr\u01B0\u1EDBc xong`);Pe.add(e);try{return await t()}finally{Pe.delete(e)}},Vt=new Set(["selection","impactLight","impactMedium","impactHeavy","rigid","soft","notificationSuccess","notificationWarning","notificationError"]),Ce=(e,t)=>{if(typeof e!="string"||!e)throw new x("INVALID_PARAMS",`Thi\u1EBFu ${t}`);return e},gt=async({method:e,params:t},{getHostData:n,getPermissions:r,is_dark:a,close:o,app_id:c,instance_id:l,options:i})=>{var _,A,f,D,y;let u=i==null?void 0:i.handlers,M={app_id:c,instance_id:l,close:o},m=()=>new x("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF \u1EE9ng d\u1EE5ng n\xE0y`);switch(e){case"requestPayment":{let d=u==null?void 0:u.requestPayment;if(!d)throw m();let s=t==null?void 0:t.amount;if(typeof s!="number"||!Number.isFinite(s)||s<=0)throw new x("INVALID_PARAMS","amount ph\u1EA3i l\xE0 s\u1ED1 > 0");let E={...t,amount:s,currency:Ce(t==null?void 0:t.currency,"currency")};return tt(e,()=>d(E,M))}case"printImage":{let d=u==null?void 0:u.printImage;if(!d)throw m();let s=Ce(t==null?void 0:t.image,"image");await tt(e,()=>d({image:s},M));return}case"openScreen":if(!(u!=null&&u.openScreen))throw m();await u.openScreen({screen:Ce(t==null?void 0:t.screen,"screen"),params:t==null?void 0:t.params},M);return;case"closeApp":o();return;case"openWebview":{let d=String((_=t==null?void 0:t.url)!=null?_:"");if(!/^https?:\/\//i.test(d))throw new x("INVALID_PARAMS","url ph\u1EA3i l\xE0 http(s)");await(i!=null&&i.openUrl?i.openUrl(d):Jt.openURL(d));return}case"showToast":(f=i==null?void 0:i.showToast)==null||f.call(i,String((A=t==null?void 0:t.message)!=null?A:""));return;case"haptic":{let d=Vt.has(t==null?void 0:t.type)?t.type:"selection";(D=i==null?void 0:i.haptic)==null||D.call(i,d);return}case"getSystemInfo":return{platform:Ut.OS==="ios"?"ios":"android",appVersion:(y=i==null?void 0:i.app_version)!=null?y:"",theme:a?"dark":"light"};case"getAccessToken":{let d=n().access_token;if(!d)throw new x("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return d}case"getToken":{let d=t==null?void 0:t.type;if(d==="access"){let ne=n().access_token;if(!ne)throw new x("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return ne}if(d!=="partner"&&d!=="chatbox")throw new x("HOST_ERROR",`Lo\u1EA1i token kh\xF4ng h\u1EE3p l\u1EC7: ${String(d)}`);let s=ut[d];if(!r().includes(s))throw new x("PERMISSION_DENIED",`Mini app ch\u01B0a \u0111\u01B0\u1EE3c c\u1EA5p quy\u1EC1n ${s} (Console \u2192 Quy\u1EC1n l\u1EA5y token)`);let E=d==="partner"?n().partner_token:n().chatbox_token;if(!E)throw new x("HOST_ERROR",`Kh\xF4ng c\xF3 ${s}`);return E}case"getUserInfo":{let d=n().user;if(!d)throw new x("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin nh\xE2n vi\xEAn");return d}case"getPageInfo":{let d=n().page;if(!d)throw new x("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin page");return d}case"sendMessage":case"insertText":throw new x("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF phi\xEAn b\u1EA3n app n\xE0y`);default:throw new x("NOT_SUPPORTED",`API kh\xF4ng t\u1ED3n t\u1EA1i: ${e}`)}};var ke=e=>`bundle:${e}`,Ie=()=>`${b().file_system.document_dir}/miniapps`,De=Ie,At=(e,t,n="index.html",r=!1,a=[])=>{let o=`${De()}/${e}/${t}`;return{app_id:e,version:t,dir:o,entry_uri:`file://${o}/${n}`,context_update:r,permissions:a}},ft=e=>{var t;b().storage.setString(ke(e.app_id),JSON.stringify({version:e.version,entry:e.entry,context_update:!!e.context_update,permissions:(t=e.permissions)!=null?t:[]}))},Ht=(e,t)=>/^https?:\/\//.test(t)?t:`${e.replace(/[^/]*$/,"")}${t}`,v=e=>{let t=b().storage.getString(ke(e));if(!t)return null;try{let{version:n,entry:r,context_update:a,permissions:o}=JSON.parse(t);return At(e,n,r,!!a,Array.isArray(o)?o:[])}catch{return null}},q=e=>b().file_system.exists(e.entry_uri.replace("file://","")),Le=async e=>{let t=v(e.app_id);return(t==null?void 0:t.version)===e.version&&await q(t)},Wt=async(e,t)=>{let n=b().file_system,r=`${De()}/${e}`,a=await n.listDir(r).catch(()=>[]);await Promise.all(a.filter(o=>!t.includes(o)).map(o=>n.remove(`${r}/${o}`).catch(()=>{})))},mt=async e=>{var t;await((t=ae[e])==null?void 0:t.catch(()=>{})),b().storage.setString(ke(e),""),await b().file_system.remove(`${De()}/${e}`).catch(()=>{})},te=class extends Error{constructor(){super("cancelled"),this.name="MiniAppInstallCancelled"}},ae={},$e=(e,{base_url:t,onProgress:n}={})=>{var _;let r=b().file_system,a=null,o=!1,c=`${r.cache_dir}/${e.app_id}-${e.version}.zip`,l=()=>{if(o)throw new te},i=async()=>{var D;l();let A=v(e.app_id);if((A==null?void 0:A.version)===e.version&&await r.exists(A.dir))return ft(e),v(e.app_id);l();let f=r.download({url:t?Ht(t,e.bundle_url):e.bundle_url,to_file:c,onProgress:(y,d)=>{var E;let s=d>0?d:(E=e.size)!=null?E:0;s>0&&(n==null||n(Math.min(1,y/s)))}});a=f;try{let{status:y}=await f.promise;if(l(),y!==200)throw new Error(`bundle ${y}`);if(e.sha256)if(r.sha256){if(await r.sha256(c)!==e.sha256)throw new Error("sha256 mismatch")}else $("b\u1ECF qua ki\u1EC3m tra sha256 (file_system kh\xF4ng c\xF3 sha256)",e.app_id);l();let d=At(e.app_id,e.version,e.entry,!!e.context_update,(D=e.permissions)!=null?D:[]);return await r.remove(d.dir).catch(()=>{}),await r.mkdir(d.dir),await r.unzip(c,d.dir),ft(e),Wt(e.app_id,[e.version,A==null?void 0:A.version].filter(Boolean)),d}catch(y){throw o?new te:y}finally{a=null,r.remove(c).catch(()=>{})}},M=((_=ae[e.app_id])!=null?_:Promise.resolve()).catch(()=>{}).then(i),m=M.catch(()=>{});return ae[e.app_id]=m,m.then(()=>{ae[e.app_id]===m&&delete ae[e.app_id]}),{promise:M,cancel:()=>{o=!0,a==null||a.cancel()}}},se={},jt=__DEV__?0:60*1e3,ht={},Mt=(e,t)=>{var r,a;let n=v(e);return n&&Date.now()-((r=ht[t])!=null?r:0)<jt?Promise.resolve(n):((a=se[e])!=null||(se[e]=(async()=>{let o=await fetch(t,{headers:{"Cache-Control":"no-cache"}});if(!o.ok)throw new Error(`manifest ${o.status}`);let c=await o.json(),l=await $e(c,{base_url:t}).promise;return ht[t]=Date.now(),l})().catch(o=>(console.warn("[miniapp] sync failed",e,o==null?void 0:o.message),v(e))).finally(()=>{se[e]=void 0})),se[e])};var me=new Map,yt=(e,t)=>(me.set(e,t),()=>{me.get(e)===t&&me.delete(e)}),qt=(e,t)=>{let n=me.get(e);return n?n(t):!1};import{useRef as Kt,useSyncExternalStore as zt}from"react";var Me=e=>{let t=e,n=new Set;return{getState:()=>t,setState:r=>{let a=typeof r=="function"?r(t):r;t={...t,...a},n.forEach(o=>o())},subscribe:r=>(n.add(r),()=>{n.delete(r)})}},H=(e,t,n=Object.is)=>{let r=Kt(null),a=()=>{let o=e.getState(),c=r.current;if(c&&c.state===o&&c.selector===t)return c.value;let l=t(o),i=c&&n(c.value,l)?c.value:l;return r.current={state:o,selector:t,value:i},i};return zt(e.subscribe,a)};var N=Me({active_key:null,instances:{}}),wt=({app:e,instance_id:t,context:n={},url_params:r={},host_data:a={}},o)=>{var l;let c=(l=b().keep_alive)==null?void 0:l.max_webviews;N.setState(i=>{let u=t!=null?t:e.app_id,M={...i.instances,[u]:{key:u,app:e,context:n,url_params:r,host_data:a,last_used_at:Date.now()}},m=Object.keys(M);return c&&c>0&&m.length>c&&m.filter(_=>_!==u).sort((_,A)=>M[_].last_used_at-M[A].last_used_at).slice(0,m.length-c).forEach(_=>{delete M[_]}),o?{active_key:u,instances:M}:{instances:M}})},Yt=e=>wt(e,!0),Qt=e=>wt(e,!1),pe=()=>N.setState({active_key:null}),ye=e=>{N.setState(t=>{if(t.active_key===e||!t.instances[e])return{};let n={...t.instances};return delete n[e],{instances:n}})};var vt="catalog",Gt="paused_apps",Xt="removed_apps",Zt=10*1e3,en=2,tn=3e3,nn=()=>{var e;try{return JSON.parse((e=b().storage.getString(vt))!=null?e:"{}")}catch{return{}}},w=Me({catalog:{},downloads:{},pause_reasons:[],updates:{},apply_ticks:{}}),_t=e=>{var t;return!!((t=b().manual_update)!=null&&t.includes(e))},_e=new Set,St=e=>{let t=new Set,n=()=>b().storage.setString(e,JSON.stringify([...t]));return{has:r=>t.has(r),values:()=>[...t],add:r=>t.has(r)?!1:(t.add(r),n(),!0),delete:r=>t.delete(r)?(n(),!0):!1,load:()=>{var r;t.clear();try{let a=JSON.parse((r=b().storage.getString(e))!=null?r:"[]");Array.isArray(a)&&a.forEach(o=>{typeof o=="string"&&t.add(o)})}catch{}}}},B=St(Gt),Y=St(Xt);et(()=>{B.load(),Y.load();let e=nn(),t={};Object.keys(e).filter(n=>!Y.has(n)).forEach(n=>{let r=v(n);r?t[n]={status:"installed",progress:1,version:r.version,has_local:!0}:B.has(n)&&(t[n]={status:"paused",progress:0,version:e[n].version,has_local:!1})}),w.setState({catalog:e,downloads:t})});var Fe=e=>H(w,t=>e?t.downloads[e]:void 0),rn=()=>H(w,e=>e.pause_reasons.length>0),F=(...e)=>$("queue",...e),R=[],W={},h=null,we=new Set,Z={},Ne=new Set,K=e=>{Ne.forEach(t=>{try{t(e)}catch(n){console.warn("[miniapp-queue] event listener error",n==null?void 0:n.message)}})},on=e=>(Ne.add(e),()=>{Ne.delete(e)}),sn=()=>w.getState().downloads,C=(e,t)=>{let n=!!v(e),r=w.getState().downloads[e],a=t.status==="downloading"&&n?"updating":t.status,o={...r!=null?r:{status:"queued",progress:0},...t,...a?{status:a}:{},has_local:n};w.setState(c=>({downloads:{...c.downloads,[e]:o}})),(r==null?void 0:r.status)!==o.status||(r==null?void 0:r.version)!==o.version||(r==null?void 0:r.has_local)!==o.has_local?K({type:"status_change",app_id:e,state:o}):r.progress!==o.progress&&K({type:"progress",app_id:e,progress:o.progress,version:o.version})},ve=(e,t)=>{var n;(n=Z[e])==null||n.forEach(r=>r(t)),delete Z[e]},an=()=>w.getState().pause_reasons.length>0,z=e=>{var l;if(h)return;let t=e?R.indexOf(e):an()?-1:R.findIndex(i=>!B.has(i));if(t<0||t>=R.length)return;let[n]=R.splice(t,1),r=w.getState().catalog[n];if(!r){ve(n,v(n)),z();return}let a=Date.now();W[n]=((l=W[n])!=null?l:0)+1,C(n,{status:"downloading",progress:0,version:r.version,error:void 0});let o=0,c=$e(r,{onProgress:i=>{let u=Math.floor(i*100);u!==o&&(o=u,C(n,{progress:u/100,version:r.version}))}});h={app_id:n,handle:c,forced:!!e},F("start",n,r.version,e?"(forced)":""),c.promise.then(i=>{F("installed",n,r.version,`${Date.now()-a}ms`),C(n,{status:"installed",progress:1,version:r.version}),ve(n,i)}).catch(i=>{var M;if(i instanceof te){if(we.has(n))return;F("paused",n),W[n]-=1,R.unshift(n),C(n,{status:B.has(n)?"paused":"queued",progress:0,version:r.version});return}let u=String((M=i==null?void 0:i.message)!=null?M:i);if(console.warn("[miniapp-queue] failed",n,u),W[n]<en){C(n,{status:"queued",progress:0,version:r.version,error:u}),setTimeout(()=>{var m;R.includes(n)||(h==null?void 0:h.app_id)===n||(R.push(n),z((m=Z[n])!=null&&m.length?n:void 0))},tn);return}C(n,{status:"failed",progress:0,version:r.version,error:u}),ve(n,v(n))}).finally(()=>{h=null;let i=R.find(u=>{var M;return(M=Z[u])==null?void 0:M.length});z(i)})},Se=(e,{front:t=!1}={})=>{if((h==null?void 0:h.app_id)===e)return;let n=R.indexOf(e);if(n>=0){if(!t)return;R.splice(n,1)}t?R.unshift(e):R.push(e)},pn=async e=>{let{host_id:t,client_token:n}=b(),r=new AbortController,a=setTimeout(()=>r.abort(),Zt);try{let o=`${Te}/api/hosts/${encodeURIComponent(t)}/miniapps?channel=${e}`,c=await fetch(o,{headers:{Authorization:`Bearer ${n}`,"Cache-Control":"no-cache"},signal:r.signal});if(!c.ok)throw new Error(`host list ${e} ${c.status}`);return(await c.json()).apps.map(i=>({...i,channel:e}))}finally{clearTimeout(a)}},ce=null,Be=()=>(ce!=null||(ce=(async()=>{var t;let e=Date.now();try{let n=await Promise.all(b().channels.map(pn)),r={};[...n].reverse().flat().forEach(i=>{r[i.app_id]=i});let a=Object.keys(w.getState().catalog).filter(i=>!r[i]);b().storage.setString(vt,JSON.stringify(r)),w.setState({catalog:r}),await Promise.all(a.map(i=>bt(i,{by_user:!1}))),a.forEach(i=>Y.delete(i));let o=Object.keys(r).filter(i=>!Y.has(i)),c=[],l={};for(let i of o.map(u=>r[u])){if(await Le(i)){C(i.app_id,{status:"installed",progress:1,version:i.version});continue}let u=v(i.app_id);if(_t(i.app_id)&&!_e.has(i.app_id)&&u&&await q(u)){C(i.app_id,{status:"installed",progress:1,version:u.version}),l[i.app_id]={app_id:i.app_id,current_version:u.version,next_version:i.version};continue}c.push(i)}return w.setState({updates:l}),c.forEach(i=>{W[i.app_id]=0,C(i.app_id,{status:B.has(i.app_id)?"paused":"queued",progress:0,version:i.version,error:void 0}),Se(i.app_id)}),F("catalog",o.length,"apps, outdated",c.map(i=>i.app_id),"removed",a,`${Date.now()-e}ms`),K({type:"sync_complete",app_ids:o,removed:a}),Object.values(l).forEach(i=>K({type:"update_available",...i})),z(),{ok:!0,app_ids:o,removed:a}}catch(n){let r=String((n==null?void 0:n.name)==="AbortError"?"timeout":(t=n==null?void 0:n.message)!=null?t:n);return console.warn("[miniapp-queue] sync catalog failed",r),K({type:"sync_failed",error:r}),{ok:!1,error:r}}finally{ce=null}})()),ce),bt=async(e,{by_user:t})=>{var a,o,c,l;if(t&&Y.add(e),we.has(e))return;we.add(e),B.delete(e);let n=R.indexOf(e);n>=0&&R.splice(n,1),(h==null?void 0:h.app_id)===e&&h.handle.cancel();let r=(l=(c=(a=w.getState().downloads[e])==null?void 0:a.version)!=null?c:(o=v(e))==null?void 0:o.version)!=null?l:"";C(e,{status:"uninstalling",progress:0,version:r}),await mt(e),ye(e),w.setState(i=>{let u={...i.downloads};return delete u[e],{downloads:u}}),delete W[e],we.delete(e),ve(e,null),F("uninstalled",e,t?"(user)":"(not in list)"),K({type:"uninstalled",app_id:e})},cn=e=>bt(e,{by_user:!0}),ln=e=>{let t=le(e);return t?(Y.delete(e),(h==null?void 0:h.app_id)===e||R.includes(e)||(W[e]=0,C(e,{status:B.has(e)?"paused":"queued",progress:0,version:t.version,error:void 0}),Se(e),z(),F("restore",e)),!0):!1},un=e=>{if(B.has(e))return;if(B.add(e),F("pause app",e),(h==null?void 0:h.app_id)===e&&!h.forced){h.handle.cancel();return}let t=w.getState().downloads[e];R.includes(e)&&t&&C(e,{status:"paused",progress:0,version:t.version})},dn=e=>{if(!B.delete(e))return;F("resume app",e);let t=w.getState().downloads[e];(t==null?void 0:t.status)==="paused"&&!R.includes(e)&&le(e)&&(W[e]=0,Se(e)),R.includes(e)&&t&&C(e,{status:"queued",progress:0,version:t.version}),z()},gn=e=>{let{pause_reasons:t}=w.getState();t.includes(e)||(w.setState({pause_reasons:[...t,e]}),F("pause",e),t.length===0&&K({type:"pause_change",paused:!0,reasons:[e]}),h&&!h.forced&&h.handle.cancel())},fn=e=>{let{pause_reasons:t}=w.getState();if(!t.includes(e))return;let n=t.filter(r=>r!==e);w.setState({pause_reasons:n}),F("resume",e),n.length===0&&K({type:"pause_change",paused:!1,reasons:n}),z()},xt=e=>w.getState().updates[e],hn=async e=>{var n,r;let t=xt(e);_e.add(e);try{let a=await be(e),o=(r=t==null?void 0:t.next_version)!=null?r:(n=le(e))==null?void 0:n.version;return!a||!o||a.version!==o?!1:(w.setState(c=>{var i;let l={...c.updates};return delete l[e],{updates:l,apply_ticks:{...c.apply_ticks,[e]:((i=c.apply_ticks[e])!=null?i:0)+1}}}),F("updated",e,t==null?void 0:t.current_version,"\u2192",a.version),!0)}finally{_e.delete(e)}},An=()=>Object.values(w.getState().catalog).map(e=>({...e,installed:!!v(e.app_id),removed_by_user:Y.has(e.app_id)})),le=e=>w.getState().catalog[e],be=async e=>{let t=le(e);if(!t)return;if(B.delete(e),Y.delete(e),await Le(t))return v(e);let n=v(e);if(_t(e)&&!_e.has(e)&&n&&await q(n))return n;let r=new Promise(a=>{var o;((o=Z[e])!=null?o:Z[e]=[]).push(a)});return(h==null?void 0:h.app_id)===e?h.forced=!0:(W[e]=0,Se(e,{front:!0}),h&&!h.forced?h.handle.cancel():z(e)),r};import{Fragment as Tt,jsx as T,jsxs as de}from"react/jsx-runtime";var Ue=e=>(e!=null?e:"").replace(/\?[^#]*/,""),Et=0,_n=()=>{let e=new Set;return{emit:t=>e.forEach(n=>n(t)),subscribe:t=>(e.add(t),()=>{e.delete(t)})}},Sn=We.memo(({instance_key:e,is_active:t,is_front:n,is_dark:r,reload_tick:a,web_at_top:o,splash:c,bridge:l,opaque_background:i,allow_embedded_miniapps:u,onWebLoadEnd:M})=>{var Ge,Xe;let m=U(null),_=U(!1),A=H(N,p=>p.instances[e]),f=A==null?void 0:A.app.app_id,D=A==null?void 0:A.app.manifest_url,y=A==null?void 0:A.context,d=A==null?void 0:A.url_params,[s,E]=ee(()=>f?v(f):null),[ne,re]=ee(!1),[Ct,qe]=ee(0),[Ot,ie]=ee(0),[kt,O]=ee(!1),V=U(null),Ke=p=>{V.current&&clearTimeout(V.current),V.current=setTimeout(()=>{V.current=null,O(!0)},p)};J(()=>()=>{V.current&&clearTimeout(V.current)},[]),J(()=>{if(!f||!t&&s)return;let p=!0;return re(!1),(async()=>{let g=v(f),P=g?await q(g):!1;if(!p||(E(P?L=>!L||L.version!==g.version||L.permissions.join(",")!==g.permissions.join(",")?g:L:null),__DEV__&&Date.now()-Et>1e4&&(Et=Date.now(),await Be()),!p))return;let j=await be(f),Q=j!==void 0?j:D?await Mt(f,D):v(f);if(p){if(!Q){re(!0);return}E(L=>L!=null?L:Q)}})(),()=>{p=!1}},[t,f,D,Ct]),J(()=>yt(e,p=>m.current?(m.current.postMessage(p),!0):!1),[e]);let It=H(w,p=>{let g=f?p.downloads[f]:void 0;return(g==null?void 0:g.status)==="installed"?g.version:void 0});J(()=>{if(t||!f||!s)return;let p=v(f);if(!p||p.version===s.version)return;let g=!0;return q(p).then(P=>{!g||!P||($(`webview:${e}`,"\u0111\u1ED5i bundle (\u1EA9n)",s.version,"\u2192",p.version),E(p))}),()=>{g=!1}},[t,f,It,s==null?void 0:s.version]);let ze=H(w,p=>{var g;return f&&(g=p.apply_ticks[f])!=null?g:0});J(()=>{if(!ze||!f)return;let p=v(f);if(!p||p.version===(s==null?void 0:s.version))return;let g=!0;return q(p).then(P=>{!g||!P||($(`webview:${e}`,"c\u1EADp nh\u1EADt",s==null?void 0:s.version,"\u2192",p.version),O(!1),E(p))}),()=>{g=!1}},[ze]),J(()=>{var P;let p=(P=b().keep_alive)==null?void 0:P.idle_close_ms;if(t||!p||p<=0)return;let g=setTimeout(()=>{ye(e)},p);return()=>clearTimeout(g)},[t,e]),J(()=>{a>0&&(re(!1),O(!1),ie(p=>p+1),qe(p=>p+1))},[a]);let Ye=U(t);J(()=>{var p;Ye.current!==t&&(Ye.current=t,_.current&&((p=m.current)==null||p.injectJavaScript(at(t?"resumed":"paused"))))},[t]);let ge=`${(Ge=s==null?void 0:s.version)!=null?Ge:"none"}:${(Xe=s==null?void 0:s.permissions.join(","))!=null?Xe:""}:${Ot}`,oe=xe(()=>JSON.stringify([y!=null?y:{},d!=null?d:{}]),[y,d]),Ee=xe(()=>{var p;return dt(d!=null?d:{},(p=s==null?void 0:s.permissions)!=null?p:[])},[oe,s==null?void 0:s.permissions]),Dt=xe(()=>lt(y!=null?y:{},Ee)+st()+(b().debug?ot():""),[Ee]),fe=U(null),Qe=U(null);J(()=>{var g,P,j;if(!s)return;if(Qe.current!==ge){Qe.current=ge,fe.current=oe;return}if(fe.current===oe)return;let p=((P=JSON.parse((g=fe.current)!=null?g:"[]")[0])!=null?P:{}).org_id;if(fe.current=oe,p===(y==null?void 0:y.org_id)&&_.current){O(!1),Ke(1500),(j=m.current)==null||j.injectJavaScript(pt(y!=null?y:{},Ee));return}O(!1),ie(Q=>Q+1)},[oe,s,ge]);let Lt=Ve(async p=>{var P,j,Q,L,Re;let g=nt(p.nativeEvent.data);if(!g){if(f&&(l!=null&&l.onWebEvent))try{Promise.resolve(l.onWebEvent(p.nativeEvent.data,{app_id:f,instance_id:e})).catch(S=>{console.warn("[miniapp] onWebEvent l\u1ED7i",f,S)})}catch(S){console.warn("[miniapp] onWebEvent l\u1ED7i",f,S)}return}if(g.method==="log"){let{level:S,text:k}=g;$(`web:${e}`,S!=null?S:"log",k!=null?k:"");return}if(g.method==="pong"){V.current||O(!0);return}if(g.method==="touchAtTop"){o.emit(!!g.at_top);return}if(g.method==="contextApplied"){V.current&&clearTimeout(V.current),V.current=null,O(!0);return}if(g.method==="ready"){_.current=!0,O(!0);let S=(P=N.getState().instances[e])==null?void 0:P.context;S&&((j=m.current)==null||j.injectJavaScript(Oe(S)));return}try{let S=await gt(g,{getHostData:()=>{var k,G;return(G=(k=N.getState().instances[e])==null?void 0:k.host_data)!=null?G:{}},getPermissions:()=>{var k,G;return f?(G=(k=v(f))==null?void 0:k.permissions)!=null?G:[]:[]},is_dark:r,close:pe,app_id:f!=null?f:"",instance_id:e,options:l});g.id&&((Q=m.current)==null||Q.injectJavaScript(rt(g.id,S)))}catch(S){if(!g.id)return;let k=S==null?void 0:S.code,G=S instanceof x?S:new x(typeof k=="string"?k:"HOST_ERROR",String((L=S==null?void 0:S.message)!=null?L:S));(Re=m.current)==null||Re.injectJavaScript(it(g.id,G))}},[e,r,f,o,l]),$t=Ve(()=>{re(!1),ie(p=>p+1),qe(p=>p+1)},[]);return de(He,{style:[je.absoluteFill,i&&{backgroundColor:r?"#09090B":"#FFFFFF"},!n&&I.behind],pointerEvents:t?"auto":"none",children:[s?T(vn,{ref:m,source:{uri:s.entry_uri},originWhitelist:["*"],allowingReadAccessToURL:`file://${u?Ie():s.dir}`,allowFileAccess:!0,allowFileAccessFromFileURLs:!0,allowUniversalAccessFromFileURLs:!0,injectedJavaScriptBeforeContentLoaded:Dt,onMessage:Lt,bounces:!1,overScrollMode:"never",onLoadStart:p=>{$(`webview:${e}`,"load start",Ue(p.nativeEvent.url)),_.current=!1,O(!1)},onError:p=>{$(`webview:${e}`,"load error",Ue(p.nativeEvent.url),p.nativeEvent.description),re(!0),O(!1)},onLoadEnd:p=>{let g=p.nativeEvent.url;$(`webview:${e}`,"load end",Ue(g)),f&&(M==null||M({app_id:f,instance_id:e,url:g})),Ke(1500)},onContentProcessDidTerminate:()=>{_.current=!1,O(!1),ie(p=>p+1)},onRenderProcessGone:()=>(_.current=!1,O(!1),ie(p=>p+1),!0),style:I.webview},ge):null,A&&T(xn,{visible:!s||!kt,interactive:ne,children:T(bn,{splash:c,app:A.app,is_dark:r,error:ne,has_bundle:!!s,retry:$t})})]})}),bn=We.memo(({splash:e,app:t,is_dark:n,error:r,has_bundle:a,retry:o})=>{let c=e,l=Fe(t.app_id),i=r?"error":!a&&(l==null?void 0:l.status)==="downloading"?"downloading":"loading";return T(c,{app:t,is_dark:n,status:i,progress:i==="downloading"?l==null?void 0:l.progress:void 0,retry:o})}),xn=({visible:e,interactive:t,children:n})=>{let r=U(new Je.Value(e?1:0)).current,[a,o]=ee(e);return J(()=>{if(e){o(!0),r.setValue(1);return}let c=Je.timing(r,{toValue:0,duration:180,useNativeDriver:!0});return c.start(({finished:l})=>{l&&o(!1)}),()=>c.stop()},[e,r]),a?T(Je.View,{style:[je.absoluteFill,{opacity:r}],pointerEvents:t?"auto":"none",children:n}):null},Pt=({app:e,is_dark:t,status:n,progress:r,retry:a})=>{let o=t?"#FAFAFA":"#18181B";return de(He,{style:[I.splash,{backgroundColor:t?"#09090B":"#FFFFFF"}],children:[T(He,{style:[I.splash_icon,{backgroundColor:t?"#18181B":"#F4F4F5"}],children:e.icon?T(yn,{source:{uri:e.icon},style:I.splash_icon_image}):T(ue,{style:I.splash_letter,children:(e.name||"?").slice(0,1).toUpperCase()})}),T(ue,{style:[I.splash_name,{color:o}],children:e.name}),n==="error"?de(Tt,{children:[T(ue,{style:I.splash_hint,children:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c mini app"}),T(wn,{activeOpacity:.7,style:[I.retry_button,{backgroundColor:t?"#27272A":"#F4F4F5"}],onPress:a,children:T(ue,{style:[I.retry_text,{color:o}],children:"Th\u1EED l\u1EA1i"})})]}):de(Tt,{children:[T(mn,{style:I.splash_spinner,color:t?"#A1A1AA":"#71717A"}),n==="downloading"&&de(ue,{style:I.splash_hint,children:["\u0110ang t\u1EA3i mini app",r?` ${Math.round(r*100)}%`:"\u2026"]})]})]})},Rt=(e,t)=>{let n=U(t),r=U(!1);__DEV__&&!r.current&&n.current!==t&&(r.current=!0,console.warn(`[miniapp] MiniAppHost prop "${e}" \u0111\u1ED5i gi\u1EEFa c\xE1c l\u1EA7n render \u2192 m\u1ECDi WebView b\u1ECB mount l\u1EA1i. Khai b\xE1o component b\xEAn ngo\xE0i render.`))},En=({container:e,splash:t=Pt,is_dark:n=!1,bridge:r,close_on_back:a=!0,opaque_background:o=!0,allow_embedded_miniapps:c=!1,onWebLoadEnd:l})=>{Rt("container",e),Rt("splash",t);let i=e,u=H(N,s=>s.active_key),M=U(u);u&&(M.current=u);let m=H(N,s=>Object.keys(s.instances).join("|")),_=H(N,s=>{var E;return s.active_key?(E=s.instances[s.active_key])==null?void 0:E.app.name:void 0}),A=xe(()=>m?m.split("|"):[],[m]),[f,D]=ee({}),y=U(_n()).current;J(()=>{if(!u||!a)return;let s=Mn.addEventListener("hardwareBackPress",()=>(pe(),!0));return()=>s.remove()},[u,a]);let d=Ve(()=>{let s=N.getState().active_key;s&&D(E=>({...E,[s]:(E[s]||0)+1}))},[]);return A.length?T(i,{visible:!!u,title:_!=null?_:"",is_dark:n,close:pe,reload:d,subscribeWebAtTop:y.subscribe,children:A.map(s=>T(Sn,{instance_key:s,is_active:u===s,is_front:(u!=null?u:M.current)===s,is_dark:n,reload_tick:f[s]||0,web_at_top:y,splash:t,bridge:r,opaque_background:o,allow_embedded_miniapps:c,onWebLoadEnd:l},s))}):null},I=je.create({webview:{flex:1,backgroundColor:"transparent"},behind:{zIndex:-1},splash:{flex:1,alignItems:"center",justifyContent:"center",gap:12},splash_icon:{width:72,height:72,borderRadius:20,alignItems:"center",justifyContent:"center",overflow:"hidden"},splash_icon_image:{width:72,height:72},splash_letter:{fontSize:28,fontWeight:"700",color:"#1D4ED8"},splash_name:{fontSize:16,fontWeight:"600"},splash_hint:{color:"#71717A"},splash_spinner:{marginTop:8},retry_button:{marginTop:4,paddingHorizontal:20,paddingVertical:10,borderRadius:999},retry_text:{fontWeight:"600"}}),Rn=We.memo(En);export{Pt as DefaultMiniAppSplash,Te as MINIAPP_PLATFORM_URL,Rn as MiniAppHost,x as MiniAppHostError,pe as closeMiniApp,Nt as configureMiniApp,Bt as createMmkvStorage,Ft as createRnfsFileSystem,be as ensureMiniApp,v as getLocalMiniApp,An as getMiniAppCatalog,le as getMiniAppCatalogEntry,sn as getMiniAppStatuses,xt as getMiniAppUpdate,on as onMiniAppEvent,Yt as openMiniApp,un as pauseMiniApp,gn as pauseMiniAppDownloads,Qt as preloadMiniApp,ln as restoreMiniApp,dn as resumeMiniApp,fn as resumeMiniAppDownloads,qt as sendEventToWeb,Be as syncMiniAppCatalog,cn as uninstallMiniApp,hn as updateMiniApp,Fe as useMiniAppDownload,rn as useMiniAppDownloadsPaused};
|