@@ -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