@retion-miniapp/react-native 0.7.2 → 0.7.3

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