📄 src/web3/wallet/browsers.ts
D-OPEN SOVEREIGN
1export enum Browser {
2  chromium = 'chromium',
3  firefox = 'firefox',
4  safari = 'safari',
5  edge = 'edge',
6  opera = 'opera',
7  brave = 'brave',
8  vivaldi = 'vivaldi',
9  yandex = 'yandex',
10  palemoon = 'palemoon',
11}
12
13export enum Platform {
14  android = 'android',
15  ios = 'ios',
16  browsers = 'browsers',
17}
18
19export const parseUserAgent = (
20  userAgent: string = typeof navigator !== 'undefined' ? navigator.userAgent : ''
21): {
22  browser: Browser;
23  platform: Platform;
24} => {
25  const ua = userAgent.toLowerCase();
26
27  // Detect browser
28  let browser: Browser;
29
30  // Check for specific browsers first (most specific to least specific)
31  // Real Yandex Browser UAs self-identify via "YaBrowser/", not the word
32  // "yandex" — keep both checks since some environments (e.g. WebViews) have
33  // been observed reporting either form.
34  if (ua.includes('yabrowser') || ua.includes('yandex')) {
35    browser = Browser.yandex;
36  } else if (ua.includes('brave')) {
37    browser = Browser.brave;
38  } else if (ua.includes('vivaldi')) {
39    browser = Browser.vivaldi;
40  } else if (ua.includes('palemoon')) {
41    browser = Browser.palemoon;
42  } else if (ua.includes('edg/') || ua.includes('edge/')) {
43    browser = Browser.edge;
44  } else if (ua.includes('opr/') || ua.includes('opera/')) {
45    browser = Browser.opera;
46  } else if (ua.includes('firefox/')) {
47    browser = Browser.firefox;
48  } else if (ua.includes('safari/') && !ua.includes('chrome/')) {
49    browser = Browser.safari;
50  } else if (ua.includes('chrome/') || ua.includes('chromium/')) {
51    browser = Browser.chromium;
52  } else {
53    // Default fallback
54    browser = Browser.chromium;
55  }
56
57  // Detect platform
58  let platform: Platform;
59
60  if (ua.includes('android')) {
61    platform = Platform.android;
62  } else if (ua.includes('iphone') || ua.includes('ipad') || ua.includes('ipod')) {
63    platform = Platform.ios;
64  } else {
65    platform = Platform.browsers;
66  }
67
68  return {
69    browser,
70    platform,
71  };
72};
73