@retion-miniapp/react-native 0.6.0 → 0.7.1

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
@@ -193,6 +193,12 @@ interface MiniAppConfig {
193
193
  channels: MiniAppChannel[];
194
194
  file_system: MiniAppFileSystem;
195
195
  storage: MiniAppStorage;
196
+ /**
197
+ * app_id cập nhật thủ công (không có trong mảng → tự động cập nhật như mặc định): đã có bản trong máy mà có bản mới → KHÔNG tự tải (kể cả khi mở app), bắn event
198
+ * `update_available` để ứng dụng hiện popup; người dùng bấm → `updateMiniApp(app_id)` tải và dùng bản mới.
199
+ * Chưa có bản nào trong máy → vẫn tải ngay như thường.
200
+ */
201
+ manual_update?: string[];
196
202
  /** Giới hạn WebView sống. Mặc định: không huỷ. */
197
203
  keep_alive?: MiniAppKeepAlive;
198
204
  /** Log tiến trình tải ra console. */
@@ -322,9 +328,10 @@ declare const closeMiniApp: () => void;
322
328
  * Giống icon app trên iOS:
323
329
  * - queued: chờ tới lượt (icon mờ) · downloading: tải lần đầu · updating: đã có bản cũ, đang tải bản mới
324
330
  * - installed: mở được · failed: lỗi sau khi thử lại (has_local → vẫn mở bản cũ)
331
+ * - paused: app này bị pauseMiniApp(app_id) — nằm trong hàng đợi nhưng không tải tới khi resumeMiniApp
325
332
  * - uninstalling: app không còn trong list, đang xoá
326
333
  */
327
- type MiniAppDownloadStatus = 'queued' | 'downloading' | 'updating' | 'installed' | 'failed' | 'uninstalling';
334
+ type MiniAppDownloadStatus = 'queued' | 'downloading' | 'updating' | 'installed' | 'failed' | 'paused' | 'uninstalling';
328
335
  interface MiniAppDownloadState {
329
336
  status: MiniAppDownloadStatus;
330
337
  /** 0–1 khi đang tải. */
@@ -359,12 +366,29 @@ type MiniAppEvent =
359
366
  app_ids: string[];
360
367
  removed: string[];
361
368
  }
369
+ /** Sync lỗi (mạng / API / token) — catalog cũ giữ nguyên, app trong máy vẫn mở được. */
370
+ | {
371
+ type: 'sync_failed';
372
+ error: string;
373
+ }
362
374
  /** Hàng đợi chuyển dừng ↔ chạy (pauseMiniAppDownloads / resumeMiniAppDownloads). reasons = lý do còn lại. */
363
375
  | {
364
376
  type: 'pause_change';
365
377
  paused: boolean;
366
378
  reasons: string[];
379
+ }
380
+ /** App trong config.manual_update có bản mới — chưa tải, chờ updateMiniApp(app_id). */
381
+ | {
382
+ type: 'update_available';
383
+ app_id: string;
384
+ current_version: string;
385
+ next_version: string;
367
386
  };
387
+ interface MiniAppUpdate {
388
+ app_id: string;
389
+ current_version: string;
390
+ next_version: string;
391
+ }
368
392
  /** Manifest từ API list ứng dụng (bundle_url tuyệt đối). */
369
393
  type MiniAppCatalogEntry = MiniAppManifest & {
370
394
  name?: string;
@@ -378,20 +402,61 @@ declare const useMiniAppDownloadsPaused: () => boolean;
378
402
  declare const onMiniAppEvent: (listener: (event: MiniAppEvent) => void) => () => void;
379
403
  /** Status hiện tại của mọi mini app — đọc 1 lần khi vẽ Sảnh, sau đó nghe onMiniAppEvent. */
380
404
  declare const getMiniAppStatuses: () => Record<string, MiniAppDownloadState>;
405
+ type MiniAppSyncResult = {
406
+ ok: true;
407
+ app_ids: string[];
408
+ removed: string[];
409
+ } | {
410
+ ok: false;
411
+ error: string;
412
+ };
381
413
  /**
382
414
  * Lấy list mini app (theo config.channels — kênh đứng trước được ưu tiên) → cập nhật catalog
383
- * → cho app khác version vào hàng đợi. Lỗi mạng → giữ catalog cũ, không xoá gì.
415
+ * → cho app khác version vào hàng đợi. Lỗi mạng → giữ catalog cũ, không xoá gì, bắn sync_failed.
416
+ * Không bao giờ reject — kết quả trả về giống event sync_complete / sync_failed.
384
417
  */
385
- declare const syncMiniAppCatalog: () => Promise<void>;
418
+ declare const syncMiniAppCatalog: () => Promise<MiniAppSyncResult>;
386
419
  /**
387
- * Gỡ mini app khỏi máy: bỏ khỏi hàng đợi, huỷ lượt tải đang chạy, xoá bundle, huỷ WebView (trừ khi
388
- * đang mở). syncMiniAppCatalog tự gọi cho app không còn trong list; app còn trong list → lần sync sau tải lại.
420
+ * Người dùng gỡ mini app: bỏ khỏi hàng đợi, huỷ lượt tải đang chạy, xoá bundle, huỷ WebView (trừ khi
421
+ * đang mở). Ghi nhớ (storage) → sync không tải lại; tải lại bằng restoreMiniApp / người dùng bấm mở.
389
422
  */
390
423
  declare const uninstallMiniApp: (app_id: string) => Promise<void>;
424
+ /**
425
+ * Tải lại app người dùng đã gỡ (vd màn "Thêm app"): bỏ ghi nhớ đã gỡ → vào hàng đợi (`queued`).
426
+ * false: app không có trong list (chưa sync / admin đã tắt).
427
+ */
428
+ declare const restoreMiniApp: (app_id: string) => boolean;
429
+ /**
430
+ * Pause riêng 1 app: đang tải → huỷ (tải lại từ đầu khi resume), đang chờ → `paused`, chưa cần tải →
431
+ * nhớ lại, bản mới ở lần sync sau cũng `paused`. App khác vẫn tải bình thường. Người dùng bấm mở → tải luôn.
432
+ * Lưu storage: thoát app mở lại vẫn pause, chỉ tải khi resumeMiniApp / người dùng bấm mở / gỡ app.
433
+ */
434
+ declare const pauseMiniApp: (app_id: string) => void;
435
+ /** Gỡ pause riêng của app → đang chờ thì về `queued` và hàng đợi chạy tiếp. */
436
+ declare const resumeMiniApp: (app_id: string) => void;
391
437
  /** Dừng hàng đợi vì `reason`. File đang tải (không phải do người dùng mở) bị huỷ, tải lại sau. */
392
438
  declare const pauseMiniAppDownloads: (reason: string) => void;
393
439
  /** Gỡ lý do dừng; hết lý do → chạy tiếp. */
394
440
  declare const resumeMiniAppDownloads: (reason: string) => void;
441
+ /** Bản cập nhật đang chờ của app (config.manual_update) — đọc đồng bộ, vd lúc mount popup (lỡ event). */
442
+ declare const getMiniAppUpdate: (app_id: string) => MiniAppUpdate | undefined;
443
+ /**
444
+ * Cập nhật thủ công (app trong config.manual_update): tải ngay bản mới (bỏ qua pause), bắn status_change(updating) /
445
+ * progress, xong → mọi WebView của app nạp lại bằng bản mới (kể cả đang hiện). true: đã dùng bản mới; false: lỗi,
446
+ * giữ bản cũ và update vẫn chờ.
447
+ */
448
+ declare const updateMiniApp: (app_id: string) => Promise<boolean>;
449
+ type MiniAppCatalogItem = MiniAppCatalogEntry & {
450
+ /** Máy đang có 1 bản (có thể cũ). */
451
+ installed: boolean;
452
+ /** Người dùng đã tự gỡ — sync không tải lại, chỉ tải khi restoreMiniApp. */
453
+ removed_by_user: boolean;
454
+ };
455
+ /**
456
+ * Mọi app trong list ứng dụng (lần sync gần nhất) kèm trạng thái — đọc đồng bộ, không gọi mạng.
457
+ * Dùng cho màn "Thêm app": lọc `!installed || removed_by_user`, tìm theo `name`, chọn → restoreMiniApp.
458
+ */
459
+ declare const getMiniAppCatalog: () => MiniAppCatalogItem[];
395
460
  /** app_id có trong catalog ứng dụng (đã phát hành) — đọc sync, không gọi mạng. */
396
461
  declare const getMiniAppCatalogEntry: (app_id: string) => MiniAppCatalogEntry | undefined;
397
462
  /**
@@ -415,4 +480,4 @@ declare class BridgeError extends Error {
415
480
  constructor(code: string, message: string);
416
481
  }
417
482
 
418
- export { DefaultMiniAppSplash, MINIAPP_PLATFORM_URL, type MiniAppBridgeOptions, type MiniAppCatalogEntry, type MiniAppChannel, type MiniAppConfig, type MiniAppContainerProps, type MiniAppContext, type MiniAppDownloadState, type MiniAppDownloadStatus, type MiniAppDownloadTask, type MiniAppEvent, type MiniAppFileSystem, type MiniAppHandlerContext, _default as MiniAppHost, type MiniAppHostData, BridgeError as MiniAppHostError, type MiniAppHostProps, type MiniAppKeepAlive, type MiniAppLaunch, type MiniAppLocalBundle, type MiniAppManifest, type MiniAppNativeHandlers, type MiniAppPaymentRequest, type MiniAppPaymentResult, type MiniAppPermission, type MiniAppSplashProps, type MiniAppStorage, type OpenMiniAppArgs, closeMiniApp, configureMiniApp, createMmkvStorage, createRnfsFileSystem, ensureMiniApp, getLocalMiniApp, getMiniAppCatalogEntry, getMiniAppStatuses, onMiniAppEvent, openMiniApp, pauseMiniAppDownloads, preloadMiniApp, resumeMiniAppDownloads, sendEventToWeb, syncMiniAppCatalog, uninstallMiniApp, useMiniAppDownload, useMiniAppDownloadsPaused };
483
+ export { DefaultMiniAppSplash, MINIAPP_PLATFORM_URL, type MiniAppBridgeOptions, type MiniAppCatalogEntry, type MiniAppCatalogItem, type MiniAppChannel, type MiniAppConfig, type MiniAppContainerProps, type MiniAppContext, type MiniAppDownloadState, type MiniAppDownloadStatus, type MiniAppDownloadTask, type MiniAppEvent, type MiniAppFileSystem, type MiniAppHandlerContext, _default as MiniAppHost, type MiniAppHostData, BridgeError as MiniAppHostError, type MiniAppHostProps, type MiniAppKeepAlive, type MiniAppLaunch, type MiniAppLocalBundle, type MiniAppManifest, type MiniAppNativeHandlers, type MiniAppPaymentRequest, type MiniAppPaymentResult, type MiniAppPermission, type MiniAppSplashProps, type MiniAppStorage, type MiniAppSyncResult, type MiniAppUpdate, type OpenMiniAppArgs, closeMiniApp, configureMiniApp, createMmkvStorage, createRnfsFileSystem, ensureMiniApp, getLocalMiniApp, getMiniAppCatalog, getMiniAppCatalogEntry, getMiniAppStatuses, getMiniAppUpdate, onMiniAppEvent, openMiniApp, pauseMiniApp, pauseMiniAppDownloads, preloadMiniApp, restoreMiniApp, resumeMiniApp, resumeMiniAppDownloads, sendEventToWeb, syncMiniAppCatalog, uninstallMiniApp, updateMiniApp, useMiniAppDownload, useMiniAppDownloadsPaused };
package/dist/index.d.ts CHANGED
@@ -193,6 +193,12 @@ interface MiniAppConfig {
193
193
  channels: MiniAppChannel[];
194
194
  file_system: MiniAppFileSystem;
195
195
  storage: MiniAppStorage;
196
+ /**
197
+ * app_id cập nhật thủ công (không có trong mảng → tự động cập nhật như mặc định): đã có bản trong máy mà có bản mới → KHÔNG tự tải (kể cả khi mở app), bắn event
198
+ * `update_available` để ứng dụng hiện popup; người dùng bấm → `updateMiniApp(app_id)` tải và dùng bản mới.
199
+ * Chưa có bản nào trong máy → vẫn tải ngay như thường.
200
+ */
201
+ manual_update?: string[];
196
202
  /** Giới hạn WebView sống. Mặc định: không huỷ. */
197
203
  keep_alive?: MiniAppKeepAlive;
198
204
  /** Log tiến trình tải ra console. */
@@ -322,9 +328,10 @@ declare const closeMiniApp: () => void;
322
328
  * Giống icon app trên iOS:
323
329
  * - queued: chờ tới lượt (icon mờ) · downloading: tải lần đầu · updating: đã có bản cũ, đang tải bản mới
324
330
  * - installed: mở được · failed: lỗi sau khi thử lại (has_local → vẫn mở bản cũ)
331
+ * - paused: app này bị pauseMiniApp(app_id) — nằm trong hàng đợi nhưng không tải tới khi resumeMiniApp
325
332
  * - uninstalling: app không còn trong list, đang xoá
326
333
  */
327
- type MiniAppDownloadStatus = 'queued' | 'downloading' | 'updating' | 'installed' | 'failed' | 'uninstalling';
334
+ type MiniAppDownloadStatus = 'queued' | 'downloading' | 'updating' | 'installed' | 'failed' | 'paused' | 'uninstalling';
328
335
  interface MiniAppDownloadState {
329
336
  status: MiniAppDownloadStatus;
330
337
  /** 0–1 khi đang tải. */
@@ -359,12 +366,29 @@ type MiniAppEvent =
359
366
  app_ids: string[];
360
367
  removed: string[];
361
368
  }
369
+ /** Sync lỗi (mạng / API / token) — catalog cũ giữ nguyên, app trong máy vẫn mở được. */
370
+ | {
371
+ type: 'sync_failed';
372
+ error: string;
373
+ }
362
374
  /** Hàng đợi chuyển dừng ↔ chạy (pauseMiniAppDownloads / resumeMiniAppDownloads). reasons = lý do còn lại. */
363
375
  | {
364
376
  type: 'pause_change';
365
377
  paused: boolean;
366
378
  reasons: string[];
379
+ }
380
+ /** App trong config.manual_update có bản mới — chưa tải, chờ updateMiniApp(app_id). */
381
+ | {
382
+ type: 'update_available';
383
+ app_id: string;
384
+ current_version: string;
385
+ next_version: string;
367
386
  };
387
+ interface MiniAppUpdate {
388
+ app_id: string;
389
+ current_version: string;
390
+ next_version: string;
391
+ }
368
392
  /** Manifest từ API list ứng dụng (bundle_url tuyệt đối). */
369
393
  type MiniAppCatalogEntry = MiniAppManifest & {
370
394
  name?: string;
@@ -378,20 +402,61 @@ declare const useMiniAppDownloadsPaused: () => boolean;
378
402
  declare const onMiniAppEvent: (listener: (event: MiniAppEvent) => void) => () => void;
379
403
  /** Status hiện tại của mọi mini app — đọc 1 lần khi vẽ Sảnh, sau đó nghe onMiniAppEvent. */
380
404
  declare const getMiniAppStatuses: () => Record<string, MiniAppDownloadState>;
405
+ type MiniAppSyncResult = {
406
+ ok: true;
407
+ app_ids: string[];
408
+ removed: string[];
409
+ } | {
410
+ ok: false;
411
+ error: string;
412
+ };
381
413
  /**
382
414
  * Lấy list mini app (theo config.channels — kênh đứng trước được ưu tiên) → cập nhật catalog
383
- * → cho app khác version vào hàng đợi. Lỗi mạng → giữ catalog cũ, không xoá gì.
415
+ * → cho app khác version vào hàng đợi. Lỗi mạng → giữ catalog cũ, không xoá gì, bắn sync_failed.
416
+ * Không bao giờ reject — kết quả trả về giống event sync_complete / sync_failed.
384
417
  */
385
- declare const syncMiniAppCatalog: () => Promise<void>;
418
+ declare const syncMiniAppCatalog: () => Promise<MiniAppSyncResult>;
386
419
  /**
387
- * Gỡ mini app khỏi máy: bỏ khỏi hàng đợi, huỷ lượt tải đang chạy, xoá bundle, huỷ WebView (trừ khi
388
- * đang mở). syncMiniAppCatalog tự gọi cho app không còn trong list; app còn trong list → lần sync sau tải lại.
420
+ * Người dùng gỡ mini app: bỏ khỏi hàng đợi, huỷ lượt tải đang chạy, xoá bundle, huỷ WebView (trừ khi
421
+ * đang mở). Ghi nhớ (storage) → sync không tải lại; tải lại bằng restoreMiniApp / người dùng bấm mở.
389
422
  */
390
423
  declare const uninstallMiniApp: (app_id: string) => Promise<void>;
424
+ /**
425
+ * Tải lại app người dùng đã gỡ (vd màn "Thêm app"): bỏ ghi nhớ đã gỡ → vào hàng đợi (`queued`).
426
+ * false: app không có trong list (chưa sync / admin đã tắt).
427
+ */
428
+ declare const restoreMiniApp: (app_id: string) => boolean;
429
+ /**
430
+ * Pause riêng 1 app: đang tải → huỷ (tải lại từ đầu khi resume), đang chờ → `paused`, chưa cần tải →
431
+ * nhớ lại, bản mới ở lần sync sau cũng `paused`. App khác vẫn tải bình thường. Người dùng bấm mở → tải luôn.
432
+ * Lưu storage: thoát app mở lại vẫn pause, chỉ tải khi resumeMiniApp / người dùng bấm mở / gỡ app.
433
+ */
434
+ declare const pauseMiniApp: (app_id: string) => void;
435
+ /** Gỡ pause riêng của app → đang chờ thì về `queued` và hàng đợi chạy tiếp. */
436
+ declare const resumeMiniApp: (app_id: string) => void;
391
437
  /** Dừng hàng đợi vì `reason`. File đang tải (không phải do người dùng mở) bị huỷ, tải lại sau. */
392
438
  declare const pauseMiniAppDownloads: (reason: string) => void;
393
439
  /** Gỡ lý do dừng; hết lý do → chạy tiếp. */
394
440
  declare const resumeMiniAppDownloads: (reason: string) => void;
441
+ /** Bản cập nhật đang chờ của app (config.manual_update) — đọc đồng bộ, vd lúc mount popup (lỡ event). */
442
+ declare const getMiniAppUpdate: (app_id: string) => MiniAppUpdate | undefined;
443
+ /**
444
+ * Cập nhật thủ công (app trong config.manual_update): tải ngay bản mới (bỏ qua pause), bắn status_change(updating) /
445
+ * progress, xong → mọi WebView của app nạp lại bằng bản mới (kể cả đang hiện). true: đã dùng bản mới; false: lỗi,
446
+ * giữ bản cũ và update vẫn chờ.
447
+ */
448
+ declare const updateMiniApp: (app_id: string) => Promise<boolean>;
449
+ type MiniAppCatalogItem = MiniAppCatalogEntry & {
450
+ /** Máy đang có 1 bản (có thể cũ). */
451
+ installed: boolean;
452
+ /** Người dùng đã tự gỡ — sync không tải lại, chỉ tải khi restoreMiniApp. */
453
+ removed_by_user: boolean;
454
+ };
455
+ /**
456
+ * Mọi app trong list ứng dụng (lần sync gần nhất) kèm trạng thái — đọc đồng bộ, không gọi mạng.
457
+ * Dùng cho màn "Thêm app": lọc `!installed || removed_by_user`, tìm theo `name`, chọn → restoreMiniApp.
458
+ */
459
+ declare const getMiniAppCatalog: () => MiniAppCatalogItem[];
395
460
  /** app_id có trong catalog ứng dụng (đã phát hành) — đọc sync, không gọi mạng. */
396
461
  declare const getMiniAppCatalogEntry: (app_id: string) => MiniAppCatalogEntry | undefined;
397
462
  /**
@@ -415,4 +480,4 @@ declare class BridgeError extends Error {
415
480
  constructor(code: string, message: string);
416
481
  }
417
482
 
418
- export { DefaultMiniAppSplash, MINIAPP_PLATFORM_URL, type MiniAppBridgeOptions, type MiniAppCatalogEntry, type MiniAppChannel, type MiniAppConfig, type MiniAppContainerProps, type MiniAppContext, type MiniAppDownloadState, type MiniAppDownloadStatus, type MiniAppDownloadTask, type MiniAppEvent, type MiniAppFileSystem, type MiniAppHandlerContext, _default as MiniAppHost, type MiniAppHostData, BridgeError as MiniAppHostError, type MiniAppHostProps, type MiniAppKeepAlive, type MiniAppLaunch, type MiniAppLocalBundle, type MiniAppManifest, type MiniAppNativeHandlers, type MiniAppPaymentRequest, type MiniAppPaymentResult, type MiniAppPermission, type MiniAppSplashProps, type MiniAppStorage, type OpenMiniAppArgs, closeMiniApp, configureMiniApp, createMmkvStorage, createRnfsFileSystem, ensureMiniApp, getLocalMiniApp, getMiniAppCatalogEntry, getMiniAppStatuses, onMiniAppEvent, openMiniApp, pauseMiniAppDownloads, preloadMiniApp, resumeMiniAppDownloads, sendEventToWeb, syncMiniAppCatalog, uninstallMiniApp, useMiniAppDownload, useMiniAppDownloadsPaused };
483
+ export { DefaultMiniAppSplash, MINIAPP_PLATFORM_URL, type MiniAppBridgeOptions, type MiniAppCatalogEntry, type MiniAppCatalogItem, type MiniAppChannel, type MiniAppConfig, type MiniAppContainerProps, type MiniAppContext, type MiniAppDownloadState, type MiniAppDownloadStatus, type MiniAppDownloadTask, type MiniAppEvent, type MiniAppFileSystem, type MiniAppHandlerContext, _default as MiniAppHost, type MiniAppHostData, BridgeError as MiniAppHostError, type MiniAppHostProps, type MiniAppKeepAlive, type MiniAppLaunch, type MiniAppLocalBundle, type MiniAppManifest, type MiniAppNativeHandlers, type MiniAppPaymentRequest, type MiniAppPaymentResult, type MiniAppPermission, type MiniAppSplashProps, type MiniAppStorage, type MiniAppSyncResult, type MiniAppUpdate, type OpenMiniAppArgs, closeMiniApp, configureMiniApp, createMmkvStorage, createRnfsFileSystem, ensureMiniApp, getLocalMiniApp, getMiniAppCatalog, getMiniAppCatalogEntry, getMiniAppStatuses, getMiniAppUpdate, onMiniAppEvent, openMiniApp, pauseMiniApp, pauseMiniAppDownloads, preloadMiniApp, restoreMiniApp, resumeMiniApp, resumeMiniAppDownloads, sendEventToWeb, syncMiniAppCatalog, uninstallMiniApp, updateMiniApp, useMiniAppDownload, useMiniAppDownloadsPaused };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var $t=Object.create;var ae=Object.defineProperty;var Nt=Object.getOwnPropertyDescriptor;var Ft=Object.getOwnPropertyNames;var Bt=Object.getPrototypeOf,Jt=Object.prototype.hasOwnProperty;var Vt=(e,t)=>{for(var n in t)ae(e,n,{get:t[n],enumerable:!0})},We=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ft(t))!Jt.call(e,s)&&s!==n&&ae(e,s,{get:()=>t[s],enumerable:!(r=Nt(t,s))||r.enumerable});return e};var je=(e,t,n)=>(n=e!=null?$t(Bt(e)):{},We(t||!e||!e.__esModule?ae(n,"default",{value:e,enumerable:!0}):n,e)),Wt=e=>We(ae({},"__esModule",{value:!0}),e);var rn={};Vt(rn,{DefaultMiniAppSplash:()=>Le,MINIAPP_PLATFORM_URL:()=>pe,MiniAppHost:()=>Rt,MiniAppHostError:()=>b,closeMiniApp:()=>Y,configureMiniApp:()=>qe,createMmkvStorage:()=>ze,createRnfsFileSystem:()=>Ke,ensureMiniApp:()=>_e,getLocalMiniApp:()=>T,getMiniAppCatalogEntry:()=>Ie,getMiniAppStatuses:()=>_t,onMiniAppEvent:()=>yt,openMiniApp:()=>mt,pauseMiniAppDownloads:()=>St,preloadMiniApp:()=>At,resumeMiniAppDownloads:()=>bt,sendEventToWeb:()=>ft,syncMiniAppCatalog:()=>ye,uninstallMiniApp:()=>ke,useMiniAppDownload:()=>Me,useMiniAppDownloadsPaused:()=>Mt});module.exports=Wt(rn);var pe="https://retion-miniapp-platform.vercel.app",q=null,He=new Set,qe=e=>{q=e,He.forEach(t=>t())},E=()=>{if(!q)throw new Error("[miniapp] Ch\u01B0a g\u1ECDi configureMiniApp()");return q},Ue=e=>{He.add(e),q&&e()},F=(...e)=>{q!=null&&q.debug&&console.log("[miniapp]",...e)};var Ke=(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:u,contentLength:a})=>s==null?void 0:s(u,a)});return{promise:c.then(({statusCode:u})=>({status:u})),cancel:()=>e.stopDownload(o)}}}),ze=e=>({getString:t=>e.getString(t),setString:(t,n)=>e.set(t,n)});var l=je(require("react")),w=require("react-native"),Tt=je(require("react-native-webview"));var ce=require("react-native"),le=1,b=class extends Error{constructor(n,r){super(r);this.code=n}},Ye=e=>{try{let t=JSON.parse(e);return(t==null?void 0:t.__retion)===le&&typeof t.method=="string"?t:null}catch{return null}},ue=e=>`window.__RETION_MINIAPP__ && window.__RETION_MINIAPP__.receive(${JSON.stringify(e)}); true;`,Ge=(e,t)=>ue({id:e,result:t}),Xe=(e,t)=>ue({id:e,error:{code:t.code,message:t.message}}),Ee=e=>ue({event:"context",data:e});var Ze=()=>`(function () {
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 s of Gt(t))!Zt.call(e,s)&&s!==n&&de(e,s,{get:()=>t[s],enumerable:!(r=Qt(t,s))||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 yn={};en(yn,{DefaultMiniAppSplash:()=>Be,MINIAPP_PLATFORM_URL:()=>ge,MiniAppHost:()=>Ut,MiniAppHostError:()=>R,closeMiniApp:()=>te,configureMiniApp:()=>Qe,createMmkvStorage:()=>Ze,createRnfsFileSystem:()=>Xe,ensureMiniApp:()=>ce,getLocalMiniApp:()=>S,getMiniAppCatalog:()=>Nt,getMiniAppCatalogEntry:()=>ne,getMiniAppStatuses:()=>Tt,getMiniAppUpdate:()=>Ne,onMiniAppEvent:()=>Rt,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(yn);var ge="https://retion-miniapp-platform.vercel.app",X=null,Ye=new Set,Qe=e=>{X=e,Ye.forEach(t=>t())},E=()=>{if(!X)throw new Error("[miniapp] Ch\u01B0a g\u1ECDi configureMiniApp()");return X},Ge=e=>{Ye.add(e),X&&e()},N=(...e)=>{X!=null&&X.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(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:i,promise:c}=e.downloadFile({fromUrl:n,toFile:r,progressInterval:250,begin:()=>{},progress:({bytesWritten:l,contentLength:o})=>s==null?void 0:s(l,o)});return{promise:c.then(({statusCode:l})=>({status:l})),cancel:()=>e.stopDownload(i)}}}),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,R=class extends Error{constructor(n,r){super(r);this.code=n}},tt=e=>{try{let t=JSON.parse(e);return(t==null?void 0:t.__retion)===he&&typeof t.method=="string"?t:null}catch{return null}},Ae=e=>`window.__RETION_MINIAPP__ && window.__RETION_MINIAPP__.receive(${JSON.stringify(e)}); true;`,nt=(e,t)=>Ae({id:e,result:t}),rt=(e,t)=>Ae({id:e,error:{code:t.code,message:t.message}}),ke=e=>Ae({event:"context",data:e});var ot=()=>`(function () {
2
2
  var post = function (level, args) {
3
3
  try {
4
4
  var parts = [];
@@ -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: ${le}, 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 @@
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;`,et=()=>`(function () {
22
+ })(); true;`,it=()=>`(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: ${le}, 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 @@
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;`,tt=e=>ue({event:e}),nt=(e,t)=>{let n=rt(t);return`try { history.replaceState(history.state, '', location.pathname + ${JSON.stringify(n?`?${n}`:"")} + location.hash); } catch (e) {}
42
- ${Ee(e)}`},rt=e=>Object.entries(e).filter(([,t])=>t!=null&&t!=="").map(([t,n])=>`${encodeURIComponent(t)}=${encodeURIComponent(String(n))}`).join("&"),ot=(e,t={})=>{let n=rt(t);return`window.__RETION_MINIAPP_HOST__ = { protocol: ${le} };
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} };
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;`},it={partner:"partner_token",chatbox:"chatbox_token"},st=(e,t)=>{let n={...e};for(let r of Object.values(it))t.includes(r)||delete n[r];return n},be=new Set,Qe=async(e,t)=>{if(be.has(e))throw new b("BUSY",`${e} \u0111ang ch\u1EA1y \u2014 ch\u1EDD l\u01B0\u1EE3t tr\u01B0\u1EDBc xong`);be.add(e);try{return await t()}finally{be.delete(e)}},xe=(e,t)=>{if(typeof e!="string"||!e)throw new b("INVALID_PARAMS",`Thi\u1EBFu ${t}`);return e},at=async({method:e,params:t},{getHostData:n,getPermissions:r,is_dark:s,close:o,app_id:c,instance_id:u,options:a})=>{var A,g,I,v;let h=a==null?void 0:a.handlers,m={app_id:c,instance_id:u,close:o},M=()=>new b("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF \u1EE9ng d\u1EE5ng n\xE0y`);switch(e){case"requestPayment":{let d=h==null?void 0:h.requestPayment;if(!d)throw M();let i=t==null?void 0:t.amount;if(typeof i!="number"||!Number.isFinite(i)||i<=0)throw new b("INVALID_PARAMS","amount ph\u1EA3i l\xE0 s\u1ED1 > 0");let x={...t,amount:i,currency:xe(t==null?void 0:t.currency,"currency")};return Qe(e,()=>d(x,m))}case"printImage":{let d=h==null?void 0:h.printImage;if(!d)throw M();let i=xe(t==null?void 0:t.image,"image");await Qe(e,()=>d({image:i},m));return}case"openScreen":if(!(h!=null&&h.openScreen))throw M();await h.openScreen({screen:xe(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((A=t==null?void 0:t.url)!=null?A:"");if(!/^https?:\/\//i.test(d))throw new b("INVALID_PARAMS","url ph\u1EA3i l\xE0 http(s)");await(a!=null&&a.openUrl?a.openUrl(d):ce.Linking.openURL(d));return}case"showToast":(I=a==null?void 0:a.showToast)==null||I.call(a,String((g=t==null?void 0:t.message)!=null?g:""));return;case"getSystemInfo":return{platform:ce.Platform.OS==="ios"?"ios":"android",appVersion:(v=a==null?void 0:a.app_version)!=null?v:"",theme:s?"dark":"light"};case"getAccessToken":{let d=n().access_token;if(!d)throw new b("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 V=n().access_token;if(!V)throw new b("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return V}if(d!=="partner"&&d!=="chatbox")throw new b("HOST_ERROR",`Lo\u1EA1i token kh\xF4ng h\u1EE3p l\u1EC7: ${String(d)}`);let i=it[d];if(!r().includes(i))throw new b("PERMISSION_DENIED",`Mini app ch\u01B0a \u0111\u01B0\u1EE3c c\u1EA5p quy\u1EC1n ${i} (Console \u2192 Quy\u1EC1n l\u1EA5y token)`);let x=d==="partner"?n().partner_token:n().chatbox_token;if(!x)throw new b("HOST_ERROR",`Kh\xF4ng c\xF3 ${i}`);return x}case"getUserInfo":{let d=n().user;if(!d)throw new b("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 b("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin page");return d}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 Te=e=>`bundle:${e}`,Re=()=>`${E().file_system.document_dir}/miniapps`,lt=(e,t,n="index.html",r=!1,s=[])=>{let o=`${Re()}/${e}/${t}`;return{app_id:e,version:t,dir:o,entry_uri:`file://${o}/${n}`,context_update:r,permissions:s}},pt=e=>{var t;E().storage.setString(Te(e.app_id),JSON.stringify({version:e.version,entry:e.entry,context_update:!!e.context_update,permissions:(t=e.permissions)!=null?t:[]}))},jt=(e,t)=>/^https?:\/\//.test(t)?t:`${e.replace(/[^/]*$/,"")}${t}`,T=e=>{let t=E().storage.getString(Te(e));if(!t)return null;try{let{version:n,entry:r,context_update:s,permissions:o}=JSON.parse(t);return lt(e,n,r,!!s,Array.isArray(o)?o:[])}catch{return null}},de=e=>E().file_system.exists(e.entry_uri.replace("file://","")),Pe=async e=>{let t=T(e.app_id);return(t==null?void 0:t.version)===e.version&&await de(t)},Ht=async(e,t)=>{let n=E().file_system,r=`${Re()}/${e}`,s=await n.listDir(r).catch(()=>[]);await Promise.all(s.filter(o=>!t.includes(o)).map(o=>n.remove(`${r}/${o}`).catch(()=>{})))},ut=async e=>{var t;await((t=re[e])==null?void 0:t.catch(()=>{})),E().storage.setString(Te(e),""),await E().file_system.remove(`${Re()}/${e}`).catch(()=>{})},Q=class extends Error{constructor(){super("cancelled"),this.name="MiniAppInstallCancelled"}},re={},Ce=(e,{base_url:t,onProgress:n}={})=>{var A;let r=E().file_system,s=null,o=!1,c=`${r.cache_dir}/${e.app_id}-${e.version}.zip`,u=()=>{if(o)throw new Q},a=async()=>{var v;u();let g=T(e.app_id);if((g==null?void 0:g.version)===e.version&&await r.exists(g.dir))return pt(e),T(e.app_id);u();let I=r.download({url:t?jt(t,e.bundle_url):e.bundle_url,to_file:c,onProgress:(d,i)=>{var V;let x=i>0?i:(V=e.size)!=null?V:0;x>0&&(n==null||n(Math.min(1,d/x)))}});s=I;try{let{status:d}=await I.promise;if(u(),d!==200)throw new Error(`bundle ${d}`);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);u();let i=lt(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),pt(e),Ht(e.app_id,[e.version,g==null?void 0:g.version].filter(Boolean)),i}catch(d){throw o?new Q:d}finally{s=null,r.remove(c).catch(()=>{})}},m=((A=re[e.app_id])!=null?A:Promise.resolve()).catch(()=>{}).then(a),M=m.catch(()=>{});return re[e.app_id]=M,M.then(()=>{re[e.app_id]===M&&delete re[e.app_id]}),{promise:m,cancel:()=>{o=!0,s==null||s.cancel()}}},ne={},qt=__DEV__?0:60*1e3,ct={},dt=(e,t)=>{var r,s;let n=T(e);return n&&Date.now()-((r=ct[t])!=null?r:0)<qt?Promise.resolve(n):((s=ne[e])!=null||(ne[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(),u=await Ce(c,{base_url:t}).promise;return ct[t]=Date.now(),u})().catch(o=>(console.warn("[miniapp] sync failed",e,o==null?void 0:o.message),T(e))).finally(()=>{ne[e]=void 0})),ne[e])};var ge=new Map,gt=(e,t)=>(ge.set(e,t),()=>{ge.get(e)===t&&ge.delete(e)}),ft=(e,t)=>{let n=ge.get(e);return n?n(t):!1};var fe=require("react"),he=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)})}},B=(e,t,n=Object.is)=>{let r=(0,fe.useRef)(null),s=()=>{let o=e.getState(),c=r.current;if(c&&c.state===o&&c.selector===t)return c.value;let u=t(o),a=c&&n(c.value,u)?c.value:u;return r.current={state:o,selector:t,value:a},a};return(0,fe.useSyncExternalStore)(e.subscribe,s)};var $=he({active_key:null,instances:{}}),ht=({app:e,instance_id:t,context:n={},url_params:r={},host_data:s={}},o)=>{var u;let c=(u=E().keep_alive)==null?void 0:u.max_webviews;$.setState(a=>{let h=t!=null?t:e.app_id,m={...a.instances,[h]:{key:h,app:e,context:n,url_params:r,host_data:s,last_used_at:Date.now()}},M=Object.keys(m);return c&&c>0&&M.length>c&&M.filter(A=>A!==h).sort((A,g)=>m[A].last_used_at-m[g].last_used_at).slice(0,M.length-c).forEach(A=>{delete m[A]}),o?{active_key:h,instances:m}:{instances:m}})},mt=e=>ht(e,!0),At=e=>ht(e,!1),Y=()=>$.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 wt="catalog",Ut=10*1e3,Kt=2,zt=3e3,Qt=()=>{var e;try{return JSON.parse((e=E().storage.getString(wt))!=null?e:"{}")}catch{return{}}},R=he({catalog:{},downloads:{},pause_reasons:[]});Ue(()=>R.setState({catalog:Qt()}));var Me=e=>B(R,t=>e?t.downloads[e]:void 0),Mt=()=>B(R,e=>e.pause_reasons.length>0),K=(...e)=>F("queue",...e),P=[],U={},_=null,Ae=new Set,z={},Oe=new Set,X=e=>{Oe.forEach(t=>{try{t(e)}catch(n){console.warn("[miniapp-queue] event listener error",n==null?void 0:n.message)}})},yt=e=>(Oe.add(e),()=>{Oe.delete(e)}),_t=()=>R.getState().downloads,J=(e,t)=>{let n=!!T(e),r=R.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};R.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?X({type:"status_change",app_id:e,state:o}):r.progress!==o.progress&&X({type:"progress",app_id:e,progress:o.progress,version:o.version})},we=(e,t)=>{var n;(n=z[e])==null||n.forEach(r=>r(t)),delete z[e]},Yt=()=>R.getState().pause_reasons.length>0,G=e=>{var u;if(_)return;let t=e?P.indexOf(e):Yt()?-1:0;if(t<0||t>=P.length)return;let[n]=P.splice(t,1),r=R.getState().catalog[n];if(!r){we(n,T(n)),G();return}let s=Date.now();U[n]=((u=U[n])!=null?u:0)+1,J(n,{status:"downloading",progress:0,version:r.version,error:void 0});let o=0,c=Ce(r,{onProgress:a=>{let h=Math.floor(a*100);h!==o&&(o=h,J(n,{progress:h/100,version:r.version}))}});_={app_id:n,handle:c,forced:!!e},K("start",n,r.version,e?"(forced)":""),c.promise.then(a=>{K("installed",n,r.version,`${Date.now()-s}ms`),J(n,{status:"installed",progress:1,version:r.version}),we(n,a)}).catch(a=>{var m;if(a instanceof Q){if(Ae.has(n))return;K("paused",n),U[n]-=1,P.unshift(n),J(n,{status:"queued",progress:0,version:r.version});return}let h=String((m=a==null?void 0:a.message)!=null?m:a);if(console.warn("[miniapp-queue] failed",n,h),U[n]<Kt){J(n,{status:"queued",progress:0,version:r.version,error:h}),setTimeout(()=>{var M;P.includes(n)||(_==null?void 0:_.app_id)===n||(P.push(n),G((M=z[n])!=null&&M.length?n:void 0))},zt);return}J(n,{status:"failed",progress:0,version:r.version,error:h}),we(n,T(n))}).finally(()=>{_=null;let a=P.find(h=>{var m;return(m=z[h])==null?void 0:m.length});G(a)})},vt=(e,{front:t=!1}={})=>{if((_==null?void 0:_.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)},Gt=async e=>{let{host_id:t,client_token:n}=E(),r=new AbortController,s=setTimeout(()=>r.abort(),Ut);try{let o=`${pe}/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(a=>({...a,channel:e}))}finally{clearTimeout(s)}},oe=null,ye=()=>(oe!=null||(oe=(async()=>{let e=Date.now();try{let t=await Promise.all(E().channels.map(Gt)),n={};[...t].reverse().flat().forEach(o=>{n[o.app_id]=o});let r=Object.keys(R.getState().catalog).filter(o=>!n[o]);E().storage.setString(wt,JSON.stringify(n)),R.setState({catalog:n}),await Promise.all(r.map(ke));let s=[];for(let o of Object.values(n))await Pe(o)?J(o.app_id,{status:"installed",progress:1,version:o.version}):s.push(o);s.forEach(o=>{U[o.app_id]=0,J(o.app_id,{status:"queued",progress:0,version:o.version,error:void 0}),vt(o.app_id)}),K("catalog",Object.keys(n).length,"apps, outdated",s.map(o=>o.app_id),"removed",r,`${Date.now()-e}ms`),X({type:"sync_complete",app_ids:Object.keys(n),removed:r}),G()}catch(t){console.warn("[miniapp-queue] sync catalog failed",t==null?void 0:t.message)}finally{oe=null}})()),oe),ke=async e=>{var r,s,o,c;if(Ae.has(e))return;Ae.add(e);let t=P.indexOf(e);t>=0&&P.splice(t,1),(_==null?void 0:_.app_id)===e&&_.handle.cancel();let n=(c=(o=(r=R.getState().downloads[e])==null?void 0:r.version)!=null?o:(s=T(e))==null?void 0:s.version)!=null?c:"";J(e,{status:"uninstalling",progress:0,version:n}),await ut(e),me(e),R.setState(u=>{let a={...u.downloads};return delete a[e],{downloads:a}}),delete U[e],Ae.delete(e),we(e,null),K("uninstalled",e),X({type:"uninstalled",app_id:e})},St=e=>{let{pause_reasons:t}=R.getState();t.includes(e)||(R.setState({pause_reasons:[...t,e]}),K("pause",e),t.length===0&&X({type:"pause_change",paused:!0,reasons:[e]}),_&&!_.forced&&_.handle.cancel())},bt=e=>{let{pause_reasons:t}=R.getState();if(!t.includes(e))return;let n=t.filter(r=>r!==e);R.setState({pause_reasons:n}),K("resume",e),n.length===0&&X({type:"pause_change",paused:!1,reasons:n}),G()},Ie=e=>R.getState().catalog[e],_e=async e=>{let t=Ie(e);if(!t)return;if(await Pe(t))return T(e);let n=new Promise(r=>{var s;((s=z[e])!=null?s:z[e]=[]).push(r)});return(_==null?void 0:_.app_id)===e?_.forced=!0:(U[e]=0,vt(e,{front:!0}),_&&!_.forced?_.handle.cancel():G(e)),n};var y=require("react/jsx-runtime"),De=e=>(e!=null?e:"").replace(/\?[^#]*/,""),xt=0,Xt=()=>{let e=new Set;return{emit:t=>e.forEach(n=>n(t)),subscribe:t=>(e.add(t),()=>{e.delete(t)})}},Zt=l.default.memo(({instance_key:e,is_active:t,is_front:n,is_dark:r,reload_tick:s,web_at_top:o,splash:c,bridge:u,opaque_background:a,onWebLoadEnd:h})=>{var Je,Ve;let m=(0,l.useRef)(null),M=(0,l.useRef)(!1),A=B($,p=>p.instances[e]),g=A==null?void 0:A.app.app_id,I=A==null?void 0:A.app.manifest_url,v=A==null?void 0:A.context,d=A==null?void 0:A.url_params,[i,x]=(0,l.useState)(()=>g?T(g):null),[V,Z]=(0,l.useState)(!1),[Pt,$e]=(0,l.useState)(0),[Ct,ee]=(0,l.useState)(0),[Ot,D]=(0,l.useState)(!1),N=(0,l.useRef)(null),Ne=p=>{N.current&&clearTimeout(N.current),N.current=setTimeout(()=>{N.current=null,D(!0)},p)};(0,l.useEffect)(()=>()=>{N.current&&clearTimeout(N.current)},[]),(0,l.useEffect)(()=>{if(!g||!t&&i)return;let p=!0;return Z(!1),(async()=>{let f=T(g),C=f?await de(f):!1;if(!p||(x(C?L=>!L||L.version!==f.version||L.permissions.join(",")!==f.permissions.join(",")?f:L:null),__DEV__&&Date.now()-xt>1e4&&(xt=Date.now(),await ye()),!p))return;let W=await _e(g),j=W!==void 0?W:I?await dt(g,I):T(g);if(p){if(!j){Z(!0);return}x(L=>L!=null?L:j)}})(),()=>{p=!1}},[t,g,I,Pt]),(0,l.useEffect)(()=>gt(e,p=>m.current?(m.current.postMessage(p),!0):!1),[e]);let kt=B(R,p=>{let f=g?p.downloads[g]:void 0;return(f==null?void 0:f.status)==="installed"?f.version:void 0});(0,l.useEffect)(()=>{if(t||!g||!i)return;let p=T(g);if(!p||p.version===i.version)return;let f=!0;return de(p).then(C=>{!f||!C||(F(`webview:${e}`,"\u0111\u1ED5i bundle (\u1EA9n)",i.version,"\u2192",p.version),x(p))}),()=>{f=!1}},[t,g,kt,i==null?void 0:i.version]),(0,l.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(()=>{me(e)},p);return()=>clearTimeout(f)},[t,e]),(0,l.useEffect)(()=>{s>0&&(Z(!1),D(!1),ee(p=>p+1),$e(p=>p+1))},[s]);let Fe=(0,l.useRef)(t);(0,l.useEffect)(()=>{var p;Fe.current!==t&&(Fe.current=t,M.current&&((p=m.current)==null||p.injectJavaScript(tt(t?"resumed":"paused"))))},[t]);let ie=`${(Je=i==null?void 0:i.version)!=null?Je:"none"}:${(Ve=i==null?void 0:i.permissions.join(","))!=null?Ve:""}:${Ct}`,te=(0,l.useMemo)(()=>JSON.stringify([v!=null?v:{},d!=null?d:{}]),[v,d]),ve=(0,l.useMemo)(()=>{var p;return st(d!=null?d:{},(p=i==null?void 0:i.permissions)!=null?p:[])},[te,i==null?void 0:i.permissions]),It=(0,l.useMemo)(()=>ot(v!=null?v:{},ve)+et()+(E().debug?Ze():""),[ve]),se=(0,l.useRef)(null),Be=(0,l.useRef)(null);(0,l.useEffect)(()=>{var f,C,W;if(!i)return;if(Be.current!==ie){Be.current=ie,se.current=te;return}if(se.current===te)return;let p=((C=JSON.parse((f=se.current)!=null?f:"[]")[0])!=null?C:{}).org_id;if(se.current=te,p===(v==null?void 0:v.org_id)&&M.current){D(!1),Ne(1500),(W=m.current)==null||W.injectJavaScript(nt(v!=null?v:{},ve));return}D(!1),ee(j=>j+1)},[te,i,ie]);let Dt=(0,l.useCallback)(async p=>{var C,W,j,L,Se;let f=Ye(p.nativeEvent.data);if(!f){if(g&&(u!=null&&u.onWebEvent))try{Promise.resolve(u.onWebEvent(p.nativeEvent.data,{app_id:g,instance_id:e})).catch(S=>{console.warn("[miniapp] onWebEvent l\u1ED7i",g,S)})}catch(S){console.warn("[miniapp] onWebEvent l\u1ED7i",g,S)}return}if(f.method==="log"){let{level:S,text:O}=f;F(`web:${e}`,S!=null?S:"log",O!=null?O:"");return}if(f.method==="pong"){N.current||D(!0);return}if(f.method==="touchAtTop"){o.emit(!!f.at_top);return}if(f.method==="contextApplied"){N.current&&clearTimeout(N.current),N.current=null,D(!0);return}if(f.method==="ready"){M.current=!0,D(!0);let S=(C=$.getState().instances[e])==null?void 0:C.context;S&&((W=m.current)==null||W.injectJavaScript(Ee(S)));return}try{let S=await at(f,{getHostData:()=>{var O,H;return(H=(O=$.getState().instances[e])==null?void 0:O.host_data)!=null?H:{}},getPermissions:()=>{var O,H;return g?(H=(O=T(g))==null?void 0:O.permissions)!=null?H:[]:[]},is_dark:r,close:Y,app_id:g!=null?g:"",instance_id:e,options:u});f.id&&((j=m.current)==null||j.injectJavaScript(Ge(f.id,S)))}catch(S){if(!f.id)return;let O=S==null?void 0:S.code,H=S instanceof b?S:new b(typeof O=="string"?O:"HOST_ERROR",String((L=S==null?void 0:S.message)!=null?L:S));(Se=m.current)==null||Se.injectJavaScript(Xe(f.id,H))}},[e,r,g,o,u]),Lt=(0,l.useCallback)(()=>{Z(!1),ee(p=>p+1),$e(p=>p+1)},[]);return(0,y.jsxs)(w.View,{style:[w.StyleSheet.absoluteFill,a&&{backgroundColor:r?"#09090B":"#FFFFFF"},!n&&k.behind],pointerEvents:t?"auto":"none",children:[i?(0,y.jsx)(Tt.default,{ref:m,source:{uri:i.entry_uri},originWhitelist:["*"],allowingReadAccessToURL:`file://${i.dir}`,allowFileAccess:!0,allowFileAccessFromFileURLs:!0,allowUniversalAccessFromFileURLs:!0,injectedJavaScriptBeforeContentLoaded:It,onMessage:Dt,bounces:!1,overScrollMode:"never",onLoadStart:p=>{F(`webview:${e}`,"load start",De(p.nativeEvent.url)),M.current=!1,D(!1)},onError:p=>{F(`webview:${e}`,"load error",De(p.nativeEvent.url),p.nativeEvent.description),Z(!0),D(!1)},onLoadEnd:p=>{let f=p.nativeEvent.url;F(`webview:${e}`,"load end",De(f)),g&&(h==null||h({app_id:g,instance_id:e,url:f})),Ne(1500)},onContentProcessDidTerminate:()=>{M.current=!1,D(!1),ee(p=>p+1)},onRenderProcessGone:()=>(M.current=!1,D(!1),ee(p=>p+1),!0),style:k.webview},ie):null,A&&(0,y.jsx)(tn,{visible:!i||!Ot,interactive:V,children:(0,y.jsx)(en,{splash:c,app:A.app,is_dark:r,error:V,has_bundle:!!i,retry:Lt})})]})}),en=l.default.memo(({splash:e,app:t,is_dark:n,error:r,has_bundle:s,retry:o})=>{let c=e,u=Me(t.app_id),a=r?"error":!s&&(u==null?void 0:u.status)==="downloading"?"downloading":"loading";return(0,y.jsx)(c,{app:t,is_dark:n,status:a,progress:a==="downloading"?u==null?void 0:u.progress:void 0,retry:o})}),tn=({visible:e,interactive:t,children:n})=>{let r=(0,l.useRef)(new w.Animated.Value(e?1:0)).current,[s,o]=(0,l.useState)(e);return(0,l.useEffect)(()=>{if(e){o(!0),r.setValue(1);return}let c=w.Animated.timing(r,{toValue:0,duration:180,useNativeDriver:!0});return c.start(({finished:u})=>{u&&o(!1)}),()=>c.stop()},[e,r]),s?(0,y.jsx)(w.Animated.View,{style:[w.StyleSheet.absoluteFill,{opacity:r}],pointerEvents:t?"auto":"none",children:n}):null},Le=({app:e,is_dark:t,status:n,progress:r,retry:s})=>{let o=t?"#FAFAFA":"#18181B";return(0,y.jsxs)(w.View,{style:[k.splash,{backgroundColor:t?"#09090B":"#FFFFFF"}],children:[(0,y.jsx)(w.View,{style:[k.splash_icon,{backgroundColor:t?"#18181B":"#F4F4F5"}],children:e.icon?(0,y.jsx)(w.Image,{source:{uri:e.icon},style:k.splash_icon_image}):(0,y.jsx)(w.Text,{style:k.splash_letter,children:(e.name||"?").slice(0,1).toUpperCase()})}),(0,y.jsx)(w.Text,{style:[k.splash_name,{color:o}],children:e.name}),n==="error"?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(w.Text,{style:k.splash_hint,children:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c mini app"}),(0,y.jsx)(w.TouchableOpacity,{activeOpacity:.7,style:[k.retry_button,{backgroundColor:t?"#27272A":"#F4F4F5"}],onPress:s,children:(0,y.jsx)(w.Text,{style:[k.retry_text,{color:o}],children:"Th\u1EED l\u1EA1i"})})]}):(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(w.ActivityIndicator,{style:k.splash_spinner,color:t?"#A1A1AA":"#71717A"}),n==="downloading"&&(0,y.jsxs)(w.Text,{style:k.splash_hint,children:["\u0110ang t\u1EA3i mini app",r?` ${Math.round(r*100)}%`:"\u2026"]})]})]})},Et=(e,t)=>{let n=(0,l.useRef)(t),r=(0,l.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.`))},nn=({container:e,splash:t=Le,is_dark:n=!1,bridge:r,close_on_back:s=!0,opaque_background:o=!0,onWebLoadEnd:c})=>{Et("container",e),Et("splash",t);let u=e,a=B($,i=>i.active_key),h=(0,l.useRef)(a);a&&(h.current=a);let m=B($,i=>Object.keys(i.instances).join("|")),M=B($,i=>{var x;return i.active_key?(x=i.instances[i.active_key])==null?void 0:x.app.name:void 0}),A=(0,l.useMemo)(()=>m?m.split("|"):[],[m]),[g,I]=(0,l.useState)({}),v=(0,l.useRef)(Xt()).current;(0,l.useEffect)(()=>{if(!a||!s)return;let i=w.BackHandler.addEventListener("hardwareBackPress",()=>(Y(),!0));return()=>i.remove()},[a,s]);let d=(0,l.useCallback)(()=>{let i=$.getState().active_key;i&&I(x=>({...x,[i]:(x[i]||0)+1}))},[]);return A.length?(0,y.jsx)(u,{visible:!!a,title:M!=null?M:"",is_dark:n,close:Y,reload:d,subscribeWebAtTop:v.subscribe,children:A.map(i=>(0,y.jsx)(Zt,{instance_key:i,is_active:a===i,is_front:(a!=null?a:h.current)===i,is_dark:n,reload_tick:g[i]||0,web_at_top:v,splash:t,bridge:r,opaque_background:o,onWebLoadEnd:c},i))}):null},k=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"}}),Rt=l.default.memo(nn);0&&(module.exports={DefaultMiniAppSplash,MINIAPP_PLATFORM_URL,MiniAppHost,MiniAppHostError,closeMiniApp,configureMiniApp,createMmkvStorage,createRnfsFileSystem,ensureMiniApp,getLocalMiniApp,getMiniAppCatalogEntry,getMiniAppStatuses,onMiniAppEvent,openMiniApp,pauseMiniAppDownloads,preloadMiniApp,resumeMiniAppDownloads,sendEventToWeb,syncMiniAppCatalog,uninstallMiniApp,useMiniAppDownload,useMiniAppDownloadsPaused});
45
+ true;`},lt={partner:"partner_token",chatbox:"chatbox_token"},ut=(e,t)=>{let n={...e};for(let r of Object.values(lt))t.includes(r)||delete n[r];return n},Pe=new Set,et=async(e,t)=>{if(Pe.has(e))throw new R("BUSY",`${e} \u0111ang ch\u1EA1y \u2014 ch\u1EDD l\u01B0\u1EE3t tr\u01B0\u1EDBc xong`);Pe.add(e);try{return await t()}finally{Pe.delete(e)}},Ce=(e,t)=>{if(typeof e!="string"||!e)throw new R("INVALID_PARAMS",`Thi\u1EBFu ${t}`);return e},dt=async({method:e,params:t},{getHostData:n,getPermissions:r,is_dark:s,close:i,app_id:c,instance_id:l,options:o})=>{var M,d,L,b;let g=o==null?void 0:o.handlers,A={app_id:c,instance_id:l,close:i},v=()=>new R("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF \u1EE9ng d\u1EE5ng n\xE0y`);switch(e){case"requestPayment":{let f=g==null?void 0:g.requestPayment;if(!f)throw v();let a=t==null?void 0:t.amount;if(typeof a!="number"||!Number.isFinite(a)||a<=0)throw new R("INVALID_PARAMS","amount ph\u1EA3i l\xE0 s\u1ED1 > 0");let T={...t,amount:a,currency:Ce(t==null?void 0:t.currency,"currency")};return et(e,()=>f(T,A))}case"printImage":{let f=g==null?void 0:g.printImage;if(!f)throw v();let a=Ce(t==null?void 0:t.image,"image");await et(e,()=>f({image:a},A));return}case"openScreen":if(!(g!=null&&g.openScreen))throw v();await g.openScreen({screen:Ce(t==null?void 0:t.screen,"screen"),params:t==null?void 0:t.params},A);return;case"closeApp":i();return;case"openWebview":{let f=String((M=t==null?void 0:t.url)!=null?M:"");if(!/^https?:\/\//i.test(f))throw new R("INVALID_PARAMS","url ph\u1EA3i l\xE0 http(s)");await(o!=null&&o.openUrl?o.openUrl(f):fe.Linking.openURL(f));return}case"showToast":(L=o==null?void 0:o.showToast)==null||L.call(o,String((d=t==null?void 0:t.message)!=null?d:""));return;case"getSystemInfo":return{platform:fe.Platform.OS==="ios"?"ios":"android",appVersion:(b=o==null?void 0:o.app_version)!=null?b:"",theme:s?"dark":"light"};case"getAccessToken":{let f=n().access_token;if(!f)throw new R("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return f}case"getToken":{let f=t==null?void 0:t.type;if(f==="access"){let j=n().access_token;if(!j)throw new R("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return j}if(f!=="partner"&&f!=="chatbox")throw new R("HOST_ERROR",`Lo\u1EA1i token kh\xF4ng h\u1EE3p l\u1EC7: ${String(f)}`);let a=lt[f];if(!r().includes(a))throw new R("PERMISSION_DENIED",`Mini app ch\u01B0a \u0111\u01B0\u1EE3c c\u1EA5p quy\u1EC1n ${a} (Console \u2192 Quy\u1EC1n l\u1EA5y token)`);let T=f==="partner"?n().partner_token:n().chatbox_token;if(!T)throw new R("HOST_ERROR",`Kh\xF4ng c\xF3 ${a}`);return T}case"getUserInfo":{let f=n().user;if(!f)throw new R("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin nh\xE2n vi\xEAn");return f}case"getPageInfo":{let f=n().page;if(!f)throw new R("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin page");return f}case"sendMessage":case"insertText":throw new R("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF phi\xEAn b\u1EA3n app n\xE0y`);default:throw new R("NOT_SUPPORTED",`API kh\xF4ng t\u1ED3n t\u1EA1i: ${e}`)}};var Oe=e=>`bundle:${e}`,Ie=()=>`${E().file_system.document_dir}/miniapps`,ht=(e,t,n="index.html",r=!1,s=[])=>{let i=`${Ie()}/${e}/${t}`;return{app_id:e,version:t,dir:i,entry_uri:`file://${i}/${n}`,context_update:r,permissions:s}},gt=e=>{var t;E().storage.setString(Oe(e.app_id),JSON.stringify({version:e.version,entry:e.entry,context_update:!!e.context_update,permissions:(t=e.permissions)!=null?t:[]}))},nn=(e,t)=>/^https?:\/\//.test(t)?t:`${e.replace(/[^/]*$/,"")}${t}`,S=e=>{let t=E().storage.getString(Oe(e));if(!t)return null;try{let{version:n,entry:r,context_update:s,permissions:i}=JSON.parse(t);return ht(e,n,r,!!s,Array.isArray(i)?i:[])}catch{return null}},H=e=>E().file_system.exists(e.entry_uri.replace("file://","")),De=async e=>{let t=S(e.app_id);return(t==null?void 0:t.version)===e.version&&await H(t)},rn=async(e,t)=>{let n=E().file_system,r=`${Ie()}/${e}`,s=await n.listDir(r).catch(()=>[]);await Promise.all(s.filter(i=>!t.includes(i)).map(i=>n.remove(`${r}/${i}`).catch(()=>{})))},At=async e=>{var t;await((t=ae[e])==null?void 0:t.catch(()=>{})),E().storage.setString(Oe(e),""),await E().file_system.remove(`${Ie()}/${e}`).catch(()=>{})},ee=class extends Error{constructor(){super("cancelled"),this.name="MiniAppInstallCancelled"}},ae={},Le=(e,{base_url:t,onProgress:n}={})=>{var M;let r=E().file_system,s=null,i=!1,c=`${r.cache_dir}/${e.app_id}-${e.version}.zip`,l=()=>{if(i)throw new ee},o=async()=>{var b;l();let d=S(e.app_id);if((d==null?void 0:d.version)===e.version&&await r.exists(d.dir))return gt(e),S(e.app_id);l();let L=r.download({url:t?nn(t,e.bundle_url):e.bundle_url,to_file:c,onProgress:(f,a)=>{var j;let T=a>0?a:(j=e.size)!=null?j:0;T>0&&(n==null||n(Math.min(1,f/T)))}});s=L;try{let{status:f}=await L.promise;if(l(),f!==200)throw new Error(`bundle ${f}`);if(e.sha256)if(r.sha256){if(await r.sha256(c)!==e.sha256)throw new Error("sha256 mismatch")}else N("b\u1ECF qua ki\u1EC3m tra sha256 (file_system kh\xF4ng c\xF3 sha256)",e.app_id);l();let a=ht(e.app_id,e.version,e.entry,!!e.context_update,(b=e.permissions)!=null?b:[]);return await r.remove(a.dir).catch(()=>{}),await r.mkdir(a.dir),await r.unzip(c,a.dir),gt(e),rn(e.app_id,[e.version,d==null?void 0:d.version].filter(Boolean)),a}catch(f){throw i?new ee:f}finally{s=null,r.remove(c).catch(()=>{})}},A=((M=ae[e.app_id])!=null?M:Promise.resolve()).catch(()=>{}).then(o),v=A.catch(()=>{});return ae[e.app_id]=v,v.then(()=>{ae[e.app_id]===v&&delete ae[e.app_id]}),{promise:A,cancel:()=>{i=!0,s==null||s.cancel()}}},se={},on=__DEV__?0:60*1e3,ft={},mt=(e,t)=>{var r,s;let n=S(e);return n&&Date.now()-((r=ft[t])!=null?r:0)<on?Promise.resolve(n):((s=se[e])!=null||(se[e]=(async()=>{let i=await fetch(t,{headers:{"Cache-Control":"no-cache"}});if(!i.ok)throw new Error(`manifest ${i.status}`);let c=await i.json(),l=await Le(c,{base_url:t}).promise;return ft[t]=Date.now(),l})().catch(i=>(console.warn("[miniapp] sync failed",e,i==null?void 0:i.message),S(e))).finally(()=>{se[e]=void 0})),se[e])};var me=new Map,Mt=(e,t)=>(me.set(e,t),()=>{me.get(e)===t&&me.delete(e)}),yt=(e,t)=>{let n=me.get(e);return n?n(t):!1};var Me=require("react"),ye=e=>{let t=e,n=new Set;return{getState:()=>t,setState:r=>{let s=typeof r=="function"?r(t):r;t={...t,...s},n.forEach(i=>i())},subscribe:r=>(n.add(r),()=>{n.delete(r)})}},V=(e,t,n=Object.is)=>{let r=(0,Me.useRef)(null),s=()=>{let i=e.getState(),c=r.current;if(c&&c.state===i&&c.selector===t)return c.value;let l=t(i),o=c&&n(c.value,l)?c.value:l;return r.current={state:i,selector:t,value:o},o};return(0,Me.useSyncExternalStore)(e.subscribe,s)};var F=ye({active_key:null,instances:{}}),wt=({app:e,instance_id:t,context:n={},url_params:r={},host_data:s={}},i)=>{var l;let c=(l=E().keep_alive)==null?void 0:l.max_webviews;F.setState(o=>{let g=t!=null?t:e.app_id,A={...o.instances,[g]:{key:g,app:e,context:n,url_params:r,host_data:s,last_used_at:Date.now()}},v=Object.keys(A);return c&&c>0&&v.length>c&&v.filter(M=>M!==g).sort((M,d)=>A[M].last_used_at-A[d].last_used_at).slice(0,v.length-c).forEach(M=>{delete A[M]}),i?{active_key:g,instances:A}:{instances:A}})},vt=e=>wt(e,!0),_t=e=>wt(e,!1),te=()=>F.setState({active_key:null}),we=e=>{F.setState(t=>{if(t.active_key===e||!t.instances[e])return{};let n={...t.instances};return delete n[e],{instances:n}})};var St="catalog",sn="paused_apps",an="removed_apps",pn=10*1e3,cn=2,ln=3e3,un=()=>{var e;try{return JSON.parse((e=E().storage.getString(St))!=null?e:"{}")}catch{return{}}},y=ye({catalog:{},downloads:{},pause_reasons:[],updates:{},apply_ticks:{}}),bt=e=>{var t;return!!((t=E().manual_update)!=null&&t.includes(e))},Se=new Set,xt=e=>{let t=new Set,n=()=>E().storage.setString(e,JSON.stringify([...t]));return{has:r=>t.has(r),values:()=>[...t],add:r=>t.has(r)?!1:(t.add(r),n(),!0),delete:r=>t.delete(r)?(n(),!0):!1,load:()=>{var r;t.clear();try{let s=JSON.parse((r=E().storage.getString(e))!=null?r:"[]");Array.isArray(s)&&s.forEach(i=>{typeof i=="string"&&t.add(i)})}catch{}}}},J=xt(sn),Y=xt(an);Ge(()=>{J.load(),Y.load();let e=un(),t={};Object.keys(e).filter(n=>!Y.has(n)).forEach(n=>{let r=S(n);r?t[n]={status:"installed",progress:1,version:r.version,has_local:!0}:J.has(n)&&(t[n]={status:"paused",progress:0,version:e[n].version,has_local:!1})}),y.setState({catalog:e,downloads:t})});var be=e=>V(y,t=>e?t.downloads[e]:void 0),Et=()=>V(y,e=>e.pause_reasons.length>0),B=(...e)=>N("queue",...e),P=[],W={},m=null,ve=new Set,Z={},$e=new Set,K=e=>{$e.forEach(t=>{try{t(e)}catch(n){console.warn("[miniapp-queue] event listener error",n==null?void 0:n.message)}})},Rt=e=>($e.add(e),()=>{$e.delete(e)}),Tt=()=>y.getState().downloads,k=(e,t)=>{let n=!!S(e),r=y.getState().downloads[e],s=t.status==="downloading"&&n?"updating":t.status,i={...r!=null?r:{status:"queued",progress:0},...t,...s?{status:s}:{},has_local:n};y.setState(c=>({downloads:{...c.downloads,[e]:i}})),(r==null?void 0:r.status)!==i.status||(r==null?void 0:r.version)!==i.version||(r==null?void 0:r.has_local)!==i.has_local?K({type:"status_change",app_id:e,state:i}):r.progress!==i.progress&&K({type:"progress",app_id:e,progress:i.progress,version:i.version})},_e=(e,t)=>{var n;(n=Z[e])==null||n.forEach(r=>r(t)),delete Z[e]},dn=()=>y.getState().pause_reasons.length>0,z=e=>{var l;if(m)return;let t=e?P.indexOf(e):dn()?-1:P.findIndex(o=>!J.has(o));if(t<0||t>=P.length)return;let[n]=P.splice(t,1),r=y.getState().catalog[n];if(!r){_e(n,S(n)),z();return}let s=Date.now();W[n]=((l=W[n])!=null?l:0)+1,k(n,{status:"downloading",progress:0,version:r.version,error:void 0});let i=0,c=Le(r,{onProgress:o=>{let g=Math.floor(o*100);g!==i&&(i=g,k(n,{progress:g/100,version:r.version}))}});m={app_id:n,handle:c,forced:!!e},B("start",n,r.version,e?"(forced)":""),c.promise.then(o=>{B("installed",n,r.version,`${Date.now()-s}ms`),k(n,{status:"installed",progress:1,version:r.version}),_e(n,o)}).catch(o=>{var A;if(o instanceof ee){if(ve.has(n))return;B("paused",n),W[n]-=1,P.unshift(n),k(n,{status:J.has(n)?"paused":"queued",progress:0,version:r.version});return}let g=String((A=o==null?void 0:o.message)!=null?A:o);if(console.warn("[miniapp-queue] failed",n,g),W[n]<cn){k(n,{status:"queued",progress:0,version:r.version,error:g}),setTimeout(()=>{var v;P.includes(n)||(m==null?void 0:m.app_id)===n||(P.push(n),z((v=Z[n])!=null&&v.length?n:void 0))},ln);return}k(n,{status:"failed",progress:0,version:r.version,error:g}),_e(n,S(n))}).finally(()=>{m=null;let o=P.find(g=>{var A;return(A=Z[g])==null?void 0:A.length});z(o)})},xe=(e,{front:t=!1}={})=>{if((m==null?void 0:m.app_id)===e)return;let n=P.indexOf(e);if(n>=0){if(!t)return;P.splice(n,1)}t?P.unshift(e):P.push(e)},gn=async e=>{let{host_id:t,client_token:n}=E(),r=new AbortController,s=setTimeout(()=>r.abort(),pn);try{let i=`${ge}/api/hosts/${encodeURIComponent(t)}/miniapps?channel=${e}`,c=await fetch(i,{headers:{Authorization:`Bearer ${n}`,"Cache-Control":"no-cache"},signal:r.signal});if(!c.ok)throw new Error(`host list ${e} ${c.status}`);return(await c.json()).apps.map(o=>({...o,channel:e}))}finally{clearTimeout(s)}},pe=null,Ee=()=>(pe!=null||(pe=(async()=>{var t;let e=Date.now();try{let n=await Promise.all(E().channels.map(gn)),r={};[...n].reverse().flat().forEach(o=>{r[o.app_id]=o});let s=Object.keys(y.getState().catalog).filter(o=>!r[o]);E().storage.setString(St,JSON.stringify(r)),y.setState({catalog:r}),await Promise.all(s.map(o=>Pt(o,{by_user:!1}))),s.forEach(o=>Y.delete(o));let i=Object.keys(r).filter(o=>!Y.has(o)),c=[],l={};for(let o of i.map(g=>r[g])){if(await De(o)){k(o.app_id,{status:"installed",progress:1,version:o.version});continue}let g=S(o.app_id);if(bt(o.app_id)&&!Se.has(o.app_id)&&g&&await H(g)){k(o.app_id,{status:"installed",progress:1,version:g.version}),l[o.app_id]={app_id:o.app_id,current_version:g.version,next_version:o.version};continue}c.push(o)}return y.setState({updates:l}),c.forEach(o=>{W[o.app_id]=0,k(o.app_id,{status:J.has(o.app_id)?"paused":"queued",progress:0,version:o.version,error:void 0}),xe(o.app_id)}),B("catalog",i.length,"apps, outdated",c.map(o=>o.app_id),"removed",s,`${Date.now()-e}ms`),K({type:"sync_complete",app_ids:i,removed:s}),Object.values(l).forEach(o=>K({type:"update_available",...o})),z(),{ok:!0,app_ids:i,removed:s}}catch(n){let r=String((n==null?void 0:n.name)==="AbortError"?"timeout":(t=n==null?void 0:n.message)!=null?t:n);return console.warn("[miniapp-queue] sync catalog failed",r),K({type:"sync_failed",error:r}),{ok:!1,error:r}}finally{pe=null}})()),pe),Pt=async(e,{by_user:t})=>{var s,i,c,l;if(t&&Y.add(e),ve.has(e))return;ve.add(e),J.delete(e);let n=P.indexOf(e);n>=0&&P.splice(n,1),(m==null?void 0:m.app_id)===e&&m.handle.cancel();let r=(l=(c=(s=y.getState().downloads[e])==null?void 0:s.version)!=null?c:(i=S(e))==null?void 0:i.version)!=null?l:"";k(e,{status:"uninstalling",progress:0,version:r}),await At(e),we(e),y.setState(o=>{let g={...o.downloads};return delete g[e],{downloads:g}}),delete W[e],ve.delete(e),_e(e,null),B("uninstalled",e,t?"(user)":"(not in list)"),K({type:"uninstalled",app_id:e})},Ct=e=>Pt(e,{by_user:!0}),kt=e=>{let t=ne(e);return t?(Y.delete(e),(m==null?void 0:m.app_id)===e||P.includes(e)||(W[e]=0,k(e,{status:J.has(e)?"paused":"queued",progress:0,version:t.version,error:void 0}),xe(e),z(),B("restore",e)),!0):!1},Ot=e=>{if(J.has(e))return;if(J.add(e),B("pause app",e),(m==null?void 0:m.app_id)===e&&!m.forced){m.handle.cancel();return}let t=y.getState().downloads[e];P.includes(e)&&t&&k(e,{status:"paused",progress:0,version:t.version})},It=e=>{if(!J.delete(e))return;B("resume app",e);let t=y.getState().downloads[e];(t==null?void 0:t.status)==="paused"&&!P.includes(e)&&ne(e)&&(W[e]=0,xe(e)),P.includes(e)&&t&&k(e,{status:"queued",progress:0,version:t.version}),z()},Dt=e=>{let{pause_reasons:t}=y.getState();t.includes(e)||(y.setState({pause_reasons:[...t,e]}),B("pause",e),t.length===0&&K({type:"pause_change",paused:!0,reasons:[e]}),m&&!m.forced&&m.handle.cancel())},Lt=e=>{let{pause_reasons:t}=y.getState();if(!t.includes(e))return;let n=t.filter(r=>r!==e);y.setState({pause_reasons:n}),B("resume",e),n.length===0&&K({type:"pause_change",paused:!1,reasons:n}),z()},Ne=e=>y.getState().updates[e],$t=async e=>{var n,r;let t=Ne(e);Se.add(e);try{let s=await ce(e),i=(r=t==null?void 0:t.next_version)!=null?r:(n=ne(e))==null?void 0:n.version;return!s||!i||s.version!==i?!1:(y.setState(c=>{var o;let l={...c.updates};return delete l[e],{updates:l,apply_ticks:{...c.apply_ticks,[e]:((o=c.apply_ticks[e])!=null?o:0)+1}}}),B("updated",e,t==null?void 0:t.current_version,"\u2192",s.version),!0)}finally{Se.delete(e)}},Nt=()=>Object.values(y.getState().catalog).map(e=>({...e,installed:!!S(e.app_id),removed_by_user:Y.has(e.app_id)})),ne=e=>y.getState().catalog[e],ce=async e=>{let t=ne(e);if(!t)return;if(J.delete(e),Y.delete(e),await De(t))return S(e);let n=S(e);if(bt(e)&&!Se.has(e)&&n&&await H(n))return n;let r=new Promise(s=>{var i;((i=Z[e])!=null?i:Z[e]=[]).push(s)});return(m==null?void 0:m.app_id)===e?m.forced=!0:(W[e]=0,xe(e,{front:!0}),m&&!m.forced?m.handle.cancel():z(e)),r};var _=require("react/jsx-runtime"),Fe=e=>(e!=null?e:"").replace(/\?[^#]*/,""),Ft=0,fn=()=>{let e=new Set;return{emit:t=>e.forEach(n=>n(t)),subscribe:t=>(e.add(t),()=>{e.delete(t)})}},hn=u.default.memo(({instance_key:e,is_active:t,is_front:n,is_dark:r,reload_tick:s,web_at_top:i,splash:c,bridge:l,opaque_background:o,onWebLoadEnd:g})=>{var qe,He;let A=(0,u.useRef)(null),v=(0,u.useRef)(!1),M=V(F,p=>p.instances[e]),d=M==null?void 0:M.app.app_id,L=M==null?void 0:M.app.manifest_url,b=M==null?void 0:M.context,f=M==null?void 0:M.url_params,[a,T]=(0,u.useState)(()=>d?S(d):null),[j,re]=(0,u.useState)(!1),[Vt,Je]=(0,u.useState)(0),[Wt,oe]=(0,u.useState)(0),[jt,O]=(0,u.useState)(!1),U=(0,u.useRef)(null),Ue=p=>{U.current&&clearTimeout(U.current),U.current=setTimeout(()=>{U.current=null,O(!0)},p)};(0,u.useEffect)(()=>()=>{U.current&&clearTimeout(U.current)},[]),(0,u.useEffect)(()=>{if(!d||!t&&a)return;let p=!0;return re(!1),(async()=>{let h=S(d),C=h?await H(h):!1;if(!p||(T(C?$=>!$||$.version!==h.version||$.permissions.join(",")!==h.permissions.join(",")?h:$:null),__DEV__&&Date.now()-Ft>1e4&&(Ft=Date.now(),await Ee()),!p))return;let q=await ce(d),Q=q!==void 0?q:L?await mt(d,L):S(d);if(p){if(!Q){re(!0);return}T($=>$!=null?$:Q)}})(),()=>{p=!1}},[t,d,L,Vt]),(0,u.useEffect)(()=>Mt(e,p=>A.current?(A.current.postMessage(p),!0):!1),[e]);let qt=V(y,p=>{let h=d?p.downloads[d]:void 0;return(h==null?void 0:h.status)==="installed"?h.version:void 0});(0,u.useEffect)(()=>{if(t||!d||!a)return;let p=S(d);if(!p||p.version===a.version)return;let h=!0;return H(p).then(C=>{!h||!C||(N(`webview:${e}`,"\u0111\u1ED5i bundle (\u1EA9n)",a.version,"\u2192",p.version),T(p))}),()=>{h=!1}},[t,d,qt,a==null?void 0:a.version]);let Ve=V(y,p=>{var h;return d&&(h=p.apply_ticks[d])!=null?h:0});(0,u.useEffect)(()=>{if(!Ve||!d)return;let p=S(d);if(!p||p.version===(a==null?void 0:a.version))return;let h=!0;return H(p).then(C=>{!h||!C||(N(`webview:${e}`,"c\u1EADp nh\u1EADt",a==null?void 0:a.version,"\u2192",p.version),O(!1),T(p))}),()=>{h=!1}},[Ve]),(0,u.useEffect)(()=>{var C;let p=(C=E().keep_alive)==null?void 0:C.idle_close_ms;if(t||!p||p<=0)return;let h=setTimeout(()=>{we(e)},p);return()=>clearTimeout(h)},[t,e]),(0,u.useEffect)(()=>{s>0&&(re(!1),O(!1),oe(p=>p+1),Je(p=>p+1))},[s]);let We=(0,u.useRef)(t);(0,u.useEffect)(()=>{var p;We.current!==t&&(We.current=t,v.current&&((p=A.current)==null||p.injectJavaScript(st(t?"resumed":"paused"))))},[t]);let le=`${(qe=a==null?void 0:a.version)!=null?qe:"none"}:${(He=a==null?void 0:a.permissions.join(","))!=null?He:""}:${Wt}`,ie=(0,u.useMemo)(()=>JSON.stringify([b!=null?b:{},f!=null?f:{}]),[b,f]),Re=(0,u.useMemo)(()=>{var p;return ut(f!=null?f:{},(p=a==null?void 0:a.permissions)!=null?p:[])},[ie,a==null?void 0:a.permissions]),Ht=(0,u.useMemo)(()=>ct(b!=null?b:{},Re)+it()+(E().debug?ot():""),[Re]),ue=(0,u.useRef)(null),je=(0,u.useRef)(null);(0,u.useEffect)(()=>{var h,C,q;if(!a)return;if(je.current!==le){je.current=le,ue.current=ie;return}if(ue.current===ie)return;let p=((C=JSON.parse((h=ue.current)!=null?h:"[]")[0])!=null?C:{}).org_id;if(ue.current=ie,p===(b==null?void 0:b.org_id)&&v.current){O(!1),Ue(1500),(q=A.current)==null||q.injectJavaScript(at(b!=null?b:{},Re));return}O(!1),oe(Q=>Q+1)},[ie,a,le]);let Kt=(0,u.useCallback)(async p=>{var C,q,Q,$,Te;let h=tt(p.nativeEvent.data);if(!h){if(d&&(l!=null&&l.onWebEvent))try{Promise.resolve(l.onWebEvent(p.nativeEvent.data,{app_id:d,instance_id:e})).catch(x=>{console.warn("[miniapp] onWebEvent l\u1ED7i",d,x)})}catch(x){console.warn("[miniapp] onWebEvent l\u1ED7i",d,x)}return}if(h.method==="log"){let{level:x,text:I}=h;N(`web:${e}`,x!=null?x:"log",I!=null?I:"");return}if(h.method==="pong"){U.current||O(!0);return}if(h.method==="touchAtTop"){i.emit(!!h.at_top);return}if(h.method==="contextApplied"){U.current&&clearTimeout(U.current),U.current=null,O(!0);return}if(h.method==="ready"){v.current=!0,O(!0);let x=(C=F.getState().instances[e])==null?void 0:C.context;x&&((q=A.current)==null||q.injectJavaScript(ke(x)));return}try{let x=await dt(h,{getHostData:()=>{var I,G;return(G=(I=F.getState().instances[e])==null?void 0:I.host_data)!=null?G:{}},getPermissions:()=>{var I,G;return d?(G=(I=S(d))==null?void 0:I.permissions)!=null?G:[]:[]},is_dark:r,close:te,app_id:d!=null?d:"",instance_id:e,options:l});h.id&&((Q=A.current)==null||Q.injectJavaScript(nt(h.id,x)))}catch(x){if(!h.id)return;let I=x==null?void 0:x.code,G=x instanceof R?x:new R(typeof I=="string"?I:"HOST_ERROR",String(($=x==null?void 0:x.message)!=null?$:x));(Te=A.current)==null||Te.injectJavaScript(rt(h.id,G))}},[e,r,d,i,l]),zt=(0,u.useCallback)(()=>{re(!1),oe(p=>p+1),Je(p=>p+1)},[]);return(0,_.jsxs)(w.View,{style:[w.StyleSheet.absoluteFill,o&&{backgroundColor:r?"#09090B":"#FFFFFF"},!n&&D.behind],pointerEvents:t?"auto":"none",children:[a?(0,_.jsx)(Jt.default,{ref:A,source:{uri:a.entry_uri},originWhitelist:["*"],allowingReadAccessToURL:`file://${a.dir}`,allowFileAccess:!0,allowFileAccessFromFileURLs:!0,allowUniversalAccessFromFileURLs:!0,injectedJavaScriptBeforeContentLoaded:Ht,onMessage:Kt,bounces:!1,overScrollMode:"never",onLoadStart:p=>{N(`webview:${e}`,"load start",Fe(p.nativeEvent.url)),v.current=!1,O(!1)},onError:p=>{N(`webview:${e}`,"load error",Fe(p.nativeEvent.url),p.nativeEvent.description),re(!0),O(!1)},onLoadEnd:p=>{let h=p.nativeEvent.url;N(`webview:${e}`,"load end",Fe(h)),d&&(g==null||g({app_id:d,instance_id:e,url:h})),Ue(1500)},onContentProcessDidTerminate:()=>{v.current=!1,O(!1),oe(p=>p+1)},onRenderProcessGone:()=>(v.current=!1,O(!1),oe(p=>p+1),!0),style:D.webview},le):null,M&&(0,_.jsx)(mn,{visible:!a||!jt,interactive:j,children:(0,_.jsx)(An,{splash:c,app:M.app,is_dark:r,error:j,has_bundle:!!a,retry:zt})})]})}),An=u.default.memo(({splash:e,app:t,is_dark:n,error:r,has_bundle:s,retry:i})=>{let c=e,l=be(t.app_id),o=r?"error":!s&&(l==null?void 0:l.status)==="downloading"?"downloading":"loading";return(0,_.jsx)(c,{app:t,is_dark:n,status:o,progress:o==="downloading"?l==null?void 0:l.progress:void 0,retry:i})}),mn=({visible:e,interactive:t,children:n})=>{let r=(0,u.useRef)(new w.Animated.Value(e?1:0)).current,[s,i]=(0,u.useState)(e);return(0,u.useEffect)(()=>{if(e){i(!0),r.setValue(1);return}let c=w.Animated.timing(r,{toValue:0,duration:180,useNativeDriver:!0});return c.start(({finished:l})=>{l&&i(!1)}),()=>c.stop()},[e,r]),s?(0,_.jsx)(w.Animated.View,{style:[w.StyleSheet.absoluteFill,{opacity:r}],pointerEvents:t?"auto":"none",children:n}):null},Be=({app:e,is_dark:t,status:n,progress:r,retry:s})=>{let i=t?"#FAFAFA":"#18181B";return(0,_.jsxs)(w.View,{style:[D.splash,{backgroundColor:t?"#09090B":"#FFFFFF"}],children:[(0,_.jsx)(w.View,{style:[D.splash_icon,{backgroundColor:t?"#18181B":"#F4F4F5"}],children:e.icon?(0,_.jsx)(w.Image,{source:{uri:e.icon},style:D.splash_icon_image}):(0,_.jsx)(w.Text,{style:D.splash_letter,children:(e.name||"?").slice(0,1).toUpperCase()})}),(0,_.jsx)(w.Text,{style:[D.splash_name,{color:i}],children:e.name}),n==="error"?(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(w.Text,{style:D.splash_hint,children:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c mini app"}),(0,_.jsx)(w.TouchableOpacity,{activeOpacity:.7,style:[D.retry_button,{backgroundColor:t?"#27272A":"#F4F4F5"}],onPress:s,children:(0,_.jsx)(w.Text,{style:[D.retry_text,{color:i}],children:"Th\u1EED l\u1EA1i"})})]}):(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(w.ActivityIndicator,{style:D.splash_spinner,color:t?"#A1A1AA":"#71717A"}),n==="downloading"&&(0,_.jsxs)(w.Text,{style:D.splash_hint,children:["\u0110ang t\u1EA3i mini app",r?` ${Math.round(r*100)}%`:"\u2026"]})]})]})},Bt=(e,t)=>{let n=(0,u.useRef)(t),r=(0,u.useRef)(!1);__DEV__&&!r.current&&n.current!==t&&(r.current=!0,console.warn(`[miniapp] MiniAppHost prop "${e}" \u0111\u1ED5i gi\u1EEFa c\xE1c l\u1EA7n render \u2192 m\u1ECDi WebView b\u1ECB mount l\u1EA1i. Khai b\xE1o component b\xEAn ngo\xE0i render.`))},Mn=({container:e,splash:t=Be,is_dark:n=!1,bridge:r,close_on_back:s=!0,opaque_background:i=!0,onWebLoadEnd:c})=>{Bt("container",e),Bt("splash",t);let l=e,o=V(F,a=>a.active_key),g=(0,u.useRef)(o);o&&(g.current=o);let A=V(F,a=>Object.keys(a.instances).join("|")),v=V(F,a=>{var T;return a.active_key?(T=a.instances[a.active_key])==null?void 0:T.app.name:void 0}),M=(0,u.useMemo)(()=>A?A.split("|"):[],[A]),[d,L]=(0,u.useState)({}),b=(0,u.useRef)(fn()).current;(0,u.useEffect)(()=>{if(!o||!s)return;let a=w.BackHandler.addEventListener("hardwareBackPress",()=>(te(),!0));return()=>a.remove()},[o,s]);let f=(0,u.useCallback)(()=>{let a=F.getState().active_key;a&&L(T=>({...T,[a]:(T[a]||0)+1}))},[]);return M.length?(0,_.jsx)(l,{visible:!!o,title:v!=null?v:"",is_dark:n,close:te,reload:f,subscribeWebAtTop:b.subscribe,children:M.map(a=>(0,_.jsx)(hn,{instance_key:a,is_active:o===a,is_front:(o!=null?o:g.current)===a,is_dark:n,reload_tick:d[a]||0,web_at_top:b,splash:t,bridge:r,opaque_background:i,onWebLoadEnd:c},a))}):null},D=w.StyleSheet.create({webview:{flex:1,backgroundColor:"transparent"},behind:{zIndex:-1},splash:{flex:1,alignItems:"center",justifyContent:"center",gap:12},splash_icon:{width:72,height:72,borderRadius:20,alignItems:"center",justifyContent:"center",overflow:"hidden"},splash_icon_image:{width:72,height:72},splash_letter:{fontSize:28,fontWeight:"700",color:"#1D4ED8"},splash_name:{fontSize:16,fontWeight:"600"},splash_hint:{color:"#71717A"},splash_spinner:{marginTop:8},retry_button:{marginTop:4,paddingHorizontal:20,paddingVertical:10,borderRadius:999},retry_text:{fontWeight:"600"}}),Ut=u.default.memo(Mn);0&&(module.exports={DefaultMiniAppSplash,MINIAPP_PLATFORM_URL,MiniAppHost,MiniAppHostError,closeMiniApp,configureMiniApp,createMmkvStorage,createRnfsFileSystem,ensureMiniApp,getLocalMiniApp,getMiniAppCatalog,getMiniAppCatalogEntry,getMiniAppStatuses,getMiniAppUpdate,onMiniAppEvent,openMiniApp,pauseMiniApp,pauseMiniAppDownloads,preloadMiniApp,restoreMiniApp,resumeMiniApp,resumeMiniAppDownloads,sendEventToWeb,syncMiniAppCatalog,uninstallMiniApp,updateMiniApp,useMiniAppDownload,useMiniAppDownloadsPaused});
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var _e="https://retion-miniapp-platform.vercel.app",q=null,qe=new Set,Rt=e=>{q=e,qe.forEach(t=>t())},S=()=>{if(!q)throw new Error("[miniapp] Ch\u01B0a g\u1ECDi configureMiniApp()");return q},Ue=e=>{qe.add(e),q&&e()},N=(...e)=>{q!=null&&q.debug&&console.log("[miniapp]",...e)};var Pt=(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:a})=>s==null?void 0:s(l,a)});return{promise:c.then(({statusCode:l})=>({status:l})),cancel:()=>e.stopDownload(o)}}}),Ct=e=>({getString:t=>e.getString(t),setString:(t,n)=>e.set(t,n)});import Ne,{useCallback as Le,useEffect as F,useMemo as we,useRef as L,useState as Q}from"react";import{ActivityIndicator as Xt,Animated as Ie,BackHandler as Zt,Image as en,StyleSheet as Fe,Text as se,TouchableOpacity as tn,View as $e}from"react-native";import nn from"react-native-webview";import{Linking as Ot,Platform as kt}from"react-native";var le=1,_=class extends Error{constructor(n,r){super(r);this.code=n}},ze=e=>{try{let t=JSON.parse(e);return(t==null?void 0:t.__retion)===le&&typeof t.method=="string"?t:null}catch{return null}},ue=e=>`window.__RETION_MINIAPP__ && window.__RETION_MINIAPP__.receive(${JSON.stringify(e)}); true;`,Qe=(e,t)=>ue({id:e,result:t}),Ye=(e,t)=>ue({id:e,error:{code:t.code,message:t.message}}),be=e=>ue({event:"context",data:e});var Ge=()=>`(function () {
1
+ var Re="https://retion-miniapp-platform.vercel.app",X=null,Ge=new Set,Lt=e=>{X=e,Ge.forEach(t=>t())},S=()=>{if(!X)throw new Error("[miniapp] Ch\u01B0a g\u1ECDi configureMiniApp()");return X},Xe=e=>{Ge.add(e),X&&e()},L=(...e)=>{X!=null&&X.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:i,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(i)}}}),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 ee}from"react";import{ActivityIndicator as fn,Animated as Fe,BackHandler as hn,Image as An,StyleSheet as We,Text as le,TouchableOpacity as mn,View as Ue}from"react-native";import Mn from"react-native-webview";import{Linking as Ft,Platform as Bt}from"react-native";var fe=1,x=class extends Error{constructor(n,r){super(r);this.code=n}},et=e=>{try{let t=JSON.parse(e);return(t==null?void 0:t.__retion)===fe&&typeof t.method=="string"?t:null}catch{return null}},he=e=>`window.__RETION_MINIAPP__ && window.__RETION_MINIAPP__.receive(${JSON.stringify(e)}); true;`,tt=(e,t)=>he({id:e,result:t}),nt=(e,t)=>he({id:e,error:{code:t.code,message:t.message}}),Ce=e=>he({event:"context",data:e});var rt=()=>`(function () {
2
2
  var post = function (level, args) {
3
3
  try {
4
4
  var parts = [];
@@ -8,7 +8,7 @@ var _e="https://retion-miniapp-platform.vercel.app",q=null,qe=new Set,Rt=e=>{q=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: ${le}, method: 'log', level: level, text: parts.join(' ') }));
11
+ window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({ __retion: ${fe}, 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 _e="https://retion-miniapp-platform.vercel.app",q=null,qe=new Set,Rt=e=>{q=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;`,Xe=()=>`(function () {
22
+ })(); true;`,ot=()=>`(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 _e="https://retion-miniapp-platform.vercel.app",q=null,qe=new Set,Rt=e=>{q=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: ${le}, method: 'touchAtTop', at_top: at_top }));
33
+ window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({ __retion: ${fe}, 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 _e="https://retion-miniapp-platform.vercel.app",q=null,qe=new Set,Rt=e=>{q=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;`,Ze=e=>ue({event:e}),et=(e,t)=>{let n=tt(t);return`try { history.replaceState(history.state, '', location.pathname + ${JSON.stringify(n?`?${n}`:"")} + location.hash); } catch (e) {}
42
- ${be(e)}`},tt=e=>Object.entries(e).filter(([,t])=>t!=null&&t!=="").map(([t,n])=>`${encodeURIComponent(t)}=${encodeURIComponent(String(n))}`).join("&"),nt=(e,t={})=>{let n=tt(t);return`window.__RETION_MINIAPP_HOST__ = { protocol: ${le} };
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} };
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;`},rt={partner:"partner_token",chatbox:"chatbox_token"},ot=(e,t)=>{let n={...e};for(let r of Object.values(rt))t.includes(r)||delete n[r];return n},ve=new Set,Ke=async(e,t)=>{if(ve.has(e))throw new _("BUSY",`${e} \u0111ang ch\u1EA1y \u2014 ch\u1EDD l\u01B0\u1EE3t tr\u01B0\u1EDBc xong`);ve.add(e);try{return await t()}finally{ve.delete(e)}},Se=(e,t)=>{if(typeof e!="string"||!e)throw new _("INVALID_PARAMS",`Thi\u1EBFu ${t}`);return e},it=async({method:e,params:t},{getHostData:n,getPermissions:r,is_dark:s,close:o,app_id:c,instance_id:l,options:a})=>{var m,d,O,M;let f=a==null?void 0:a.handlers,h={app_id:c,instance_id:l,close:o},A=()=>new _("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF \u1EE9ng d\u1EE5ng n\xE0y`);switch(e){case"requestPayment":{let u=f==null?void 0:f.requestPayment;if(!u)throw A();let i=t==null?void 0:t.amount;if(typeof i!="number"||!Number.isFinite(i)||i<=0)throw new _("INVALID_PARAMS","amount ph\u1EA3i l\xE0 s\u1ED1 > 0");let v={...t,amount:i,currency:Se(t==null?void 0:t.currency,"currency")};return Ke(e,()=>u(v,h))}case"printImage":{let u=f==null?void 0:f.printImage;if(!u)throw A();let i=Se(t==null?void 0:t.image,"image");await Ke(e,()=>u({image:i},h));return}case"openScreen":if(!(f!=null&&f.openScreen))throw A();await f.openScreen({screen:Se(t==null?void 0:t.screen,"screen"),params:t==null?void 0:t.params},h);return;case"closeApp":o();return;case"openWebview":{let u=String((m=t==null?void 0:t.url)!=null?m:"");if(!/^https?:\/\//i.test(u))throw new _("INVALID_PARAMS","url ph\u1EA3i l\xE0 http(s)");await(a!=null&&a.openUrl?a.openUrl(u):Ot.openURL(u));return}case"showToast":(O=a==null?void 0:a.showToast)==null||O.call(a,String((d=t==null?void 0:t.message)!=null?d:""));return;case"getSystemInfo":return{platform:kt.OS==="ios"?"ios":"android",appVersion:(M=a==null?void 0:a.app_version)!=null?M:"",theme:s?"dark":"light"};case"getAccessToken":{let u=n().access_token;if(!u)throw new _("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return u}case"getToken":{let u=t==null?void 0:t.type;if(u==="access"){let V=n().access_token;if(!V)throw new _("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return V}if(u!=="partner"&&u!=="chatbox")throw new _("HOST_ERROR",`Lo\u1EA1i token kh\xF4ng h\u1EE3p l\u1EC7: ${String(u)}`);let i=rt[u];if(!r().includes(i))throw new _("PERMISSION_DENIED",`Mini app ch\u01B0a \u0111\u01B0\u1EE3c c\u1EA5p quy\u1EC1n ${i} (Console \u2192 Quy\u1EC1n l\u1EA5y token)`);let v=u==="partner"?n().partner_token:n().chatbox_token;if(!v)throw new _("HOST_ERROR",`Kh\xF4ng c\xF3 ${i}`);return v}case"getUserInfo":{let u=n().user;if(!u)throw new _("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin nh\xE2n vi\xEAn");return u}case"getPageInfo":{let u=n().page;if(!u)throw new _("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin page");return u}case"sendMessage":case"insertText":throw new _("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF phi\xEAn b\u1EA3n app n\xE0y`);default:throw new _("NOT_SUPPORTED",`API kh\xF4ng t\u1ED3n t\u1EA1i: ${e}`)}};var xe=e=>`bundle:${e}`,Ee=()=>`${S().file_system.document_dir}/miniapps`,pt=(e,t,n="index.html",r=!1,s=[])=>{let o=`${Ee()}/${e}/${t}`;return{app_id:e,version:t,dir:o,entry_uri:`file://${o}/${n}`,context_update:r,permissions:s}},st=e=>{var t;S().storage.setString(xe(e.app_id),JSON.stringify({version:e.version,entry:e.entry,context_update:!!e.context_update,permissions:(t=e.permissions)!=null?t:[]}))},It=(e,t)=>/^https?:\/\//.test(t)?t:`${e.replace(/[^/]*$/,"")}${t}`,x=e=>{let t=S().storage.getString(xe(e));if(!t)return null;try{let{version:n,entry:r,context_update:s,permissions:o}=JSON.parse(t);return pt(e,n,r,!!s,Array.isArray(o)?o:[])}catch{return null}},de=e=>S().file_system.exists(e.entry_uri.replace("file://","")),Te=async e=>{let t=x(e.app_id);return(t==null?void 0:t.version)===e.version&&await de(t)},Dt=async(e,t)=>{let n=S().file_system,r=`${Ee()}/${e}`,s=await n.listDir(r).catch(()=>[]);await Promise.all(s.filter(o=>!t.includes(o)).map(o=>n.remove(`${r}/${o}`).catch(()=>{})))},ct=async e=>{var t;await((t=re[e])==null?void 0:t.catch(()=>{})),S().storage.setString(xe(e),""),await S().file_system.remove(`${Ee()}/${e}`).catch(()=>{})},Y=class extends Error{constructor(){super("cancelled"),this.name="MiniAppInstallCancelled"}},re={},Re=(e,{base_url:t,onProgress:n}={})=>{var m;let r=S().file_system,s=null,o=!1,c=`${r.cache_dir}/${e.app_id}-${e.version}.zip`,l=()=>{if(o)throw new Y},a=async()=>{var M;l();let d=x(e.app_id);if((d==null?void 0:d.version)===e.version&&await r.exists(d.dir))return st(e),x(e.app_id);l();let O=r.download({url:t?It(t,e.bundle_url):e.bundle_url,to_file:c,onProgress:(u,i)=>{var V;let v=i>0?i:(V=e.size)!=null?V:0;v>0&&(n==null||n(Math.min(1,u/v)))}});s=O;try{let{status:u}=await O.promise;if(l(),u!==200)throw new Error(`bundle ${u}`);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=pt(e.app_id,e.version,e.entry,!!e.context_update,(M=e.permissions)!=null?M:[]);return await r.remove(i.dir).catch(()=>{}),await r.mkdir(i.dir),await r.unzip(c,i.dir),st(e),Dt(e.app_id,[e.version,d==null?void 0:d.version].filter(Boolean)),i}catch(u){throw o?new Y:u}finally{s=null,r.remove(c).catch(()=>{})}},h=((m=re[e.app_id])!=null?m:Promise.resolve()).catch(()=>{}).then(a),A=h.catch(()=>{});return re[e.app_id]=A,A.then(()=>{re[e.app_id]===A&&delete re[e.app_id]}),{promise:h,cancel:()=>{o=!0,s==null||s.cancel()}}},ne={},Lt=__DEV__?0:60*1e3,at={},lt=(e,t)=>{var r,s;let n=x(e);return n&&Date.now()-((r=at[t])!=null?r:0)<Lt?Promise.resolve(n):((s=ne[e])!=null||(ne[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 Re(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),x(e))).finally(()=>{ne[e]=void 0})),ne[e])};var ge=new Map,ut=(e,t)=>(ge.set(e,t),()=>{ge.get(e)===t&&ge.delete(e)}),$t=(e,t)=>{let n=ge.get(e);return n?n(t):!1};import{useRef as Nt,useSyncExternalStore as Ft}from"react";var fe=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)})}},B=(e,t,n=Object.is)=>{let r=Nt(null),s=()=>{let o=e.getState(),c=r.current;if(c&&c.state===o&&c.selector===t)return c.value;let l=t(o),a=c&&n(c.value,l)?c.value:l;return r.current={state:o,selector:t,value:a},a};return Ft(e.subscribe,s)};var D=fe({active_key:null,instances:{}}),dt=({app:e,instance_id:t,context:n={},url_params:r={},host_data:s={}},o)=>{var l;let c=(l=S().keep_alive)==null?void 0:l.max_webviews;D.setState(a=>{let f=t!=null?t:e.app_id,h={...a.instances,[f]:{key:f,app:e,context:n,url_params:r,host_data:s,last_used_at:Date.now()}},A=Object.keys(h);return c&&c>0&&A.length>c&&A.filter(m=>m!==f).sort((m,d)=>h[m].last_used_at-h[d].last_used_at).slice(0,A.length-c).forEach(m=>{delete h[m]}),o?{active_key:f,instances:h}:{instances:h}})},Bt=e=>dt(e,!0),Jt=e=>dt(e,!1),oe=()=>D.setState({active_key:null}),he=e=>{D.setState(t=>{if(t.active_key===e||!t.instances[e])return{};let n={...t.instances};return delete n[e],{instances:n}})};var gt="catalog",Vt=10*1e3,Wt=2,jt=3e3,Ht=()=>{var e;try{return JSON.parse((e=S().storage.getString(gt))!=null?e:"{}")}catch{return{}}},b=fe({catalog:{},downloads:{},pause_reasons:[]});Ue(()=>b.setState({catalog:Ht()}));var Ce=e=>B(b,t=>e?t.downloads[e]:void 0),qt=()=>B(b,e=>e.pause_reasons.length>0),K=(...e)=>N("queue",...e),T=[],U={},w=null,me=new Set,z={},Pe=new Set,X=e=>{Pe.forEach(t=>{try{t(e)}catch(n){console.warn("[miniapp-queue] event listener error",n==null?void 0:n.message)}})},Ut=e=>(Pe.add(e),()=>{Pe.delete(e)}),Kt=()=>b.getState().downloads,J=(e,t)=>{let n=!!x(e),r=b.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};b.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?X({type:"status_change",app_id:e,state:o}):r.progress!==o.progress&&X({type:"progress",app_id:e,progress:o.progress,version:o.version})},Ae=(e,t)=>{var n;(n=z[e])==null||n.forEach(r=>r(t)),delete z[e]},zt=()=>b.getState().pause_reasons.length>0,G=e=>{var l;if(w)return;let t=e?T.indexOf(e):zt()?-1:0;if(t<0||t>=T.length)return;let[n]=T.splice(t,1),r=b.getState().catalog[n];if(!r){Ae(n,x(n)),G();return}let s=Date.now();U[n]=((l=U[n])!=null?l:0)+1,J(n,{status:"downloading",progress:0,version:r.version,error:void 0});let o=0,c=Re(r,{onProgress:a=>{let f=Math.floor(a*100);f!==o&&(o=f,J(n,{progress:f/100,version:r.version}))}});w={app_id:n,handle:c,forced:!!e},K("start",n,r.version,e?"(forced)":""),c.promise.then(a=>{K("installed",n,r.version,`${Date.now()-s}ms`),J(n,{status:"installed",progress:1,version:r.version}),Ae(n,a)}).catch(a=>{var h;if(a instanceof Y){if(me.has(n))return;K("paused",n),U[n]-=1,T.unshift(n),J(n,{status:"queued",progress:0,version:r.version});return}let f=String((h=a==null?void 0:a.message)!=null?h:a);if(console.warn("[miniapp-queue] failed",n,f),U[n]<Wt){J(n,{status:"queued",progress:0,version:r.version,error:f}),setTimeout(()=>{var A;T.includes(n)||(w==null?void 0:w.app_id)===n||(T.push(n),G((A=z[n])!=null&&A.length?n:void 0))},jt);return}J(n,{status:"failed",progress:0,version:r.version,error:f}),Ae(n,x(n))}).finally(()=>{w=null;let a=T.find(f=>{var h;return(h=z[f])==null?void 0:h.length});G(a)})},ft=(e,{front:t=!1}={})=>{if((w==null?void 0:w.app_id)===e)return;let n=T.indexOf(e);if(n>=0){if(!t)return;T.splice(n,1)}t?T.unshift(e):T.push(e)},Qt=async e=>{let{host_id:t,client_token:n}=S(),r=new AbortController,s=setTimeout(()=>r.abort(),Vt);try{let o=`${_e}/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(a=>({...a,channel:e}))}finally{clearTimeout(s)}},ie=null,Oe=()=>(ie!=null||(ie=(async()=>{let e=Date.now();try{let t=await Promise.all(S().channels.map(Qt)),n={};[...t].reverse().flat().forEach(o=>{n[o.app_id]=o});let r=Object.keys(b.getState().catalog).filter(o=>!n[o]);S().storage.setString(gt,JSON.stringify(n)),b.setState({catalog:n}),await Promise.all(r.map(ht));let s=[];for(let o of Object.values(n))await Te(o)?J(o.app_id,{status:"installed",progress:1,version:o.version}):s.push(o);s.forEach(o=>{U[o.app_id]=0,J(o.app_id,{status:"queued",progress:0,version:o.version,error:void 0}),ft(o.app_id)}),K("catalog",Object.keys(n).length,"apps, outdated",s.map(o=>o.app_id),"removed",r,`${Date.now()-e}ms`),X({type:"sync_complete",app_ids:Object.keys(n),removed:r}),G()}catch(t){console.warn("[miniapp-queue] sync catalog failed",t==null?void 0:t.message)}finally{ie=null}})()),ie),ht=async e=>{var r,s,o,c;if(me.has(e))return;me.add(e);let t=T.indexOf(e);t>=0&&T.splice(t,1),(w==null?void 0:w.app_id)===e&&w.handle.cancel();let n=(c=(o=(r=b.getState().downloads[e])==null?void 0:r.version)!=null?o:(s=x(e))==null?void 0:s.version)!=null?c:"";J(e,{status:"uninstalling",progress:0,version:n}),await ct(e),he(e),b.setState(l=>{let a={...l.downloads};return delete a[e],{downloads:a}}),delete U[e],me.delete(e),Ae(e,null),K("uninstalled",e),X({type:"uninstalled",app_id:e})},Yt=e=>{let{pause_reasons:t}=b.getState();t.includes(e)||(b.setState({pause_reasons:[...t,e]}),K("pause",e),t.length===0&&X({type:"pause_change",paused:!0,reasons:[e]}),w&&!w.forced&&w.handle.cancel())},Gt=e=>{let{pause_reasons:t}=b.getState();if(!t.includes(e))return;let n=t.filter(r=>r!==e);b.setState({pause_reasons:n}),K("resume",e),n.length===0&&X({type:"pause_change",paused:!1,reasons:n}),G()},mt=e=>b.getState().catalog[e],ke=async e=>{let t=mt(e);if(!t)return;if(await Te(t))return x(e);let n=new Promise(r=>{var s;((s=z[e])!=null?s:z[e]=[]).push(r)});return(w==null?void 0:w.app_id)===e?w.forced=!0:(U[e]=0,ft(e,{front:!0}),w&&!w.forced?w.handle.cancel():G(e)),n};import{Fragment as Mt,jsx as E,jsxs as ae}from"react/jsx-runtime";var De=e=>(e!=null?e:"").replace(/\?[^#]*/,""),At=0,rn=()=>{let e=new Set;return{emit:t=>e.forEach(n=>n(t)),subscribe:t=>(e.add(t),()=>{e.delete(t)})}},on=Ne.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:a,onWebLoadEnd:f})=>{var je,He;let h=L(null),A=L(!1),m=B(D,p=>p.instances[e]),d=m==null?void 0:m.app.app_id,O=m==null?void 0:m.app.manifest_url,M=m==null?void 0:m.context,u=m==null?void 0:m.url_params,[i,v]=Q(()=>d?x(d):null),[V,Z]=Q(!1),[_t,Be]=Q(0),[vt,ee]=Q(0),[St,k]=Q(!1),$=L(null),Je=p=>{$.current&&clearTimeout($.current),$.current=setTimeout(()=>{$.current=null,k(!0)},p)};F(()=>()=>{$.current&&clearTimeout($.current)},[]),F(()=>{if(!d||!t&&i)return;let p=!0;return Z(!1),(async()=>{let g=x(d),R=g?await de(g):!1;if(!p||(v(R?I=>!I||I.version!==g.version||I.permissions.join(",")!==g.permissions.join(",")?g:I:null),__DEV__&&Date.now()-At>1e4&&(At=Date.now(),await Oe()),!p))return;let W=await ke(d),j=W!==void 0?W:O?await lt(d,O):x(d);if(p){if(!j){Z(!0);return}v(I=>I!=null?I:j)}})(),()=>{p=!1}},[t,d,O,_t]),F(()=>ut(e,p=>h.current?(h.current.postMessage(p),!0):!1),[e]);let bt=B(b,p=>{let g=d?p.downloads[d]:void 0;return(g==null?void 0:g.status)==="installed"?g.version:void 0});F(()=>{if(t||!d||!i)return;let p=x(d);if(!p||p.version===i.version)return;let g=!0;return de(p).then(R=>{!g||!R||(N(`webview:${e}`,"\u0111\u1ED5i bundle (\u1EA9n)",i.version,"\u2192",p.version),v(p))}),()=>{g=!1}},[t,d,bt,i==null?void 0:i.version]),F(()=>{var R;let p=(R=S().keep_alive)==null?void 0:R.idle_close_ms;if(t||!p||p<=0)return;let g=setTimeout(()=>{he(e)},p);return()=>clearTimeout(g)},[t,e]),F(()=>{s>0&&(Z(!1),k(!1),ee(p=>p+1),Be(p=>p+1))},[s]);let Ve=L(t);F(()=>{var p;Ve.current!==t&&(Ve.current=t,A.current&&((p=h.current)==null||p.injectJavaScript(Ze(t?"resumed":"paused"))))},[t]);let pe=`${(je=i==null?void 0:i.version)!=null?je:"none"}:${(He=i==null?void 0:i.permissions.join(","))!=null?He:""}:${vt}`,te=we(()=>JSON.stringify([M!=null?M:{},u!=null?u:{}]),[M,u]),Me=we(()=>{var p;return ot(u!=null?u:{},(p=i==null?void 0:i.permissions)!=null?p:[])},[te,i==null?void 0:i.permissions]),xt=we(()=>nt(M!=null?M:{},Me)+Xe()+(S().debug?Ge():""),[Me]),ce=L(null),We=L(null);F(()=>{var g,R,W;if(!i)return;if(We.current!==pe){We.current=pe,ce.current=te;return}if(ce.current===te)return;let p=((R=JSON.parse((g=ce.current)!=null?g:"[]")[0])!=null?R:{}).org_id;if(ce.current=te,p===(M==null?void 0:M.org_id)&&A.current){k(!1),Je(1500),(W=h.current)==null||W.injectJavaScript(et(M!=null?M:{},Me));return}k(!1),ee(j=>j+1)},[te,i,pe]);let Et=Le(async p=>{var R,W,j,I,ye;let g=ze(p.nativeEvent.data);if(!g){if(d&&(l!=null&&l.onWebEvent))try{Promise.resolve(l.onWebEvent(p.nativeEvent.data,{app_id:d,instance_id:e})).catch(y=>{console.warn("[miniapp] onWebEvent l\u1ED7i",d,y)})}catch(y){console.warn("[miniapp] onWebEvent l\u1ED7i",d,y)}return}if(g.method==="log"){let{level:y,text:P}=g;N(`web:${e}`,y!=null?y:"log",P!=null?P:"");return}if(g.method==="pong"){$.current||k(!0);return}if(g.method==="touchAtTop"){o.emit(!!g.at_top);return}if(g.method==="contextApplied"){$.current&&clearTimeout($.current),$.current=null,k(!0);return}if(g.method==="ready"){A.current=!0,k(!0);let y=(R=D.getState().instances[e])==null?void 0:R.context;y&&((W=h.current)==null||W.injectJavaScript(be(y)));return}try{let y=await it(g,{getHostData:()=>{var P,H;return(H=(P=D.getState().instances[e])==null?void 0:P.host_data)!=null?H:{}},getPermissions:()=>{var P,H;return d?(H=(P=x(d))==null?void 0:P.permissions)!=null?H:[]:[]},is_dark:r,close:oe,app_id:d!=null?d:"",instance_id:e,options:l});g.id&&((j=h.current)==null||j.injectJavaScript(Qe(g.id,y)))}catch(y){if(!g.id)return;let P=y==null?void 0:y.code,H=y instanceof _?y:new _(typeof P=="string"?P:"HOST_ERROR",String((I=y==null?void 0:y.message)!=null?I:y));(ye=h.current)==null||ye.injectJavaScript(Ye(g.id,H))}},[e,r,d,o,l]),Tt=Le(()=>{Z(!1),ee(p=>p+1),Be(p=>p+1)},[]);return ae($e,{style:[Fe.absoluteFill,a&&{backgroundColor:r?"#09090B":"#FFFFFF"},!n&&C.behind],pointerEvents:t?"auto":"none",children:[i?E(nn,{ref:h,source:{uri:i.entry_uri},originWhitelist:["*"],allowingReadAccessToURL:`file://${i.dir}`,allowFileAccess:!0,allowFileAccessFromFileURLs:!0,allowUniversalAccessFromFileURLs:!0,injectedJavaScriptBeforeContentLoaded:xt,onMessage:Et,bounces:!1,overScrollMode:"never",onLoadStart:p=>{N(`webview:${e}`,"load start",De(p.nativeEvent.url)),A.current=!1,k(!1)},onError:p=>{N(`webview:${e}`,"load error",De(p.nativeEvent.url),p.nativeEvent.description),Z(!0),k(!1)},onLoadEnd:p=>{let g=p.nativeEvent.url;N(`webview:${e}`,"load end",De(g)),d&&(f==null||f({app_id:d,instance_id:e,url:g})),Je(1500)},onContentProcessDidTerminate:()=>{A.current=!1,k(!1),ee(p=>p+1)},onRenderProcessGone:()=>(A.current=!1,k(!1),ee(p=>p+1),!0),style:C.webview},pe):null,m&&E(an,{visible:!i||!St,interactive:V,children:E(sn,{splash:c,app:m.app,is_dark:r,error:V,has_bundle:!!i,retry:Tt})})]})}),sn=Ne.memo(({splash:e,app:t,is_dark:n,error:r,has_bundle:s,retry:o})=>{let c=e,l=Ce(t.app_id),a=r?"error":!s&&(l==null?void 0:l.status)==="downloading"?"downloading":"loading";return E(c,{app:t,is_dark:n,status:a,progress:a==="downloading"?l==null?void 0:l.progress:void 0,retry:o})}),an=({visible:e,interactive:t,children:n})=>{let r=L(new Ie.Value(e?1:0)).current,[s,o]=Q(e);return F(()=>{if(e){o(!0),r.setValue(1);return}let c=Ie.timing(r,{toValue:0,duration:180,useNativeDriver:!0});return c.start(({finished:l})=>{l&&o(!1)}),()=>c.stop()},[e,r]),s?E(Ie.View,{style:[Fe.absoluteFill,{opacity:r}],pointerEvents:t?"auto":"none",children:n}):null},yt=({app:e,is_dark:t,status:n,progress:r,retry:s})=>{let o=t?"#FAFAFA":"#18181B";return ae($e,{style:[C.splash,{backgroundColor:t?"#09090B":"#FFFFFF"}],children:[E($e,{style:[C.splash_icon,{backgroundColor:t?"#18181B":"#F4F4F5"}],children:e.icon?E(en,{source:{uri:e.icon},style:C.splash_icon_image}):E(se,{style:C.splash_letter,children:(e.name||"?").slice(0,1).toUpperCase()})}),E(se,{style:[C.splash_name,{color:o}],children:e.name}),n==="error"?ae(Mt,{children:[E(se,{style:C.splash_hint,children:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c mini app"}),E(tn,{activeOpacity:.7,style:[C.retry_button,{backgroundColor:t?"#27272A":"#F4F4F5"}],onPress:s,children:E(se,{style:[C.retry_text,{color:o}],children:"Th\u1EED l\u1EA1i"})})]}):ae(Mt,{children:[E(Xt,{style:C.splash_spinner,color:t?"#A1A1AA":"#71717A"}),n==="downloading"&&ae(se,{style:C.splash_hint,children:["\u0110ang t\u1EA3i mini app",r?` ${Math.round(r*100)}%`:"\u2026"]})]})]})},wt=(e,t)=>{let n=L(t),r=L(!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.`))},pn=({container:e,splash:t=yt,is_dark:n=!1,bridge:r,close_on_back:s=!0,opaque_background:o=!0,onWebLoadEnd:c})=>{wt("container",e),wt("splash",t);let l=e,a=B(D,i=>i.active_key),f=L(a);a&&(f.current=a);let h=B(D,i=>Object.keys(i.instances).join("|")),A=B(D,i=>{var v;return i.active_key?(v=i.instances[i.active_key])==null?void 0:v.app.name:void 0}),m=we(()=>h?h.split("|"):[],[h]),[d,O]=Q({}),M=L(rn()).current;F(()=>{if(!a||!s)return;let i=Zt.addEventListener("hardwareBackPress",()=>(oe(),!0));return()=>i.remove()},[a,s]);let u=Le(()=>{let i=D.getState().active_key;i&&O(v=>({...v,[i]:(v[i]||0)+1}))},[]);return m.length?E(l,{visible:!!a,title:A!=null?A:"",is_dark:n,close:oe,reload:u,subscribeWebAtTop:M.subscribe,children:m.map(i=>E(on,{instance_key:i,is_active:a===i,is_front:(a!=null?a:f.current)===i,is_dark:n,reload_tick:d[i]||0,web_at_top:M,splash:t,bridge:r,opaque_background:o,onWebLoadEnd:c},i))}):null},C=Fe.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"}}),cn=Ne.memo(pn);export{yt as DefaultMiniAppSplash,_e as MINIAPP_PLATFORM_URL,cn as MiniAppHost,_ as MiniAppHostError,oe as closeMiniApp,Rt as configureMiniApp,Ct as createMmkvStorage,Pt as createRnfsFileSystem,ke as ensureMiniApp,x as getLocalMiniApp,mt as getMiniAppCatalogEntry,Kt as getMiniAppStatuses,Ut as onMiniAppEvent,Bt as openMiniApp,Yt as pauseMiniAppDownloads,Jt as preloadMiniApp,Gt as resumeMiniAppDownloads,$t as sendEventToWeb,Oe as syncMiniAppCatalog,ht as uninstallMiniApp,Ce as useMiniAppDownload,qt as useMiniAppDownloadsPaused};
45
+ true;`},ct={partner:"partner_token",chatbox:"chatbox_token"},lt=(e,t)=>{let n={...e};for(let r of Object.values(ct))t.includes(r)||delete n[r];return n},Te=new Set,Ze=async(e,t)=>{if(Te.has(e))throw new x("BUSY",`${e} \u0111ang ch\u1EA1y \u2014 ch\u1EDD l\u01B0\u1EE3t tr\u01B0\u1EDBc xong`);Te.add(e);try{return await t()}finally{Te.delete(e)}},Pe=(e,t)=>{if(typeof e!="string"||!e)throw new x("INVALID_PARAMS",`Thi\u1EBFu ${t}`);return e},ut=async({method:e,params:t},{getHostData:n,getPermissions:r,is_dark:a,close:i,app_id:c,instance_id:l,options:o})=>{var m,u,I,v;let d=o==null?void 0:o.handlers,h={app_id:c,instance_id:l,close:i},y=()=>new x("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF \u1EE9ng d\u1EE5ng n\xE0y`);switch(e){case"requestPayment":{let g=d==null?void 0:d.requestPayment;if(!g)throw y();let s=t==null?void 0:t.amount;if(typeof s!="number"||!Number.isFinite(s)||s<=0)throw new x("INVALID_PARAMS","amount ph\u1EA3i l\xE0 s\u1ED1 > 0");let b={...t,amount:s,currency:Pe(t==null?void 0:t.currency,"currency")};return Ze(e,()=>g(b,h))}case"printImage":{let g=d==null?void 0:d.printImage;if(!g)throw y();let s=Pe(t==null?void 0:t.image,"image");await Ze(e,()=>g({image:s},h));return}case"openScreen":if(!(d!=null&&d.openScreen))throw y();await d.openScreen({screen:Pe(t==null?void 0:t.screen,"screen"),params:t==null?void 0:t.params},h);return;case"closeApp":i();return;case"openWebview":{let g=String((m=t==null?void 0:t.url)!=null?m:"");if(!/^https?:\/\//i.test(g))throw new x("INVALID_PARAMS","url ph\u1EA3i l\xE0 http(s)");await(o!=null&&o.openUrl?o.openUrl(g):Ft.openURL(g));return}case"showToast":(I=o==null?void 0:o.showToast)==null||I.call(o,String((u=t==null?void 0:t.message)!=null?u:""));return;case"getSystemInfo":return{platform:Bt.OS==="ios"?"ios":"android",appVersion:(v=o==null?void 0:o.app_version)!=null?v:"",theme:a?"dark":"light"};case"getAccessToken":{let g=n().access_token;if(!g)throw new x("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return g}case"getToken":{let g=t==null?void 0:t.type;if(g==="access"){let j=n().access_token;if(!j)throw new x("HOST_ERROR","Mini app ch\u01B0a c\xF3 token cho page n\xE0y");return j}if(g!=="partner"&&g!=="chatbox")throw new x("HOST_ERROR",`Lo\u1EA1i token kh\xF4ng h\u1EE3p l\u1EC7: ${String(g)}`);let s=ct[g];if(!r().includes(s))throw new x("PERMISSION_DENIED",`Mini app ch\u01B0a \u0111\u01B0\u1EE3c c\u1EA5p quy\u1EC1n ${s} (Console \u2192 Quy\u1EC1n l\u1EA5y token)`);let b=g==="partner"?n().partner_token:n().chatbox_token;if(!b)throw new x("HOST_ERROR",`Kh\xF4ng c\xF3 ${s}`);return b}case"getUserInfo":{let g=n().user;if(!g)throw new x("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin nh\xE2n vi\xEAn");return g}case"getPageInfo":{let g=n().page;if(!g)throw new x("HOST_ERROR","Kh\xF4ng l\u1EA5y \u0111\u01B0\u1EE3c th\xF4ng tin page");return g}case"sendMessage":case"insertText":throw new x("NOT_SUPPORTED",`${e} ch\u01B0a h\u1ED7 tr\u1EE3 \u1EDF phi\xEAn b\u1EA3n app n\xE0y`);default:throw new x("NOT_SUPPORTED",`API kh\xF4ng t\u1ED3n t\u1EA1i: ${e}`)}};var ke=e=>`bundle:${e}`,Oe=()=>`${S().file_system.document_dir}/miniapps`,ft=(e,t,n="index.html",r=!1,a=[])=>{let i=`${Oe()}/${e}/${t}`;return{app_id:e,version:t,dir:i,entry_uri:`file://${i}/${n}`,context_update:r,permissions:a}},dt=e=>{var t;S().storage.setString(ke(e.app_id),JSON.stringify({version:e.version,entry:e.entry,context_update:!!e.context_update,permissions:(t=e.permissions)!=null?t:[]}))},Jt=(e,t)=>/^https?:\/\//.test(t)?t:`${e.replace(/[^/]*$/,"")}${t}`,w=e=>{let t=S().storage.getString(ke(e));if(!t)return null;try{let{version:n,entry:r,context_update:a,permissions:i}=JSON.parse(t);return ft(e,n,r,!!a,Array.isArray(i)?i:[])}catch{return null}},H=e=>S().file_system.exists(e.entry_uri.replace("file://","")),Ie=async e=>{let t=w(e.app_id);return(t==null?void 0:t.version)===e.version&&await H(t)},Ut=async(e,t)=>{let n=S().file_system,r=`${Oe()}/${e}`,a=await n.listDir(r).catch(()=>[]);await Promise.all(a.filter(i=>!t.includes(i)).map(i=>n.remove(`${r}/${i}`).catch(()=>{})))},ht=async e=>{var t;await((t=se[e])==null?void 0:t.catch(()=>{})),S().storage.setString(ke(e),""),await S().file_system.remove(`${Oe()}/${e}`).catch(()=>{})},te=class extends Error{constructor(){super("cancelled"),this.name="MiniAppInstallCancelled"}},se={},De=(e,{base_url:t,onProgress:n}={})=>{var m;let r=S().file_system,a=null,i=!1,c=`${r.cache_dir}/${e.app_id}-${e.version}.zip`,l=()=>{if(i)throw new te},o=async()=>{var v;l();let u=w(e.app_id);if((u==null?void 0:u.version)===e.version&&await r.exists(u.dir))return dt(e),w(e.app_id);l();let I=r.download({url:t?Jt(t,e.bundle_url):e.bundle_url,to_file:c,onProgress:(g,s)=>{var j;let b=s>0?s:(j=e.size)!=null?j:0;b>0&&(n==null||n(Math.min(1,g/b)))}});a=I;try{let{status:g}=await I.promise;if(l(),g!==200)throw new Error(`bundle ${g}`);if(e.sha256)if(r.sha256){if(await r.sha256(c)!==e.sha256)throw new Error("sha256 mismatch")}else L("b\u1ECF qua ki\u1EC3m tra sha256 (file_system kh\xF4ng c\xF3 sha256)",e.app_id);l();let s=ft(e.app_id,e.version,e.entry,!!e.context_update,(v=e.permissions)!=null?v:[]);return await r.remove(s.dir).catch(()=>{}),await r.mkdir(s.dir),await r.unzip(c,s.dir),dt(e),Ut(e.app_id,[e.version,u==null?void 0:u.version].filter(Boolean)),s}catch(g){throw i?new te:g}finally{a=null,r.remove(c).catch(()=>{})}},h=((m=se[e.app_id])!=null?m:Promise.resolve()).catch(()=>{}).then(o),y=h.catch(()=>{});return se[e.app_id]=y,y.then(()=>{se[e.app_id]===y&&delete se[e.app_id]}),{promise:h,cancel:()=>{i=!0,a==null||a.cancel()}}},ie={},Vt=__DEV__?0:60*1e3,gt={},At=(e,t)=>{var r,a;let n=w(e);return n&&Date.now()-((r=gt[t])!=null?r:0)<Vt?Promise.resolve(n):((a=ie[e])!=null||(ie[e]=(async()=>{let i=await fetch(t,{headers:{"Cache-Control":"no-cache"}});if(!i.ok)throw new Error(`manifest ${i.status}`);let c=await i.json(),l=await De(c,{base_url:t}).promise;return gt[t]=Date.now(),l})().catch(i=>(console.warn("[miniapp] sync failed",e,i==null?void 0:i.message),w(e))).finally(()=>{ie[e]=void 0})),ie[e])};var Ae=new Map,mt=(e,t)=>(Ae.set(e,t),()=>{Ae.get(e)===t&&Ae.delete(e)}),Wt=(e,t)=>{let n=Ae.get(e);return n?n(t):!1};import{useRef as jt,useSyncExternalStore as qt}from"react";var me=e=>{let t=e,n=new Set;return{getState:()=>t,setState:r=>{let a=typeof r=="function"?r(t):r;t={...t,...a},n.forEach(i=>i())},subscribe:r=>(n.add(r),()=>{n.delete(r)})}},V=(e,t,n=Object.is)=>{let r=jt(null),a=()=>{let i=e.getState(),c=r.current;if(c&&c.state===i&&c.selector===t)return c.value;let l=t(i),o=c&&n(c.value,l)?c.value:l;return r.current={state:i,selector:t,value:o},o};return qt(e.subscribe,a)};var $=me({active_key:null,instances:{}}),Mt=({app:e,instance_id:t,context:n={},url_params:r={},host_data:a={}},i)=>{var l;let c=(l=S().keep_alive)==null?void 0:l.max_webviews;$.setState(o=>{let d=t!=null?t:e.app_id,h={...o.instances,[d]:{key:d,app:e,context:n,url_params:r,host_data:a,last_used_at:Date.now()}},y=Object.keys(h);return c&&c>0&&y.length>c&&y.filter(m=>m!==d).sort((m,u)=>h[m].last_used_at-h[u].last_used_at).slice(0,y.length-c).forEach(m=>{delete h[m]}),i?{active_key:d,instances:h}:{instances:h}})},Ht=e=>Mt(e,!0),Kt=e=>Mt(e,!1),ae=()=>$.setState({active_key:null}),Me=e=>{$.setState(t=>{if(t.active_key===e||!t.instances[e])return{};let n={...t.instances};return delete n[e],{instances:n}})};var yt="catalog",zt="paused_apps",Yt="removed_apps",Qt=10*1e3,Gt=2,Xt=3e3,Zt=()=>{var e;try{return JSON.parse((e=S().storage.getString(yt))!=null?e:"{}")}catch{return{}}},M=me({catalog:{},downloads:{},pause_reasons:[],updates:{},apply_ticks:{}}),wt=e=>{var t;return!!((t=S().manual_update)!=null&&t.includes(e))},ve=new Set,vt=e=>{let t=new Set,n=()=>S().storage.setString(e,JSON.stringify([...t]));return{has:r=>t.has(r),values:()=>[...t],add:r=>t.has(r)?!1:(t.add(r),n(),!0),delete:r=>t.delete(r)?(n(),!0):!1,load:()=>{var r;t.clear();try{let a=JSON.parse((r=S().storage.getString(e))!=null?r:"[]");Array.isArray(a)&&a.forEach(i=>{typeof i=="string"&&t.add(i)})}catch{}}}},F=vt(zt),Y=vt(Yt);Xe(()=>{F.load(),Y.load();let e=Zt(),t={};Object.keys(e).filter(n=>!Y.has(n)).forEach(n=>{let r=w(n);r?t[n]={status:"installed",progress:1,version:r.version,has_local:!0}:F.has(n)&&(t[n]={status:"paused",progress:0,version:e[n].version,has_local:!1})}),M.setState({catalog:e,downloads:t})});var $e=e=>V(M,t=>e?t.downloads[e]:void 0),en=()=>V(M,e=>e.pause_reasons.length>0),N=(...e)=>L("queue",...e),E=[],W={},A=null,ye=new Set,Z={},Le=new Set,K=e=>{Le.forEach(t=>{try{t(e)}catch(n){console.warn("[miniapp-queue] event listener error",n==null?void 0:n.message)}})},tn=e=>(Le.add(e),()=>{Le.delete(e)}),nn=()=>M.getState().downloads,P=(e,t)=>{let n=!!w(e),r=M.getState().downloads[e],a=t.status==="downloading"&&n?"updating":t.status,i={...r!=null?r:{status:"queued",progress:0},...t,...a?{status:a}:{},has_local:n};M.setState(c=>({downloads:{...c.downloads,[e]:i}})),(r==null?void 0:r.status)!==i.status||(r==null?void 0:r.version)!==i.version||(r==null?void 0:r.has_local)!==i.has_local?K({type:"status_change",app_id:e,state:i}):r.progress!==i.progress&&K({type:"progress",app_id:e,progress:i.progress,version:i.version})},we=(e,t)=>{var n;(n=Z[e])==null||n.forEach(r=>r(t)),delete Z[e]},rn=()=>M.getState().pause_reasons.length>0,z=e=>{var l;if(A)return;let t=e?E.indexOf(e):rn()?-1:E.findIndex(o=>!F.has(o));if(t<0||t>=E.length)return;let[n]=E.splice(t,1),r=M.getState().catalog[n];if(!r){we(n,w(n)),z();return}let a=Date.now();W[n]=((l=W[n])!=null?l:0)+1,P(n,{status:"downloading",progress:0,version:r.version,error:void 0});let i=0,c=De(r,{onProgress:o=>{let d=Math.floor(o*100);d!==i&&(i=d,P(n,{progress:d/100,version:r.version}))}});A={app_id:n,handle:c,forced:!!e},N("start",n,r.version,e?"(forced)":""),c.promise.then(o=>{N("installed",n,r.version,`${Date.now()-a}ms`),P(n,{status:"installed",progress:1,version:r.version}),we(n,o)}).catch(o=>{var h;if(o instanceof te){if(ye.has(n))return;N("paused",n),W[n]-=1,E.unshift(n),P(n,{status:F.has(n)?"paused":"queued",progress:0,version:r.version});return}let d=String((h=o==null?void 0:o.message)!=null?h:o);if(console.warn("[miniapp-queue] failed",n,d),W[n]<Gt){P(n,{status:"queued",progress:0,version:r.version,error:d}),setTimeout(()=>{var y;E.includes(n)||(A==null?void 0:A.app_id)===n||(E.push(n),z((y=Z[n])!=null&&y.length?n:void 0))},Xt);return}P(n,{status:"failed",progress:0,version:r.version,error:d}),we(n,w(n))}).finally(()=>{A=null;let o=E.find(d=>{var h;return(h=Z[d])==null?void 0:h.length});z(o)})},_e=(e,{front:t=!1}={})=>{if((A==null?void 0:A.app_id)===e)return;let n=E.indexOf(e);if(n>=0){if(!t)return;E.splice(n,1)}t?E.unshift(e):E.push(e)},on=async e=>{let{host_id:t,client_token:n}=S(),r=new AbortController,a=setTimeout(()=>r.abort(),Qt);try{let i=`${Re}/api/hosts/${encodeURIComponent(t)}/miniapps?channel=${e}`,c=await fetch(i,{headers:{Authorization:`Bearer ${n}`,"Cache-Control":"no-cache"},signal:r.signal});if(!c.ok)throw new Error(`host list ${e} ${c.status}`);return(await c.json()).apps.map(o=>({...o,channel:e}))}finally{clearTimeout(a)}},pe=null,Ne=()=>(pe!=null||(pe=(async()=>{var t;let e=Date.now();try{let n=await Promise.all(S().channels.map(on)),r={};[...n].reverse().flat().forEach(o=>{r[o.app_id]=o});let a=Object.keys(M.getState().catalog).filter(o=>!r[o]);S().storage.setString(yt,JSON.stringify(r)),M.setState({catalog:r}),await Promise.all(a.map(o=>_t(o,{by_user:!1}))),a.forEach(o=>Y.delete(o));let i=Object.keys(r).filter(o=>!Y.has(o)),c=[],l={};for(let o of i.map(d=>r[d])){if(await Ie(o)){P(o.app_id,{status:"installed",progress:1,version:o.version});continue}let d=w(o.app_id);if(wt(o.app_id)&&!ve.has(o.app_id)&&d&&await H(d)){P(o.app_id,{status:"installed",progress:1,version:d.version}),l[o.app_id]={app_id:o.app_id,current_version:d.version,next_version:o.version};continue}c.push(o)}return M.setState({updates:l}),c.forEach(o=>{W[o.app_id]=0,P(o.app_id,{status:F.has(o.app_id)?"paused":"queued",progress:0,version:o.version,error:void 0}),_e(o.app_id)}),N("catalog",i.length,"apps, outdated",c.map(o=>o.app_id),"removed",a,`${Date.now()-e}ms`),K({type:"sync_complete",app_ids:i,removed:a}),Object.values(l).forEach(o=>K({type:"update_available",...o})),z(),{ok:!0,app_ids:i,removed:a}}catch(n){let r=String((n==null?void 0:n.name)==="AbortError"?"timeout":(t=n==null?void 0:n.message)!=null?t:n);return console.warn("[miniapp-queue] sync catalog failed",r),K({type:"sync_failed",error:r}),{ok:!1,error:r}}finally{pe=null}})()),pe),_t=async(e,{by_user:t})=>{var a,i,c,l;if(t&&Y.add(e),ye.has(e))return;ye.add(e),F.delete(e);let n=E.indexOf(e);n>=0&&E.splice(n,1),(A==null?void 0:A.app_id)===e&&A.handle.cancel();let r=(l=(c=(a=M.getState().downloads[e])==null?void 0:a.version)!=null?c:(i=w(e))==null?void 0:i.version)!=null?l:"";P(e,{status:"uninstalling",progress:0,version:r}),await ht(e),Me(e),M.setState(o=>{let d={...o.downloads};return delete d[e],{downloads:d}}),delete W[e],ye.delete(e),we(e,null),N("uninstalled",e,t?"(user)":"(not in list)"),K({type:"uninstalled",app_id:e})},sn=e=>_t(e,{by_user:!0}),an=e=>{let t=ce(e);return t?(Y.delete(e),(A==null?void 0:A.app_id)===e||E.includes(e)||(W[e]=0,P(e,{status:F.has(e)?"paused":"queued",progress:0,version:t.version,error:void 0}),_e(e),z(),N("restore",e)),!0):!1},pn=e=>{if(F.has(e))return;if(F.add(e),N("pause app",e),(A==null?void 0:A.app_id)===e&&!A.forced){A.handle.cancel();return}let t=M.getState().downloads[e];E.includes(e)&&t&&P(e,{status:"paused",progress:0,version:t.version})},cn=e=>{if(!F.delete(e))return;N("resume app",e);let t=M.getState().downloads[e];(t==null?void 0:t.status)==="paused"&&!E.includes(e)&&ce(e)&&(W[e]=0,_e(e)),E.includes(e)&&t&&P(e,{status:"queued",progress:0,version:t.version}),z()},ln=e=>{let{pause_reasons:t}=M.getState();t.includes(e)||(M.setState({pause_reasons:[...t,e]}),N("pause",e),t.length===0&&K({type:"pause_change",paused:!0,reasons:[e]}),A&&!A.forced&&A.handle.cancel())},un=e=>{let{pause_reasons:t}=M.getState();if(!t.includes(e))return;let n=t.filter(r=>r!==e);M.setState({pause_reasons:n}),N("resume",e),n.length===0&&K({type:"pause_change",paused:!1,reasons:n}),z()},St=e=>M.getState().updates[e],dn=async e=>{var n,r;let t=St(e);ve.add(e);try{let a=await Se(e),i=(r=t==null?void 0:t.next_version)!=null?r:(n=ce(e))==null?void 0:n.version;return!a||!i||a.version!==i?!1:(M.setState(c=>{var o;let l={...c.updates};return delete l[e],{updates:l,apply_ticks:{...c.apply_ticks,[e]:((o=c.apply_ticks[e])!=null?o:0)+1}}}),N("updated",e,t==null?void 0:t.current_version,"\u2192",a.version),!0)}finally{ve.delete(e)}},gn=()=>Object.values(M.getState().catalog).map(e=>({...e,installed:!!w(e.app_id),removed_by_user:Y.has(e.app_id)})),ce=e=>M.getState().catalog[e],Se=async e=>{let t=ce(e);if(!t)return;if(F.delete(e),Y.delete(e),await Ie(t))return w(e);let n=w(e);if(wt(e)&&!ve.has(e)&&n&&await H(n))return n;let r=new Promise(a=>{var i;((i=Z[e])!=null?i:Z[e]=[]).push(a)});return(A==null?void 0:A.app_id)===e?A.forced=!0:(W[e]=0,_e(e,{front:!0}),A&&!A.forced?A.handle.cancel():z(e)),r};import{Fragment as Et,jsx as R,jsxs as ue}from"react/jsx-runtime";var Be=e=>(e!=null?e:"").replace(/\?[^#]*/,""),bt=0,yn=()=>{let e=new Set;return{emit:t=>e.forEach(n=>n(t)),subscribe:t=>(e.add(t),()=>{e.delete(t)})}},wn=Ve.memo(({instance_key:e,is_active:t,is_front:n,is_dark:r,reload_tick:a,web_at_top:i,splash:c,bridge:l,opaque_background:o,onWebLoadEnd:d})=>{var Ye,Qe;let h=J(null),y=J(!1),m=V($,p=>p.instances[e]),u=m==null?void 0:m.app.app_id,I=m==null?void 0:m.app.manifest_url,v=m==null?void 0:m.context,g=m==null?void 0:m.url_params,[s,b]=ee(()=>u?w(u):null),[j,ne]=ee(!1),[Tt,je]=ee(0),[Pt,re]=ee(0),[Ct,C]=ee(!1),U=J(null),qe=p=>{U.current&&clearTimeout(U.current),U.current=setTimeout(()=>{U.current=null,C(!0)},p)};B(()=>()=>{U.current&&clearTimeout(U.current)},[]),B(()=>{if(!u||!t&&s)return;let p=!0;return ne(!1),(async()=>{let f=w(u),T=f?await H(f):!1;if(!p||(b(T?D=>!D||D.version!==f.version||D.permissions.join(",")!==f.permissions.join(",")?f:D:null),__DEV__&&Date.now()-bt>1e4&&(bt=Date.now(),await Ne()),!p))return;let q=await Se(u),Q=q!==void 0?q:I?await At(u,I):w(u);if(p){if(!Q){ne(!0);return}b(D=>D!=null?D:Q)}})(),()=>{p=!1}},[t,u,I,Tt]),B(()=>mt(e,p=>h.current?(h.current.postMessage(p),!0):!1),[e]);let kt=V(M,p=>{let f=u?p.downloads[u]:void 0;return(f==null?void 0:f.status)==="installed"?f.version:void 0});B(()=>{if(t||!u||!s)return;let p=w(u);if(!p||p.version===s.version)return;let f=!0;return H(p).then(T=>{!f||!T||(L(`webview:${e}`,"\u0111\u1ED5i bundle (\u1EA9n)",s.version,"\u2192",p.version),b(p))}),()=>{f=!1}},[t,u,kt,s==null?void 0:s.version]);let He=V(M,p=>{var f;return u&&(f=p.apply_ticks[u])!=null?f:0});B(()=>{if(!He||!u)return;let p=w(u);if(!p||p.version===(s==null?void 0:s.version))return;let f=!0;return H(p).then(T=>{!f||!T||(L(`webview:${e}`,"c\u1EADp nh\u1EADt",s==null?void 0:s.version,"\u2192",p.version),C(!1),b(p))}),()=>{f=!1}},[He]),B(()=>{var T;let p=(T=S().keep_alive)==null?void 0:T.idle_close_ms;if(t||!p||p<=0)return;let f=setTimeout(()=>{Me(e)},p);return()=>clearTimeout(f)},[t,e]),B(()=>{a>0&&(ne(!1),C(!1),re(p=>p+1),je(p=>p+1))},[a]);let Ke=J(t);B(()=>{var p;Ke.current!==t&&(Ke.current=t,y.current&&((p=h.current)==null||p.injectJavaScript(it(t?"resumed":"paused"))))},[t]);let de=`${(Ye=s==null?void 0:s.version)!=null?Ye:"none"}:${(Qe=s==null?void 0:s.permissions.join(","))!=null?Qe:""}:${Pt}`,oe=be(()=>JSON.stringify([v!=null?v:{},g!=null?g:{}]),[v,g]),xe=be(()=>{var p;return lt(g!=null?g:{},(p=s==null?void 0:s.permissions)!=null?p:[])},[oe,s==null?void 0:s.permissions]),Ot=be(()=>pt(v!=null?v:{},xe)+ot()+(S().debug?rt():""),[xe]),ge=J(null),ze=J(null);B(()=>{var f,T,q;if(!s)return;if(ze.current!==de){ze.current=de,ge.current=oe;return}if(ge.current===oe)return;let p=((T=JSON.parse((f=ge.current)!=null?f:"[]")[0])!=null?T:{}).org_id;if(ge.current=oe,p===(v==null?void 0:v.org_id)&&y.current){C(!1),qe(1500),(q=h.current)==null||q.injectJavaScript(st(v!=null?v:{},xe));return}C(!1),re(Q=>Q+1)},[oe,s,de]);let It=Je(async p=>{var T,q,Q,D,Ee;let f=et(p.nativeEvent.data);if(!f){if(u&&(l!=null&&l.onWebEvent))try{Promise.resolve(l.onWebEvent(p.nativeEvent.data,{app_id:u,instance_id:e})).catch(_=>{console.warn("[miniapp] onWebEvent l\u1ED7i",u,_)})}catch(_){console.warn("[miniapp] onWebEvent l\u1ED7i",u,_)}return}if(f.method==="log"){let{level:_,text:k}=f;L(`web:${e}`,_!=null?_:"log",k!=null?k:"");return}if(f.method==="pong"){U.current||C(!0);return}if(f.method==="touchAtTop"){i.emit(!!f.at_top);return}if(f.method==="contextApplied"){U.current&&clearTimeout(U.current),U.current=null,C(!0);return}if(f.method==="ready"){y.current=!0,C(!0);let _=(T=$.getState().instances[e])==null?void 0:T.context;_&&((q=h.current)==null||q.injectJavaScript(Ce(_)));return}try{let _=await ut(f,{getHostData:()=>{var k,G;return(G=(k=$.getState().instances[e])==null?void 0:k.host_data)!=null?G:{}},getPermissions:()=>{var k,G;return u?(G=(k=w(u))==null?void 0:k.permissions)!=null?G:[]:[]},is_dark:r,close:ae,app_id:u!=null?u:"",instance_id:e,options:l});f.id&&((Q=h.current)==null||Q.injectJavaScript(tt(f.id,_)))}catch(_){if(!f.id)return;let k=_==null?void 0:_.code,G=_ instanceof x?_:new x(typeof k=="string"?k:"HOST_ERROR",String((D=_==null?void 0:_.message)!=null?D:_));(Ee=h.current)==null||Ee.injectJavaScript(nt(f.id,G))}},[e,r,u,i,l]),Dt=Je(()=>{ne(!1),re(p=>p+1),je(p=>p+1)},[]);return ue(Ue,{style:[We.absoluteFill,o&&{backgroundColor:r?"#09090B":"#FFFFFF"},!n&&O.behind],pointerEvents:t?"auto":"none",children:[s?R(Mn,{ref:h,source:{uri:s.entry_uri},originWhitelist:["*"],allowingReadAccessToURL:`file://${s.dir}`,allowFileAccess:!0,allowFileAccessFromFileURLs:!0,allowUniversalAccessFromFileURLs:!0,injectedJavaScriptBeforeContentLoaded:Ot,onMessage:It,bounces:!1,overScrollMode:"never",onLoadStart:p=>{L(`webview:${e}`,"load start",Be(p.nativeEvent.url)),y.current=!1,C(!1)},onError:p=>{L(`webview:${e}`,"load error",Be(p.nativeEvent.url),p.nativeEvent.description),ne(!0),C(!1)},onLoadEnd:p=>{let f=p.nativeEvent.url;L(`webview:${e}`,"load end",Be(f)),u&&(d==null||d({app_id:u,instance_id:e,url:f})),qe(1500)},onContentProcessDidTerminate:()=>{y.current=!1,C(!1),re(p=>p+1)},onRenderProcessGone:()=>(y.current=!1,C(!1),re(p=>p+1),!0),style:O.webview},de):null,m&&R(_n,{visible:!s||!Ct,interactive:j,children:R(vn,{splash:c,app:m.app,is_dark:r,error:j,has_bundle:!!s,retry:Dt})})]})}),vn=Ve.memo(({splash:e,app:t,is_dark:n,error:r,has_bundle:a,retry:i})=>{let c=e,l=$e(t.app_id),o=r?"error":!a&&(l==null?void 0:l.status)==="downloading"?"downloading":"loading";return R(c,{app:t,is_dark:n,status:o,progress:o==="downloading"?l==null?void 0:l.progress:void 0,retry:i})}),_n=({visible:e,interactive:t,children:n})=>{let r=J(new Fe.Value(e?1:0)).current,[a,i]=ee(e);return B(()=>{if(e){i(!0),r.setValue(1);return}let c=Fe.timing(r,{toValue:0,duration:180,useNativeDriver:!0});return c.start(({finished:l})=>{l&&i(!1)}),()=>c.stop()},[e,r]),a?R(Fe.View,{style:[We.absoluteFill,{opacity:r}],pointerEvents:t?"auto":"none",children:n}):null},Rt=({app:e,is_dark:t,status:n,progress:r,retry:a})=>{let i=t?"#FAFAFA":"#18181B";return ue(Ue,{style:[O.splash,{backgroundColor:t?"#09090B":"#FFFFFF"}],children:[R(Ue,{style:[O.splash_icon,{backgroundColor:t?"#18181B":"#F4F4F5"}],children:e.icon?R(An,{source:{uri:e.icon},style:O.splash_icon_image}):R(le,{style:O.splash_letter,children:(e.name||"?").slice(0,1).toUpperCase()})}),R(le,{style:[O.splash_name,{color:i}],children:e.name}),n==="error"?ue(Et,{children:[R(le,{style:O.splash_hint,children:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c mini app"}),R(mn,{activeOpacity:.7,style:[O.retry_button,{backgroundColor:t?"#27272A":"#F4F4F5"}],onPress:a,children:R(le,{style:[O.retry_text,{color:i}],children:"Th\u1EED l\u1EA1i"})})]}):ue(Et,{children:[R(fn,{style:O.splash_spinner,color:t?"#A1A1AA":"#71717A"}),n==="downloading"&&ue(le,{style:O.splash_hint,children:["\u0110ang t\u1EA3i mini app",r?` ${Math.round(r*100)}%`:"\u2026"]})]})]})},xt=(e,t)=>{let n=J(t),r=J(!1);__DEV__&&!r.current&&n.current!==t&&(r.current=!0,console.warn(`[miniapp] MiniAppHost prop "${e}" \u0111\u1ED5i gi\u1EEFa c\xE1c l\u1EA7n render \u2192 m\u1ECDi WebView b\u1ECB mount l\u1EA1i. Khai b\xE1o component b\xEAn ngo\xE0i render.`))},Sn=({container:e,splash:t=Rt,is_dark:n=!1,bridge:r,close_on_back:a=!0,opaque_background:i=!0,onWebLoadEnd:c})=>{xt("container",e),xt("splash",t);let l=e,o=V($,s=>s.active_key),d=J(o);o&&(d.current=o);let h=V($,s=>Object.keys(s.instances).join("|")),y=V($,s=>{var b;return s.active_key?(b=s.instances[s.active_key])==null?void 0:b.app.name:void 0}),m=be(()=>h?h.split("|"):[],[h]),[u,I]=ee({}),v=J(yn()).current;B(()=>{if(!o||!a)return;let s=hn.addEventListener("hardwareBackPress",()=>(ae(),!0));return()=>s.remove()},[o,a]);let g=Je(()=>{let s=$.getState().active_key;s&&I(b=>({...b,[s]:(b[s]||0)+1}))},[]);return m.length?R(l,{visible:!!o,title:y!=null?y:"",is_dark:n,close:ae,reload:g,subscribeWebAtTop:v.subscribe,children:m.map(s=>R(wn,{instance_key:s,is_active:o===s,is_front:(o!=null?o:d.current)===s,is_dark:n,reload_tick:u[s]||0,web_at_top:v,splash:t,bridge:r,opaque_background:i,onWebLoadEnd:c},s))}):null},O=We.create({webview:{flex:1,backgroundColor:"transparent"},behind:{zIndex:-1},splash:{flex:1,alignItems:"center",justifyContent:"center",gap:12},splash_icon:{width:72,height:72,borderRadius:20,alignItems:"center",justifyContent:"center",overflow:"hidden"},splash_icon_image:{width:72,height:72},splash_letter:{fontSize:28,fontWeight:"700",color:"#1D4ED8"},splash_name:{fontSize:16,fontWeight:"600"},splash_hint:{color:"#71717A"},splash_spinner:{marginTop:8},retry_button:{marginTop:4,paddingHorizontal:20,paddingVertical:10,borderRadius:999},retry_text:{fontWeight:"600"}}),bn=Ve.memo(Sn);export{Rt as DefaultMiniAppSplash,Re as MINIAPP_PLATFORM_URL,bn as MiniAppHost,x as MiniAppHostError,ae as closeMiniApp,Lt as configureMiniApp,Nt as createMmkvStorage,$t as createRnfsFileSystem,Se as ensureMiniApp,w as getLocalMiniApp,gn as getMiniAppCatalog,ce as getMiniAppCatalogEntry,nn as getMiniAppStatuses,St as getMiniAppUpdate,tn as onMiniAppEvent,Ht as openMiniApp,pn as pauseMiniApp,ln as pauseMiniAppDownloads,Kt as preloadMiniApp,an as restoreMiniApp,cn as resumeMiniApp,un as resumeMiniAppDownloads,Wt as sendEventToWeb,Ne as syncMiniAppCatalog,sn as uninstallMiniApp,dn as updateMiniApp,$e as useMiniAppDownload,en as useMiniAppDownloadsPaused};
package/package.json CHANGED
@@ -1,8 +1,16 @@
1
1
  {
2
2
  "name": "@retion-miniapp/react-native",
3
- "version": "0.6.0",
3
+ "version": "0.7.1",
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
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/vanqui123/retion-miniapp-react-native.git"
9
+ },
10
+ "homepage": "https://github.com/vanqui123/retion-miniapp-react-native/blob/main/docs/MINIAPP_README.md",
11
+ "bugs": {
12
+ "url": "https://github.com/vanqui123/retion-miniapp-react-native/issues"
13
+ },
6
14
  "keywords": [
7
15
  "react-native",
8
16
  "mini-app",
@@ -44,7 +52,21 @@
44
52
  "peerDependencies": {
45
53
  "react": ">=18",
46
54
  "react-native": ">=0.72",
47
- "react-native-webview": ">=13"
55
+ "react-native-webview": ">=13",
56
+ "react-native-fs": ">=2.20",
57
+ "react-native-mmkv": ">=3",
58
+ "react-native-zip-archive": ">=6"
59
+ },
60
+ "peerDependenciesMeta": {
61
+ "react-native-fs": {
62
+ "optional": true
63
+ },
64
+ "react-native-mmkv": {
65
+ "optional": true
66
+ },
67
+ "react-native-zip-archive": {
68
+ "optional": true
69
+ }
48
70
  },
49
71
  "devDependencies": {
50
72
  "@types/react": "^19.2.0",