@retion-miniapp/react-native 0.7.1 → 0.7.2
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 +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- 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(). */
|
|
@@ -480,4 +484,4 @@ declare class BridgeError extends Error {
|
|
|
480
484
|
constructor(code: string, message: string);
|
|
481
485
|
}
|
|
482
486
|
|
|
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 };
|
|
487
|
+
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(). */
|
|
@@ -480,4 +484,4 @@ declare class BridgeError extends Error {
|
|
|
480
484
|
constructor(code: string, message: string);
|
|
481
485
|
}
|
|
482
486
|
|
|
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 };
|
|
487
|
+
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 Yt=Object.create;var de=Object.defineProperty;var Qt=Object.getOwnPropertyDescriptor;var Gt=Object.getOwnPropertyNames;var Xt=Object.getPrototypeOf,Zt=Object.prototype.hasOwnProperty;var en=(e,t)=>{for(var n in t)de(e,n,{get:t[n],enumerable:!0})},Ke=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let
|
|
1
|
+
"use strict";var Yt=Object.create;var de=Object.defineProperty;var Qt=Object.getOwnPropertyDescriptor;var Gt=Object.getOwnPropertyNames;var Xt=Object.getPrototypeOf,Zt=Object.prototype.hasOwnProperty;var en=(e,t)=>{for(var n in t)de(e,n,{get:t[n],enumerable:!0})},Ke=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Gt(t))!Zt.call(e,a)&&a!==n&&de(e,a,{get:()=>t[a],enumerable:!(r=Qt(t,a))||r.enumerable});return e};var ze=(e,t,n)=>(n=e!=null?Yt(Xt(e)):{},Ke(t||!e||!e.__esModule?de(n,"default",{value:e,enumerable:!0}):n,e)),tn=e=>Ke(de({},"__esModule",{value:!0}),e);var wn={};en(wn,{DefaultMiniAppSplash:()=>Be,MINIAPP_PLATFORM_URL:()=>ge,MiniAppHost:()=>Ut,MiniAppHostError:()=>T,closeMiniApp:()=>ne,configureMiniApp:()=>Qe,createMmkvStorage:()=>Ze,createRnfsFileSystem:()=>Xe,ensureMiniApp:()=>ce,getLocalMiniApp:()=>S,getMiniAppCatalog:()=>Nt,getMiniAppCatalogEntry:()=>re,getMiniAppStatuses:()=>Rt,getMiniAppUpdate:()=>Ne,onMiniAppEvent:()=>Tt,openMiniApp:()=>vt,pauseMiniApp:()=>Ot,pauseMiniAppDownloads:()=>Dt,preloadMiniApp:()=>_t,restoreMiniApp:()=>kt,resumeMiniApp:()=>It,resumeMiniAppDownloads:()=>Lt,sendEventToWeb:()=>yt,syncMiniAppCatalog:()=>Ee,uninstallMiniApp:()=>Ct,updateMiniApp:()=>$t,useMiniAppDownload:()=>be,useMiniAppDownloadsPaused:()=>Et});module.exports=tn(wn);var ge="https://retion-miniapp-platform.vercel.app",Z=null,Ye=new Set,Qe=e=>{Z=e,Ye.forEach(t=>t())},E=()=>{if(!Z)throw new Error("[miniapp] Ch\u01B0a g\u1ECDi configureMiniApp()");return Z},Ge=e=>{Ye.add(e),Z&&e()},N=(...e)=>{Z!=null&&Z.debug&&console.log("[miniapp]",...e)};var Xe=(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:s,promise:c}=e.downloadFile({fromUrl:n,toFile:r,progressInterval:250,begin:()=>{},progress:({bytesWritten:l,contentLength:o})=>a==null?void 0:a(l,o)});return{promise:c.then(({statusCode:l})=>({status:l})),cancel:()=>e.stopDownload(s)}}}),Ze=e=>({getString:t=>e.getString(t),setString:(t,n)=>e.set(t,n)});var u=ze(require("react")),w=require("react-native"),Jt=ze(require("react-native-webview"));var fe=require("react-native"),he=1,T=class extends Error{constructor(n,r){super(r);this.code=n}},tt=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;`,nt=(e,t)=>Ae({id:e,result:t}),rt=(e,t)=>Ae({id:e,error:{code:t.code,message:t.message}}),ke=e=>Ae({event:"context",data:e});var ot=()=>`(function () {
|
|
2
2
|
var post = function (level, args) {
|
|
3
3
|
try {
|
|
4
4
|
var parts = [];
|
|
@@ -42,4 +42,4 @@
|
|
|
42
42
|
${ke(e)}`},pt=e=>Object.entries(e).filter(([,t])=>t!=null&&t!=="").map(([t,n])=>`${encodeURIComponent(t)}=${encodeURIComponent(String(n))}`).join("&"),ct=(e,t={})=>{let n=pt(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;`},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;`},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 T("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)}},nn=new Set(["selection","impactLight","impactMedium","impactHeavy","rigid","soft","notificationSuccess","notificationWarning","notificationError"]),Ce=(e,t)=>{if(typeof e!="string"||!e)throw new T("INVALID_PARAMS",`Thi\u1EBFu ${t}`);return e},dt=async({method:e,params:t},{getHostData:n,getPermissions:r,is_dark:a,close:s,app_id:c,instance_id:l,options:o})=>{var m,d,L,b,R;let g=o==null?void 0:o.handlers,h={app_id:c,instance_id:l,close:s},v=()=>new T("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF \u1EE9ng d\u1EE5ng n\xE0y`);switch(e){case"requestPayment":{let i=g==null?void 0:g.requestPayment;if(!i)throw v();let M=t==null?void 0:t.amount;if(typeof M!="number"||!Number.isFinite(M)||M<=0)throw new T("INVALID_PARAMS","amount ph\u1EA3i l\xE0 s\u1ED1 > 0");let U={...t,amount:M,currency:Ce(t==null?void 0:t.currency,"currency")};return et(e,()=>i(U,h))}case"printImage":{let i=g==null?void 0:g.printImage;if(!i)throw v();let M=Ce(t==null?void 0:t.image,"image");await et(e,()=>i({image:M},h));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},h);return;case"closeApp":s();return;case"openWebview":{let i=String((m=t==null?void 0:t.url)!=null?m:"");if(!/^https?:\/\//i.test(i))throw new T("INVALID_PARAMS","url ph\u1EA3i l\xE0 http(s)");await(o!=null&&o.openUrl?o.openUrl(i):fe.Linking.openURL(i));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"haptic":{let i=nn.has(t==null?void 0:t.type)?t.type:"selection";(b=o==null?void 0:o.haptic)==null||b.call(o,i);return}case"getSystemInfo":return{platform:fe.Platform.OS==="ios"?"ios":"android",appVersion:(R=o==null?void 0:o.app_version)!=null?R:"",theme:a?"dark":"light"};case"getAccessToken":{let i=n().access_token;if(!i)throw new T("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return i}case"getToken":{let i=t==null?void 0:t.type;if(i==="access"){let j=n().access_token;if(!j)throw new T("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return j}if(i!=="partner"&&i!=="chatbox")throw new T("HOST_ERROR",`Lo\u1EA1i token kh\xF4ng h\u1EE3p l\u1EC7: ${String(i)}`);let M=lt[i];if(!r().includes(M))throw new T("PERMISSION_DENIED",`Mini app ch\u01B0a \u0111\u01B0\u1EE3c c\u1EA5p quy\u1EC1n ${M} (Console \u2192 Quy\u1EC1n l\u1EA5y token)`);let U=i==="partner"?n().partner_token:n().chatbox_token;if(!U)throw new T("HOST_ERROR",`Kh\xF4ng c\xF3 ${M}`);return U}case"getUserInfo":{let i=n().user;if(!i)throw new T("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin nh\xE2n vi\xEAn");return i}case"getPageInfo":{let i=n().page;if(!i)throw new T("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin page");return i}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 Oe=e=>`bundle:${e}`,Ie=()=>`${E().file_system.document_dir}/miniapps`,ht=(e,t,n="index.html",r=!1,a=[])=>{let s=`${Ie()}/${e}/${t}`;return{app_id:e,version:t,dir:s,entry_uri:`file://${s}/${n}`,context_update:r,permissions:a}},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:[]}))},rn=(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:a,permissions:s}=JSON.parse(t);return ht(e,n,r,!!a,Array.isArray(s)?s:[])}catch{return null}},K=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 K(t)},on=async(e,t)=>{let n=E().file_system,r=`${Ie()}/${e}`,a=await n.listDir(r).catch(()=>[]);await Promise.all(a.filter(s=>!t.includes(s)).map(s=>n.remove(`${r}/${s}`).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(()=>{})},te=class extends Error{constructor(){super("cancelled"),this.name="MiniAppInstallCancelled"}},ae={},Le=(e,{base_url:t,onProgress:n}={})=>{var m;let r=E().file_system,a=null,s=!1,c=`${r.cache_dir}/${e.app_id}-${e.version}.zip`,l=()=>{if(s)throw new te},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?rn(t,e.bundle_url):e.bundle_url,to_file:c,onProgress:(R,i)=>{var U;let M=i>0?i:(U=e.size)!=null?U:0;M>0&&(n==null||n(Math.min(1,R/M)))}});a=L;try{let{status:R}=await L.promise;if(l(),R!==200)throw new Error(`bundle ${R}`);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 i=ht(e.app_id,e.version,e.entry,!!e.context_update,(b=e.permissions)!=null?b:[]);return await r.remove(i.dir).catch(()=>{}),await r.mkdir(i.dir),await r.unzip(c,i.dir),gt(e),on(e.app_id,[e.version,d==null?void 0:d.version].filter(Boolean)),i}catch(R){throw s?new te:R}finally{a=null,r.remove(c).catch(()=>{})}},h=((m=ae[e.app_id])!=null?m:Promise.resolve()).catch(()=>{}).then(o),v=h.catch(()=>{});return ae[e.app_id]=v,v.then(()=>{ae[e.app_id]===v&&delete ae[e.app_id]}),{promise:h,cancel:()=>{s=!0,a==null||a.cancel()}}},se={},sn=__DEV__?0:60*1e3,ft={},mt=(e,t)=>{var r,a;let n=S(e);return n&&Date.now()-((r=ft[t])!=null?r:0)<sn?Promise.resolve(n):((a=se[e])!=null||(se[e]=(async()=>{let s=await fetch(t,{headers:{"Cache-Control":"no-cache"}});if(!s.ok)throw new Error(`manifest ${s.status}`);let c=await s.json(),l=await Le(c,{base_url:t}).promise;return ft[t]=Date.now(),l})().catch(s=>(console.warn("[miniapp] sync failed",e,s==null?void 0:s.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 a=typeof r=="function"?r(t):r;t={...t,...a},n.forEach(s=>s())},subscribe:r=>(n.add(r),()=>{n.delete(r)})}},H=(e,t,n=Object.is)=>{let r=(0,Me.useRef)(null),a=()=>{let s=e.getState(),c=r.current;if(c&&c.state===s&&c.selector===t)return c.value;let l=t(s),o=c&&n(c.value,l)?c.value:l;return r.current={state:s,selector:t,value:o},o};return(0,Me.useSyncExternalStore)(e.subscribe,a)};var F=ye({active_key:null,instances:{}}),wt=({app:e,instance_id:t,context:n={},url_params:r={},host_data:a={}},s)=>{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,h={...o.instances,[g]:{key:g,app:e,context:n,url_params:r,host_data:a,last_used_at:Date.now()}},v=Object.keys(h);return c&&c>0&&v.length>c&&v.filter(m=>m!==g).sort((m,d)=>h[m].last_used_at-h[d].last_used_at).slice(0,v.length-c).forEach(m=>{delete h[m]}),s?{active_key:g,instances:h}:{instances:h}})},vt=e=>wt(e,!0),_t=e=>wt(e,!1),ne=()=>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",an="paused_apps",pn="removed_apps",cn=10*1e3,ln=2,un=3e3,dn=()=>{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 a=JSON.parse((r=E().storage.getString(e))!=null?r:"[]");Array.isArray(a)&&a.forEach(s=>{typeof s=="string"&&t.add(s)})}catch{}}}},J=xt(an),Q=xt(pn);Ge(()=>{J.load(),Q.load();let e=dn(),t={};Object.keys(e).filter(n=>!Q.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=>H(y,t=>e?t.downloads[e]:void 0),Et=()=>H(y,e=>e.pause_reasons.length>0),B=(...e)=>N("queue",...e),P=[],W={},A=null,ve=new Set,ee={},$e=new Set,z=e=>{$e.forEach(t=>{try{t(e)}catch(n){console.warn("[miniapp-queue] event listener error",n==null?void 0:n.message)}})},Tt=e=>($e.add(e),()=>{$e.delete(e)}),Rt=()=>y.getState().downloads,k=(e,t)=>{let n=!!S(e),r=y.getState().downloads[e],a=t.status==="downloading"&&n?"updating":t.status,s={...r!=null?r:{status:"queued",progress:0},...t,...a?{status:a}:{},has_local:n};y.setState(c=>({downloads:{...c.downloads,[e]:s}})),(r==null?void 0:r.status)!==s.status||(r==null?void 0:r.version)!==s.version||(r==null?void 0:r.has_local)!==s.has_local?z({type:"status_change",app_id:e,state:s}):r.progress!==s.progress&&z({type:"progress",app_id:e,progress:s.progress,version:s.version})},_e=(e,t)=>{var n;(n=ee[e])==null||n.forEach(r=>r(t)),delete ee[e]},gn=()=>y.getState().pause_reasons.length>0,Y=e=>{var l;if(A)return;let t=e?P.indexOf(e):gn()?-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)),Y();return}let a=Date.now();W[n]=((l=W[n])!=null?l:0)+1,k(n,{status:"downloading",progress:0,version:r.version,error:void 0});let s=0,c=Le(r,{onProgress:o=>{let g=Math.floor(o*100);g!==s&&(s=g,k(n,{progress:g/100,version:r.version}))}});A={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()-a}ms`),k(n,{status:"installed",progress:1,version:r.version}),_e(n,o)}).catch(o=>{var h;if(o instanceof te){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((h=o==null?void 0:o.message)!=null?h:o);if(console.warn("[miniapp-queue] failed",n,g),W[n]<ln){k(n,{status:"queued",progress:0,version:r.version,error:g}),setTimeout(()=>{var v;P.includes(n)||(A==null?void 0:A.app_id)===n||(P.push(n),Y((v=ee[n])!=null&&v.length?n:void 0))},un);return}k(n,{status:"failed",progress:0,version:r.version,error:g}),_e(n,S(n))}).finally(()=>{A=null;let o=P.find(g=>{var h;return(h=ee[g])==null?void 0:h.length});Y(o)})},xe=(e,{front:t=!1}={})=>{if((A==null?void 0:A.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)},fn=async e=>{let{host_id:t,client_token:n}=E(),r=new AbortController,a=setTimeout(()=>r.abort(),cn);try{let s=`${ge}/api/hosts/${encodeURIComponent(t)}/miniapps?channel=${e}`,c=await fetch(s,{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,Ee=()=>(pe!=null||(pe=(async()=>{var t;let e=Date.now();try{let n=await Promise.all(E().channels.map(fn)),r={};[...n].reverse().flat().forEach(o=>{r[o.app_id]=o});let a=Object.keys(y.getState().catalog).filter(o=>!r[o]);E().storage.setString(St,JSON.stringify(r)),y.setState({catalog:r}),await Promise.all(a.map(o=>Pt(o,{by_user:!1}))),a.forEach(o=>Q.delete(o));let s=Object.keys(r).filter(o=>!Q.has(o)),c=[],l={};for(let o of s.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 K(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",s.length,"apps, outdated",c.map(o=>o.app_id),"removed",a,`${Date.now()-e}ms`),z({type:"sync_complete",app_ids:s,removed:a}),Object.values(l).forEach(o=>z({type:"update_available",...o})),Y(),{ok:!0,app_ids:s,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),z({type:"sync_failed",error:r}),{ok:!1,error:r}}finally{pe=null}})()),pe),Pt=async(e,{by_user:t})=>{var a,s,c,l;if(t&&Q.add(e),ve.has(e))return;ve.add(e),J.delete(e);let n=P.indexOf(e);n>=0&&P.splice(n,1),(A==null?void 0:A.app_id)===e&&A.handle.cancel();let r=(l=(c=(a=y.getState().downloads[e])==null?void 0:a.version)!=null?c:(s=S(e))==null?void 0:s.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)"),z({type:"uninstalled",app_id:e})},Ct=e=>Pt(e,{by_user:!0}),kt=e=>{let t=re(e);return t?(Q.delete(e),(A==null?void 0:A.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),Y(),B("restore",e)),!0):!1},Ot=e=>{if(J.has(e))return;if(J.add(e),B("pause app",e),(A==null?void 0:A.app_id)===e&&!A.forced){A.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)&&re(e)&&(W[e]=0,xe(e)),P.includes(e)&&t&&k(e,{status:"queued",progress:0,version:t.version}),Y()},Dt=e=>{let{pause_reasons:t}=y.getState();t.includes(e)||(y.setState({pause_reasons:[...t,e]}),B("pause",e),t.length===0&&z({type:"pause_change",paused:!0,reasons:[e]}),A&&!A.forced&&A.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&&z({type:"pause_change",paused:!1,reasons:n}),Y()},Ne=e=>y.getState().updates[e],$t=async e=>{var n,r;let t=Ne(e);Se.add(e);try{let a=await ce(e),s=(r=t==null?void 0:t.next_version)!=null?r:(n=re(e))==null?void 0:n.version;return!a||!s||a.version!==s?!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",a.version),!0)}finally{Se.delete(e)}},Nt=()=>Object.values(y.getState().catalog).map(e=>({...e,installed:!!S(e.app_id),removed_by_user:Q.has(e.app_id)})),re=e=>y.getState().catalog[e],ce=async e=>{let t=re(e);if(!t)return;if(J.delete(e),Q.delete(e),await De(t))return S(e);let n=S(e);if(bt(e)&&!Se.has(e)&&n&&await K(n))return n;let r=new Promise(a=>{var s;((s=ee[e])!=null?s:ee[e]=[]).push(a)});return(A==null?void 0:A.app_id)===e?A.forced=!0:(W[e]=0,xe(e,{front:!0}),A&&!A.forced?A.handle.cancel():Y(e)),r};var _=require("react/jsx-runtime"),Fe=e=>(e!=null?e:"").replace(/\?[^#]*/,""),Ft=0,hn=()=>{let e=new Set;return{emit:t=>e.forEach(n=>n(t)),subscribe:t=>(e.add(t),()=>{e.delete(t)})}},An=u.default.memo(({instance_key:e,is_active:t,is_front:n,is_dark:r,reload_tick:a,web_at_top:s,splash:c,bridge:l,opaque_background:o,onWebLoadEnd:g})=>{var je,qe;let h=(0,u.useRef)(null),v=(0,u.useRef)(!1),m=H(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,R=m==null?void 0:m.url_params,[i,M]=(0,u.useState)(()=>d?S(d):null),[U,j]=(0,u.useState)(!1),[Vt,Je]=(0,u.useState)(0),[Ht,oe]=(0,u.useState)(0),[Wt,O]=(0,u.useState)(!1),V=(0,u.useRef)(null),Ue=p=>{V.current&&clearTimeout(V.current),V.current=setTimeout(()=>{V.current=null,O(!0)},p)};(0,u.useEffect)(()=>()=>{V.current&&clearTimeout(V.current)},[]),(0,u.useEffect)(()=>{if(!d||!t&&i)return;let p=!0;return j(!1),(async()=>{let f=S(d),C=f?await K(f):!1;if(!p||(M(C?$=>!$||$.version!==f.version||$.permissions.join(",")!==f.permissions.join(",")?f:$:null),__DEV__&&Date.now()-Ft>1e4&&(Ft=Date.now(),await Ee()),!p))return;let q=await ce(d),G=q!==void 0?q:L?await mt(d,L):S(d);if(p){if(!G){j(!0);return}M($=>$!=null?$:G)}})(),()=>{p=!1}},[t,d,L,Vt]),(0,u.useEffect)(()=>Mt(e,p=>h.current?(h.current.postMessage(p),!0):!1),[e]);let jt=H(y,p=>{let f=d?p.downloads[d]:void 0;return(f==null?void 0:f.status)==="installed"?f.version:void 0});(0,u.useEffect)(()=>{if(t||!d||!i)return;let p=S(d);if(!p||p.version===i.version)return;let f=!0;return K(p).then(C=>{!f||!C||(N(`webview:${e}`,"\u0111\u1ED5i bundle (\u1EA9n)",i.version,"\u2192",p.version),M(p))}),()=>{f=!1}},[t,d,jt,i==null?void 0:i.version]);let Ve=H(y,p=>{var f;return d&&(f=p.apply_ticks[d])!=null?f:0});(0,u.useEffect)(()=>{if(!Ve||!d)return;let p=S(d);if(!p||p.version===(i==null?void 0:i.version))return;let f=!0;return K(p).then(C=>{!f||!C||(N(`webview:${e}`,"c\u1EADp nh\u1EADt",i==null?void 0:i.version,"\u2192",p.version),O(!1),M(p))}),()=>{f=!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 f=setTimeout(()=>{we(e)},p);return()=>clearTimeout(f)},[t,e]),(0,u.useEffect)(()=>{a>0&&(j(!1),O(!1),oe(p=>p+1),Je(p=>p+1))},[a]);let He=(0,u.useRef)(t);(0,u.useEffect)(()=>{var p;He.current!==t&&(He.current=t,v.current&&((p=h.current)==null||p.injectJavaScript(st(t?"resumed":"paused"))))},[t]);let le=`${(je=i==null?void 0:i.version)!=null?je:"none"}:${(qe=i==null?void 0:i.permissions.join(","))!=null?qe:""}:${Ht}`,ie=(0,u.useMemo)(()=>JSON.stringify([b!=null?b:{},R!=null?R:{}]),[b,R]),Te=(0,u.useMemo)(()=>{var p;return ut(R!=null?R:{},(p=i==null?void 0:i.permissions)!=null?p:[])},[ie,i==null?void 0:i.permissions]),qt=(0,u.useMemo)(()=>ct(b!=null?b:{},Te)+it()+(E().debug?ot():""),[Te]),ue=(0,u.useRef)(null),We=(0,u.useRef)(null);(0,u.useEffect)(()=>{var f,C,q;if(!i)return;if(We.current!==le){We.current=le,ue.current=ie;return}if(ue.current===ie)return;let p=((C=JSON.parse((f=ue.current)!=null?f:"[]")[0])!=null?C:{}).org_id;if(ue.current=ie,p===(b==null?void 0:b.org_id)&&v.current){O(!1),Ue(1500),(q=h.current)==null||q.injectJavaScript(at(b!=null?b:{},Te));return}O(!1),oe(G=>G+1)},[ie,i,le]);let Kt=(0,u.useCallback)(async p=>{var C,q,G,$,Re;let f=tt(p.nativeEvent.data);if(!f){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(f.method==="log"){let{level:x,text:I}=f;N(`web:${e}`,x!=null?x:"log",I!=null?I:"");return}if(f.method==="pong"){V.current||O(!0);return}if(f.method==="touchAtTop"){s.emit(!!f.at_top);return}if(f.method==="contextApplied"){V.current&&clearTimeout(V.current),V.current=null,O(!0);return}if(f.method==="ready"){v.current=!0,O(!0);let x=(C=F.getState().instances[e])==null?void 0:C.context;x&&((q=h.current)==null||q.injectJavaScript(ke(x)));return}try{let x=await dt(f,{getHostData:()=>{var I,X;return(X=(I=F.getState().instances[e])==null?void 0:I.host_data)!=null?X:{}},getPermissions:()=>{var I,X;return d?(X=(I=S(d))==null?void 0:I.permissions)!=null?X:[]:[]},is_dark:r,close:ne,app_id:d!=null?d:"",instance_id:e,options:l});f.id&&((G=h.current)==null||G.injectJavaScript(nt(f.id,x)))}catch(x){if(!f.id)return;let I=x==null?void 0:x.code,X=x instanceof T?x:new T(typeof I=="string"?I:"HOST_ERROR",String(($=x==null?void 0:x.message)!=null?$:x));(Re=h.current)==null||Re.injectJavaScript(rt(f.id,X))}},[e,r,d,s,l]),zt=(0,u.useCallback)(()=>{j(!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:[i?(0,_.jsx)(Jt.default,{ref:h,source:{uri:i.entry_uri},originWhitelist:["*"],allowingReadAccessToURL:`file://${i.dir}`,allowFileAccess:!0,allowFileAccessFromFileURLs:!0,allowUniversalAccessFromFileURLs:!0,injectedJavaScriptBeforeContentLoaded:qt,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),j(!0),O(!1)},onLoadEnd:p=>{let f=p.nativeEvent.url;N(`webview:${e}`,"load end",Fe(f)),d&&(g==null||g({app_id:d,instance_id:e,url:f})),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:!i||!Wt,interactive:U,children:(0,_.jsx)(mn,{splash:c,app:m.app,is_dark:r,error:U,has_bundle:!!i,retry:zt})})]})}),mn=u.default.memo(({splash:e,app:t,is_dark:n,error:r,has_bundle:a,retry:s})=>{let c=e,l=be(t.app_id),o=r?"error":!a&&(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:s})}),Mn=({visible:e,interactive:t,children:n})=>{let r=(0,u.useRef)(new w.Animated.Value(e?1:0)).current,[a,s]=(0,u.useState)(e);return(0,u.useEffect)(()=>{if(e){s(!0),r.setValue(1);return}let c=w.Animated.timing(r,{toValue:0,duration:180,useNativeDriver:!0});return c.start(({finished:l})=>{l&&s(!1)}),()=>c.stop()},[e,r]),a?(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:a})=>{let s=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:s}],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:a,children:(0,_.jsx)(w.Text,{style:[D.retry_text,{color:s}],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.`))},yn=({container:e,splash:t=Be,is_dark:n=!1,bridge:r,close_on_back:a=!0,opaque_background:s=!0,onWebLoadEnd:c})=>{Bt("container",e),Bt("splash",t);let l=e,o=H(F,i=>i.active_key),g=(0,u.useRef)(o);o&&(g.current=o);let h=H(F,i=>Object.keys(i.instances).join("|")),v=H(F,i=>{var M;return i.active_key?(M=i.instances[i.active_key])==null?void 0:M.app.name:void 0}),m=(0,u.useMemo)(()=>h?h.split("|"):[],[h]),[d,L]=(0,u.useState)({}),b=(0,u.useRef)(hn()).current;(0,u.useEffect)(()=>{if(!o||!a)return;let i=w.BackHandler.addEventListener("hardwareBackPress",()=>(ne(),!0));return()=>i.remove()},[o,a]);let R=(0,u.useCallback)(()=>{let i=F.getState().active_key;i&&L(M=>({...M,[i]:(M[i]||0)+1}))},[]);return m.length?(0,_.jsx)(l,{visible:!!o,title:v!=null?v:"",is_dark:n,close:ne,reload:R,subscribeWebAtTop:b.subscribe,children:m.map(i=>(0,_.jsx)(An,{instance_key:i,is_active:o===i,is_front:(o!=null?o:g.current)===i,is_dark:n,reload_tick:d[i]||0,web_at_top:b,splash:t,bridge:r,opaque_background:s,onWebLoadEnd:c},i))}):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(yn);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",Z=null,Ge=new Set,Lt=e=>{Z=e,Ge.forEach(t=>t())},S=()=>{if(!Z)throw new Error("[miniapp] Ch\u01B0a g\u1ECDi configureMiniApp()");return Z},Xe=e=>{Ge.add(e),Z&&e()},L=(...e)=>{Z!=null&&Z.debug&&console.log("[miniapp]",...e)};var $t=(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:s,promise:c}=e.downloadFile({fromUrl:n,toFile:r,progressInterval:250,begin:()=>{},progress:({bytesWritten:l,contentLength:o})=>a==null?void 0:a(l,o)});return{promise:c.then(({statusCode:l})=>({status:l})),cancel:()=>e.stopDownload(s)}}}),Nt=e=>({getString:t=>e.getString(t),setString:(t,n)=>e.set(t,n)});import Ve,{useCallback as Je,useEffect as B,useMemo as be,useRef as J,useState as te}from"react";import{ActivityIndicator as hn,Animated as Fe,BackHandler as An,Image as mn,StyleSheet as He,Text as le,TouchableOpacity as Mn,View as Ue}from"react-native";import yn from"react-native-webview";import{Linking as Ft,Platform as Bt}from"react-native";var fe=1,b=class extends Error{constructor(n,r){super(r);this.code=n}},et=e=>{try{let t=JSON.parse(e);return(t==null?void 0:t.__retion)===fe&&typeof t.method=="string"?t:null}catch{return null}},he=e=>`window.__RETION_MINIAPP__ && window.__RETION_MINIAPP__.receive(${JSON.stringify(e)}); true;`,tt=(e,t)=>he({id:e,result:t}),nt=(e,t)=>he({id:e,error:{code:t.code,message:t.message}}),Ce=e=>he({event:"context",data:e});var rt=()=>`(function () {
|
|
2
2
|
var post = function (level, args) {
|
|
3
3
|
try {
|
|
4
4
|
var parts = [];
|
|
@@ -42,4 +42,4 @@ var Re="https://retion-miniapp-platform.vercel.app",X=null,Ge=new Set,Lt=e=>{X=e
|
|
|
42
42
|
${Ce(e)}`},at=e=>Object.entries(e).filter(([,t])=>t!=null&&t!=="").map(([t,n])=>`${encodeURIComponent(t)}=${encodeURIComponent(String(n))}`).join("&"),pt=(e,t={})=>{let n=at(t);return`window.__RETION_MINIAPP_HOST__ = { protocol: ${fe} };
|
|
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;`},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},Re=new Set,Ze=async(e,t)=>{if(Re.has(e))throw new b("BUSY",`${e} \u0111ang ch\u1EA1y \u2014 ch\u1EDD l\u01B0\u1EE3t tr\u01B0\u1EDBc xong`);Re.add(e);try{return await t()}finally{Re.delete(e)}},Jt=new Set(["selection","impactLight","impactMedium","impactHeavy","rigid","soft","notificationSuccess","notificationWarning","notificationError"]),Pe=(e,t)=>{if(typeof e!="string"||!e)throw new b("INVALID_PARAMS",`Thi\u1EBFu ${t}`);return e},ut=async({method:e,params:t},{getHostData:n,getPermissions:r,is_dark:a,close:s,app_id:c,instance_id:l,options:o})=>{var A,u,I,v,x;let d=o==null?void 0:o.handlers,f={app_id:c,instance_id:l,close:s},y=()=>new b("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF \u1EE9ng d\u1EE5ng n\xE0y`);switch(e){case"requestPayment":{let i=d==null?void 0:d.requestPayment;if(!i)throw y();let m=t==null?void 0:t.amount;if(typeof m!="number"||!Number.isFinite(m)||m<=0)throw new b("INVALID_PARAMS","amount ph\u1EA3i l\xE0 s\u1ED1 > 0");let U={...t,amount:m,currency:Pe(t==null?void 0:t.currency,"currency")};return Ze(e,()=>i(U,f))}case"printImage":{let i=d==null?void 0:d.printImage;if(!i)throw y();let m=Pe(t==null?void 0:t.image,"image");await Ze(e,()=>i({image:m},f));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},f);return;case"closeApp":s();return;case"openWebview":{let i=String((A=t==null?void 0:t.url)!=null?A:"");if(!/^https?:\/\//i.test(i))throw new b("INVALID_PARAMS","url ph\u1EA3i l\xE0 http(s)");await(o!=null&&o.openUrl?o.openUrl(i):Ft.openURL(i));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"haptic":{let i=Jt.has(t==null?void 0:t.type)?t.type:"selection";(v=o==null?void 0:o.haptic)==null||v.call(o,i);return}case"getSystemInfo":return{platform:Bt.OS==="ios"?"ios":"android",appVersion:(x=o==null?void 0:o.app_version)!=null?x:"",theme:a?"dark":"light"};case"getAccessToken":{let i=n().access_token;if(!i)throw new b("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return i}case"getToken":{let i=t==null?void 0:t.type;if(i==="access"){let j=n().access_token;if(!j)throw new b("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return j}if(i!=="partner"&&i!=="chatbox")throw new b("HOST_ERROR",`Lo\u1EA1i token kh\xF4ng h\u1EE3p l\u1EC7: ${String(i)}`);let m=ct[i];if(!r().includes(m))throw new b("PERMISSION_DENIED",`Mini app ch\u01B0a \u0111\u01B0\u1EE3c c\u1EA5p quy\u1EC1n ${m} (Console \u2192 Quy\u1EC1n l\u1EA5y token)`);let U=i==="partner"?n().partner_token:n().chatbox_token;if(!U)throw new b("HOST_ERROR",`Kh\xF4ng c\xF3 ${m}`);return U}case"getUserInfo":{let i=n().user;if(!i)throw new b("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin nh\xE2n vi\xEAn");return i}case"getPageInfo":{let i=n().page;if(!i)throw new b("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin page");return i}case"sendMessage":case"insertText":throw new b("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF phi\xEAn b\u1EA3n app n\xE0y`);default:throw new b("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 s=`${Oe()}/${e}/${t}`;return{app_id:e,version:t,dir:s,entry_uri:`file://${s}/${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:[]}))},Ut=(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:s}=JSON.parse(t);return ft(e,n,r,!!a,Array.isArray(s)?s:[])}catch{return null}},K=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 K(t)},Vt=async(e,t)=>{let n=S().file_system,r=`${Oe()}/${e}`,a=await n.listDir(r).catch(()=>[]);await Promise.all(a.filter(s=>!t.includes(s)).map(s=>n.remove(`${r}/${s}`).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(()=>{})},ne=class extends Error{constructor(){super("cancelled"),this.name="MiniAppInstallCancelled"}},se={},De=(e,{base_url:t,onProgress:n}={})=>{var A;let r=S().file_system,a=null,s=!1,c=`${r.cache_dir}/${e.app_id}-${e.version}.zip`,l=()=>{if(s)throw new ne},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?Ut(t,e.bundle_url):e.bundle_url,to_file:c,onProgress:(x,i)=>{var U;let m=i>0?i:(U=e.size)!=null?U:0;m>0&&(n==null||n(Math.min(1,x/m)))}});a=I;try{let{status:x}=await I.promise;if(l(),x!==200)throw new Error(`bundle ${x}`);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 i=ft(e.app_id,e.version,e.entry,!!e.context_update,(v=e.permissions)!=null?v:[]);return await r.remove(i.dir).catch(()=>{}),await r.mkdir(i.dir),await r.unzip(c,i.dir),dt(e),Vt(e.app_id,[e.version,u==null?void 0:u.version].filter(Boolean)),i}catch(x){throw s?new ne:x}finally{a=null,r.remove(c).catch(()=>{})}},f=((A=se[e.app_id])!=null?A:Promise.resolve()).catch(()=>{}).then(o),y=f.catch(()=>{});return se[e.app_id]=y,y.then(()=>{se[e.app_id]===y&&delete se[e.app_id]}),{promise:f,cancel:()=>{s=!0,a==null||a.cancel()}}},ie={},Ht=__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)<Ht?Promise.resolve(n):((a=ie[e])!=null||(ie[e]=(async()=>{let s=await fetch(t,{headers:{"Cache-Control":"no-cache"}});if(!s.ok)throw new Error(`manifest ${s.status}`);let c=await s.json(),l=await De(c,{base_url:t}).promise;return gt[t]=Date.now(),l})().catch(s=>(console.warn("[miniapp] sync failed",e,s==null?void 0:s.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(s=>s())},subscribe:r=>(n.add(r),()=>{n.delete(r)})}},H=(e,t,n=Object.is)=>{let r=jt(null),a=()=>{let s=e.getState(),c=r.current;if(c&&c.state===s&&c.selector===t)return c.value;let l=t(s),o=c&&n(c.value,l)?c.value:l;return r.current={state:s,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={}},s)=>{var l;let c=(l=S().keep_alive)==null?void 0:l.max_webviews;$.setState(o=>{let d=t!=null?t:e.app_id,f={...o.instances,[d]:{key:d,app:e,context:n,url_params:r,host_data:a,last_used_at:Date.now()}},y=Object.keys(f);return c&&c>0&&y.length>c&&y.filter(A=>A!==d).sort((A,u)=>f[A].last_used_at-f[u].last_used_at).slice(0,y.length-c).forEach(A=>{delete f[A]}),s?{active_key:d,instances:f}:{instances:f}})},Kt=e=>Mt(e,!0),zt=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",Yt="paused_apps",Qt="removed_apps",Gt=10*1e3,Xt=2,Zt=3e3,en=()=>{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(s=>{typeof s=="string"&&t.add(s)})}catch{}}}},F=vt(Yt),Q=vt(Qt);Xe(()=>{F.load(),Q.load();let e=en(),t={};Object.keys(e).filter(n=>!Q.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=>H(M,t=>e?t.downloads[e]:void 0),tn=()=>H(M,e=>e.pause_reasons.length>0),N=(...e)=>L("queue",...e),E=[],W={},h=null,ye=new Set,ee={},Le=new Set,z=e=>{Le.forEach(t=>{try{t(e)}catch(n){console.warn("[miniapp-queue] event listener error",n==null?void 0:n.message)}})},nn=e=>(Le.add(e),()=>{Le.delete(e)}),rn=()=>M.getState().downloads,P=(e,t)=>{let n=!!w(e),r=M.getState().downloads[e],a=t.status==="downloading"&&n?"updating":t.status,s={...r!=null?r:{status:"queued",progress:0},...t,...a?{status:a}:{},has_local:n};M.setState(c=>({downloads:{...c.downloads,[e]:s}})),(r==null?void 0:r.status)!==s.status||(r==null?void 0:r.version)!==s.version||(r==null?void 0:r.has_local)!==s.has_local?z({type:"status_change",app_id:e,state:s}):r.progress!==s.progress&&z({type:"progress",app_id:e,progress:s.progress,version:s.version})},we=(e,t)=>{var n;(n=ee[e])==null||n.forEach(r=>r(t)),delete ee[e]},on=()=>M.getState().pause_reasons.length>0,Y=e=>{var l;if(h)return;let t=e?E.indexOf(e):on()?-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)),Y();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 s=0,c=De(r,{onProgress:o=>{let d=Math.floor(o*100);d!==s&&(s=d,P(n,{progress:d/100,version:r.version}))}});h={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 f;if(o instanceof ne){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((f=o==null?void 0:o.message)!=null?f:o);if(console.warn("[miniapp-queue] failed",n,d),W[n]<Xt){P(n,{status:"queued",progress:0,version:r.version,error:d}),setTimeout(()=>{var y;E.includes(n)||(h==null?void 0:h.app_id)===n||(E.push(n),Y((y=ee[n])!=null&&y.length?n:void 0))},Zt);return}P(n,{status:"failed",progress:0,version:r.version,error:d}),we(n,w(n))}).finally(()=>{h=null;let o=E.find(d=>{var f;return(f=ee[d])==null?void 0:f.length});Y(o)})},_e=(e,{front:t=!1}={})=>{if((h==null?void 0:h.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)},sn=async e=>{let{host_id:t,client_token:n}=S(),r=new AbortController,a=setTimeout(()=>r.abort(),Gt);try{let s=`${Te}/api/hosts/${encodeURIComponent(t)}/miniapps?channel=${e}`,c=await fetch(s,{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(sn)),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=>Q.delete(o));let s=Object.keys(r).filter(o=>!Q.has(o)),c=[],l={};for(let o of s.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 K(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",s.length,"apps, outdated",c.map(o=>o.app_id),"removed",a,`${Date.now()-e}ms`),z({type:"sync_complete",app_ids:s,removed:a}),Object.values(l).forEach(o=>z({type:"update_available",...o})),Y(),{ok:!0,app_ids:s,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),z({type:"sync_failed",error:r}),{ok:!1,error:r}}finally{pe=null}})()),pe),_t=async(e,{by_user:t})=>{var a,s,c,l;if(t&&Q.add(e),ye.has(e))return;ye.add(e),F.delete(e);let n=E.indexOf(e);n>=0&&E.splice(n,1),(h==null?void 0:h.app_id)===e&&h.handle.cancel();let r=(l=(c=(a=M.getState().downloads[e])==null?void 0:a.version)!=null?c:(s=w(e))==null?void 0:s.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)"),z({type:"uninstalled",app_id:e})},an=e=>_t(e,{by_user:!0}),pn=e=>{let t=ce(e);return t?(Q.delete(e),(h==null?void 0:h.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),Y(),N("restore",e)),!0):!1},cn=e=>{if(F.has(e))return;if(F.add(e),N("pause app",e),(h==null?void 0:h.app_id)===e&&!h.forced){h.handle.cancel();return}let t=M.getState().downloads[e];E.includes(e)&&t&&P(e,{status:"paused",progress:0,version:t.version})},ln=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}),Y()},un=e=>{let{pause_reasons:t}=M.getState();t.includes(e)||(M.setState({pause_reasons:[...t,e]}),N("pause",e),t.length===0&&z({type:"pause_change",paused:!0,reasons:[e]}),h&&!h.forced&&h.handle.cancel())},dn=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&&z({type:"pause_change",paused:!1,reasons:n}),Y()},St=e=>M.getState().updates[e],gn=async e=>{var n,r;let t=St(e);ve.add(e);try{let a=await Se(e),s=(r=t==null?void 0:t.next_version)!=null?r:(n=ce(e))==null?void 0:n.version;return!a||!s||a.version!==s?!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)}},fn=()=>Object.values(M.getState().catalog).map(e=>({...e,installed:!!w(e.app_id),removed_by_user:Q.has(e.app_id)})),ce=e=>M.getState().catalog[e],Se=async e=>{let t=ce(e);if(!t)return;if(F.delete(e),Q.delete(e),await Ie(t))return w(e);let n=w(e);if(wt(e)&&!ve.has(e)&&n&&await K(n))return n;let r=new Promise(a=>{var s;((s=ee[e])!=null?s:ee[e]=[]).push(a)});return(h==null?void 0:h.app_id)===e?h.forced=!0:(W[e]=0,_e(e,{front:!0}),h&&!h.forced?h.handle.cancel():Y(e)),r};import{Fragment as Et,jsx as T,jsxs as ue}from"react/jsx-runtime";var Be=e=>(e!=null?e:"").replace(/\?[^#]*/,""),bt=0,wn=()=>{let e=new Set;return{emit:t=>e.forEach(n=>n(t)),subscribe:t=>(e.add(t),()=>{e.delete(t)})}},vn=Ve.memo(({instance_key:e,is_active:t,is_front:n,is_dark:r,reload_tick:a,web_at_top:s,splash:c,bridge:l,opaque_background:o,onWebLoadEnd:d})=>{var Ye,Qe;let f=J(null),y=J(!1),A=H($,p=>p.instances[e]),u=A==null?void 0:A.app.app_id,I=A==null?void 0:A.app.manifest_url,v=A==null?void 0:A.context,x=A==null?void 0:A.url_params,[i,m]=te(()=>u?w(u):null),[U,j]=te(!1),[Rt,We]=te(0),[Pt,re]=te(0),[Ct,C]=te(!1),V=J(null),je=p=>{V.current&&clearTimeout(V.current),V.current=setTimeout(()=>{V.current=null,C(!0)},p)};B(()=>()=>{V.current&&clearTimeout(V.current)},[]),B(()=>{if(!u||!t&&i)return;let p=!0;return j(!1),(async()=>{let g=w(u),R=g?await K(g):!1;if(!p||(m(R?D=>!D||D.version!==g.version||D.permissions.join(",")!==g.permissions.join(",")?g:D:null),__DEV__&&Date.now()-bt>1e4&&(bt=Date.now(),await Ne()),!p))return;let q=await Se(u),G=q!==void 0?q:I?await At(u,I):w(u);if(p){if(!G){j(!0);return}m(D=>D!=null?D:G)}})(),()=>{p=!1}},[t,u,I,Rt]),B(()=>mt(e,p=>f.current?(f.current.postMessage(p),!0):!1),[e]);let kt=H(M,p=>{let g=u?p.downloads[u]:void 0;return(g==null?void 0:g.status)==="installed"?g.version:void 0});B(()=>{if(t||!u||!i)return;let p=w(u);if(!p||p.version===i.version)return;let g=!0;return K(p).then(R=>{!g||!R||(L(`webview:${e}`,"\u0111\u1ED5i bundle (\u1EA9n)",i.version,"\u2192",p.version),m(p))}),()=>{g=!1}},[t,u,kt,i==null?void 0:i.version]);let qe=H(M,p=>{var g;return u&&(g=p.apply_ticks[u])!=null?g:0});B(()=>{if(!qe||!u)return;let p=w(u);if(!p||p.version===(i==null?void 0:i.version))return;let g=!0;return K(p).then(R=>{!g||!R||(L(`webview:${e}`,"c\u1EADp nh\u1EADt",i==null?void 0:i.version,"\u2192",p.version),C(!1),m(p))}),()=>{g=!1}},[qe]),B(()=>{var R;let p=(R=S().keep_alive)==null?void 0:R.idle_close_ms;if(t||!p||p<=0)return;let g=setTimeout(()=>{Me(e)},p);return()=>clearTimeout(g)},[t,e]),B(()=>{a>0&&(j(!1),C(!1),re(p=>p+1),We(p=>p+1))},[a]);let Ke=J(t);B(()=>{var p;Ke.current!==t&&(Ke.current=t,y.current&&((p=f.current)==null||p.injectJavaScript(it(t?"resumed":"paused"))))},[t]);let de=`${(Ye=i==null?void 0:i.version)!=null?Ye:"none"}:${(Qe=i==null?void 0:i.permissions.join(","))!=null?Qe:""}:${Pt}`,oe=be(()=>JSON.stringify([v!=null?v:{},x!=null?x:{}]),[v,x]),xe=be(()=>{var p;return lt(x!=null?x:{},(p=i==null?void 0:i.permissions)!=null?p:[])},[oe,i==null?void 0:i.permissions]),Ot=be(()=>pt(v!=null?v:{},xe)+ot()+(S().debug?rt():""),[xe]),ge=J(null),ze=J(null);B(()=>{var g,R,q;if(!i)return;if(ze.current!==de){ze.current=de,ge.current=oe;return}if(ge.current===oe)return;let p=((R=JSON.parse((g=ge.current)!=null?g:"[]")[0])!=null?R:{}).org_id;if(ge.current=oe,p===(v==null?void 0:v.org_id)&&y.current){C(!1),je(1500),(q=f.current)==null||q.injectJavaScript(st(v!=null?v:{},xe));return}C(!1),re(G=>G+1)},[oe,i,de]);let It=Je(async p=>{var R,q,G,D,Ee;let g=et(p.nativeEvent.data);if(!g){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(g.method==="log"){let{level:_,text:k}=g;L(`web:${e}`,_!=null?_:"log",k!=null?k:"");return}if(g.method==="pong"){V.current||C(!0);return}if(g.method==="touchAtTop"){s.emit(!!g.at_top);return}if(g.method==="contextApplied"){V.current&&clearTimeout(V.current),V.current=null,C(!0);return}if(g.method==="ready"){y.current=!0,C(!0);let _=(R=$.getState().instances[e])==null?void 0:R.context;_&&((q=f.current)==null||q.injectJavaScript(Ce(_)));return}try{let _=await ut(g,{getHostData:()=>{var k,X;return(X=(k=$.getState().instances[e])==null?void 0:k.host_data)!=null?X:{}},getPermissions:()=>{var k,X;return u?(X=(k=w(u))==null?void 0:k.permissions)!=null?X:[]:[]},is_dark:r,close:ae,app_id:u!=null?u:"",instance_id:e,options:l});g.id&&((G=f.current)==null||G.injectJavaScript(tt(g.id,_)))}catch(_){if(!g.id)return;let k=_==null?void 0:_.code,X=_ instanceof b?_:new b(typeof k=="string"?k:"HOST_ERROR",String((D=_==null?void 0:_.message)!=null?D:_));(Ee=f.current)==null||Ee.injectJavaScript(nt(g.id,X))}},[e,r,u,s,l]),Dt=Je(()=>{j(!1),re(p=>p+1),We(p=>p+1)},[]);return ue(Ue,{style:[He.absoluteFill,o&&{backgroundColor:r?"#09090B":"#FFFFFF"},!n&&O.behind],pointerEvents:t?"auto":"none",children:[i?T(yn,{ref:f,source:{uri:i.entry_uri},originWhitelist:["*"],allowingReadAccessToURL:`file://${i.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),j(!0),C(!1)},onLoadEnd:p=>{let g=p.nativeEvent.url;L(`webview:${e}`,"load end",Be(g)),u&&(d==null||d({app_id:u,instance_id:e,url:g})),je(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,A&&T(Sn,{visible:!i||!Ct,interactive:U,children:T(_n,{splash:c,app:A.app,is_dark:r,error:U,has_bundle:!!i,retry:Dt})})]})}),_n=Ve.memo(({splash:e,app:t,is_dark:n,error:r,has_bundle:a,retry:s})=>{let c=e,l=$e(t.app_id),o=r?"error":!a&&(l==null?void 0:l.status)==="downloading"?"downloading":"loading";return T(c,{app:t,is_dark:n,status:o,progress:o==="downloading"?l==null?void 0:l.progress:void 0,retry:s})}),Sn=({visible:e,interactive:t,children:n})=>{let r=J(new Fe.Value(e?1:0)).current,[a,s]=te(e);return B(()=>{if(e){s(!0),r.setValue(1);return}let c=Fe.timing(r,{toValue:0,duration:180,useNativeDriver:!0});return c.start(({finished:l})=>{l&&s(!1)}),()=>c.stop()},[e,r]),a?T(Fe.View,{style:[He.absoluteFill,{opacity:r}],pointerEvents:t?"auto":"none",children:n}):null},Tt=({app:e,is_dark:t,status:n,progress:r,retry:a})=>{let s=t?"#FAFAFA":"#18181B";return ue(Ue,{style:[O.splash,{backgroundColor:t?"#09090B":"#FFFFFF"}],children:[T(Ue,{style:[O.splash_icon,{backgroundColor:t?"#18181B":"#F4F4F5"}],children:e.icon?T(mn,{source:{uri:e.icon},style:O.splash_icon_image}):T(le,{style:O.splash_letter,children:(e.name||"?").slice(0,1).toUpperCase()})}),T(le,{style:[O.splash_name,{color:s}],children:e.name}),n==="error"?ue(Et,{children:[T(le,{style:O.splash_hint,children:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c mini app"}),T(Mn,{activeOpacity:.7,style:[O.retry_button,{backgroundColor:t?"#27272A":"#F4F4F5"}],onPress:a,children:T(le,{style:[O.retry_text,{color:s}],children:"Th\u1EED l\u1EA1i"})})]}):ue(Et,{children:[T(hn,{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.`))},bn=({container:e,splash:t=Tt,is_dark:n=!1,bridge:r,close_on_back:a=!0,opaque_background:s=!0,onWebLoadEnd:c})=>{xt("container",e),xt("splash",t);let l=e,o=H($,i=>i.active_key),d=J(o);o&&(d.current=o);let f=H($,i=>Object.keys(i.instances).join("|")),y=H($,i=>{var m;return i.active_key?(m=i.instances[i.active_key])==null?void 0:m.app.name:void 0}),A=be(()=>f?f.split("|"):[],[f]),[u,I]=te({}),v=J(wn()).current;B(()=>{if(!o||!a)return;let i=An.addEventListener("hardwareBackPress",()=>(ae(),!0));return()=>i.remove()},[o,a]);let x=Je(()=>{let i=$.getState().active_key;i&&I(m=>({...m,[i]:(m[i]||0)+1}))},[]);return A.length?T(l,{visible:!!o,title:y!=null?y:"",is_dark:n,close:ae,reload:x,subscribeWebAtTop:v.subscribe,children:A.map(i=>T(vn,{instance_key:i,is_active:o===i,is_front:(o!=null?o:d.current)===i,is_dark:n,reload_tick:u[i]||0,web_at_top:v,splash:t,bridge:r,opaque_background:s,onWebLoadEnd:c},i))}):null},O=He.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"}}),xn=Ve.memo(bn);export{Tt as DefaultMiniAppSplash,Te as MINIAPP_PLATFORM_URL,xn as MiniAppHost,b as MiniAppHostError,ae as closeMiniApp,Lt as configureMiniApp,Nt as createMmkvStorage,$t as createRnfsFileSystem,Se as ensureMiniApp,w as getLocalMiniApp,fn as getMiniAppCatalog,ce as getMiniAppCatalogEntry,rn as getMiniAppStatuses,St as getMiniAppUpdate,nn as onMiniAppEvent,Kt as openMiniApp,cn as pauseMiniApp,un as pauseMiniAppDownloads,zt as preloadMiniApp,pn as restoreMiniApp,ln as resumeMiniApp,dn as resumeMiniAppDownloads,Wt as sendEventToWeb,Ne as syncMiniAppCatalog,an as uninstallMiniApp,gn as updateMiniApp,$e as useMiniAppDownload,tn as useMiniAppDownloadsPaused};
|