@wowlabtech/mini-app-adapter 0.1.0 → 0.2.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.cjs CHANGED
@@ -739,6 +739,25 @@ var BaseMiniAppAdapter = class {
739
739
  return null;
740
740
  }
741
741
  async requestNotificationsPermission() {
742
+ if (typeof Notification === "undefined" || typeof Notification.requestPermission !== "function") {
743
+ return false;
744
+ }
745
+ try {
746
+ const permission = await Notification.requestPermission();
747
+ return permission === "granted";
748
+ } catch (error) {
749
+ console.warn("[tvm-app-adapter] requestNotificationsPermission fallback failed:", error);
750
+ return false;
751
+ }
752
+ }
753
+ async addToHomeScreen() {
754
+ return false;
755
+ }
756
+ async checkHomeScreenStatus() {
757
+ return "unknown";
758
+ }
759
+ async denyNotifications() {
760
+ console.warn("[tvm-app-adapter] denyNotifications fallback is not supported in this environment.");
742
761
  return false;
743
762
  }
744
763
  enableVerticalSwipes() {
@@ -1464,6 +1483,50 @@ var TelegramMiniAppAdapter = class extends BaseMiniAppAdapter {
1464
1483
  async shareStory(mediaUrl, options) {
1465
1484
  (0, import_sdk.shareStory)(mediaUrl, options);
1466
1485
  }
1486
+ async addToHomeScreen() {
1487
+ const isAvailable = typeof import_sdk.addToHomeScreen?.isAvailable === "function" ? import_sdk.addToHomeScreen.isAvailable() : true;
1488
+ if (!isAvailable) {
1489
+ return super.addToHomeScreen();
1490
+ }
1491
+ return new Promise((resolve) => {
1492
+ const cleanup = () => {
1493
+ (0, import_sdk.off)("home_screen_added", handleSuccess);
1494
+ (0, import_sdk.off)("home_screen_failed", handleFail);
1495
+ };
1496
+ const handleSuccess = () => {
1497
+ cleanup();
1498
+ resolve(true);
1499
+ };
1500
+ const handleFail = () => {
1501
+ cleanup();
1502
+ resolve(false);
1503
+ };
1504
+ (0, import_sdk.on)("home_screen_added", handleSuccess);
1505
+ (0, import_sdk.on)("home_screen_failed", handleFail);
1506
+ try {
1507
+ (0, import_sdk.addToHomeScreen)();
1508
+ } catch (error) {
1509
+ cleanup();
1510
+ console.warn("[tvm-app-adapter] Telegram addToHomeScreen failed:", error);
1511
+ resolve(false);
1512
+ }
1513
+ });
1514
+ }
1515
+ async checkHomeScreenStatus() {
1516
+ try {
1517
+ const status = await (0, import_sdk.checkHomeScreenStatus)();
1518
+ if (typeof status === "string") {
1519
+ return status;
1520
+ }
1521
+ if (typeof status === "boolean") {
1522
+ return status ? "added" : "not_added";
1523
+ }
1524
+ return "unknown";
1525
+ } catch (error) {
1526
+ console.warn("[tvm-app-adapter] Telegram checkHomeScreenStatus failed:", error);
1527
+ return "unknown";
1528
+ }
1529
+ }
1467
1530
  async requestPhone() {
1468
1531
  const contactFeature = ensureFeature(import_sdk.requestContact);
1469
1532
  if (!contactFeature.ok) {
@@ -1803,6 +1866,39 @@ var VKMiniAppAdapter = class extends BaseMiniAppAdapter {
1803
1866
  return false;
1804
1867
  }
1805
1868
  }
1869
+ async addToHomeScreen() {
1870
+ const supported = await this.supportsBridgeMethod("VKWebAppAddToHomeScreen");
1871
+ if (!supported) {
1872
+ console.warn("[tvm-app-adapter] VK addToHomeScreen not supported");
1873
+ return super.addToHomeScreen();
1874
+ }
1875
+ try {
1876
+ const response = await import_vk_bridge.default.send("VKWebAppAddToHomeScreen");
1877
+ if (response && typeof response === "object" && "result" in response) {
1878
+ return Boolean(response.result);
1879
+ }
1880
+ return true;
1881
+ } catch (error) {
1882
+ console.warn("[tvm-app-adapter] VK addToHomeScreen failed:", error);
1883
+ return false;
1884
+ }
1885
+ }
1886
+ async denyNotifications() {
1887
+ const supported = await this.supportsBridgeMethod("VKWebAppDenyNotifications");
1888
+ if (!supported) {
1889
+ return super.denyNotifications();
1890
+ }
1891
+ try {
1892
+ const response = await import_vk_bridge.default.send("VKWebAppDenyNotifications");
1893
+ if (response && typeof response === "object" && "result" in response) {
1894
+ return Boolean(response.result);
1895
+ }
1896
+ return true;
1897
+ } catch (error) {
1898
+ console.warn("[tvm-app-adapter] VK deny notifications failed:", error);
1899
+ return false;
1900
+ }
1901
+ }
1806
1902
  async scanQRCode(options) {
1807
1903
  const supportsQrScanner = await this.supportsBridgeMethod("VKWebAppOpenCodeReader");
1808
1904
  if (!supportsQrScanner) {
@@ -1838,6 +1934,25 @@ var VKMiniAppAdapter = class extends BaseMiniAppAdapter {
1838
1934
  };
1839
1935
  await import_vk_bridge.default.send("VKWebAppShowStoryBox", bridgeOptions);
1840
1936
  }
1937
+ shareUrl(url, text) {
1938
+ void this.shareUrlInternal(url, text);
1939
+ }
1940
+ async shareUrlInternal(url, text) {
1941
+ const supported = await this.supportsBridgeMethod("VKWebAppShare");
1942
+ if (!supported) {
1943
+ super.shareUrl(url, text ?? "");
1944
+ return;
1945
+ }
1946
+ try {
1947
+ await import_vk_bridge.default.send("VKWebAppShare", {
1948
+ link: url,
1949
+ ...text ? { text } : {}
1950
+ });
1951
+ } catch (error) {
1952
+ console.warn("[tvm-app-adapter] VK shareUrl failed:", error);
1953
+ super.shareUrl(url, text ?? "");
1954
+ }
1955
+ }
1841
1956
  async downloadFile(url, filename) {
1842
1957
  const supported = await this.supportsBridgeMethod("VKWebAppDownloadFile");
1843
1958
  if (!supported) {
@@ -2196,6 +2311,13 @@ var WebMiniAppAdapter = class extends BaseMiniAppAdapter {
2196
2311
  languageCode: navigator.language,
2197
2312
  isWebView: false
2198
2313
  });
2314
+ __publicField(this, "deferredPrompt", null);
2315
+ if (typeof window !== "undefined") {
2316
+ window.addEventListener("beforeinstallprompt", (event) => {
2317
+ event.preventDefault();
2318
+ this.deferredPrompt = event;
2319
+ });
2320
+ }
2199
2321
  }
2200
2322
  async downloadFile(url, filename) {
2201
2323
  try {
@@ -2344,6 +2466,49 @@ var WebMiniAppAdapter = class extends BaseMiniAppAdapter {
2344
2466
  }
2345
2467
  });
2346
2468
  }
2469
+ shareUrl(url, text) {
2470
+ if (navigator.share) {
2471
+ try {
2472
+ navigator.share({ title: text, text, url });
2473
+ return;
2474
+ } catch (err) {
2475
+ console.warn("Share cancelled or failed:", err);
2476
+ }
2477
+ }
2478
+ const payload = text ? `${text}
2479
+ ${url}` : url;
2480
+ this.copyTextToClipboard(payload).catch((err) => {
2481
+ console.warn("Share fallback (clipboard) failed:", err);
2482
+ });
2483
+ }
2484
+ async addToHomeScreen() {
2485
+ const isAndroid = /android/i.test(navigator.userAgent);
2486
+ if (!isAndroid || !this.deferredPrompt) {
2487
+ return super.addToHomeScreen();
2488
+ }
2489
+ try {
2490
+ this.deferredPrompt.prompt();
2491
+ const choice = await this.deferredPrompt.userChoice;
2492
+ this.deferredPrompt = null;
2493
+ return choice?.outcome === "accepted";
2494
+ } catch (error) {
2495
+ console.warn("[tvm-app-adapter] Web addToHomeScreen failed:", error);
2496
+ this.deferredPrompt = null;
2497
+ return false;
2498
+ }
2499
+ }
2500
+ async checkHomeScreenStatus() {
2501
+ try {
2502
+ const isStandalone = typeof window !== "undefined" && window.matchMedia?.("(display-mode: standalone)").matches || // iOS Safari specific flag
2503
+ typeof navigator !== "undefined" && navigator.standalone === true;
2504
+ if (isStandalone) {
2505
+ return "added";
2506
+ }
2507
+ return "unknown";
2508
+ } catch {
2509
+ return "unknown";
2510
+ }
2511
+ }
2347
2512
  };
2348
2513
 
2349
2514
  // src/adapters/index.ts