Skip to content

Commit 6715eae

Browse files
authored
Merge pull request #58 from Telegram-Mini-Apps/fix/properly-use-telegram-bus
Fixes
2 parents 06e7f10 + 2e4637d commit 6715eae

File tree

4 files changed

+73
-52
lines changed

4 files changed

+73
-52
lines changed

declaration.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,13 +265,18 @@ export interface WebApp {
265265

266266
export interface Telegram {
267267
WebApp: WebApp;
268+
//TODO type for WebView
268269
WebView: any;
269270
}
270271

271272
declare global {
272273
interface Window {
273274
Telegram: Telegram,
275+
//TODO better types for proxies
274276
TelegramGameProxy: any,
277+
TelegramWebviewProxy: {
278+
postEvent: (eventType, eventData) => void,
279+
},
275280
TelegramGameProxy_receiveEvent: (eventType: string, eventData: unknown) => void,
276281
telegramAnalytics: {
277282
init: ({ token, appName }: {

src/controllers/Analytics.controller.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ import { App } from '../app'
22
import { TonConnectObserver } from "../observers/TonConnect.observer";
33
import { DocumentObserver } from "../observers/Document.observer";
44
import {BACKEND_URL, STAGING_BACKEND_URL} from "../constants";
5-
import {WebAppObserver} from "../observers/WebApp.observer";
65
import {WebViewObserver} from "../observers/WebView.observer";
76

87
export class AnalyticsController {
98
private appModule: App;
109
private tonConnectObserver: TonConnectObserver;
1110
private documentObserver: DocumentObserver;
12-
private webAppObserver: WebAppObserver;
1311
private webViewObserver: WebViewObserver;
1412

1513
private eventsThreshold: Record<string, number> = {
@@ -21,14 +19,12 @@ export class AnalyticsController {
2119

2220
this.documentObserver = new DocumentObserver(this);
2321
this.tonConnectObserver = new TonConnectObserver(this);
24-
this.webAppObserver = new WebAppObserver(this);
2522
this.webViewObserver = new WebViewObserver(this);
2623
}
2724

2825
public async init() {
2926
this.documentObserver.init();
3027
this.tonConnectObserver.init();
31-
this.webAppObserver.init();
3228
this.webViewObserver.init();
3329

3430
try {

src/observers/WebApp.observer.ts

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/observers/WebView.observer.ts

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,30 +24,34 @@ export class WebViewObserver {
2424
this.handlePlatformListener(window.TelegramGameProxy);
2525
this.handlePlatformListener(window.Telegram.WebView);
2626
this.handlePlatformListener(window.TelegramGameProxy_receiveEvent);
27+
28+
this.initPostEventBus();
2729
}
2830

2931
private handlePlatformListener(listener: any) {
3032
if (!listener) {
3133
return;
3234
}
3335

34-
let originalReceiveEvent: (eventType: string, eventData: unknown) => void;
35-
36-
if (listener?.receiveEvent) {
37-
originalReceiveEvent = listener.receiveEvent;
38-
} else {
39-
originalReceiveEvent = listener;
40-
listener = window;
41-
}
42-
4336
const observer = this;
4437

45-
listener.receiveEvent = (eventType: string, eventData: unknown) => {
46-
observer.handleEvents(eventType, eventData);
38+
if (listener?.receiveEvent) {
39+
listener.receiveEvent = (eventType: string, eventData: unknown) => {
40+
observer.handleEvents(eventType, eventData as Record<string, any>);
4741

48-
return originalReceiveEvent.call(listener, eventType, eventData);
49-
}
42+
window.Telegram.WebView.callEventCallbacks(eventType, function(callback) {
43+
callback(eventType, eventData);
44+
});
45+
}
46+
} else {
47+
window.TelegramGameProxy_receiveEvent = (eventType: string, eventData: unknown) => {
48+
observer.handleEvents(eventType, eventData as Record<string, any>);
5049

50+
window.Telegram.WebView.callEventCallbacks(eventType, function(callback) {
51+
callback(eventType, eventData);
52+
});
53+
}
54+
}
5155
}
5256

5357
private handleEvents(eventType: string, eventData: Record<string, any>) {
@@ -58,5 +62,55 @@ export class WebViewObserver {
5862
});
5963
}
6064
}
61-
}
65+
}
66+
67+
private initPostEventBus() {
68+
window.Telegram.WebView.postEvent = (eventType, callback, eventData) => {
69+
this.originalPostEvent(eventType, callback, eventData);
70+
if (eventType === 'web_app_open_invoice') {
71+
let slug = eventData.slug;
72+
73+
if (slug.startsWith('$')){
74+
slug = slug.slice(1);
75+
}
76+
77+
this.analyticsController.collectEvent(Events.PURCHASE_INIT, {
78+
slug
79+
});
80+
}
81+
};
82+
}
83+
84+
private originalPostEvent(eventType, callback, eventData) {
85+
if (!callback) {
86+
callback = function () {};
87+
}
88+
if (eventData === undefined) {
89+
eventData = '';
90+
}
91+
console.log('[Telegram.WebView] > postEvent', eventType, eventData);
92+
93+
if (window.TelegramWebviewProxy !== undefined) {
94+
window.TelegramWebviewProxy.postEvent(eventType, JSON.stringify(eventData));
95+
callback();
96+
}
97+
else if (window.external && 'notify' in window.external) {
98+
window.external.notify(JSON.stringify({eventType: eventType, eventData: eventData}));
99+
callback();
100+
}
101+
else if (window.Telegram.WebView?.isIframe) {
102+
try {
103+
var trustedTarget = 'https://web.telegram.org';
104+
// For now we don't restrict target, for testing purposes
105+
trustedTarget = '*';
106+
window.parent.postMessage(JSON.stringify({eventType: eventType, eventData: eventData}), trustedTarget);
107+
callback();
108+
} catch (e) {
109+
callback(e);
110+
}
111+
}
112+
else {
113+
callback({notAvailable: true});
114+
}
115+
};
62116
}

0 commit comments

Comments
 (0)