Use same lock values as mobile clients
[ProtonMail-WebClient.git] / packages / shared / lib / broadcast / broadcast.ts
blobd2719e275134e9ef8a8340a1167e95b1e5441ff5
1 const getClient = () => {
2     const {
3         navigator: { standalone, userAgent },
4     } = window as any;
5     const lowercaseUserAgent = userAgent.toLowerCase();
6     const safari = /safari/.test(lowercaseUserAgent);
7     const ios = /iphone|ipod|ipad/.test(lowercaseUserAgent);
9     if (ios && typeof (window as any)?.webkit?.messageHandlers?.iOS !== 'undefined') {
10         if (!standalone && safari) {
11             // browser
12         } else if (standalone && !safari) {
13             // standalone
14         } else if (!standalone && !safari) {
15             // uiwebview
16             return 'ios';
17         }
18     }
20     if (typeof (window as any)?.AndroidInterface !== 'undefined') {
21         return 'android';
22     }
24     if ((window as any).chrome && (window as any).chrome.webview) {
25         return 'webview';
26     }
28     return 'web';
31 const broadcast = <T>(message: T) => {
32     const client = getClient();
34     const serialized = JSON.stringify(message);
36     switch (client) {
37         case 'ios': {
38             (window as any)?.webkit?.messageHandlers?.iOS?.postMessage?.(serialized);
39             break;
40         }
42         case 'android': {
43             (window as any)?.AndroidInterface?.dispatch?.(serialized);
44             break;
45         }
47         case 'webview': {
48             // This is an embedded chrome browser. It uses different message passing mechanism.
49             // (window as any).chrome.webview.postMessage(message);
50             break;
51         }
53         case 'web': {
54             window.parent.postMessage(serialized, '*');
55             break;
56         }
58         default:
59     }
62 export default broadcast;