diff --git a/__tests__/web-pages/unsupported-browser.test.ts b/__tests__/web-pages/unsupported-browser.test.ts
new file mode 100644
index 0000000..26fd8bb
--- /dev/null
+++ b/__tests__/web-pages/unsupported-browser.test.ts
@@ -0,0 +1,253 @@
+/**
+ * Tests for unsupported-browser.html page
+ * This tests the browser detection logic that runs in the page
+ */
+
+import { describe, it, expect } from '@jest/globals';
+
+// Mock browser detection functions (these are in the HTML inline script)
+function detectBrowser(userAgent: string, platform: string): { name: string; version: string } {
+ let name = 'Unknown';
+ let version = '0';
+
+ // Chrome
+ if (/Chrome\/(\d+)/.test(userAgent) && !/Edg/.test(userAgent) && !/OPR/.test(userAgent)) {
+ name = 'Chrome';
+ const match = userAgent.match(/Chrome\/(\d+)/);
+ version = match ? match[1] : '0';
+ }
+ // Edge
+ else if (/Edg\/(\d+)/.test(userAgent)) {
+ name = 'Edge';
+ const match = userAgent.match(/Edg\/(\d+)/);
+ version = match ? match[1] : '0';
+ }
+ // Opera
+ else if (/OPR\/(\d+)/.test(userAgent)) {
+ name = 'Opera';
+ const match = userAgent.match(/OPR\/(\d+)/);
+ version = match ? match[1] : '0';
+ }
+ // Safari
+ else if (/Safari\/(\d+)/.test(userAgent) && !/Chrome/.test(userAgent)) {
+ name = 'Safari';
+ const match = userAgent.match(/Version\/(\d+)/);
+ version = match ? match[1] : '0';
+ }
+ // Firefox
+ else if (/Firefox\/(\d+)/.test(userAgent)) {
+ name = 'Firefox';
+ const match = userAgent.match(/Firefox\/(\d+)/);
+ version = match ? match[1] : '0';
+ }
+
+ return { name, version };
+}
+
+function detectPlatformFromUA(userAgent: string, platform: string): string {
+ if (/Win/.test(platform)) return 'Windows';
+ if (/Mac/.test(platform)) return 'macOS';
+ if (/iPhone|iPad|iPod/.test(userAgent)) return 'iOS';
+ if (/Android/.test(userAgent)) return 'Android';
+ if (/Linux/.test(platform)) return 'Linux';
+ return 'Unknown';
+}
+
+function getUnsupportedMessage(browserInfo: {
+ name: string;
+ platform: string;
+ hasWebBluetooth: boolean;
+}): string {
+ const { name, platform, hasWebBluetooth } = browserInfo;
+
+ if (platform === 'iOS') {
+ return 'Web Bluetooth is not supported on iOS due to system limitations. Please use a desktop browser or download our mobile app.';
+ }
+
+ if (name === 'Safari') {
+ return 'Safari does not support Web Bluetooth API. Please use Chrome, Edge, or Opera instead.';
+ }
+
+ if (name === 'Firefox') {
+ return 'Firefox does not support Web Bluetooth API due to privacy concerns. Please use Chrome, Edge, or Opera instead.';
+ }
+
+ if (!hasWebBluetooth) {
+ return 'Your browser does not support Web Bluetooth API. Please update to a newer version or try Chrome, Edge, or Opera.';
+ }
+
+ return 'Your browser version may be outdated. Please update to the latest version or try Chrome, Edge, or Opera.';
+}
+
+describe('Unsupported Browser Page - Browser Detection', () => {
+ describe('detectBrowser', () => {
+ it('should detect Chrome correctly', () => {
+ const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';
+ const result = detectBrowser(userAgent, 'Win32');
+ expect(result.name).toBe('Chrome');
+ expect(result.version).toBe('120');
+ });
+
+ it('should detect Edge correctly', () => {
+ const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0';
+ const result = detectBrowser(userAgent, 'Win32');
+ expect(result.name).toBe('Edge');
+ expect(result.version).toBe('120');
+ });
+
+ it('should detect Opera correctly', () => {
+ const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OPR/106.0.0.0';
+ const result = detectBrowser(userAgent, 'Win32');
+ expect(result.name).toBe('Opera');
+ expect(result.version).toBe('106');
+ });
+
+ it('should detect Safari correctly', () => {
+ const userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15';
+ const result = detectBrowser(userAgent, 'MacIntel');
+ expect(result.name).toBe('Safari');
+ expect(result.version).toBe('17');
+ });
+
+ it('should detect Firefox correctly', () => {
+ const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0';
+ const result = detectBrowser(userAgent, 'Win32');
+ expect(result.name).toBe('Firefox');
+ expect(result.version).toBe('121');
+ });
+
+ it('should return Unknown for unrecognized browser', () => {
+ const userAgent = 'Some Unknown Browser/1.0';
+ const result = detectBrowser(userAgent, 'Win32');
+ expect(result.name).toBe('Unknown');
+ expect(result.version).toBe('0');
+ });
+ });
+
+ describe('detectPlatformFromUA', () => {
+ it('should detect Windows correctly', () => {
+ const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)';
+ const platform = 'Win32';
+ const result = detectPlatformFromUA(userAgent, platform);
+ expect(result).toBe('Windows');
+ });
+
+ it('should detect macOS correctly', () => {
+ const userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)';
+ const platform = 'MacIntel';
+ const result = detectPlatformFromUA(userAgent, platform);
+ expect(result).toBe('macOS');
+ });
+
+ it('should detect iOS correctly', () => {
+ const userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)';
+ const platform = 'iPhone';
+ const result = detectPlatformFromUA(userAgent, platform);
+ expect(result).toBe('iOS');
+ });
+
+ it('should detect Android correctly', () => {
+ const userAgent = 'Mozilla/5.0 (Linux; Android 13)';
+ const platform = 'Linux';
+ const result = detectPlatformFromUA(userAgent, platform);
+ expect(result).toBe('Android');
+ });
+
+ it('should detect Linux correctly', () => {
+ const userAgent = 'Mozilla/5.0 (X11; Linux x86_64)';
+ const platform = 'Linux x86_64';
+ const result = detectPlatformFromUA(userAgent, platform);
+ expect(result).toBe('Linux');
+ });
+ });
+
+ describe('getUnsupportedMessage', () => {
+ it('should return iOS-specific message for iOS platform', () => {
+ const browserInfo = {
+ name: 'Safari',
+ platform: 'iOS',
+ hasWebBluetooth: false,
+ };
+ const message = getUnsupportedMessage(browserInfo);
+ expect(message).toContain('iOS');
+ expect(message).toContain('system limitations');
+ expect(message).toContain('mobile app');
+ });
+
+ it('should return Safari-specific message', () => {
+ const browserInfo = {
+ name: 'Safari',
+ platform: 'macOS',
+ hasWebBluetooth: false,
+ };
+ const message = getUnsupportedMessage(browserInfo);
+ expect(message).toContain('Safari');
+ expect(message).toContain('does not support');
+ expect(message).toContain('Chrome, Edge, or Opera');
+ });
+
+ it('should return Firefox-specific message', () => {
+ const browserInfo = {
+ name: 'Firefox',
+ platform: 'Windows',
+ hasWebBluetooth: false,
+ };
+ const message = getUnsupportedMessage(browserInfo);
+ expect(message).toContain('Firefox');
+ expect(message).toContain('privacy concerns');
+ expect(message).toContain('Chrome, Edge, or Opera');
+ });
+
+ it('should return no Web Bluetooth message when API is not available', () => {
+ const browserInfo = {
+ name: 'Chrome',
+ platform: 'Windows',
+ hasWebBluetooth: false,
+ };
+ const message = getUnsupportedMessage(browserInfo);
+ expect(message).toContain('does not support Web Bluetooth');
+ expect(message).toContain('update');
+ });
+
+ it('should return generic outdated message for other cases', () => {
+ const browserInfo = {
+ name: 'Chrome',
+ platform: 'Windows',
+ hasWebBluetooth: true,
+ };
+ const message = getUnsupportedMessage(browserInfo);
+ expect(message).toContain('outdated');
+ expect(message).toContain('Chrome, Edge, or Opera');
+ });
+ });
+});
+
+describe('Unsupported Browser Page - Content', () => {
+ it('should have correct recommended browsers', () => {
+ const recommendedBrowsers = [
+ {
+ name: 'Google Chrome',
+ minVersion: '70',
+ downloadUrl: 'https://www.google.com/chrome/',
+ },
+ {
+ name: 'Microsoft Edge',
+ minVersion: '79',
+ downloadUrl: 'https://www.microsoft.com/edge',
+ },
+ {
+ name: 'Opera',
+ minVersion: '57',
+ downloadUrl: 'https://www.opera.com/',
+ },
+ ];
+
+ expect(recommendedBrowsers).toHaveLength(3);
+ expect(recommendedBrowsers[0].name).toBe('Google Chrome');
+ expect(recommendedBrowsers[0].minVersion).toBe('70');
+ expect(recommendedBrowsers[1].name).toBe('Microsoft Edge');
+ expect(recommendedBrowsers[1].minVersion).toBe('79');
+ expect(recommendedBrowsers[2].name).toBe('Opera');
+ expect(recommendedBrowsers[2].minVersion).toBe('57');
+ });
+});
diff --git a/web-pages/unsupported-browser.html b/web-pages/unsupported-browser.html
new file mode 100644
index 0000000..ced3a91
--- /dev/null
+++ b/web-pages/unsupported-browser.html
@@ -0,0 +1,459 @@
+
+
+
+
+
+ Browser Not Supported - WellNuo
+
+
+
+
+
+
+
+
+
+
+
Browser Not Supported
+
+ WellNuo Web requires a browser that supports Web Bluetooth API for connecting to health sensors.
+
+
+
+
Your Browser
+
+ Detecting browser...
+
+
+
+
Recommended Browsers
+
+
+
+
+
+
+
+
Prefer Mobile?
+
+ Download the WellNuo mobile app for the best experience on your smartphone or tablet.
+
+
+ Visit WellNuo.com
+
+
+
+
+
+
+
Technical Details:
+
Loading...
+
+
Web Bluetooth Requirements:
+
+ - HTTPS connection (required for security)
+ - Bluetooth hardware enabled on your device
+ - Operating System: Windows 10+, macOS, or Linux
+ - Browser: Chrome 70+, Edge 79+, or Opera 57+
+
+
+
+
+
+
+
+
+