diff --git a/README.md b/README.md index e949ef2..391486a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ![SecureBit.chat Logo](logo/favicon.ico) -**The world's first P2P messenger with ECDH + DTLS + SAS security, Lightning Network payments and military-grade cryptography** +**The world's first P2P messenger with ECDH + DTLS + SAS security and military-grade cryptography** [![Latest Release](https://img.shields.io/github/v/release/SecureBitChat/securebit-chat?style=for-the-badge&logo=github&color=orange)](https://github.com/SecureBitChat/securebit-chat/releases/latest) [![Live Demo](https://img.shields.io/badge/🌐_Live_Demo-Try_Now-success?style=for-the-badge)](https://securebitchat.github.io/securebit-chat/) @@ -103,17 +103,12 @@ ### 🏆 Industry Leader * **Dominates in 11/15 security categories** vs Signal, Threema, Session -* **First messenger** with Lightning Network integration +* **First messenger** with enhanced ECDH + DTLS + SAS security * **Military-grade cryptography** exceeding government standards * **Zero servers** — truly decentralized P2P architecture * **PWA technology** — install like native apps without app stores -### ⚡ Lightning Network Pioneer - -* **Instant satoshi payments** for secure sessions -* **Pay-per-session model** — no ads, no data harvesting -* **WebLN integration** with all major Lightning wallets -* **Sustainable economics** for private communication + ### 🔐 15-Layer Military Security @@ -152,14 +147,14 @@ | Feature | **SecureBit.chat** | Signal | Threema | Session | | --------------------------- | ----------------------------- | ---------------------------- | --------------------- | ---------------------- | | **Architecture** | 🏆 Pure P2P WebRTC | ❌ Centralized servers | ❌ Centralized servers | ⚠️ Onion network | -| **Payment Integration** | 🏆 Lightning Network | ❌ None | ❌ None | ❌ None | +| **Payment Integration** | ❌ None | ❌ None | ❌ None | ❌ None | | **File Transfer** | 🏆 P2P encrypted + chunked | ✅ Encrypted via servers | ✅ Encrypted via servers | ✅ Encrypted via servers | | **PWA Support** | 🏆 Full PWA installation | ❌ None | ❌ None | ❌ None | | **Registration** | 🏆 Anonymous | ❌ Phone required | ✅ ID generated | ✅ Random ID | | **Traffic Obfuscation** | 🏆 Advanced fake traffic | ❌ None | ❌ None | ✅ Onion routing | | **Censorship Resistance** | 🏆 Hard to block | ⚠️ Blocked in some countries | ⚠️ May be blocked | ✅ Onion routing | | **Data Storage** | 🏆 Zero storage | ⚠️ Local database | ⚠️ Local + backup | ⚠️ Local database | -| **Economic Model** | 🏆 Pay‑per‑session | ⚠️ Donations dependent | ✅ One‑time purchase | ⚠️ Donations dependent | +| **Economic Model** | ✅ Open-source | ⚠️ Donations dependent | ✅ One‑time purchase | ⚠️ Donations dependent | | **Metadata Protection** | 🏆 Full encryption | ⚠️ Sealed Sender (partial) | ⚠️ Minimal metadata | ✅ Onion routing | | **Key Security** | 🏆 Non‑extractable + hardware | ✅ Secure storage | ✅ Local storage | ✅ Secure storage | | **Perfect Forward Secrecy** | 🏆 Auto rotation (5 min) | ✅ Double Ratchet | ⚠️ Partial (groups) | ✅ Session Ratchet | @@ -178,7 +173,7 @@ 2. **Install PWA:** Click "Install" button for native app experience 3. **Choose:** *Create Channel* or *Join Channel* 4. **Complete:** Secure key exchange with verification -5. **Select:** Session type (Demo / Basic / Premium) +5. **Verify:** Security codes and start a secure chat 6. **Communicate:** With military‑grade encryption + secure file transfers ### Option 2: Self‑Host @@ -227,26 +222,7 @@ open http://localhost:8000 --- -## ⚡ Lightning Network Integration - -### Session Types - -* **🎮 Demo:** 6 minutes free (testing) -* **⚡ Basic:** 1 hour for 50 satoshis -* **💎 Premium:** 6 hours for 200 satoshis - -### Supported Wallets - -| Wallet | WebLN | Mobile | Desktop | -| ----------------- | :---: | :----: | :-----: | -| Alby | ✅ | ✅ | ✅ | -| Zeus | ✅ | ✅ | ✅ | -| Wallet of Satoshi | ✅ | ✅ | ❌ | -| Muun | ⚠️ | ✅ | ❌ | -| Breez | ✅ | ✅ | ❌ | -| Strike | ✅ | ✅ | ✅ | - -*And many more WebLN‑compatible wallets.* + --- @@ -260,7 +236,7 @@ open http://localhost:8000 🔑 Key Exchange: ECDH P-384 (Perfect Forward Secrecy) 🛡️ Transport Layer: WebRTC DTLS 1.2 🌐 Network Layer: P2P WebRTC Data Channels -⚡ Payment Layer: Lightning Network + WebLN + 📱 PWA Layer: Service Workers + Cache API 🔒 ASN.1 Layer: Complete DER parsing and validation ``` @@ -280,7 +256,7 @@ open http://localhost:8000 * Modern browser with WebRTC support (Chrome 60+, Firefox 60+, Safari 12+) * HTTPS connection (required for WebRTC and PWA) * JavaScript enabled -* Lightning wallet with WebLN (for payments) + * Service Worker support for PWA features --- @@ -322,7 +298,7 @@ open http://localhost:8000 * P2P group chats (up to 8 participants) * Mesh networking topology -* Group Lightning payments + * Anonymous group administration * Group file sharing @@ -482,7 +458,7 @@ We welcome contributions from the community! * 🔐 Cryptography — Security improvements and audits * 🌐 Network — P2P optimization and reliability -* ⚡ Lightning — Payment integration enhancements + * 📂 File Transfer — EnhancedSecureFileTransfer improvements * 📱 PWA — Install prompts, offline management, and PWA lifecycle * 🎨 UI/UX — Interface improvements, FileTransfer and DownloadApps components @@ -524,7 +500,7 @@ While SecureBit.chat implements military-grade cryptography and follows security * Always verify security codes out-of-band * Keep devices and browsers updated * Be aware of endpoint security risks -* Use reputable Lightning wallets + * **File transfers are protected with the same military-grade cryptography as chat messages** * **All cryptographic keys now undergo complete ASN.1 structure validation** @@ -533,7 +509,7 @@ This software is provided "as is" for educational and research purposes. Users a * Cryptographic software usage * Private communications -* Bitcoin/Lightning Network transactions + * File sharing and transfer ### Privacy Statement @@ -558,12 +534,7 @@ SecureBit.chat: * **Secure P2P file sharing without servers** * **Complete ASN.1 validation for cryptographic keys** -### For Bitcoin/Lightning Users - -* Native Lightning Network integration -* Sustainable pay-per-session model -* Support for all major Lightning wallets -* No KYC or account requirements + ### For Mobile Users diff --git a/SECURITY.md b/SECURITY.md index 43e27eb..fb5708e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -153,8 +153,7 @@ We maintain a hall of fame for security researchers who help improve SecureBit.c 2. **Use Official Source:** Only use https://SecureBit.chat 3. **Keep Updated:** Use version 4.02.x for complete ASN.1 validation 4. **Secure Environment:** Use updated browsers on secure devices -5. **Lightning Wallets:** Use reputable Lightning wallets (Alby, Zeus, etc.) -6. **Monitor Security Status:** Check for "MAXIMUM SECURITY" indicator in chat +5. **Monitor Security Status:** Check for "MAXIMUM SECURITY" indicator in chat ### Security Indicators: - ✅ **Green Shield:** MAXIMUM SECURITY (Stage 5) active @@ -169,6 +168,13 @@ We maintain a hall of fame for security researchers who help improve SecureBit.c - ❌ Unofficial domains or mirrors - ❌ Missing security layer notifications +### Research Ethics +- **No Disruption:** Don't interfere with live users +- **Responsible Disclosure:** Follow our disclosure timeline +- **No Data Harvesting:** Don't collect user communications +- **Legal Compliance:** Follow all applicable laws +- **Respect Privacy:** Don't attempt to break active encrypted sessions + ## 🔬 Security Research Guidelines ### Scope @@ -191,16 +197,8 @@ We maintain a hall of fame for security researchers who help improve SecureBit.c - ❌ Physical attacks on user devices - ❌ DoS attacks on user connections - ❌ Issues requiring physical access -- ❌ Lightning Network protocol issues - ❌ Browser security vulnerabilities -### Research Ethics -- **No Disruption:** Don't interfere with live users -- **Responsible Disclosure:** Follow our disclosure timeline -- **No Data Harvesting:** Don't collect user communications -- **Legal Compliance:** Follow all applicable laws -- **Respect Privacy:** Don't attempt to break active encrypted sessions - ## 🔄 Recent Security Updates (Version 4.02) ### Major Security Enhancements: diff --git a/SECURITY_UPDATES_v4.02.985.md b/SECURITY_UPDATES_v4.02.985.md deleted file mode 100644 index f1ebf65..0000000 --- a/SECURITY_UPDATES_v4.02.985.md +++ /dev/null @@ -1,256 +0,0 @@ -# Security Updates v4.02.985 - ECDH + DTLS + SAS - -## 🛡️ Revolutionary Security System Update - -**Release Date:** January 2025 -**Version:** 4.02.985 -**Security Level:** Military-Grade -**Breaking Changes:** Yes - Complete PAKE removal - ---- - -## 🔥 Major Security Improvements - -### 1. Complete PAKE System Removal - -**What Changed:** -- **Removed:** All libsodium dependencies and PAKE-based authentication -- **Replaced With:** ECDH + DTLS + SAS triple-layer security system -- **Impact:** Eliminates complex PAKE implementation in favor of standardized protocols - -**Security Benefits:** -- ✅ **Simplified Architecture** - Reduced attack surface -- ✅ **Standards Compliance** - RFC-compliant protocols -- ✅ **Better Maintenance** - Native Web Crypto API usage -- ✅ **Enhanced Security** - Triple-layer defense system - -### 2. ECDH Key Exchange Implementation - -**New Features:** -- **Elliptic Curve Diffie-Hellman** using P-384 (secp384r1) -- **Cryptographically secure** key pair generation -- **Perfect Forward Secrecy** with session-specific keys -- **MITM resistance** requiring knowledge of both private keys - -**Technical Details:** -```javascript -// ECDH Key Generation -const keyPair = await crypto.subtle.generateKey( - { name: 'ECDH', namedCurve: 'P-384' }, - true, - ['deriveKey', 'deriveBits'] -); - -// Shared Secret Derivation -const sharedSecret = await crypto.subtle.deriveBits( - { name: 'ECDH', public: peerPublicKey }, - privateKey, - 384 -); -``` - -### 3. DTLS Fingerprint Verification - -**New Features:** -- **WebRTC Certificate Extraction** from SDP offers/answers -- **SHA-256 Fingerprint Generation** for transport verification -- **Mutual Verification** between both parties -- **Transport Layer Security** validation - -**Security Properties:** -- ✅ **Connection Integrity** - Prevents hijacking -- ✅ **Certificate Validation** - Ensures authentic WebRTC certificates -- ✅ **MITM Detection** - Detects man-in-the-middle at transport layer - -### 4. SAS (Short Authentication String) System - -**New Features:** -- **7-digit Verification Code** (0000000-9999999) -- **HKDF-based Generation** from shared secret and DTLS fingerprints -- **Single Code Generation** on Offer side, shared with Answer side -- **Mutual Verification** - Both users must confirm the same code - -**Implementation:** -```javascript -// SAS Generation -async _computeSAS(keyMaterialRaw, localFP, remoteFP) { - const salt = enc.encode('webrtc-sas|' + [localFP, remoteFP].sort().join('|')); - const key = await crypto.subtle.importKey('raw', keyMaterialRaw, 'HKDF', false, ['deriveBits']); - const bits = await crypto.subtle.deriveBits( - { name: 'HKDF', hash: 'SHA-256', salt, info: enc.encode('p2p-sas-v1') }, - key, 64 - ); - const n = (new DataView(bits).getUint32(0) ^ new DataView(bits).getUint32(4)) >>> 0; - return String(n % 10_000_000).padStart(7, '0'); -} -``` - ---- - -## 🔒 Security Flow - -### New Authentication Process - -``` -1. ECDH Key Exchange - ├── Generate P-384 key pairs - ├── Exchange public keys via SDP - └── Derive shared secret - -2. DTLS Fingerprint Verification - ├── Extract certificates from WebRTC SDP - ├── Generate SHA-256 fingerprints - └── Verify transport authenticity - -3. SAS Generation and Sharing - ├── Generate SAS from shared secret + fingerprints - ├── Share SAS code via data channel - └── Display to both users - -4. Mutual Verification - ├── Both users confirm the same SAS code - ├── Connection established only after confirmation - └── Secure communication begins -``` - -### MITM Attack Prevention - -**Triple-Layer Defense:** -1. **ECDH Layer** - Requires knowledge of both private keys -2. **DTLS Layer** - Validates transport layer certificates -3. **SAS Layer** - Human-verifiable out-of-band confirmation - -**Attack Scenarios:** -- ❌ **Passive Eavesdropping** - Prevented by ECDH encryption -- ❌ **Active MITM** - Prevented by DTLS fingerprint verification -- ❌ **Certificate Spoofing** - Prevented by SAS verification -- ❌ **Connection Hijacking** - Prevented by mutual verification - ---- - -## 🚀 Performance Improvements - -### Reduced Dependencies -- **Before:** libsodium.js (~200KB) + custom PAKE implementation -- **After:** Native Web Crypto API (0KB additional) -- **Improvement:** ~200KB reduction in bundle size - -### Faster Authentication -- **Before:** Complex PAKE multi-step protocol -- **After:** Streamlined ECDH + SAS verification -- **Improvement:** ~40% faster connection establishment - -### Better Browser Compatibility -- **Before:** Required libsodium polyfills -- **After:** Native browser APIs only -- **Improvement:** Better compatibility across all modern browsers - ---- - -## 🔧 Technical Implementation - -### Key Components Added - -1. **`_computeSAS()`** - SAS generation using HKDF -2. **`_extractDTLSFingerprintFromSDP()`** - Certificate extraction -3. **`_decodeKeyFingerprint()`** - Key material processing -4. **`confirmVerification()`** - Mutual verification handling -5. **`handleSASCode()`** - SAS code reception and validation - -### Key Components Removed - -1. **All PAKE-related methods** - `runPAKE()`, `_handlePAKEMessage()`, etc. -2. **libsodium dependencies** - `_getFallbackSodium()`, sodium imports -3. **PAKE message types** - `PAKE_STEP1`, `PAKE_STEP2`, `PAKE_FINISH` -4. **PAKE state management** - `isPAKEVerified`, `resetPAKE()` - -### Message Types Updated - -**New System Messages:** -- `sas_code` - SAS code transmission -- `verification_confirmed` - Local verification confirmation -- `verification_both_confirmed` - Mutual verification completion - -**Removed System Messages:** -- `PAKE_STEP1`, `PAKE_STEP2`, `PAKE_FINISH` - ---- - -## 🛡️ Security Analysis - -### Threat Model Updates - -**New Protections:** -- ✅ **Enhanced MITM Protection** - Triple-layer defense -- ✅ **Transport Security** - DTLS fingerprint verification -- ✅ **User Verification** - Human-readable SAS codes -- ✅ **Standards Compliance** - RFC-compliant protocols - -**Maintained Protections:** -- ✅ **Perfect Forward Secrecy** - Session-specific keys -- ✅ **Replay Protection** - Unique session identifiers -- ✅ **Race Condition Protection** - Mutex framework -- ✅ **Memory Safety** - Secure key storage - -### Security Rating - -**Previous Version (v4.02.442):** -- Security Level: High (PAKE + ASN.1) -- MITM Protection: Good -- Standards Compliance: Partial - -**Current Version (v4.02.985):** -- Security Level: Military-Grade (ECDH + DTLS + SAS) -- MITM Protection: Maximum -- Standards Compliance: Full RFC compliance - ---- - -## 📋 Migration Guide - -### For Developers - -**Breaking Changes:** -1. **PAKE API Removal** - All PAKE-related methods removed -2. **Message Type Changes** - New system message types -3. **Authentication Flow** - Complete rewrite of verification process - -**Required Updates:** -1. Remove any PAKE-related code -2. Update message handling for new system messages -3. Implement SAS verification UI -4. Update connection establishment logic - -### For Users - -**No Action Required:** -- Automatic update to new security system -- Improved user experience with SAS verification -- Better security with simplified interface - ---- - -## 🔮 Future Roadmap - -### v5.0 Post-Quantum (Planned) -- **Post-Quantum Cryptography** - NIST-approved algorithms -- **Hybrid Classical-Quantum** - Transitional security -- **Enhanced SAS** - Quantum-resistant verification - -### v4.03.x (Next) -- **Performance Optimizations** - Further speed improvements -- **Enhanced UI** - Better SAS verification experience -- **Additional Curves** - Support for more elliptic curves - ---- - -## 📞 Support - -**Security Issues:** security@securebit.chat -**Technical Support:** support@securebit.chat -**Documentation:** [GitHub Wiki](https://github.com/SecureBitChat/securebit-chat/wiki) - ---- - -**SecureBit.chat v4.02.985 - ECDH + DTLS + SAS** -*Military-grade security for the modern web* diff --git a/SECURITY_UPDATES_v4.1.md b/SECURITY_UPDATES_v4.1.md deleted file mode 100644 index 2ab72d8..0000000 --- a/SECURITY_UPDATES_v4.1.md +++ /dev/null @@ -1,159 +0,0 @@ -# SecureBit.chat Security Updates v4.1 - -## 🔒 Comprehensive Connection Security Overhaul - -### 🛡️ New Security Technologies Implemented - -#### 1. Advanced Mutex Framework (Layer 13) -- **Race Condition Protection:** Custom `_withMutex('connectionOperation')` with 15-second timeout -- **Atomic Operations:** Serialized connection operations to prevent conflicts -- **Multi-stage Validation:** Step-by-step validation with automatic rollback -- **Error Recovery:** `_cleanupFailedOfferCreation()` for failed operations -- **Diagnostic Capability:** Unique `operationId` tracking for precise error identification - -#### 2. Secure Key Storage System (Layer 14) -- **WeakMap Isolation:** Replaced public key properties with private `WeakMap`-based storage -- **Secure Access Methods:** `_getSecureKey()`, `_setSecureKey()`, `_initializeSecureKeyStorage()` -- **Key Validation:** `_validateKeyValue()` with type and format checking -- **Key Rotation:** `_rotateKeys()` with secure key replacement -- **Emergency Wipe:** `_emergencyKeyWipe()` for threat response -- **Backward Compatibility:** Getters/setters for existing code compatibility - -#### 3. Production Security Logging (Layer 15) -- **Environment Detection:** Automatic production vs development mode detection -- **Data Sanitization:** `_secureLog()` replacing `console.log` with sanitization -- **Log Level Control:** Production (warn+error only), Development (debug+) -- **Rate Limiting:** Automatic log spam prevention and cleanup -- **Privacy Protection:** Encryption keys, message content, and tokens are sanitized - -### 🔐 Security Benefits - -#### Enhanced Protection Against: -- **Race Conditions:** Timing-based attacks during key generation eliminated -- **Key Exposure:** Direct access to cryptographic keys prevented -- **Data Leakage:** Sensitive information protected in production logs -- **Memory Attacks:** Keys inaccessible via debugger or direct property access -- **Connection Conflicts:** Atomic connection establishment ensured - -#### Performance Impact: -- **Total Latency:** Increased by ~3.5ms (from 75ms to 78.5ms) -- **Memory Usage:** Minimal additional overhead -- **Throughput:** Maintained at ~500 messages/second -- **Efficiency:** 50% (excellent for security level provided) - -### 📊 Updated Security Architecture - -#### 15-Layer Defense System: -1. **Enhanced Authentication** (ECDSA P-384) -2. **Key Exchange** (ECDH P-384) -3. **Metadata Protection** (Separate AES-GCM) -4. **Message Encryption** (Enhanced AES-GCM) -5. **Nested Encryption** (Additional AES-GCM) -6. **Packet Padding** (Size Obfuscation) -7. **Anti-Fingerprinting** (Pattern Obfuscation) -8. **Packet Reordering Protection** (Sequence Security) -9. **Message Chunking** (Timing Analysis Protection) -10. **Fake Traffic Generation** (Traffic Analysis) -11. **Enhanced Rate Limiting** (DDoS Protection) -12. **Perfect Forward Secrecy** (Key Rotation) -13. **Mutex Framework** (Race Condition Protection) ⭐ NEW -14. **Secure Key Storage** (WeakMap Isolation) ⭐ NEW -15. **Production Security Logging** (Data Sanitization) ⭐ NEW - -### 🔄 Breaking Changes - -#### Connection Establishment: -- Now requires mutex coordination for all operations -- Automatic rollback on connection failures -- Enhanced error diagnostics with phase tracking - -#### Key Storage: -- Public key properties (`encryptionKey`, `macKey`, etc.) replaced with private storage -- All key access must go through secure methods -- Backward compatibility maintained through getters/setters - -#### Logging: -- `console.log` replaced with `_secureLog()` in production -- Sensitive data automatically sanitized -- Environment-aware logging behavior - -### 🚀 Implementation Details - -#### Mutex Framework Usage: -```javascript -await this._withMutex('connectionOperation', async () => { - const operationId = this._generateOperationId(); - try { - await this._generateEncryptionKeys(); - await this._validateConnectionParameters(); - await this._establishSecureChannel(); - } catch (error) { - await this._cleanupFailedOfferCreation(operationId); - throw error; - } -}); -``` - -#### Secure Key Storage Usage: -```javascript -// Initialize secure storage -this._initializeSecureKeyStorage(); - -// Secure key access -const encryptionKey = this._getSecureKey('encryptionKey'); -this._setSecureKey('encryptionKey', newKey, { validate: true }); - -// Emergency key wipe -this._emergencyKeyWipe(); -``` - -#### Production Logging Usage: -```javascript -// Secure logging with data sanitization -this._secureLog('debug', 'Connection established', { - userId: '[REDACTED]', - encryptionKey: '[REDACTED]', - messageContent: '[REDACTED]' -}); -``` - -### 📈 Security Metrics - -#### Threat Protection Enhancement: -- **Race Condition Attacks:** 100% prevention -- **Key Exposure:** 100% prevention -- **Data Leakage:** 100% prevention in production -- **Memory Attacks:** 100% prevention -- **Connection Conflicts:** 100% prevention - -#### Compliance Standards: -- ✅ **NIST SP 800-57:** Enhanced key management -- ✅ **FIPS 140-2 Level 2:** Cryptographic module security -- ✅ **GDPR:** Enhanced privacy protection -- ✅ **CCPA:** California privacy compliance -- ✅ **ISO 27001:** Information security management - -### 🔮 Future Enhancements - -#### Planned for v4.2: -- **AI-Powered Pattern Generation:** Machine learning fake traffic -- **Protocol Mimicry:** Disguise as common protocols (HTTP, DNS) -- **Adaptive Obfuscation:** Real-time pattern adjustment -- **Quantum Key Distribution:** Hardware-based key generation - -#### Long-term Roadmap: -- **Post-Quantum Cryptography:** CRYSTALS-Kyber and CRYSTALS-Dilithium -- **Advanced Traffic Obfuscation:** AI-powered pattern generation -- **Enhanced Perfect Forward Secrecy:** Every 1 minute key rotation - ---- - -**Version:** 4.1.223 -**Release Date:** January 15, 2025 -**Security Level:** Military-Grade (15 layers) -**Compatibility:** Backward compatible with v4.0.x -**Upgrade Required:** Recommended for all users - ---- - -*This update represents a significant advancement in secure communication technology, providing military-grade protection against the most sophisticated threats while maintaining excellent performance and user experience.* diff --git a/dist/app.js b/dist/app.js index 67feb58..114999f 100644 --- a/dist/app.js +++ b/dist/app.js @@ -8,12 +8,6 @@ var UniqueFeatureSlider = () => { title: "18-Layer Military Security", description: "Revolutionary defense system with ECDH P-384 + AES-GCM 256 + ECDSA + Complete ASN.1 Validation. Enhanced Security Edition provides military-grade protection exceeding government standards with complete key structure verification." }, - { - icon: "fas fa-bolt", - color: "yellow", - title: "Lightning Network Payments", - description: "First messenger with Lightning Network integration. Pay-per-session with satoshis via WebLN. Sustainable economic model without ads or data harvesting." - }, { icon: "fas fa-network-wired", color: "purple", @@ -68,7 +62,7 @@ var UniqueFeatureSlider = () => { React.createElement("p", { key: "subtitle", className: "text-secondary max-w-2xl mx-auto" - }, "The only messenger with military-grade cryptography and Lightning payments") + }, "The only messenger with military-grade cryptography") ]), React.createElement("div", { key: "slider-container", @@ -320,7 +314,7 @@ var ComparisonTable = () => { /* @__PURE__ */ React.createElement("td", { className: "p-4 text-center" }, /* @__PURE__ */ React.createElement("span", { className: `${getStatusIcon(feature.threema.status).color} text-2xl` }, getStatusIcon(feature.threema.status).icon)), /* @__PURE__ */ React.createElement("td", { className: "p-4 text-center" }, /* @__PURE__ */ React.createElement("span", { className: `${getStatusIcon(feature.session.status).color} text-2xl` }, getStatusIcon(feature.session.status).icon)) ), selectedFeature === featureIndex && /* @__PURE__ */ React.createElement("tr", { className: "border-b border-gray-700/30 bg-gradient-to-r from-gray-800/20 to-gray-900/20" }, /* @__PURE__ */ React.createElement("td", { className: "p-4 text-xs text-gray-400 font-medium" }, "Technical Details:"), /* @__PURE__ */ React.createElement("td", { className: "p-4 text-center" }, /* @__PURE__ */ React.createElement("div", { className: "text-xs text-orange-300 font-medium leading-relaxed max-w-32" }, feature.lockbit.detail)), /* @__PURE__ */ React.createElement("td", { className: "p-4 text-center" }, /* @__PURE__ */ React.createElement("div", { className: "text-xs text-blue-300 leading-relaxed max-w-32" }, feature.signal.detail)), /* @__PURE__ */ React.createElement("td", { className: "p-4 text-center" }, /* @__PURE__ */ React.createElement("div", { className: "text-xs text-green-300 leading-relaxed max-w-32" }, feature.threema.detail)), /* @__PURE__ */ React.createElement("td", { className: "p-4 text-center" }, /* @__PURE__ */ React.createElement("div", { className: "text-xs text-cyan-300 leading-relaxed max-w-32" }, feature.session.detail)))))) - )), /* @__PURE__ */ React.createElement("div", { className: "mt-8 grid grid-cols-2 md:grid-cols-4 gap-4 max-w-5xl mx-auto" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-center p-4 bg-yellow-500/10 border border-yellow-500/20 rounded-xl hover:bg-yellow-500/20 transition-colors" }, /* @__PURE__ */ React.createElement("span", { className: "text-yellow-400 mr-2 text-xl" }, "\u{1F3C6}"), /* @__PURE__ */ React.createElement("span", { className: "text-yellow-300 text-sm font-bold" }, "Category Leader")), /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-center p-4 bg-green-500/10 border border-green-500/20 rounded-xl hover:bg-green-500/20 transition-colors" }, /* @__PURE__ */ React.createElement("span", { className: "text-green-400 mr-2 text-xl" }, "\u2705"), /* @__PURE__ */ React.createElement("span", { className: "text-green-300 text-sm font-bold" }, "Excellent")), /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-center p-4 bg-yellow-500/10 border border-yellow-500/20 rounded-xl hover:bg-yellow-500/20 transition-colors" }, /* @__PURE__ */ React.createElement("span", { className: "text-yellow-400 mr-2 text-xl" }, "\u26A0\uFE0F"), /* @__PURE__ */ React.createElement("span", { className: "text-yellow-300 text-sm font-bold" }, "Partial/Limited")), /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-center p-4 bg-red-500/10 border border-red-500/20 rounded-xl hover:bg-red-500/20 transition-colors" }, /* @__PURE__ */ React.createElement("span", { className: "text-red-400 mr-2 text-xl" }, "\u274C"), /* @__PURE__ */ React.createElement("span", { className: "text-red-300 text-sm font-bold" }, "Not Available"))), /* @__PURE__ */ React.createElement("div", { className: "mt-10 space-y-6 max-w-6xl mx-auto" }, /* @__PURE__ */ React.createElement("div", { className: "p-6 bg-gradient-to-r from-orange-500/10 to-yellow-500/10 border border-orange-500/20 rounded-xl" }, /* @__PURE__ */ React.createElement("h4", { className: "text-xl font-bold text-orange-400 mb-4 flex items-center" }, /* @__PURE__ */ React.createElement("i", { className: "fas fa-trophy mr-3" }), "SecureBit.chat Enhanced Security Edition Summary"), /* @__PURE__ */ React.createElement("p", { className: "text-secondary leading-relaxed text-lg mb-4" }, "SecureBit.chat dominates in 11 out of 15 security categories, establishing itself as the most secure P2P messenger available. The Enhanced Security Edition introduces revolutionary 18-layer defense architecture with complete ASN.1 validation, Lightning Network integration, and military-grade cryptography that exceeds government and enterprise standards."), /* @__PURE__ */ React.createElement("div", { className: "grid md:grid-cols-2 gap-4 mt-6" }, /* @__PURE__ */ React.createElement("div", { className: "p-4 bg-orange-500/5 border border-orange-500/10 rounded-lg" }, /* @__PURE__ */ React.createElement("h5", { className: "text-orange-400 font-semibold mb-2" }, "\u{1F510} Cryptographic Superiority"), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-gray-300" }, "ECDH P-384 + AES-GCM 256 + ECDSA P-384 + Complete ASN.1 Validation with non-extractable keys and 18-layer defense system")), /* @__PURE__ */ React.createElement("div", { className: "p-4 bg-orange-500/5 border border-orange-500/10 rounded-lg" }, /* @__PURE__ */ React.createElement("h5", { className: "text-orange-400 font-semibold mb-2" }, "\u26A1 Lightning Integration"), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-gray-300" }, "First messenger with Lightning Network payments - sustainable economic model with instant satoshi transactions")), /* @__PURE__ */ React.createElement("div", { className: "p-4 bg-orange-500/5 border border-orange-500/10 rounded-lg" }, /* @__PURE__ */ React.createElement("h5", { className: "text-orange-400 font-semibold mb-2" }, "\u{1F310} True P2P Architecture"), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-gray-300" }, "Pure WebRTC connections with zero servers, impossible to censor or shutdown, complete anonymity")), /* @__PURE__ */ React.createElement("div", { className: "p-4 bg-orange-500/5 border border-orange-500/10 rounded-lg" }, /* @__PURE__ */ React.createElement("h5", { className: "text-orange-400 font-semibold mb-2" }, "\u{1F3AD} Traffic Obfuscation"), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-gray-300" }, "Advanced fake traffic generation, packet padding, and pattern masking defeat traffic analysis"))))), /* @__PURE__ */ React.createElement("div", { className: "mt-8 text-center" }, /* @__PURE__ */ React.createElement("div", { className: "inline-flex items-center px-6 py-3 bg-gray-800/50 border border-gray-600/30 rounded-xl" }, /* @__PURE__ */ React.createElement("span", { className: "text-orange-400 mr-2" }, "\u{1F680}"), /* @__PURE__ */ React.createElement("span", { className: "text-gray-300 text-sm" }, "Enhanced Security Edition v4.02.985 - ECDH + DTLS + SAS - "), /* @__PURE__ */ React.createElement("span", { className: "text-orange-400 font-semibold text-sm" }, "Active Production Release"), /* @__PURE__ */ React.createElement("span", { className: "text-gray-400 text-sm ml-2" }, " | Next: v5.0 Post-Quantum"))))); + )), /* @__PURE__ */ React.createElement("div", { className: "mt-8 grid grid-cols-2 md:grid-cols-4 gap-4 max-w-5xl mx-auto" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-center p-4 bg-yellow-500/10 border border-yellow-500/20 rounded-xl hover:bg-yellow-500/20 transition-colors" }, /* @__PURE__ */ React.createElement("span", { className: "text-yellow-400 mr-2 text-xl" }, "\u{1F3C6}"), /* @__PURE__ */ React.createElement("span", { className: "text-yellow-300 text-sm font-bold" }, "Category Leader")), /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-center p-4 bg-green-500/10 border border-green-500/20 rounded-xl hover:bg-green-500/20 transition-colors" }, /* @__PURE__ */ React.createElement("span", { className: "text-green-400 mr-2 text-xl" }, "\u2705"), /* @__PURE__ */ React.createElement("span", { className: "text-green-300 text-sm font-bold" }, "Excellent")), /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-center p-4 bg-yellow-500/10 border border-yellow-500/20 rounded-xl hover:bg-yellow-500/20 transition-colors" }, /* @__PURE__ */ React.createElement("span", { className: "text-yellow-400 mr-2 text-xl" }, "\u26A0\uFE0F"), /* @__PURE__ */ React.createElement("span", { className: "text-yellow-300 text-sm font-bold" }, "Partial/Limited")), /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-center p-4 bg-red-500/10 border border-red-500/20 rounded-xl hover:bg-red-500/20 transition-colors" }, /* @__PURE__ */ React.createElement("span", { className: "text-red-400 mr-2 text-xl" }, "\u274C"), /* @__PURE__ */ React.createElement("span", { className: "text-red-300 text-sm font-bold" }, "Not Available"))), /* @__PURE__ */ React.createElement("div", { className: "mt-10 space-y-6 max-w-6xl mx-auto" }, /* @__PURE__ */ React.createElement("div", { className: "p-6 bg-gradient-to-r from-orange-500/10 to-yellow-500/10 border border-orange-500/20 rounded-xl" }, /* @__PURE__ */ React.createElement("h4", { className: "text-xl font-bold text-orange-400 mb-4 flex items-center" }, /* @__PURE__ */ React.createElement("i", { className: "fas fa-trophy mr-3" }), "SecureBit.chat Enhanced Security Edition Summary"), /* @__PURE__ */ React.createElement("p", { className: "text-secondary leading-relaxed text-lg mb-4" }, "SecureBit.chat dominates in 11 out of 15 security categories, establishing itself as the most secure P2P messenger available. The Enhanced Security Edition introduces revolutionary 18-layer defense architecture with complete ASN.1 validation, and military-grade cryptography that exceeds government and enterprise standards."), /* @__PURE__ */ React.createElement("div", { className: "grid md:grid-cols-2 gap-4 mt-6" }, /* @__PURE__ */ React.createElement("div", { className: "p-4 bg-orange-500/5 border border-orange-500/10 rounded-lg" }, /* @__PURE__ */ React.createElement("h5", { className: "text-orange-400 font-semibold mb-2" }, "\u{1F510} Cryptographic Superiority"), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-gray-300" }, "ECDH P-384 + AES-GCM 256 + ECDSA P-384 + Complete ASN.1 Validation with non-extractable keys and 18-layer defense system")), /* @__PURE__ */ React.createElement("div", { className: "p-4 bg-orange-500/5 border border-orange-500/10 rounded-lg" }, /* @__PURE__ */ React.createElement("h5", { className: "text-orange-400 font-semibold mb-2" }, "\u{1F310} True P2P Architecture"), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-gray-300" }, "Pure WebRTC connections with zero servers, impossible to censor or shutdown, complete anonymity")), /* @__PURE__ */ React.createElement("div", { className: "p-4 bg-orange-500/5 border border-orange-500/10 rounded-lg" }, /* @__PURE__ */ React.createElement("h5", { className: "text-orange-400 font-semibold mb-2" }, "\u{1F3AD} Traffic Obfuscation"), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-gray-300" }, "Advanced fake traffic generation, packet padding, and pattern masking defeat traffic analysis"))))), /* @__PURE__ */ React.createElement("div", { className: "mt-8 text-center" }, /* @__PURE__ */ React.createElement("div", { className: "inline-flex items-center px-6 py-3 bg-gray-800/50 border border-gray-600/30 rounded-xl" }, /* @__PURE__ */ React.createElement("span", { className: "text-orange-400 mr-2" }, "\u{1F680}"), /* @__PURE__ */ React.createElement("span", { className: "text-gray-300 text-sm" }, "Enhanced Security Edition v4.02.985 - ECDH + DTLS + SAS - "), /* @__PURE__ */ React.createElement("span", { className: "text-orange-400 font-semibold text-sm" }, "Active Production Release"), /* @__PURE__ */ React.createElement("span", { className: "text-gray-400 text-sm ml-2" }, " | Next: v5.0 Post-Quantum"))))); }; function Roadmap() { const [selectedPhase, setSelectedPhase] = React.useState(null); @@ -413,7 +407,6 @@ function Roadmap() { "Complete ASN.1 DER validation", "OID and EC point verification", "SPKI structure validation", - "Lightning Network payments", "P2P WebRTC architecture", "Metadata protection", "100% open source code" @@ -465,7 +458,6 @@ function Roadmap() { "Signal Double Ratchet for groups", "Anonymous groups without metadata", "Ephemeral groups (disappear after session)", - "Group Lightning payments", "Cryptographic group administration", "Group member auditing" ] @@ -1218,348 +1210,6 @@ var EnhancedConnectionSetup = ({ ]), React.createElement("h4", { key: "title", className: "text-xs sm:text-sm font-medium text-primary mb-1" }, "ECDSA P-384 Signatures"), React.createElement("p", { key: "desc", className: "text-xs text-muted leading-tight" }, "Digital signatures for message integrity") - ]), - React.createElement("div", { key: "feature6", className: "text-center p-3 sm:p-4" }, [ - React.createElement("div", { key: "icon", className: "w-10 h-10 sm:w-12 sm:h-12 bg-yellow-500/10 border border-yellow-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3" }, [ - React.createElement("i", { className: "fas fa-bolt accent-yellow" }) - ]), - React.createElement("h4", { key: "title", className: "text-xs sm:text-sm font-medium text-primary mb-1" }, "Lightning Payments"), - React.createElement("p", { key: "desc", className: "text-xs text-muted leading-tight" }, "Pay-per-session via WebLN") - ]) - ]), - // Wallet Logos Section - React.createElement("div", { - key: "wallet-logos-section", - className: "mt-8" - }, [ - React.createElement("div", { - key: "wallet-logos-header", - className: "text-center mb-4" - }, [ - React.createElement("h3", { - key: "title", - className: "text-lg font-medium text-primary mb-2" - }, "Supported Lightning wallets"), - React.createElement("p", { - key: "subtitle", - className: "text-secondary text-sm" - }, "To pay for sessions, use any of the popular wallets.") - ]), - React.createElement("div", { - key: "wallet-logos-container", - className: "wallet-logos-container" - }, [ - React.createElement("div", { - key: "wallet-logos-track", - className: "wallet-logos-track" - }, [ - // First set of logos - React.createElement("a", { - key: "alby1-link", - href: "https://getalby.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo alby" - }, [ - React.createElement("img", { - key: "alby-img1", - src: "logo/alby.svg", - alt: "Alby Lightning Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "zeus1-link", - href: "https://zeusln.app", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo zeus" - }, [ - React.createElement("img", { - key: "zeus-img1", - src: "logo/zeus.svg", - alt: "Zeus Lightning Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "wos1-link", - href: "https://www.walletofsatoshi.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo wos" - }, [ - React.createElement("img", { - key: "wos-img1", - src: "logo/wos.svg", - alt: "Wallet of Satoshi", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "muun1-link", - href: "https://muun.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo muun" - }, [ - React.createElement("img", { - key: "muun-img1", - src: "logo/muun.svg", - alt: "Muun Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "atomic1-link", - href: "https://atomicwallet.io", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo atomic" - }, [ - React.createElement("img", { - key: "atomic-img1", - src: "logo/atomic.svg", - alt: "Atomic Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "breez1-link", - href: "https://breez.technology/mobile/", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo breez" - }, [ - React.createElement("img", { - key: "breez-img1", - src: "logo/breez.svg", - alt: "Breez Lightning Wallet" - }) - ]), - React.createElement("a", { - key: "lightning-labs1-link", - href: "https://lightning.engineering", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo lightning-labs" - }, [ - React.createElement("img", { - key: "lightning-labs-img1", - src: "logo/lightning-labs.svg", - alt: "Lightning Labs" - }) - ]), - React.createElement("a", { - key: "lnbits1-link", - href: "https://lnbits.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo lnbits" - }, [ - React.createElement("img", { - key: "lnbits-img1", - src: "logo/lnbits.svg", - alt: "LNbits", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "strike1-link", - href: "https://strike.me", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo strike" - }, [ - React.createElement("img", { - key: "strike-img1", - src: "logo/strike.svg", - alt: "Strike", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "impervious1-link", - href: "https://impervious.ai", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo impervious" - }, [ - React.createElement("img", { - key: "impervious-img1", - src: "logo/impervious.svg", - alt: "Impervious", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "bitcoin-lightning1-link", - href: "https://www.blink.sv/", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo bitcoin-lightning" - }, [ - React.createElement("img", { - key: "blink-img1", - src: "logo/blink.svg", - alt: "Blink Wallet", - className: "wallet-logo-img" - }) - ]), - // Second set of logos - React.createElement("a", { - key: "alby2-link", - href: "https://getalby.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo alby" - }, [ - React.createElement("img", { - key: "alby-img2", - src: "logo/alby.svg", - alt: "Alby Lightning Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "zeus2-link", - href: "https://zeusln.app", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo zeus" - }, [ - React.createElement("img", { - key: "zeus-img2", - src: "logo/zeus.svg", - alt: "Zeus Lightning Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "wos2-link", - href: "https://www.walletofsatoshi.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo wos" - }, [ - React.createElement("img", { - key: "wos-img2", - src: "logo/wos.svg", - alt: "Wallet of Satoshi", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "muun2-link", - href: "https://muun.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo muun" - }, [ - React.createElement("img", { - key: "muun-img2", - src: "logo/muun.svg", - alt: "Muun Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "atomic2-link", - href: "https://atomicwallet.io", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo atomic" - }, [ - React.createElement("img", { - key: "atomic-img2", - src: "logo/atomic.svg", - alt: "Atomic Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "breez2-link", - href: "https://breez.technology/mobile/", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo breez" - }, [ - React.createElement("img", { - key: "breez-img2", - src: "logo/breez.svg", - alt: "Breez Lightning Wallet" - }) - ]), - React.createElement("a", { - key: "lightning-labs2-link", - href: "https://lightning.engineering", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo lightning-labs" - }, [ - React.createElement("img", { - key: "lightning-labs-img2", - src: "logo/lightning-labs.svg", - alt: "Lightning Labs" - }) - ]), - React.createElement("a", { - key: "lnbits2-link", - href: "https://lnbits.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo lnbits" - }, [ - React.createElement("img", { - key: "lnbits-img2", - src: "logo/lnbits.svg", - alt: "LNbits", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "strike2-link", - href: "https://strike.me", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo strike" - }, [ - React.createElement("img", { - key: "strike-img2", - src: "logo/strike.svg", - alt: "Strike", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "impervious2-link", - href: "https://impervious.ai", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo impervious" - }, [ - React.createElement("img", { - key: "impervious-img2", - src: "logo/impervious.svg", - alt: "Impervious", - className: "wallet-logo-img" - }) - ]), - React.createElement("a", { - key: "bitcoin-lightning2-link", - href: "https://www.blink.sv/", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo bitcoin-lightning" - }, [ - React.createElement("img", { - key: "blink-img2", - src: "logo/blink.svg", - alt: "Blink Wallet", - className: "wallet-logo-img" - }) - ]) - ]) ]) ]), React.createElement(UniqueFeatureSlider, { key: "unique-features-slider" }), diff --git a/dist/app.js.map b/dist/app.js.map index 38be236..3d14bdb 100644 --- a/dist/app.js.map +++ b/dist/app.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/app.jsx"], - "sourcesContent": ["// QRScanner will be loaded as a script\n \n // Slider Component\n const UniqueFeatureSlider = () => {\n const [currentSlide, setCurrentSlide] = React.useState(0);\n \n const slides = [\n {\n icon: \"fas fa-shield-halved\",\n color: \"orange\",\n title: \"18-Layer Military Security\",\n description: \"Revolutionary defense system with ECDH P-384 + AES-GCM 256 + ECDSA + Complete ASN.1 Validation. Enhanced Security Edition provides military-grade protection exceeding government standards with complete key structure verification.\"\n },\n {\n icon: \"fas fa-bolt\",\n color: \"yellow\",\n title: \"Lightning Network Payments\",\n description: \"First messenger with Lightning Network integration. Pay-per-session with satoshis via WebLN. Sustainable economic model without ads or data harvesting.\"\n },\n {\n icon: \"fas fa-network-wired\",\n color: \"purple\",\n title: \"Pure P2P WebRTC Architecture\",\n description: \"Direct peer-to-peer connections without any servers. Impossible to censor, block, or monitor. Complete decentralization with zero infrastructure.\"\n },\n {\n icon: \"fas fa-sync-alt\",\n color: \"green\",\n title: \"Perfect Forward Secrecy\",\n description: \"Automatic key rotation every 5 minutes or 100 messages. Non-extractable keys with hardware protection ensure past messages remain secure.\"\n },\n {\n icon: \"fas fa-user-secret\",\n color: \"cyan\",\n title: \"Advanced Traffic Obfuscation\",\n description: \"Fake traffic generation, packet padding, and pattern masking make communication indistinguishable from random noise. Defeats traffic analysis.\"\n },\n {\n icon: \"fas fa-eye-slash\",\n color: \"blue\",\n title: \"Zero Data Collection\",\n description: \"No registration, no servers, no logs. Messages exist only in browser memory. Complete anonymity with instant anonymous channels.\"\n },\n {\n icon: \"fas fa-code\",\n color: \"emerald\",\n title: \"100% Open Source Security\",\n description: \"All code is open for audit under MIT license. Uses only standard WebCrypto APIs. Cryptography runs directly in browser without server dependencies.\"\n }\n ];\n \n const nextSlide = () => setCurrentSlide((prev) => (prev + 1) % slides.length);\n const prevSlide = () => setCurrentSlide((prev) => (prev - 1 + slides.length) % slides.length);\n const goToSlide = (index) => setCurrentSlide(index);\n \n React.useEffect(() => {\n const timer = setInterval(() => {\n nextSlide();\n }, 15000);\n return () => clearInterval(timer);\n }, []);\n \n return React.createElement('div', {\n className: \"mt-12\"\n }, [\n React.createElement('div', {\n key: 'header',\n className: \"text-center mb-8\"\n }, [\n React.createElement('h3', {\n key: 'title',\n className: \"text-2xl font-semibold text-primary mb-3\"\n }, 'Why SecureBit.chat is unique'),\n React.createElement('p', {\n key: 'subtitle',\n className: \"text-secondary max-w-2xl mx-auto\"\n }, 'The only messenger with military-grade cryptography and Lightning payments')\n ]),\n \n React.createElement('div', {\n key: 'slider-container',\n className: \"relative max-w-4xl mx-auto\"\n }, [\n React.createElement('div', {\n key: 'slider-wrapper',\n className: \"overflow-hidden rounded-xl\"\n }, [\n React.createElement('div', {\n key: 'slides',\n className: \"flex transition-transform duration-500 ease-in-out\",\n style: { transform: `translateX(-${currentSlide * 100}%)` }\n }, slides.map((slide, index) =>\n React.createElement('div', {\n key: index,\n className: \"w-full flex-shrink-0 px-4\"\n }, [\n React.createElement('div', {\n key: 'slide-content',\n className: \"card-minimal rounded-xl p-8 text-center min-h-[300px] flex flex-col justify-center relative overflow-hidden\"\n }, [\n // Background icon\n React.createElement('i', {\n key: 'bg-icon',\n className: `${slide.icon} absolute right-[-100px] top-1/2 -translate-y-1/2 opacity-10 text-[300px] pointer-events-none ${\n slide.color === 'orange' ? 'text-orange-500' :\n slide.color === 'yellow' ? 'text-yellow-500' :\n slide.color === 'purple' ? 'text-purple-500' :\n slide.color === 'green' ? 'text-green-500' :\n slide.color === 'cyan' ? 'text-cyan-500' :\n slide.color === 'blue' ? 'text-blue-500' :\n 'text-emerald-500'\n }`\n }),\n \n // Content\n React.createElement('h4', {\n key: 'slide-title',\n className: \"text-xl font-semibold text-primary mb-4 relative z-10\"\n }, slide.title),\n React.createElement('p', {\n key: 'slide-description',\n className: \"text-secondary leading-relaxed max-w-2xl mx-auto relative z-10\"\n }, slide.description)\n ])\n ])\n ))\n ]),\n \n // Navigation\n React.createElement('button', {\n key: 'prev-btn',\n onClick: prevSlide,\n className: \"absolute left-2 top-1/2 transform -translate-y-1/2 w-10 h-10 bg-gray-600/80 hover:bg-gray-500/80 text-white rounded-full flex items-center justify-center transition-all duration-200 z-10\"\n }, [\n React.createElement('i', {\n key: 'prev-icon',\n className: \"fas fa-chevron-left\"\n })\n ]),\n React.createElement('button', {\n key: 'next-btn',\n onClick: nextSlide,\n className: \"absolute right-2 top-1/2 transform -translate-y-1/2 w-10 h-10 bg-gray-600/80 hover:bg-gray-500/80 text-white rounded-full flex items-center justify-center transition-all duration-200 z-10\"\n }, [\n React.createElement('i', {\n key: 'next-icon',\n className: \"fas fa-chevron-right\"\n })\n ])\n ]),\n \n // Enhanced dots navigation (\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u044B\u0435 \u0442\u043E\u0447\u043A\u0438)\n React.createElement('div', {\n key: 'dots-container',\n className: \"flex justify-center space-x-3 mt-6\"\n }, slides.map((slide, index) =>\n React.createElement('button', {\n key: index,\n onClick: () => goToSlide(index),\n className: `relative group transition-all duration-300 ${\n index === currentSlide\n ? 'w-12 h-4 bg-orange-500 rounded-full'\n : 'w-4 h-4 bg-gray-600 hover:bg-gray-500 rounded-full hover:scale-125'\n }`\n }, [\n // Tooltip on hover\n React.createElement('div', {\n key: 'tooltip',\n className: \"absolute -top-10 left-1/2 transform -translate-x-1/2 bg-gray-800 text-white text-xs px-2 py-1 rounded opacity-0 group-hover:opacity-100 transition-opacity duration-200 whitespace-nowrap pointer-events-none\"\n }, slide.title)\n ])\n ))\n ]);\n };\n \n \n \n const ComparisonTable = () => {\n const [selectedFeature, setSelectedFeature] = React.useState(null);\n \n const messengers = [\n {\n name: \"SecureBit.chat\",\n logo:
\n \n
,\n type: \"P2P WebRTC\",\n version: \"Latest\",\n color: \"orange\",\n },\n {\n name: \"Signal\",\n logo: (\n \n \n \n \n ),\n type: \"Centralized\",\n version: \"Latest\",\n color: \"blue\",\n },\n {\n name: \"Threema\",\n logo: (\n \n \n \n \n \n \n \n ),\n type: \"Centralized\",\n version: \"Latest\",\n color: \"green\",\n },\n {\n name: \"Session\",\n logo: (\n \n \n \n \n ),\n type: \"Onion Network\",\n version: \"Latest\",\n color: \"cyan\",\n },\n ];\n \n const features = [\n {\n name: \"Security Architecture\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"18-layer military-grade defense system with complete ASN.1 validation\" },\n signal: { status: \"\u2705\", detail: \"Signal Protocol with double ratchet\" },\n threema: { status: \"\u2705\", detail: \"Standard security implementation\" },\n session: { status: \"\u2705\", detail: \"Modified Signal Protocol + Onion routing\" },\n },\n {\n name: \"Cryptography\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"ECDH P-384 + AES-GCM 256 + ECDSA P-384\" },\n signal: { status: \"\u2705\", detail: \"Signal Protocol + Double Ratchet\" },\n threema: { status: \"\u2705\", detail: \"NaCl + XSalsa20 + Poly1305\" },\n session: { status: \"\u2705\", detail: \"Modified Signal Protocol\" },\n },\n {\n name: \"Perfect Forward Secrecy\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Auto rotation every 5 minutes or 100 messages\" },\n signal: { status: \"\u2705\", detail: \"Double Ratchet algorithm\" },\n threema: { status: \"\u26A0\uFE0F\", detail: \"Partial (group chats)\" },\n session: { status: \"\u2705\", detail: \"Session Ratchet algorithm\" },\n },\n {\n name: \"Architecture\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Pure P2P WebRTC without servers\" },\n signal: { status: \"\u274C\", detail: \"Centralized Signal servers\" },\n threema: { status: \"\u274C\", detail: \"Threema servers in Switzerland\" },\n session: { status: \"\u26A0\uFE0F\", detail: \"Onion routing via network nodes\" },\n },\n {\n name: \"Registration Anonymity\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"No registration required, instant anonymous channels\" },\n signal: { status: \"\u274C\", detail: \"Phone number required\" },\n threema: { status: \"\u2705\", detail: \"ID generated locally\" },\n session: { status: \"\u2705\", detail: \"Random session ID\" },\n },\n {\n name: \"Payment Integration\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Lightning Network satoshis per session + WebLN\" },\n signal: { status: \"\u274C\", detail: \"No payment system\" },\n threema: { status: \"\u274C\", detail: \"No payment system\" },\n session: { status: \"\u274C\", detail: \"No payment system\" },\n },\n {\n name: \"Metadata Protection\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Full metadata encryption + traffic obfuscation\" },\n signal: { status: \"\u26A0\uFE0F\", detail: \"Sealed Sender (partial)\" },\n threema: { status: \"\u26A0\uFE0F\", detail: \"Minimal metadata\" },\n session: { status: \"\u2705\", detail: \"Onion routing hides metadata\" },\n },\n {\n name: \"Traffic Obfuscation\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Fake traffic + pattern masking + packet padding\" },\n signal: { status: \"\u274C\", detail: \"No traffic obfuscation\" },\n threema: { status: \"\u274C\", detail: \"No traffic obfuscation\" },\n session: { status: \"\u2705\", detail: \"Onion routing provides obfuscation\" },\n },\n {\n name: \"Open Source\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"100% open + auditable + MIT license\" },\n signal: { status: \"\u2705\", detail: \"Fully open\" },\n threema: { status: \"\u26A0\uFE0F\", detail: \"Only clients open\" },\n session: { status: \"\u2705\", detail: \"Fully open\" },\n },\n {\n name: \"MITM Protection\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Out-of-band verification + mutual auth + ECDSA\" },\n signal: { status: \"\u2705\", detail: \"Safety numbers verification\" },\n threema: { status: \"\u2705\", detail: \"QR code scanning\" },\n session: { status: \"\u26A0\uFE0F\", detail: \"Basic key verification\" },\n },\n {\n name: \"Economic Model\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Sustainable pay-per-session model\" },\n signal: { status: \"\u26A0\uFE0F\", detail: \"Donations and grants dependency\" },\n threema: { status: \"\u2705\", detail: \"One-time app purchase\" },\n session: { status: \"\u26A0\uFE0F\", detail: \"Donations dependency\" },\n },\n {\n name: \"Censorship Resistance\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Impossible to block P2P + no servers to target\" },\n signal: { status: \"\u26A0\uFE0F\", detail: \"Blocked in authoritarian countries\" },\n threema: { status: \"\u26A0\uFE0F\", detail: \"May be blocked\" },\n session: { status: \"\u2705\", detail: \"Onion routing bypasses blocks\" },\n },\n {\n name: \"Data Storage\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Zero data storage - only in browser memory\" },\n signal: { status: \"\u26A0\uFE0F\", detail: \"Local database storage\" },\n threema: { status: \"\u26A0\uFE0F\", detail: \"Local + optional backup\" },\n session: { status: \"\u26A0\uFE0F\", detail: \"Local database storage\" },\n },\n {\n name: \"Key Security\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Non-extractable keys + hardware protection\" },\n signal: { status: \"\u2705\", detail: \"Secure key storage\" },\n threema: { status: \"\u2705\", detail: \"Local key storage\" },\n session: { status: \"\u2705\", detail: \"Secure key storage\" },\n },\n {\n name: \"Post-Quantum Roadmap\",\n lockbit: { status: \"\u2705\", detail: \"Planned v5.0 - CRYSTALS-Kyber/Dilithium\" },\n signal: { status: \"\u26A0\uFE0F\", detail: \"PQXDH in development\" },\n threema: { status: \"\u274C\", detail: \"Not announced\" },\n session: { status: \"\u274C\", detail: \"Not announced\" },\n },\n ];\n \n const getStatusIcon = (status) => {\n const statusMap = {\n \"\uD83C\uDFC6\": { icon: \"\uD83C\uDFC6\", color: \"text-yellow-400\" },\n \"\u2705\": { icon: \"\u2705\", color: \"text-green-400\" },\n \"\u26A0\uFE0F\": { icon: \"\u26A0\uFE0F\", color: \"text-yellow-400\" },\n \"\u274C\": { icon: \"\u274C\", color: \"text-red-400\" },\n };\n return statusMap[status] || { icon: status, color: \"text-gray-400\" };\n };\n \n const toggleFeatureDetail = (index) => {\n setSelectedFeature(selectedFeature === index ? null : index);\n };\n \n return (\n
\n {/* Title */}\n
\n

\n Enhanced Security Edition Comparison\n

\n

\n Enhanced Security Edition vs leading secure messengers\n

\n
\n \uD83C\uDFC6\n \n Category Leader - Military-Grade Security\n \n
\n
\n \n {/* Table container */}\n
\n {/* Mobile Alert */}\n
\n

\n \uD83D\uDCA1 Rotate your device horizontally for better viewing\n

\n
\n \n {/* Table */}\n
\n \n {/* Table Header */}\n \n \n \n Security Criterion\n \n {messengers.map((messenger, index) => (\n \n
\n
{messenger.logo}
\n
\n {messenger.name}\n
\n
{messenger.type}
\n
{messenger.version}
\n
\n \n ))}\n \n \n \n {/* Table body*/}\n \n {features.map((feature, featureIndex) => (\n \n toggleFeatureDetail(featureIndex)}\n >\n \n
\n {feature.name}\n \n
\n \n \n \n {getStatusIcon(feature.lockbit.status).icon}\n \n \n \n \n {getStatusIcon(feature.signal.status).icon}\n \n \n \n \n {getStatusIcon(feature.threema.status).icon}\n \n \n \n \n {getStatusIcon(feature.session.status).icon}\n \n \n \n \n {/* Details */}\n {selectedFeature === featureIndex && (\n \n Technical Details:\n \n
\n {feature.lockbit.detail}\n
\n \n \n
\n {feature.signal.detail}\n
\n \n \n
\n {feature.threema.detail}\n
\n \n \n
\n {feature.session.detail}\n
\n \n \n )}\n
\n ))}\n \n \n
\n \n {/* Legend */}\n
\n
\n \uD83C\uDFC6\n Category Leader\n
\n
\n \u2705\n Excellent\n
\n
\n \u26A0\uFE0F\n Partial/Limited\n
\n
\n \u274C\n Not Available\n
\n
\n \n {/* Legend */}\n
\n
\n

\n \n SecureBit.chat Enhanced Security Edition Summary\n

\n

\n SecureBit.chat dominates in 11 out of 15 security categories, establishing itself as the most secure P2P messenger available.\n The Enhanced Security Edition introduces revolutionary 18-layer defense architecture with complete ASN.1 validation, Lightning Network integration, and military-grade cryptography that exceeds government and enterprise standards.\n

\n
\n
\n
\uD83D\uDD10 Cryptographic Superiority
\n

\n ECDH P-384 + AES-GCM 256 + ECDSA P-384 + Complete ASN.1 Validation with non-extractable keys and 18-layer defense system\n

\n
\n
\n
\u26A1 Lightning Integration
\n

\n First messenger with Lightning Network payments - sustainable economic model with instant satoshi transactions\n

\n
\n
\n
\uD83C\uDF10 True P2P Architecture
\n

\n Pure WebRTC connections with zero servers, impossible to censor or shutdown, complete anonymity\n

\n
\n
\n
\uD83C\uDFAD Traffic Obfuscation
\n

\n Advanced fake traffic generation, packet padding, and pattern masking defeat traffic analysis\n

\n
\n
\n
\n
\n \n {/* Version information */}\n
\n
\n \uD83D\uDE80\n Enhanced Security Edition v4.02.985 - ECDH + DTLS + SAS - \n Active Production Release\n | Next: v5.0 Post-Quantum\n
\n
\n
\n
\n );\n };\n \n function Roadmap() {\n const [selectedPhase, setSelectedPhase] = React.useState(null);\n const phases = [\n {\n version: \"v1.0\",\n title: \"Start of Development\",\n status: \"done\",\n date: \"Early 2025\",\n description: \"Idea, prototype, and infrastructure setup\",\n features: [\n \"Concept and requirements formation\",\n \"Stack selection: WebRTC, P2P, cryptography\",\n \"First messaging prototypes\",\n \"Repository creation and CI\",\n \"Basic encryption architecture\",\n \"UX/UI design\"\n ]\n },\n {\n version: \"v1.5\",\n title: \"Alpha Release\",\n status: \"done\",\n date: \"Spring 2025\",\n description: \"First public alpha: basic chat and key exchange\",\n features: [\n \"Basic P2P messaging via WebRTC\",\n \"Simple E2E encryption (demo scheme)\",\n \"Stable signaling and reconnection\",\n \"Minimal UX for testing\",\n \"Feedback collection from early testers\"\n ]\n },\n {\n version: \"v2.0\",\n title: \"Security Hardened\",\n status: \"done\",\n date: \"Summer 2025\",\n description: \"Security strengthening and stable branch release\",\n features: [\n \"ECDH/ECDSA implementation in production\",\n \"Perfect Forward Secrecy and key rotation\",\n \"Improved authentication checks\",\n \"File encryption and large payload transfers\",\n \"Audit of basic cryptoprocesses\"\n ]\n },\n {\n version: \"v3.0\",\n title: \"Scaling & Stability\",\n status: \"done\",\n date: \"Fall 2025\",\n description: \"Network scaling and stability improvements\",\n features: [\n \"Optimization of P2P connections and NAT traversal\",\n \"Reconnection mechanisms and message queues\",\n \"Reduced battery consumption on mobile\",\n \"Support for multi-device synchronization\",\n \"Monitoring and logging tools for developers\"\n ]\n },\n {\n version: \"v3.5\",\n title: \"Privacy-first Release\",\n status: \"done\",\n date: \"Winter 2025\",\n description: \"Focus on privacy: minimizing metadata\",\n features: [\n \"Metadata protection and fingerprint reduction\",\n \"Experiments with onion routing and DHT\",\n \"Options for anonymous connections\",\n \"Preparation for open code audit\",\n \"Improved user verification processes\"\n ]\n },\n \n // current and future phases\n {\n version: \"v4.02.985\",\n title: \"Enhanced Security Edition\",\n status: \"current\",\n date: \"Now\",\n description: \"Current version with ECDH + DTLS + SAS security, 18-layer military-grade cryptography and complete ASN.1 validation\",\n features: [\n \"ECDH + DTLS + SAS triple-layer security\",\n \"ECDH P-384 + AES-GCM 256-bit encryption\",\n \"DTLS fingerprint verification\",\n \"SAS (Short Authentication String) verification\",\n \"Perfect Forward Secrecy with key rotation\",\n \"Enhanced MITM attack prevention\",\n \"Complete ASN.1 DER validation\",\n \"OID and EC point verification\",\n \"SPKI structure validation\",\n \"Lightning Network payments\",\n \"P2P WebRTC architecture\",\n \"Metadata protection\",\n \"100% open source code\"\n ]\n },\n {\n version: \"v4.5\",\n title: \"Mobile & Desktop Edition\",\n status: \"development\",\n date: \"Q2 2025\",\n description: \"Native apps for all platforms\",\n features: [\n \"PWA app for mobile\",\n \"Electron app for desktop\",\n \"Real-time notifications\",\n \"Automatic reconnection\",\n \"Battery optimization\",\n \"Cross-device synchronization\",\n \"Improved UX/UI\",\n \"Support for files up to 100MB\"\n ]\n },\n {\n version: \"v5.0\",\n title: \"Quantum-Resistant Edition\",\n status: \"planned\",\n date: \"Q4 2025\",\n description: \"Protection against quantum computers\",\n features: [\n \"Post-quantum cryptography CRYSTALS-Kyber\",\n \"SPHINCS+ digital signatures\",\n \"Hybrid scheme: classic + PQ\",\n \"Quantum-safe key exchange\",\n \"Updated hashing algorithms\",\n \"Migration of existing sessions\",\n \"Compatibility with v4.x\",\n \"Quantum-resistant protocols\"\n ]\n },\n {\n version: \"v5.5\",\n title: \"Group Communications\",\n status: \"planned\",\n date: \"Q2 2026\",\n description: \"Group chats with preserved privacy\",\n features: [\n \"P2P group connections up to 8 participants\",\n \"Mesh networking for groups\",\n \"Signal Double Ratchet for groups\",\n \"Anonymous groups without metadata\",\n \"Ephemeral groups (disappear after session)\",\n \"Group Lightning payments\",\n \"Cryptographic group administration\",\n \"Group member auditing\"\n ]\n },\n {\n version: \"v6.0\",\n title: \"Decentralized Network\",\n status: \"research\",\n date: \"2027\",\n description: \"Fully decentralized network\",\n features: [\n \"LockBit node mesh network\",\n \"DHT for peer discovery\",\n \"Built-in onion routing\",\n \"Tokenomics and node incentives\",\n \"Governance via DAO\",\n \"Interoperability with other networks\",\n \"Cross-platform compatibility\",\n \"Self-healing network\"\n ]\n },\n {\n version: \"v7.0\",\n title: \"AI Privacy Assistant\",\n status: \"research\",\n date: \"2028+\",\n description: \"AI for privacy and security\",\n features: [\n \"Local AI threat analysis\",\n \"Automatic MITM detection\",\n \"Adaptive cryptography\",\n \"Personalized security recommendations\",\n \"Zero-knowledge machine learning\",\n \"Private AI assistant\",\n \"Predictive security\",\n \"Autonomous attack protection\"\n ]\n }\n ];\n \n \n const getStatusConfig = (status) => {\n switch (status) {\n case 'current':\n return {\n color: 'green',\n bgClass: 'bg-green-500/10 border-green-500/20',\n textClass: 'text-green-400',\n icon: 'fas fa-check-circle',\n label: 'Current Version'\n };\n case 'development':\n return {\n color: 'orange',\n bgClass: 'bg-orange-500/10 border-orange-500/20',\n textClass: 'text-orange-400',\n icon: 'fas fa-code',\n label: 'In Development'\n };\n case 'planned':\n return {\n color: 'blue',\n bgClass: 'bg-blue-500/10 border-blue-500/20',\n textClass: 'text-blue-400',\n icon: 'fas fa-calendar-alt',\n label: 'Planned'\n };\n case 'research':\n return {\n color: 'purple',\n bgClass: 'bg-purple-500/10 border-purple-500/20',\n textClass: 'text-purple-400',\n icon: 'fas fa-flask',\n label: 'Research'\n };\n case 'done':\n return {\n color: 'gray',\n bgClass: 'bg-gray-500/10 border-gray-500/20',\n textClass: 'text-gray-300',\n icon: 'fas fa-flag-checkered',\n label: 'Released'\n };\n default:\n return {\n color: 'gray',\n bgClass: 'bg-gray-500/10 border-gray-500/20',\n textClass: 'text-gray-400',\n icon: 'fas fa-question',\n label: 'Unknown'\n };\n }\n };\n \n \n const togglePhaseDetail = (index) => {\n setSelectedPhase(selectedPhase === index ? null : index);\n };\n return (\n
\n
\n

\n Development Roadmap\n

\n

\n Evolution of SecureBit.chat : from initial development to quantum-resistant decentralized network with complete ASN.1 validation\n

\n \n \n \n Click on a version for details\n \n
\n
\n \n
\n
\n {/* The line has been removed */}\n \n
\n {phases.map((phase, index) => {\n const statusConfig = getStatusConfig(phase.status);\n const isExpanded = selectedPhase === index;\n \n return (\n
\n {/* The dots are visible only on sm and larger screens */}\n \n togglePhaseDetail(index)}\n key={`phase-button-${index}`}\n className={`card-minimal rounded-xl p-4 text-left w-full transition-all duration-300 ${\n isExpanded\n ? \"ring-2 ring-\" + statusConfig.color + \"-500/30\"\n : \"\"\n }`}\n >\n \n \n \n \n {phase.version}\n \n
\n \n
\n \n {phase.title}\n \n \n {phase.description}\n

\n
\n
\n \n \n \n \n \n {statusConfig.label}\n \n
\n \n
{phase.date}
\n \n
\n \n \n {isExpanded && (\n \n \n \n Key features:\n \n \n \n {phase.features.map((feature, featureIndex) => (\n \n \n \n {feature}\n \n \n ))}\n \n \n )}\n \n \n );\n })}\n \n \n \n \n
\n \n \n Join the future of privacy\n \n

\n SecureBit.chat grows thanks to the community. Your ideas and feedback help shape the future of secure communication with complete ASN.1 validation.\n

\n \n \n \n \n GitHub Repository\n \n \n \n \n Feedback\n \n
\n \n \n \n );\n }\n \n \n // Enhanced Copy Button with better UX\n const EnhancedCopyButton = ({ text, className = \"\", children }) => {\n const [copied, setCopied] = React.useState(false);\n \n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n console.error('Copy failed:', error);\n // Fallback for older browsers\n const textArea = document.createElement('textarea');\n textArea.value = text;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n };\n \n return React.createElement('button', {\n onClick: handleCopy,\n className: `${className} transition-all duration-200`\n }, [\n React.createElement('i', {\n key: 'icon',\n className: `${copied ? 'fas fa-check accent-green' : 'fas fa-copy text-secondary'} mr-2`\n }),\n copied ? 'Copied!' : children\n ]);\n };\n \n // Verification Component\n const VerificationStep = ({ verificationCode, onConfirm, onReject, localConfirmed, remoteConfirmed, bothConfirmed }) => {\n return React.createElement('div', {\n className: \"card-minimal rounded-xl p-6 border-purple-500/20\"\n }, [\n React.createElement('div', {\n key: 'header',\n className: \"flex items-center mb-4\"\n }, [\n React.createElement('div', {\n key: 'icon',\n className: \"w-10 h-10 bg-purple-500/10 border border-purple-500/20 rounded-lg flex items-center justify-center mr-3\"\n }, [\n React.createElement('i', {\n className: 'fas fa-shield-alt accent-purple'\n })\n ]),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-medium text-primary\"\n }, \"Security verification\")\n ]),\n React.createElement('div', {\n key: 'content',\n className: \"space-y-4\"\n }, [\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-sm\"\n }, \"Verify the security code with your contact via another communication channel (voice, SMS, etc.):\"),\n React.createElement('div', {\n key: 'code-display',\n className: \"text-center\"\n }, [\n React.createElement('div', {\n key: 'code',\n className: \"verification-code text-2xl py-4\"\n }, verificationCode)\n ]),\n // Verification status indicators\n React.createElement('div', {\n key: 'verification-status',\n className: \"space-y-2\"\n }, [\n React.createElement('div', {\n key: 'local-status',\n className: `flex items-center justify-between p-2 rounded-lg ${localConfirmed ? 'bg-green-500/10 border border-green-500/20' : 'bg-gray-500/10 border border-gray-500/20'}`\n }, [\n React.createElement('span', {\n key: 'local-label',\n className: \"text-sm text-secondary\"\n }, \"Your confirmation:\"),\n React.createElement('div', {\n key: 'local-indicator',\n className: \"flex items-center\"\n }, [\n React.createElement('i', {\n key: 'local-icon',\n className: `fas ${localConfirmed ? 'fa-check-circle text-green-400' : 'fa-clock text-gray-400'} mr-2`\n }),\n React.createElement('span', {\n key: 'local-text',\n className: `text-sm ${localConfirmed ? 'text-green-400' : 'text-gray-400'}`\n }, localConfirmed ? 'Confirmed' : 'Pending')\n ])\n ]),\n React.createElement('div', {\n key: 'remote-status',\n className: `flex items-center justify-between p-2 rounded-lg ${remoteConfirmed ? 'bg-green-500/10 border border-green-500/20' : 'bg-gray-500/10 border border-gray-500/20'}`\n }, [\n React.createElement('span', {\n key: 'remote-label',\n className: \"text-sm text-secondary\"\n }, \"Peer confirmation:\"),\n React.createElement('div', {\n key: 'remote-indicator',\n className: \"flex items-center\"\n }, [\n React.createElement('i', {\n key: 'remote-icon',\n className: `fas ${remoteConfirmed ? 'fa-check-circle text-green-400' : 'fa-clock text-gray-400'} mr-2`\n }),\n React.createElement('span', {\n key: 'remote-text',\n className: `text-sm ${remoteConfirmed ? 'text-green-400' : 'text-gray-400'}`\n }, remoteConfirmed ? 'Confirmed' : 'Pending')\n ])\n ])\n ]),\n React.createElement('div', {\n key: 'warning',\n className: \"p-3 bg-yellow-500/10 border border-yellow-500/20 rounded-lg\"\n }, [\n React.createElement('p', {\n className: \"text-yellow-400 text-sm flex items-center\"\n }, [\n React.createElement('i', {\n className: 'fas fa-exclamation-triangle mr-2'\n }),\n 'Make sure the codes match exactly.!'\n ])\n ]),\n React.createElement('div', {\n key: 'buttons',\n className: \"flex space-x-3\"\n }, [\n React.createElement('button', {\n key: 'confirm',\n onClick: onConfirm,\n disabled: localConfirmed,\n className: `flex-1 py-3 px-4 rounded-lg font-medium transition-all duration-200 ${localConfirmed ? 'bg-gray-500/20 text-gray-400 cursor-not-allowed' : 'btn-verify text-white'}`\n }, [\n React.createElement('i', {\n className: `fas ${localConfirmed ? 'fa-check-circle' : 'fa-check'} mr-2`\n }),\n localConfirmed ? 'Confirmed' : 'The codes match'\n ]),\n React.createElement('button', {\n key: 'reject',\n onClick: onReject,\n className: \"flex-1 bg-red-500/10 hover:bg-red-500/20 text-red-400 border border-red-500/20 py-3 px-4 rounded-lg font-medium transition-all duration-200\"\n }, [\n React.createElement('i', {\n className: 'fas fa-times mr-2'\n }),\n 'The codes do not match'\n ])\n ])\n ])\n ]);\n };\n \n // Enhanced Chat Message with better security indicators\n const EnhancedChatMessage = ({ message, type, timestamp }) => {\n const formatTime = (ts) => {\n return new Date(ts).toLocaleTimeString('ru-RU', { \n hour: '2-digit', \n minute: '2-digit',\n second: '2-digit'\n });\n };\n \n const getMessageStyle = () => {\n switch (type) {\n case 'sent':\n return {\n container: \"ml-auto bg-orange-500/15 border-orange-500/20 text-primary\",\n icon: \"fas fa-lock accent-orange\",\n label: \"Encrypted\"\n };\n case 'received':\n return {\n container: \"mr-auto card-minimal text-primary\",\n icon: \"fas fa-unlock-alt accent-green\",\n label: \"Decrypted\"\n };\n case 'system':\n return {\n container: \"mx-auto bg-yellow-500/10 border border-yellow-500/20 text-yellow-400\",\n icon: \"fas fa-info-circle accent-yellow\",\n label: \"System\"\n };\n default:\n return {\n container: \"mx-auto card-minimal text-secondary\",\n icon: \"fas fa-circle text-muted\",\n label: \"Unknown\"\n };\n }\n };\n \n const style = getMessageStyle();\n \n return React.createElement('div', {\n className: `message-slide mb-3 p-3 rounded-lg max-w-md break-words ${style.container} border`\n }, [\n React.createElement('div', {\n key: 'content',\n className: \"flex items-start space-x-2\"\n }, [\n React.createElement('i', {\n key: 'icon',\n className: `${style.icon} text-sm mt-0.5 opacity-70`\n }),\n React.createElement('div', {\n key: 'text',\n className: \"flex-1\"\n }, [\n React.createElement('div', {\n key: 'message',\n className: \"text-sm\"\n }, message),\n timestamp && React.createElement('div', {\n key: 'meta',\n className: \"flex items-center justify-between mt-1 text-xs opacity-50\"\n }, [\n React.createElement('span', {\n key: 'time'\n }, formatTime(timestamp)),\n React.createElement('span', {\n key: 'status',\n className: \"text-xs\"\n }, style.label)\n ])\n ])\n ])\n ]);\n };\n \n // Enhanced Connection Setup with verification\n const EnhancedConnectionSetup = ({\n messages, \n onCreateOffer, \n onCreateAnswer, \n onConnect, \n onClearData,\n onVerifyConnection,\n connectionStatus,\n offerData,\n answerData,\n offerInput,\n setOfferInput,\n answerInput,\n setAnswerInput,\n showOfferStep,\n showAnswerStep,\n verificationCode,\n showVerification,\n showQRCode,\n qrCodeUrl,\n showQRScanner,\n setShowQRCode,\n setShowQRScanner,\n setShowQRScannerModal,\n offerPassword,\n answerPassword,\n localVerificationConfirmed,\n remoteVerificationConfirmed,\n bothVerificationsConfirmed\n }) => {\n const [mode, setMode] = React.useState('select');\n \n const resetToSelect = () => {\n setMode('select');\n onClearData();\n };\n \n const handleVerificationConfirm = () => {\n onVerifyConnection(true);\n };\n \n const handleVerificationReject = () => {\n onVerifyConnection(false);\n };\n \n if (showVerification) {\n return React.createElement('div', {\n className: \"min-h-[calc(100vh-104px)] flex items-center justify-center p-4\"\n }, [\n React.createElement('div', {\n key: 'verification',\n className: \"w-full max-w-md\"\n }, [\n React.createElement(VerificationStep, {\n verificationCode: verificationCode,\n onConfirm: handleVerificationConfirm,\n onReject: handleVerificationReject,\n localConfirmed: localVerificationConfirmed,\n remoteConfirmed: remoteVerificationConfirmed,\n bothConfirmed: bothVerificationsConfirmed\n })\n ])\n ]);\n }\n \n if (mode === 'select') {\n return React.createElement('div', {\n className: \"min-h-[calc(100vh-104px)] flex items-center justify-center p-4\"\n }, [\n React.createElement('div', {\n key: 'selector',\n className: \"w-full max-w-4xl\"\n }, [\n React.createElement('div', {\n key: 'header',\n className: \"text-center mb-8\"\n }, [\n React.createElement('h2', {\n key: 'title',\n className: \"text-2xl font-semibold text-primary mb-3\"\n }, 'Start secure communication'),\n React.createElement('p', {\n key: 'subtitle',\n className: \"text-secondary max-w-2xl mx-auto\"\n }, \"Choose a connection method for a secure channel with ECDH encryption and Perfect Forward Secrecy.\")\n ]),\n \n React.createElement('div', {\n key: 'options',\n className: \"grid md:grid-cols-2 gap-6 max-w-3xl mx-auto\"\n }, [\n // Create Connection\n React.createElement('div', {\n key: 'create',\n onClick: () => setMode('create'),\n className: \"card-minimal rounded-xl p-6 cursor-pointer group\"\n }, [\n React.createElement('div', {\n key: 'icon',\n className: \"w-12 h-12 bg-blue-500/10 border border-blue-500/20 rounded-lg flex items-center justify-center mx-auto mb-4\"\n }, [\n React.createElement('i', {\n className: 'fas fa-plus text-xl text-blue-400'\n })\n ]),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-semibold text-primary text-center mb-3\"\n }, \"Create channel\"),\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-center text-sm mb-4\"\n }, \"Initiate a new secure connection with encrypted exchange\"),\n React.createElement('div', {\n key: 'features',\n className: \"space-y-2\"\n }, [\n React.createElement('div', {\n key: 'f1',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-key accent-orange mr-2 text-xs'\n }),\n 'Generating ECDH keys'\n ]),\n React.createElement('div', {\n key: 'f2',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-shield-alt accent-orange mr-2 text-xs'\n }),\n 'Verification code'\n ]),\n React.createElement('div', {\n key: 'f3',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-sync-alt accent-purple mr-2 text-xs'\n }),\n 'PFS key rotation'\n ])\n ])\n ]),\n \n // Join Connection\n React.createElement('div', {\n key: 'join',\n onClick: () => setMode('join'),\n className: \"card-minimal rounded-xl p-6 cursor-pointer group\"\n }, [\n React.createElement('div', {\n key: 'icon',\n className: \"w-12 h-12 bg-green-500/10 border border-green-500/20 rounded-lg flex items-center justify-center mx-auto mb-4\"\n }, [\n React.createElement('i', {\n className: 'fas fa-link text-xl accent-green'\n })\n ]),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-semibold text-primary text-center mb-3\"\n }, \"Join\"),\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-center text-sm mb-4\"\n }, \"Connect to an existing secure channel\"),\n React.createElement('div', {\n key: 'features',\n className: \"space-y-2\"\n }, [\n React.createElement('div', {\n key: 'f1',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-paste accent-green mr-2 text-xs'\n }),\n 'Paste Offer invitation'\n ]),\n React.createElement('div', {\n key: 'f2',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-check-circle accent-green mr-2 text-xs'\n }),\n 'Automatic verification'\n ]),\n React.createElement('div', {\n key: 'f3',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-sync-alt accent-purple mr-2 text-xs'\n }),\n 'PFS protection'\n ])\n ])\n ])\n ]),\n \n \n React.createElement('div', {\n key: 'security-features',\n className: \"grid grid-cols-2 md:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4 max-w-6xl mx-auto mt-8\"\n }, [\n React.createElement('div', { key: 'feature1', className: \"text-center p-3 sm:p-4\" }, [\n React.createElement('div', { key: 'icon', className: \"w-10 h-10 sm:w-12 sm:h-12 bg-green-500/10 border border-green-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3\" }, [\n React.createElement('i', { className: 'fas fa-key accent-green' })\n ]),\n React.createElement('h4', { key: 'title', className: \"text-xs sm:text-sm font-medium text-primary mb-1\" }, \"ECDH P-384 Key Exchange\"),\n React.createElement('p', { key: 'desc', className: \"text-xs text-muted leading-tight\" }, \"Military-grade elliptic curve key exchange\")\n ]),\n React.createElement('div', { key: 'feature2', className: \"text-center p-3 sm:p-4\" }, [\n React.createElement('div', { key: 'icon', className: \"w-10 h-10 sm:w-12 sm:h-12 bg-purple-500/10 border border-purple-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3\" }, [\n React.createElement('i', { className: 'fas fa-user-shield accent-purple' })\n ]),\n React.createElement('h4', { key: 'title', className: \"text-xs sm:text-sm font-medium text-primary mb-1\" }, \"MITM Protection\"),\n React.createElement('p', { key: 'desc', className: \"text-xs text-muted leading-tight\" }, \"Out-of-band verification against attacks\")\n ]),\n React.createElement('div', { key: 'feature3', className: \"text-center p-3 sm:p-4\" }, [\n React.createElement('div', { key: 'icon', className: \"w-10 h-10 sm:w-12 sm:h-12 bg-orange-500/10 border border-orange-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3\" }, [\n React.createElement('i', { className: 'fas fa-lock accent-orange' })\n ]),\n React.createElement('h4', { key: 'title', className: \"text-xs sm:text-sm font-medium text-primary mb-1\" }, \"AES-GCM 256 Encryption\"),\n React.createElement('p', { key: 'desc', className: \"text-xs text-muted leading-tight\" }, \"Authenticated encryption standard\")\n ]),\n React.createElement('div', { key: 'feature4', className: \"text-center p-3 sm:p-4\" }, [\n React.createElement('div', { key: 'icon', className: \"w-10 h-10 sm:w-12 sm:h-12 bg-cyan-500/10 border border-cyan-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3\" }, [\n React.createElement('i', { className: 'fas fa-sync-alt accent-cyan' })\n ]),\n React.createElement('h4', { key: 'title', className: \"text-xs sm:text-sm font-medium text-primary mb-1\" }, \"Perfect Forward Secrecy\"),\n React.createElement('p', { key: 'desc', className: \"text-xs text-muted leading-tight\" }, \"Automatic key rotation every 5 minutes\")\n ]),\n React.createElement('div', { key: 'feature5', className: \"text-center p-3 sm:p-4\" }, [\n React.createElement('div', { key: 'icon', className: \"w-10 h-10 sm:w-12 sm:h-12 bg-blue-500/10 border border-blue-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3\" }, [\n React.createElement('i', { className: 'fas fa-signature accent-blue' })\n ]),\n React.createElement('h4', { key: 'title', className: \"text-xs sm:text-sm font-medium text-primary mb-1\" }, \"ECDSA P-384 Signatures\"),\n React.createElement('p', { key: 'desc', className: \"text-xs text-muted leading-tight\" }, \"Digital signatures for message integrity\")\n ]),\n React.createElement('div', { key: 'feature6', className: \"text-center p-3 sm:p-4\" }, [\n React.createElement('div', { key: 'icon', className: \"w-10 h-10 sm:w-12 sm:h-12 bg-yellow-500/10 border border-yellow-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3\" }, [\n React.createElement('i', { className: 'fas fa-bolt accent-yellow' })\n ]),\n React.createElement('h4', { key: 'title', className: \"text-xs sm:text-sm font-medium text-primary mb-1\" }, \"Lightning Payments\"),\n React.createElement('p', { key: 'desc', className: \"text-xs text-muted leading-tight\" }, \"Pay-per-session via WebLN\")\n ])\n ]),\n \n // Wallet Logos Section\n React.createElement('div', {\n key: 'wallet-logos-section',\n className: \"mt-8\"\n }, [\n React.createElement('div', {\n key: 'wallet-logos-header',\n className: \"text-center mb-4\"\n }, [\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-medium text-primary mb-2\"\n }, \"Supported Lightning wallets\"),\n React.createElement('p', {\n key: 'subtitle',\n className: \"text-secondary text-sm\"\n }, \"To pay for sessions, use any of the popular wallets.\")\n ]),\n React.createElement('div', {\n key: 'wallet-logos-container',\n className: \"wallet-logos-container\"\n }, [\n React.createElement('div', {\n key: 'wallet-logos-track',\n className: \"wallet-logos-track\"\n }, [\n // First set of logos\n React.createElement('a', { \n key: 'alby1-link', \n href: \"https://getalby.com\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo alby\"\n }, [\n React.createElement('img', {\n key: 'alby-img1',\n src: \"logo/alby.svg\",\n alt: \"Alby Lightning Wallet\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'zeus1-link', \n href: \"https://zeusln.app\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo zeus\"\n }, [\n React.createElement('img', {\n key: 'zeus-img1',\n src: \"logo/zeus.svg\",\n alt: \"Zeus Lightning Wallet\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'wos1-link', \n href: \"https://www.walletofsatoshi.com\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo wos\"\n }, [\n React.createElement('img', {\n key: 'wos-img1',\n src: \"logo/wos.svg\",\n alt: \"Wallet of Satoshi\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'muun1-link', \n href: \"https://muun.com\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo muun\"\n }, [\n React.createElement('img', {\n key: 'muun-img1',\n src: \"logo/muun.svg\",\n alt: \"Muun Wallet\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'atomic1-link', \n href: \"https://atomicwallet.io\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo atomic\"\n }, [\n React.createElement('img', {\n key: 'atomic-img1',\n src: \"logo/atomic.svg\",\n alt: \"Atomic Wallet\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'breez1-link', \n href: \"https://breez.technology/mobile/\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo breez\"\n }, [\n React.createElement('img', {\n key: 'breez-img1',\n src: \"logo/breez.svg\",\n alt: \"Breez Lightning Wallet\",\n })\n ]),\n React.createElement('a', { \n key: 'lightning-labs1-link', \n href: \"https://lightning.engineering\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo lightning-labs\"\n }, [\n React.createElement('img', {\n key: 'lightning-labs-img1',\n src: \"logo/lightning-labs.svg\",\n alt: \"Lightning Labs\",\n })\n ]),\n React.createElement('a', { \n key: 'lnbits1-link', \n href: \"https://lnbits.com\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo lnbits\"\n }, [\n React.createElement('img', {\n key: 'lnbits-img1',\n src: \"logo/lnbits.svg\",\n alt: \"LNbits\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'strike1-link', \n href: \"https://strike.me\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo strike\"\n }, [\n React.createElement('img', {\n key: 'strike-img1',\n src: \"logo/strike.svg\",\n alt: \"Strike\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'impervious1-link', \n href: \"https://impervious.ai\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo impervious\"\n }, [\n React.createElement('img', {\n key: 'impervious-img1',\n src: \"logo/impervious.svg\",\n alt: \"Impervious\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'bitcoin-lightning1-link', \n href: \"https://www.blink.sv/\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo bitcoin-lightning\"\n }, [\n React.createElement('img', {\n key: 'blink-img1',\n src: \"logo/blink.svg\",\n alt: \"Blink Wallet\",\n className: \"wallet-logo-img\"\n })\n ]),\n // Second set of logos\n React.createElement('a', { \n key: 'alby2-link', \n href: \"https://getalby.com\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo alby\"\n }, [\n React.createElement('img', {\n key: 'alby-img2',\n src: \"logo/alby.svg\",\n alt: \"Alby Lightning Wallet\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'zeus2-link', \n href: \"https://zeusln.app\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo zeus\"\n }, [\n React.createElement('img', {\n key: 'zeus-img2',\n src: \"logo/zeus.svg\",\n alt: \"Zeus Lightning Wallet\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'wos2-link', \n href: \"https://www.walletofsatoshi.com\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo wos\"\n }, [\n React.createElement('img', {\n key: 'wos-img2',\n src: \"logo/wos.svg\",\n alt: \"Wallet of Satoshi\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'muun2-link', \n href: \"https://muun.com\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo muun\"\n }, [\n React.createElement('img', {\n key: 'muun-img2',\n src: \"logo/muun.svg\",\n alt: \"Muun Wallet\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'atomic2-link', \n href: \"https://atomicwallet.io\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo atomic\"\n }, [\n React.createElement('img', {\n key: 'atomic-img2',\n src: \"logo/atomic.svg\",\n alt: \"Atomic Wallet\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'breez2-link', \n href: \"https://breez.technology/mobile/\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo breez\"\n }, [\n React.createElement('img', {\n key: 'breez-img2',\n src: \"logo/breez.svg\",\n alt: \"Breez Lightning Wallet\",\n })\n ]),\n React.createElement('a', { \n key: 'lightning-labs2-link', \n href: \"https://lightning.engineering\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo lightning-labs\"\n }, [\n React.createElement('img', {\n key: 'lightning-labs-img2',\n src: \"logo/lightning-labs.svg\",\n alt: \"Lightning Labs\",\n })\n ]),\n React.createElement('a', { \n key: 'lnbits2-link', \n href: \"https://lnbits.com\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo lnbits\"\n }, [\n React.createElement('img', {\n key: 'lnbits-img2',\n src: \"logo/lnbits.svg\",\n alt: \"LNbits\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'strike2-link', \n href: \"https://strike.me\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo strike\"\n }, [\n React.createElement('img', {\n key: 'strike-img2',\n src: \"logo/strike.svg\",\n alt: \"Strike\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'impervious2-link', \n href: \"https://impervious.ai\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo impervious\"\n }, [\n React.createElement('img', {\n key: 'impervious-img2',\n src: \"logo/impervious.svg\",\n alt: \"Impervious\",\n className: \"wallet-logo-img\"\n })\n ]),\n React.createElement('a', { \n key: 'bitcoin-lightning2-link', \n href: \"https://www.blink.sv/\", \n target: \"_blank\", \n rel: \"noindex nofollow\",\n className: \"wallet-logo bitcoin-lightning\"\n }, [\n React.createElement('img', {\n key: 'blink-img2',\n src: \"logo/blink.svg\",\n alt: \"Blink Wallet\",\n className: \"wallet-logo-img\"\n })\n ])\n ])\n ])\n ]),\n React.createElement(UniqueFeatureSlider, { key: 'unique-features-slider' }),\n \n React.createElement(DownloadApps, { key: 'download-apps' }),\n \n React.createElement(ComparisonTable, { key: 'comparison-table' }), \n \n React.createElement(Roadmap, { key: 'roadmap' }),\n ])\n ]);\n }\n \n if (mode === 'create') {\n return React.createElement('div', {\n className: \"min-h-[calc(100vh-104px)] flex items-center justify-center p-4\"\n }, [\n React.createElement('div', {\n key: 'create-flow',\n className: \"w-full max-w-3xl space-y-6\"\n }, [\n React.createElement('div', {\n key: 'header',\n className: \"text-center\"\n }, [\n React.createElement('button', {\n key: 'back',\n onClick: resetToSelect,\n className: \"mb-4 text-secondary hover:text-primary transition-colors flex items-center mx-auto text-sm\"\n }, [\n React.createElement('i', {\n className: 'fas fa-arrow-left mr-2'\n }),\n 'Back to selection'\n ]),\n React.createElement('h2', {\n key: 'title',\n className: \"text-xl font-semibold text-primary mb-2\"\n }, 'Creating a secure channel')\n ]),\n \n // Step 1\n React.createElement('div', {\n key: 'step1',\n className: \"card-minimal rounded-xl p-6\"\n }, [\n React.createElement('div', {\n key: 'step-header',\n className: \"flex items-center mb-4\"\n }, [\n React.createElement('div', {\n key: 'number',\n className: \"step-number mr-3\"\n }, '1'),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-medium text-primary\"\n }, \"Generating ECDH keys and verification code\")\n ]),\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-sm mb-4\"\n }, \"Creating cryptographically strong keys and codes to protect against attacks\"),\n React.createElement('button', {\n key: 'create-btn',\n onClick: onCreateOffer,\n disabled: connectionStatus === 'connecting' || showOfferStep,\n className: `w-full btn-primary text-white py-3 px-4 rounded-lg font-medium transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed`\n }, [\n React.createElement('i', {\n className: 'fas fa-shield-alt mr-2'\n }),\n showOfferStep ? 'Keys created \u2713' : 'Create secure keys'\n ]),\n \n showOfferStep && React.createElement('div', {\n key: 'offer-result',\n className: \"mt-6 space-y-4\"\n }, [\n React.createElement('div', {\n key: 'success',\n className: \"p-3 bg-green-500/10 border border-green-500/20 rounded-lg\"\n }, [\n React.createElement('p', {\n className: \"text-green-400 text-sm font-medium flex items-center\"\n }, [\n React.createElement('i', {\n className: 'fas fa-check-circle mr-2'\n }),\n 'Secure invitation created! Send the code to your contact:'\n ])\n ]),\n React.createElement('div', {\n key: 'offer-data',\n className: \"space-y-3\"\n }, [\n React.createElement('textarea', {\n key: 'textarea',\n value: typeof offerData === 'object' ? JSON.stringify(offerData, null, 2) : offerData,\n readOnly: true,\n rows: 8,\n className: \"w-full p-3 bg-custom-bg border border-gray-500/20 rounded-lg font-mono text-xs text-secondary resize-none custom-scrollbar\"\n }),\n React.createElement('div', {\n key: 'buttons',\n className: \"flex gap-2\"\n }, [\n React.createElement(EnhancedCopyButton, {\n key: 'copy',\n text: typeof offerData === 'object' ? JSON.stringify(offerData, null, 2) : offerData,\n className: \"flex-1 px-3 py-2 bg-orange-500/10 hover:bg-orange-500/20 text-orange-400 border border-orange-500/20 rounded text-sm font-medium\"\n }, 'Copy invitation code'),\n React.createElement('button', {\n key: 'qr-toggle',\n onClick: async () => {\n const next = !showQRCode;\n setShowQRCode(next);\n if (next) {\n try {\n const payload = typeof offerData === 'object' ? JSON.stringify(offerData) : offerData;\n if (payload && payload.length) {\n await generateQRCode(payload);\n }\n } catch (e) {\n console.warn('QR regenerate on toggle failed:', e);\n }\n }\n },\n className: \"px-3 py-2 bg-blue-500/10 hover:bg-blue-500/20 text-blue-400 border border-blue-500/20 rounded text-sm font-medium transition-all duration-200\"\n }, [\n React.createElement('i', {\n key: 'icon',\n className: showQRCode ? 'fas fa-eye-slash mr-1' : 'fas fa-qrcode mr-1'\n }),\n showQRCode ? 'Hide QR' : 'Show QR'\n ])\n ]),\n showQRCode && qrCodeUrl && React.createElement('div', {\n key: 'qr-container',\n className: \"mt-4 p-4 bg-gray-800/50 border border-gray-600/30 rounded-lg text-center\"\n }, [\n React.createElement('h4', {\n key: 'qr-title',\n className: \"text-sm font-medium text-primary mb-3\"\n }, 'Scan QR code to connect'),\n React.createElement('div', {\n key: 'qr-wrapper',\n className: \"flex justify-center\"\n }, [\n React.createElement('img', {\n key: 'qr-image',\n src: qrCodeUrl,\n alt: \"QR Code for secure connection\",\n className: \"max-w-none h-auto border border-gray-600/30 rounded w-[20rem] sm:w-[24rem] md:w-[28rem] lg:w-[32rem]\"\n }),\n (typeof qrFramesTotal !== 'undefined' && typeof qrFrameIndex !== 'undefined' && qrFramesTotal > 1) && React.createElement('div', {\n key: 'qr-frame-indicator',\n className: \"ml-3 self-center text-xs text-gray-300\"\n }, `Frame ${Math.max(1, qrFrameIndex || 1)}/${qrFramesTotal}`)\n ]),\n React.createElement('p', {\n key: 'qr-description',\n className: \"text-xs text-gray-400 mt-2\"\n }, 'Your contact can scan this QR code to quickly join the secure session')\n ])\n ])\n ])\n ]),\n \n // Step 2 - Session Type Selection\n // showOfferStep && React.createElement('div', {\n // key: 'step2',\n // className: \"card-minimal rounded-xl p-6\"\n // }, [\n // React.createElement('div', {\n // key: 'step-header',\n // className: \"flex items-center mb-4\"\n // }, [\n // React.createElement('div', {\n // key: 'number',\n // className: \"w-8 h-8 bg-green-500 text-white rounded-lg flex items-center justify-center font-semibold text-sm mr-3\"\n // }, '2'),\n // React.createElement('h3', {\n // key: 'title',\n // className: \"text-lg font-medium text-primary\"\n // }, \"Select session type\")\n // ]),\n // React.createElement('p', {\n // key: 'description',\n // className: \"text-secondary text-sm mb-4\"\n // }, \"Choose a session plan or use limited demo mode for testing.\"),\n // React.createElement(SessionTypeSelector, {\n // key: 'session-selector',\n // onSelectType: (sessionType) => {\n // // Save the selected session type\n // setSelectedSessionType(sessionType);\n // console.log('\uD83C\uDFAF Session type selected:', sessionType);\n \n // // FIX: For demo sessions, we immediately call automatic activation\n // if (sessionType === 'demo') {\n // console.log('\uD83C\uDFAE Demo session selected, scheduling automatic activation...');\n // // Delay activation for 2 seconds to stabilize\n // setTimeout(() => {\n // if (sessionManager) {\n // console.log('\uD83D\uDE80 Triggering demo session activation from selection...');\n // handleDemoVerification();\n // }\n // }, 2000);\n // }\n \n // // Open a modal payment window\n // if (typeof window.showPaymentModal === 'function') {\n // window.showPaymentModal(sessionType);\n // } else {\n // // Fallback - show session information\n // console.log('Selected session type:', sessionType);\n // }\n // },\n // onCancel: resetToSelect,\n // sessionManager: window.sessionManager\n // })\n // ]),\n \n // Step 3 - Waiting for response\n showOfferStep && React.createElement('div', {\n key: 'step2',\n className: \"card-minimal rounded-xl p-6\"\n }, [\n React.createElement('div', {\n key: 'step-header',\n className: \"flex items-center mb-4\"\n }, [\n React.createElement('div', {\n key: 'number',\n className: \"w-8 h-8 bg-blue-500 text-white rounded-lg flex items-center justify-center font-semibold text-sm mr-3\"\n }, '2'),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-medium text-primary\"\n }, \"Waiting for the peer's response\")\n ]),\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-sm mb-4\"\n }, \"Paste the encrypted invitation code from your contact.\"),\n React.createElement('div', {\n key: 'buttons',\n className: \"flex gap-2 mb-4\"\n }, [\n React.createElement('button', {\n key: 'scan-btn',\n onClick: () => setShowQRScannerModal(true),\n className: \"px-4 py-2 bg-purple-500/10 hover:bg-purple-500/20 text-purple-400 border border-purple-500/20 rounded text-sm font-medium transition-all duration-200\"\n }, [\n React.createElement('i', {\n key: 'icon',\n className: 'fas fa-qrcode mr-2'\n }),\n 'Scan QR Code'\n ])\n ]),\n React.createElement('textarea', {\n key: 'input',\n value: answerInput,\n onChange: (e) => {\n setAnswerInput(e.target.value);\n // Mark answer as created when user manually enters data\n if (e.target.value.trim().length > 0) {\n markAnswerCreated();\n }\n },\n rows: 6,\n placeholder: \"Paste the encrypted response code from your contact or scan QR code...\",\n className: \"w-full p-3 bg-custom-bg border border-gray-500/20 rounded-lg resize-none mb-4 text-secondary placeholder-gray-500 focus:border-orange-500/40 focus:outline-none transition-all custom-scrollbar text-sm\"\n }),\n React.createElement('button', {\n key: 'connect-btn',\n onClick: onConnect,\n disabled: !answerInput.trim(),\n className: \"w-full btn-secondary text-white py-3 px-4 rounded-lg font-medium transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed\"\n }, [\n React.createElement('i', {\n className: 'fas fa-rocket mr-2'\n }),\n 'Establish connection'\n ])\n ])\n ])\n ]);\n }\n \n if (mode === 'join') {\n return React.createElement('div', {\n className: \"min-h-[calc(100vh-104px)] flex items-center justify-center p-4\"\n }, [\n React.createElement('div', {\n key: 'join-flow',\n className: \"w-full max-w-3xl space-y-6\"\n }, [\n React.createElement('div', {\n key: 'header',\n className: \"text-center\"\n }, [\n React.createElement('button', {\n key: 'back',\n onClick: resetToSelect,\n className: \"mb-4 text-secondary hover:text-primary transition-colors flex items-center mx-auto text-sm\"\n }, [\n React.createElement('i', {\n className: 'fas fa-arrow-left mr-2'\n }),\n 'Back to selection'\n ]),\n React.createElement('h2', {\n key: 'title',\n className: \"text-xl font-semibold text-primary mb-2\"\n }, 'Joining the secure channel')\n ]),\n \n // Step 1\n React.createElement('div', {\n key: 'step1',\n className: \"card-minimal rounded-xl p-6\"\n }, [\n React.createElement('div', {\n key: 'step-header',\n className: \"flex items-center mb-4\"\n }, [\n React.createElement('div', {\n key: 'number',\n className: \"w-8 h-8 bg-green-500 text-white rounded-lg flex items-center justify-center font-semibold text-sm mr-3\"\n }, '1'),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-medium text-primary\"\n }, \"Paste secure invitation\")\n ]),\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-sm mb-4\"\n }, \"Copy and paste the encrypted invitation code from the initiator.\"),\n React.createElement('textarea', {\n key: 'input',\n value: offerInput,\n onChange: (e) => {\n setOfferInput(e.target.value);\n // Mark answer as created when user manually enters data\n if (e.target.value.trim().length > 0) {\n markAnswerCreated();\n }\n },\n rows: 8,\n placeholder: \"Paste the encrypted invitation code or scan QR code...\",\n className: \"w-full p-3 bg-custom-bg border border-gray-500/20 rounded-lg resize-none mb-4 text-secondary placeholder-gray-500 focus:border-green-500/40 focus:outline-none transition-all custom-scrollbar text-sm\"\n }),\n React.createElement('div', {\n key: 'buttons',\n className: \"flex gap-2 mb-4\"\n }, [\n React.createElement('button', {\n key: 'scan-btn',\n onClick: () => setShowQRScannerModal(true),\n className: \"px-4 py-2 bg-purple-500/10 hover:bg-purple-500/20 text-purple-400 border border-purple-500/20 rounded text-sm font-medium transition-all duration-200\"\n }, [\n React.createElement('i', {\n key: 'icon',\n className: 'fas fa-qrcode mr-2'\n }),\n 'Scan QR Code'\n ]),\n React.createElement('button', {\n key: 'process-btn',\n onClick: onCreateAnswer,\n disabled: !offerInput.trim() || connectionStatus === 'connecting',\n className: \"flex-1 btn-secondary text-white py-2 px-4 rounded-lg font-medium transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed\"\n }, [\n React.createElement('i', {\n className: 'fas fa-cogs mr-2'\n }),\n 'Process invitation'\n ])\n ]),\n showQRScanner && React.createElement('div', {\n key: 'qr-scanner',\n className: \"p-4 bg-gray-800/50 border border-gray-600/30 rounded-lg text-center\"\n }, [\n React.createElement('h4', {\n key: 'scanner-title',\n className: \"text-sm font-medium text-primary mb-3\"\n }, 'QR Code Scanner'),\n React.createElement('p', {\n key: 'scanner-description',\n className: \"text-xs text-gray-400 mb-3\"\n }, 'Use your device camera to scan the QR code from the invitation'),\n React.createElement('button', {\n key: 'open-scanner',\n onClick: () => {\n console.log('Open Camera Scanner clicked, showQRScannerModal will be set to true');\n console.log('QRScanner available:', !!window.QRScanner);\n console.log('setShowQRScannerModal function:', typeof setShowQRScannerModal);\n if (typeof setShowQRScannerModal === 'function') {\n setShowQRScannerModal(true);\n } else {\n console.error('setShowQRScannerModal is not a function:', setShowQRScannerModal);\n }\n },\n className: \"w-full px-4 py-3 bg-purple-600 hover:bg-purple-500 text-white rounded-lg font-medium transition-all duration-200 mb-3\"\n }, [\n React.createElement('i', {\n key: 'camera-icon',\n className: 'fas fa-camera mr-2'\n }),\n 'Open Camera Scanner'\n ]),\n React.createElement('button', {\n key: 'test-qr',\n onClick: async () => {\n console.log('Creating test QR code...');\n if (window.generateQRCode) {\n const testData = '{\"type\":\"test\",\"message\":\"Hello QR Scanner!\"}';\n const qrUrl = await window.generateQRCode(testData);\n console.log('Test QR code generated:', qrUrl);\n // Open QR code in new tab for testing\n const newWindow = window.open();\n newWindow.document.write(``);\n }\n },\n className: \"px-3 py-1 bg-green-600/20 hover:bg-green-600/30 text-green-300 border border-green-500/20 rounded text-xs font-medium transition-all duration-200 mr-2\"\n }, 'Test QR'),\n React.createElement('button', {\n key: 'close-scanner',\n onClick: () => setShowQRScanner(false),\n className: \"px-3 py-1 bg-gray-600/20 hover:bg-gray-600/30 text-gray-300 border border-gray-500/20 rounded text-xs font-medium transition-all duration-200\"\n }, 'Close Scanner')\n ])\n ]),\n \n // Step 2\n showAnswerStep && React.createElement('div', {\n key: 'step2',\n className: \"card-minimal rounded-xl p-6\"\n }, [\n React.createElement('div', {\n key: 'step-header',\n className: \"flex items-center mb-4\"\n }, [\n React.createElement('div', {\n key: 'number',\n className: \"step-number mr-3\"\n }, '2'),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-medium text-primary\"\n }, \"Sending a secure response\")\n ]),\n React.createElement('div', {\n key: 'success',\n className: \"p-3 bg-green-500/10 border border-green-500/20 rounded-lg mb-4\"\n }, [\n React.createElement('p', {\n className: \"text-green-400 text-sm font-medium flex items-center\"\n }, [\n React.createElement('i', {\n className: 'fas fa-check-circle mr-2'\n }),\n 'Secure response created! Send this code to the initiator:'\n ])\n ]),\n React.createElement('div', {\n key: 'answer-data',\n className: \"space-y-3 mb-4\"\n }, [\n React.createElement('textarea', {\n key: 'textarea',\n value: typeof answerData === 'object' ? JSON.stringify(answerData, null, 2) : answerData,\n readOnly: true,\n rows: 6,\n className: \"w-full p-3 bg-custom-bg border border-green-500/20 rounded-lg font-mono text-xs text-secondary resize-none custom-scrollbar\"\n }),\n React.createElement(EnhancedCopyButton, {\n key: 'copy',\n text: typeof answerData === 'object' ? JSON.stringify(answerData, null, 2) : answerData,\n className: \"w-full px-3 py-2 bg-green-500/10 hover:bg-green-500/20 text-green-400 border border-green-500/20 rounded text-sm font-medium\"\n }, 'Copy response code')\n ]),\n React.createElement('div', {\n key: 'info',\n className: \"p-3 bg-purple-500/10 border border-purple-500/20 rounded-lg\"\n }, [\n React.createElement('p', {\n className: \"text-purple-400 text-sm flex items-center justify-center\"\n }, [\n React.createElement('i', {\n className: 'fas fa-shield-alt mr-2'\n }),\n 'The connection will be established with verification'\n ])\n ])\n ])\n ])\n ]);\n }\n };\n \n // Global scroll function - defined outside components to ensure availability\n const createScrollToBottomFunction = (chatMessagesRef) => {\n return () => {\n console.log('\uD83D\uDD0D Global scrollToBottom called, chatMessagesRef:', chatMessagesRef.current);\n if (chatMessagesRef && chatMessagesRef.current) {\n const scrollAttempt = () => {\n if (chatMessagesRef.current) {\n chatMessagesRef.current.scrollTo({\n top: chatMessagesRef.current.scrollHeight,\n behavior: 'smooth'\n });\n }\n };\n scrollAttempt();\n \n setTimeout(scrollAttempt, 50);\n setTimeout(scrollAttempt, 150);\n setTimeout(scrollAttempt, 300);\n \n requestAnimationFrame(() => {\n setTimeout(scrollAttempt, 100);\n });\n }\n };\n };\n \n const EnhancedChatInterface = ({\n messages,\n messageInput,\n setMessageInput,\n onSendMessage,\n onDisconnect,\n keyFingerprint,\n isVerified,\n chatMessagesRef,\n scrollToBottom,\n webrtcManager\n }) => {\n const [showScrollButton, setShowScrollButton] = React.useState(false);\n const [showFileTransfer, setShowFileTransfer] = React.useState(false);\n \n // \u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u043F\u0440\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439\n React.useEffect(() => {\n if (chatMessagesRef.current && messages.length > 0) {\n const { scrollTop, scrollHeight, clientHeight } = chatMessagesRef.current;\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 100;\n if (isNearBottom) {\n const smoothScroll = () => {\n if (chatMessagesRef.current) {\n chatMessagesRef.current.scrollTo({\n top: chatMessagesRef.current.scrollHeight,\n behavior: 'smooth'\n });\n }\n };\n smoothScroll();\n setTimeout(smoothScroll, 50);\n setTimeout(smoothScroll, 150);\n }\n }\n }, [messages, chatMessagesRef]);\n \n // \u041E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A \u0441\u043A\u0440\u043E\u043B\u043B\u0430\n const handleScroll = () => {\n if (chatMessagesRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = chatMessagesRef.current;\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 100;\n setShowScrollButton(!isNearBottom);\n }\n };\n \n // \u041F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u0432\u043D\u0438\u0437 \u043F\u043E \u043A\u043D\u043E\u043F\u043A\u0435\n const handleScrollToBottom = () => {\n console.log('\uD83D\uDD0D handleScrollToBottom called, scrollToBottom type:', typeof scrollToBottom);\n if (typeof scrollToBottom === 'function') {\n scrollToBottom();\n setShowScrollButton(false);\n } else {\n console.error('\u274C scrollToBottom is not a function:', scrollToBottom);\n // Fallback: direct scroll\n if (chatMessagesRef.current) {\n chatMessagesRef.current.scrollTo({\n top: chatMessagesRef.current.scrollHeight,\n behavior: 'smooth'\n });\n }\n setShowScrollButton(false);\n }\n };\n \n // \u041E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A \u043D\u0430\u0436\u0430\u0442\u0438\u044F Enter\n const handleKeyPress = (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n onSendMessage();\n }\n };\n \n // \u0418\u0421\u041F\u0420\u0410\u0412\u041B\u0415\u041D\u0418\u0415: \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u0438 \u0434\u043B\u044F \u0444\u0430\u0439\u043B\u043E\u0432\u044B\u0445 \u0442\u0440\u0430\u043D\u0441\u0444\u0435\u0440\u043E\u0432\n const isFileTransferReady = () => {\n if (!webrtcManager) return false;\n \n const connected = webrtcManager.isConnected ? webrtcManager.isConnected() : false;\n const verified = webrtcManager.isVerified || false;\n const hasDataChannel = webrtcManager.dataChannel && webrtcManager.dataChannel.readyState === 'open';\n \n return connected && verified && hasDataChannel;\n };\n \n // \u0412\u043E\u0437\u0432\u0440\u0430\u0442 JSX \u0447\u0435\u0440\u0435\u0437 React.createElement\n return React.createElement(\n 'div',\n {\n className: \"chat-container flex flex-col\",\n style: { backgroundColor: '#272827', height: 'calc(100vh - 64px)' }\n },\n [\n // \u041E\u0431\u043B\u0430\u0441\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439\n React.createElement(\n 'div',\n { className: \"flex-1 flex flex-col overflow-hidden\" },\n React.createElement(\n 'div',\n { className: \"flex-1 max-w-4xl mx-auto w-full p-4 overflow-hidden\" },\n React.createElement(\n 'div',\n {\n ref: chatMessagesRef,\n onScroll: handleScroll,\n className: \"h-full overflow-y-auto space-y-3 hide-scrollbar pr-2 scroll-smooth\"\n },\n messages.length === 0 ?\n React.createElement(\n 'div',\n { className: \"flex items-center justify-center h-full\" },\n React.createElement(\n 'div',\n { className: \"text-center max-w-md\" },\n [\n React.createElement(\n 'div',\n { className: \"w-16 h-16 bg-green-500/10 border border-green-500/20 rounded-xl flex items-center justify-center mx-auto mb-4\" },\n React.createElement(\n 'svg',\n { className: \"w-8 h-8 text-green-500\", fill: \"none\", stroke: \"currentColor\", viewBox: \"0 0 24 24\" },\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n })\n )\n ),\n React.createElement('h3', { className: \"text-lg font-medium text-gray-300 mb-2\" }, \"Secure channel is ready!\"),\n React.createElement('p', { className: \"text-gray-400 text-sm mb-4\" }, \"All messages are protected by modern cryptographic algorithms\"),\n React.createElement(\n 'div',\n { className: \"text-left space-y-2\" },\n [\n ['End-to-end encryption', 'M5 13l4 4L19 7'],\n ['Protection against replay attacks', 'M5 13l4 4L19 7'],\n ['Integrity verification', 'M5 13l4 4L19 7'],\n ['Perfect Forward Secrecy', 'M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15']\n ].map(([text, d], i) =>\n React.createElement(\n 'div',\n { key: `f${i}`, className: \"flex items-center text-sm text-gray-400\" },\n [\n React.createElement(\n 'svg',\n {\n className: `w-4 h-4 mr-3 ${i === 3 ? 'text-purple-500' : 'text-green-500'}`,\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\"\n },\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: d\n })\n ),\n text\n ]\n )\n )\n )\n ]\n )\n ) :\n messages.map((msg) =>\n React.createElement(EnhancedChatMessage, {\n key: msg.id,\n message: msg.message,\n type: msg.type,\n timestamp: msg.timestamp\n })\n )\n )\n )\n ),\n \n // \u041A\u043D\u043E\u043F\u043A\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432\u043D\u0438\u0437\n showScrollButton &&\n React.createElement(\n 'button',\n {\n onClick: handleScrollToBottom,\n className: \"fixed right-6 w-12 h-12 bg-green-500/20 hover:bg-green-500/30 border border-green-500/30 text-green-400 rounded-full flex items-center justify-center transition-all duration-200 shadow-lg z-50\",\n style: { bottom: '160px' }\n },\n React.createElement(\n 'svg',\n { className: \"w-6 h-6\", fill: \"none\", stroke: \"currentColor\", viewBox: \"0 0 24 24\" },\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M19 14l-7 7m0 0l-7-7m7 7V3\"\n })\n )\n ),\n \n // \u0421\u0435\u043A\u0446\u0438\u044F \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0444\u0430\u0439\u043B\u043E\u0432\n React.createElement(\n 'div',\n {\n className: \"flex-shrink-0 border-t border-gray-500/10\",\n style: { backgroundColor: '#272827' }\n },\n React.createElement(\n 'div',\n { className: \"max-w-4xl mx-auto px-4\" },\n [\n React.createElement(\n 'button',\n {\n onClick: () => setShowFileTransfer(!showFileTransfer),\n className: `flex items-center text-sm text-gray-400 hover:text-gray-300 transition-colors py-4 ${showFileTransfer ? 'mb-4' : ''}`\n },\n [\n React.createElement(\n 'svg',\n {\n className: `w-4 h-4 mr-2 transform transition-transform ${showFileTransfer ? 'rotate-180' : ''}`,\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\"\n },\n showFileTransfer ?\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M5 15l7-7 7 7\"\n }) :\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M15.172 7l-6.586 6.586a2 2 0 102.828 2.828l6.414-6.586a4 4 0 00-5.656-5.656l-6.415 6.585a6 6 0 108.486 8.486L20.5 13\"\n })\n ),\n showFileTransfer ? 'Hide file transfer' : 'Send files'\n ]\n ),\n // \u0418\u0421\u041F\u0420\u0410\u0412\u041B\u0415\u041D\u0418\u0415: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\n showFileTransfer &&\n React.createElement(window.FileTransferComponent || (() => \n React.createElement('div', {\n className: \"p-4 text-center text-red-400\"\n }, 'FileTransferComponent not loaded')\n ), {\n webrtcManager: webrtcManager,\n isConnected: isFileTransferReady()\n })\n ]\n )\n ),\n \n // \u041E\u0431\u043B\u0430\u0441\u0442\u044C \u0432\u0432\u043E\u0434\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439\n React.createElement(\n 'div',\n { className: \"border-t border-gray-500/10\" },\n React.createElement(\n 'div',\n { className: \"max-w-4xl mx-auto p-4\" },\n React.createElement(\n 'div',\n { className: \"flex items-stretch space-x-3\" },\n [\n React.createElement(\n 'div',\n { className: \"flex-1 relative\" },\n [\n React.createElement('textarea', {\n value: messageInput,\n onChange: (e) => setMessageInput(e.target.value),\n onKeyDown: handleKeyPress,\n placeholder: \"Enter message to encrypt...\",\n rows: 2,\n maxLength: 2000,\n style: { backgroundColor: '#272827' },\n className: \"w-full p-3 border border-gray-600 rounded-lg resize-none text-gray-300 placeholder-gray-500 focus:border-green-500/40 focus:outline-none transition-all custom-scrollbar text-sm\"\n }),\n React.createElement(\n 'div',\n { className: \"absolute bottom-2 right-3 flex items-center space-x-2 text-xs text-gray-400\" },\n [\n React.createElement('span', null, `${messageInput.length}/2000`),\n React.createElement('span', null, \"\u2022 Enter to send\")\n ]\n )\n ]\n ),\n React.createElement(\n 'button',\n {\n onClick: onSendMessage,\n disabled: !messageInput.trim(),\n className: \"bg-green-400/20 text-green-400 p-3 rounded-lg transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center min-h-[72px]\"\n },\n React.createElement(\n 'svg',\n { className: \"w-6 h-6\", fill: \"none\", stroke: \"currentColor\", viewBox: \"0 0 24 24\" },\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M12 19l9 2-9-18-9 18 9-2zm0 0v-8\"\n })\n )\n )\n ]\n )\n )\n )\n ]\n );\n };\n \n \n // Main Enhanced Application Component\n const EnhancedSecureP2PChat = () => {\n console.log('\uD83D\uDD0D EnhancedSecureP2PChat component initialized');\n const [messages, setMessages] = React.useState([]);\n const [connectionStatus, setConnectionStatus] = React.useState('disconnected');\n \n // Moved scrollToBottom logic to be available globally\n const [messageInput, setMessageInput] = React.useState('');\n const [offerData, setOfferData] = React.useState('');\n const [answerData, setAnswerData] = React.useState('');\n const [offerInput, setOfferInput] = React.useState('');\n const [answerInput, setAnswerInput] = React.useState('');\n const [keyFingerprint, setKeyFingerprint] = React.useState('');\n const [verificationCode, setVerificationCode] = React.useState('');\n const [showOfferStep, setShowOfferStep] = React.useState(false);\n const [showAnswerStep, setShowAnswerStep] = React.useState(false);\n const [showVerification, setShowVerification] = React.useState(false);\n const [showQRCode, setShowQRCode] = React.useState(false);\n const [qrCodeUrl, setQrCodeUrl] = React.useState('');\n const [showQRScanner, setShowQRScanner] = React.useState(false);\n const [showQRScannerModal, setShowQRScannerModal] = React.useState(false);\n const [isVerified, setIsVerified] = React.useState(false);\n const [securityLevel, setSecurityLevel] = React.useState(null);\n \n // Mutual verification states\n const [localVerificationConfirmed, setLocalVerificationConfirmed] = React.useState(false);\n const [remoteVerificationConfirmed, setRemoteVerificationConfirmed] = React.useState(false);\n const [bothVerificationsConfirmed, setBothVerificationsConfirmed] = React.useState(false);\n \n // PAKE password states removed - using SAS verification instead\n \n // Session state - all security features enabled by default\n const [sessionTimeLeft, setSessionTimeLeft] = React.useState(0);\n const [pendingSession, setPendingSession] = React.useState(null);\n \n // All security features are enabled by default - no payment required\n \n \n \n // ============================================\n // CENTRALIZED CONNECTION STATE MANAGEMENT\n // ============================================\n \n const [connectionState, setConnectionState] = React.useState({\n status: 'disconnected',\n hasActiveAnswer: false,\n answerCreatedAt: null,\n isUserInitiatedDisconnect: false\n });\n \n // Centralized connection state handler\n const updateConnectionState = (newState, options = {}) => {\n const { preserveAnswer = false, isUserAction = false } = options;\n \n setConnectionState(prev => ({\n ...prev,\n ...newState,\n isUserInitiatedDisconnect: isUserAction,\n hasActiveAnswer: preserveAnswer ? prev.hasActiveAnswer : false,\n answerCreatedAt: preserveAnswer ? prev.answerCreatedAt : null\n }));\n };\n \n // Check if we should preserve answer data\n const shouldPreserveAnswerData = () => {\n const now = Date.now();\n const answerAge = now - (connectionState.answerCreatedAt || 0);\n const maxPreserveTime = 30000; // 30 seconds\n \n // \u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u0430\u043C\u0438\u0445 \u0434\u0430\u043D\u043D\u044B\u0445\n const hasAnswerData = (answerData && answerData.trim().length > 0) || \n (answerInput && answerInput.trim().length > 0);\n \n const shouldPreserve = (connectionState.hasActiveAnswer && \n answerAge < maxPreserveTime && \n !connectionState.isUserInitiatedDisconnect) ||\n (hasAnswerData && answerAge < maxPreserveTime && \n !connectionState.isUserInitiatedDisconnect);\n \n console.log('\uD83D\uDD0D shouldPreserveAnswerData check:', {\n hasActiveAnswer: connectionState.hasActiveAnswer,\n hasAnswerData: hasAnswerData,\n answerAge: answerAge,\n maxPreserveTime: maxPreserveTime,\n isUserInitiatedDisconnect: connectionState.isUserInitiatedDisconnect,\n shouldPreserve: shouldPreserve,\n answerData: answerData ? 'exists' : 'null',\n answerInput: answerInput ? 'exists' : 'null'\n });\n \n return shouldPreserve;\n };\n \n // Mark answer as created\n const markAnswerCreated = () => {\n updateConnectionState({\n hasActiveAnswer: true,\n answerCreatedAt: Date.now()\n });\n };\n \n // Global functions for cleanup\n React.useEffect(() => {\n window.forceCleanup = () => {\n handleClearData();\n if (webrtcManagerRef.current) {\n webrtcManagerRef.current.disconnect();\n }\n };\n\n window.clearLogs = () => {\n if (typeof console.clear === 'function') {\n console.clear();\n }\n };\n \n return () => {\n delete window.forceCleanup;\n delete window.clearLogs;\n };\n }, []);\n \n const webrtcManagerRef = React.useRef(null);\n // Expose for modules/UI that run outside this closure (e.g., inline handlers)\n // Safe because it's a ref object and we maintain it centrally here\n window.webrtcManagerRef = webrtcManagerRef;\n \n const addMessageWithAutoScroll = React.useCallback((message, type) => {\n const newMessage = {\n message,\n type,\n id: Date.now() + Math.random(),\n timestamp: Date.now()\n };\n \n setMessages(prev => {\n const updated = [...prev, newMessage];\n \n setTimeout(() => {\n if (chatMessagesRef?.current) {\n const container = chatMessagesRef.current;\n try {\n const { scrollTop, scrollHeight, clientHeight } = container;\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 100;\n \n if (isNearBottom || prev.length === 0) {\n requestAnimationFrame(() => {\n if (container && container.scrollTo) {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'smooth'\n });\n }\n });\n }\n } catch (error) {\n console.warn('Scroll error:', error);\n container.scrollTop = container.scrollHeight;\n }\n }\n }, 50);\n \n return updated;\n });\n }, []);\n \n // Update security level based on real verification\n const updateSecurityLevel = React.useCallback(async () => {\n if (window.isUpdatingSecurity) {\n return;\n }\n \n window.isUpdatingSecurity = true;\n \n try {\n if (webrtcManagerRef.current) {\n // All security features are enabled by default - always show MAXIMUM level\n setSecurityLevel({\n level: 'MAXIMUM',\n score: 100,\n color: 'green',\n details: 'All security features enabled by default',\n passedChecks: 10,\n totalChecks: 10,\n isRealData: true\n });\n \n if (window.DEBUG_MODE) {\n const currentLevel = webrtcManagerRef.current.ecdhKeyPair && webrtcManagerRef.current.ecdsaKeyPair \n ? await webrtcManagerRef.current.calculateSecurityLevel()\n : {\n level: 'MAXIMUM',\n score: 100,\n sessionType: 'premium',\n passedChecks: 10,\n totalChecks: 10\n };\n console.log('\uD83D\uDD12 Security level updated:', {\n level: currentLevel.level,\n score: currentLevel.score,\n sessionType: currentLevel.sessionType,\n passedChecks: currentLevel.passedChecks,\n totalChecks: currentLevel.totalChecks\n });\n }\n }\n } catch (error) {\n console.error('Failed to update security level:', error);\n setSecurityLevel({\n level: 'ERROR',\n score: 0,\n color: 'red',\n details: 'Verification failed'\n });\n } finally {\n setTimeout(() => {\n window.isUpdatingSecurity = false;\n }, 2000);\n }\n }, []);\n \n // Session time ticker - unlimited sessions\n React.useEffect(() => {\n const timer = setInterval(() => {\n // Sessions are unlimited - no time restrictions\n setSessionTimeLeft(0);\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n \n // Sessions are unlimited - no expiration handler needed\n \n // All security features are enabled by default - no demo sessions needed\n const chatMessagesRef = React.useRef(null);\n \n // Create scroll function using global helper\n const scrollToBottom = createScrollToBottomFunction(chatMessagesRef);\n \n // Auto-scroll when messages change\n React.useEffect(() => {\n if (messages.length > 0 && chatMessagesRef.current) {\n scrollToBottom();\n setTimeout(scrollToBottom, 50);\n setTimeout(scrollToBottom, 150);\n }\n }, [messages]);\n \n // PAKE password functions removed - using SAS verification instead\n \n React.useEffect(() => {\n // Prevent multiple initializations\n if (webrtcManagerRef.current) {\n console.log('\u26A0\uFE0F WebRTC Manager already initialized, skipping...');\n return;\n }\n \n const handleMessage = (message, type) => {\n // \u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0430 \u0444\u0430\u0439\u043B\u043E\u0432\u044B\u0435 \u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\n if (typeof message === 'string' && message.trim().startsWith('{')) {\n try {\n const parsedMessage = JSON.parse(message);\n const blockedTypes = [\n 'file_transfer_start',\n 'file_transfer_response',\n 'file_chunk',\n 'chunk_confirmation',\n 'file_transfer_complete',\n 'file_transfer_error',\n 'heartbeat',\n 'verification',\n 'verification_response',\n 'verification_confirmed',\n 'verification_both_confirmed',\n 'peer_disconnect',\n 'key_rotation_signal',\n 'key_rotation_ready',\n 'security_upgrade'\n ];\n if (parsedMessage.type && blockedTypes.includes(parsedMessage.type)) {\n console.log(`\uD83D\uDED1 Blocked system/file message from chat: ${parsedMessage.type}`);\n return; // \u041D\u0435 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u043C \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0435 \u0438 \u0444\u0430\u0439\u043B\u043E\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u0447\u0430\u0442\u0435\n }\n } catch (parseError) {\n // \u041D\u0435 JSON - \u044D\u0442\u043E \u043D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E \u0434\u043B\u044F \u043E\u0431\u044B\u0447\u043D\u044B\u0445 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439\n }\n }\n \n addMessageWithAutoScroll(message, type);\n };\n \n const handleStatusChange = (status) => {\n console.log('handleStatusChange called with status:', status);\n console.log('\uD83D\uDD0D Status change details:');\n console.log(' - oldStatus:', connectionStatus);\n console.log(' - newStatus:', status);\n console.log(' - isVerified:', isVerified);\n console.log(' - willShowChat:', status === 'connected' && isVerified);\n setConnectionStatus(status);\n \n if (status === 'connected') {\n document.dispatchEvent(new CustomEvent('new-connection'));\n \n // \u041D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0435\u043C \u0432\u0435\u0440\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044E \u043F\u0440\u0438 'connected' - \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 'verified'\n // setIsVerified(true);\n // setShowVerification(false);\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } else if (status === 'verifying') {\n console.log('Setting showVerification to true for verifying status');\n setShowVerification(true);\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } else if (status === 'verified') {\n setIsVerified(true);\n setShowVerification(false);\n setBothVerificationsConfirmed(true);\n // CRITICAL: Set connectionStatus to 'connected' to show chat\n setConnectionStatus('connected');\n // Force immediate update of isVerified state\n setTimeout(() => {\n setIsVerified(true);\n }, 0);\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } else if (status === 'connecting') {\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } else if (status === 'disconnected') {\n // \u041E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u043C \u0446\u0435\u043D\u0442\u0440\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435\n updateConnectionState({ status: 'disconnected' });\n setConnectionStatus('disconnected');\n \n // \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u043C, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0432\u0435\u0442\u0430\n if (shouldPreserveAnswerData()) {\n console.log('\uD83D\uDEE1\uFE0F Preserving answer data after recent creation');\n setIsVerified(false);\n setShowVerification(false);\n return;\n }\n \n // \u041F\u0440\u0438 \u0440\u0430\u0437\u0440\u044B\u0432\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u043E\u0447\u0438\u0449\u0430\u0435\u043C \u0432\u0441\u0435 \u0434\u0430\u043D\u043D\u044B\u0435\n setIsVerified(false);\n setShowVerification(false);\n \n // Dispatch disconnected event for SessionTimer\n document.dispatchEvent(new CustomEvent('disconnected'));\n \n // Clear verification states\n setLocalVerificationConfirmed(false);\n setRemoteVerificationConfirmed(false);\n setBothVerificationsConfirmed(false);\n \n // Clear connection data\n setOfferData(null);\n setAnswerData(null);\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setKeyFingerprint('');\n setVerificationCode('');\n setSecurityLevel(null);\n \n // Reset session and timer\n setSessionTimeLeft(0);\n \n // Return to main page after a short delay\n setTimeout(() => {\n setConnectionStatus('disconnected');\n setShowVerification(false);\n \n // \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u043C, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0432\u0435\u0442\u0430\n if (shouldPreserveAnswerData()) {\n console.log('\uD83D\uDEE1\uFE0F Preserving answer data in setTimeout after recent creation');\n return;\n }\n \n setOfferData(null);\n setAnswerData(null);\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setMessages([]);\n }, 1000);\n \n // \u041D\u0435 \u043E\u0447\u0438\u0449\u0430\u0435\u043C \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u043F\u0440\u0438 \u0440\u0430\u0437\u0440\u044B\u0432\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\n // \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043C\u043E\u0433 \u0432\u0438\u0434\u0435\u0442\u044C \u043E\u0448\u0438\u0431\u043A\u0438\n } else if (status === 'peer_disconnected') {\n setSessionTimeLeft(0);\n \n document.dispatchEvent(new CustomEvent('peer-disconnect'));\n \n // A short delay before clearing to display the status\n setTimeout(() => {\n setKeyFingerprint('');\n setVerificationCode('');\n setSecurityLevel(null);\n setIsVerified(false);\n setShowVerification(false);\n setConnectionStatus('disconnected');\n \n // Clear verification states\n setLocalVerificationConfirmed(false);\n setRemoteVerificationConfirmed(false);\n setBothVerificationsConfirmed(false);\n \n // \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u043C, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0432\u0435\u0442\u0430\n if (shouldPreserveAnswerData()) {\n console.log('\uD83D\uDEE1\uFE0F Preserving answer data in peer_disconnected after recent creation');\n return;\n }\n \n // Clear connection data\n setOfferData(null);\n setAnswerData(null);\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setMessages([]);\n \n // \u041D\u0435 \u043E\u0447\u0438\u0449\u0430\u0435\u043C \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u043F\u0440\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438 \u043F\u0438\u0440\u0430\n // \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\n // if (typeof console.clear === 'function') {\n // console.clear();\n // }\n \n // Session manager removed - all features enabled by default\n }, 2000);\n }\n };\n \n const handleKeyExchange = (fingerprint) => {\n console.log('handleKeyExchange called with fingerprint:', fingerprint);\n if (fingerprint === '') {\n setKeyFingerprint('');\n } else {\n setKeyFingerprint(fingerprint);\n console.log('Key fingerprint set in UI:', fingerprint);\n }\n };\n \n const handleVerificationRequired = (code) => {\n console.log('handleVerificationRequired called with code:', code);\n if (code === '') {\n setVerificationCode('');\n setShowVerification(false);\n } else {\n setVerificationCode(code);\n setShowVerification(true);\n console.log('Verification code set, showing verification UI');\n }\n };\n \n const handleVerificationStateChange = (state) => {\n console.log('handleVerificationStateChange called with state:', state);\n setLocalVerificationConfirmed(state.localConfirmed);\n setRemoteVerificationConfirmed(state.remoteConfirmed);\n setBothVerificationsConfirmed(state.bothConfirmed);\n };\n \n // Callback for handling response errors\n const handleAnswerError = (errorType, errorMessage) => {\n if (errorType === 'replay_attack') {\n // Reset the session upon replay attack\n setSessionTimeLeft(0);\n setPendingSession(null);\n \n addMessageWithAutoScroll('\uD83D\uDCA1 Data is outdated. Please create a new invitation or use a current response code.', 'system');\n \n if (typeof console.clear === 'function') {\n console.clear();\n }\n } else if (errorType === 'security_violation') {\n // Reset the session upon security breach\n setSessionTimeLeft(0);\n setPendingSession(null);\n \n addMessageWithAutoScroll(`\uD83D\uDD12 Security breach: ${errorMessage}`, 'system');\n \n if (typeof console.clear === 'function') {\n console.clear();\n }\n }\n };\n \n // Create WebRTC Manager only once\n console.log('\uD83D\uDD27 Initializing WebRTC Manager...');\n \n if (typeof console.clear === 'function') {\n console.clear();\n }\n \n webrtcManagerRef.current = new EnhancedSecureWebRTCManager(\n handleMessage, \n handleStatusChange, \n handleKeyExchange,\n handleVerificationRequired,\n handleAnswerError,\n handleVerificationStateChange\n );\n \n handleMessage('\uD83D\uDE80 SecureBit.chat Enhanced Security Edition v4.02.985 - ECDH + DTLS + SAS initialized. Ready to establish a secure connection with ECDH key exchange, DTLS fingerprint verification, and SAS authentication to prevent MITM attacks.', 'system');\n \n const handleBeforeUnload = (event) => {\n if (event.type === 'beforeunload' && !isTabSwitching) {\n console.log('\uD83D\uDD0C Page unloading (closing tab) - sending disconnect notification');\n \n if (webrtcManagerRef.current && webrtcManagerRef.current.isConnected()) {\n try {\n webrtcManagerRef.current.sendSystemMessage({\n type: 'peer_disconnect',\n reason: 'user_disconnect',\n timestamp: Date.now()\n });\n } catch (error) {\n console.log('Could not send disconnect notification:', error.message);\n }\n \n setTimeout(() => {\n if (webrtcManagerRef.current) {\n webrtcManagerRef.current.disconnect();\n }\n }, 100);\n } else if (webrtcManagerRef.current) {\n webrtcManagerRef.current.disconnect();\n }\n } else if (isTabSwitching) {\n console.log('\uD83D\uDCF1 Tab switching detected - NOT disconnecting');\n event.preventDefault();\n event.returnValue = '';\n }\n };\n \n window.addEventListener('beforeunload', handleBeforeUnload);\n \n let isTabSwitching = false;\n let tabSwitchTimeout = null;\n \n const handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n console.log('\uD83D\uDCF1 Page hidden (tab switch) - keeping connection alive');\n isTabSwitching = true;\n \n if (tabSwitchTimeout) {\n clearTimeout(tabSwitchTimeout);\n }\n \n tabSwitchTimeout = setTimeout(() => {\n isTabSwitching = false;\n }, 5000); \n \n } else if (document.visibilityState === 'visible') {\n console.log('\uD83D\uDCF1 Page visible (tab restored) - connection maintained');\n isTabSwitching = false;\n \n if (tabSwitchTimeout) {\n clearTimeout(tabSwitchTimeout);\n tabSwitchTimeout = null;\n }\n }\n };\n \n document.addEventListener('visibilitychange', handleVisibilityChange);\n \n // Setup file transfer callbacks\n if (webrtcManagerRef.current) {\n webrtcManagerRef.current.setFileTransferCallbacks(\n // Progress callback\n (progress) => {\n console.log('File progress:', progress);\n },\n \n // File received callback\n (fileData) => {\n const sizeMb = Math.max(1, Math.round((fileData.fileSize || 0) / (1024 * 1024)));\n const downloadMessage = React.createElement('div', {\n className: 'flex items-center space-x-2'\n }, [\n React.createElement('span', { key: 'label' }, `\uD83D\uDCE5 File received: ${fileData.fileName} (${sizeMb} MB)`),\n React.createElement('button', {\n key: 'btn',\n className: 'px-3 py-1 rounded bg-blue-600 hover:bg-blue-700 text-white text-xs',\n onClick: async () => {\n try {\n const url = await fileData.getObjectURL();\n const a = document.createElement('a');\n a.href = url;\n a.download = fileData.fileName;\n a.click();\n // \u0414\u0430\u0435\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443 \u0432\u0440\u0435\u043C\u044F \u043D\u0430\u0447\u0430\u0442\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0443, \u0437\u0430\u0442\u0435\u043C \u043E\u0441\u0432\u043E\u0431\u043E\u0436\u0434\u0430\u0435\u043C URL\n setTimeout(() => fileData.revokeObjectURL(url), 15000);\n } catch (e) {\n console.error('Download failed:', e);\n addMessageWithAutoScroll(`\u274C File upload error: ${String(e?.message || e)}`, 'system');\n }\n }\n }, 'Download')\n ]);\n \n addMessageWithAutoScroll(downloadMessage, 'system');\n },\n \n // Error callback\n (error) => {\n console.error('File transfer error:', error);\n \n if (error.includes('Connection not ready')) {\n addMessageWithAutoScroll(`\u26A0\uFE0F File transfer error: connection not ready. Try again later.`, 'system');\n } else if (error.includes('File too large')) {\n addMessageWithAutoScroll(`\u26A0\uFE0F File is too big. Maximum size: 100 MB`, 'system');\n } else {\n addMessageWithAutoScroll(`\u274C File transfer error: ${error}`, 'system');\n }\n }\n );\n }\n \n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload);\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n \n if (tabSwitchTimeout) {\n clearTimeout(tabSwitchTimeout);\n tabSwitchTimeout = null;\n }\n \n if (webrtcManagerRef.current) {\n console.log('\uD83E\uDDF9 Cleaning up WebRTC Manager...');\n webrtcManagerRef.current.disconnect();\n webrtcManagerRef.current = null;\n }\n };\n }, []); // Empty dependency array to run only once\n \n // All security features are enabled by default - no session purchase needed\n \n const compressOfferData = (offerData) => {\n try {\n // Parse the offer data if it's a string\n const offer = typeof offerData === 'string' ? JSON.parse(offerData) : offerData;\n \n // Create a minimal version with only the most essential data\n const minimalOffer = {\n type: offer.type,\n version: offer.version,\n timestamp: offer.timestamp,\n sessionId: offer.sessionId,\n connectionId: offer.connectionId,\n verificationCode: offer.verificationCode,\n salt: offer.salt,\n // Use only key fingerprints instead of full keys\n keyFingerprints: offer.keyFingerprints,\n // Add a reference to get full data\n fullDataAvailable: true,\n compressionLevel: 'minimal'\n };\n \n return JSON.stringify(minimalOffer);\n } catch (error) {\n console.error('Error compressing offer data:', error);\n return offerData; // Return original if compression fails\n }\n };\n\n const createQRReference = (offerData) => {\n try {\n // Create a unique reference ID for this offer\n const referenceId = `offer_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n \n // Store the full offer data in localStorage with the reference ID\n localStorage.setItem(`qr_offer_${referenceId}`, JSON.stringify(offerData));\n \n // Create a minimal QR code with just the reference\n const qrReference = {\n type: 'secure_offer_reference',\n referenceId: referenceId,\n timestamp: Date.now(),\n message: 'Scan this QR code and use the reference ID to get full offer data'\n };\n \n return JSON.stringify(qrReference);\n } catch (error) {\n console.error('Error creating QR reference:', error);\n return null;\n }\n };\n\n const createTemplateOffer = (offer) => {\n // Minimal template to keep QR within single image capacity\n const templateOffer = {\n type: 'enhanced_secure_offer_template',\n version: '4.0',\n sessionId: offer.sessionId,\n connectionId: offer.connectionId,\n verificationCode: offer.verificationCode,\n timestamp: offer.timestamp,\n // Avoid bulky fields (SDP, raw keys); keep only fingerprints and essentials\n keyFingerprints: offer.keyFingerprints,\n // Keep concise auth hints (omit large nonces)\n authChallenge: offer?.authChallenge?.challenge,\n // Optionally include a compact capability hint if small\n capabilities: Array.isArray(offer.capabilities) && offer.capabilities.length <= 5\n ? offer.capabilities\n : undefined\n };\n \n return templateOffer;\n };\n\n // Conservative QR payload limit (characters). Adjust per error correction level.\n const MAX_QR_LEN = 800;\n const [qrFramesTotal, setQrFramesTotal] = React.useState(0);\n const [qrFrameIndex, setQrFrameIndex] = React.useState(0);\n\n // Animated QR state (for multi-chunk COSE)\n const qrAnimationRef = React.useRef({ timer: null, chunks: [], idx: 0, active: false });\n const stopQrAnimation = () => {\n try { if (qrAnimationRef.current.timer) { clearInterval(qrAnimationRef.current.timer); } } catch {}\n qrAnimationRef.current = { timer: null, chunks: [], idx: 0, active: false };\n setQrFrameIndex(0);\n setQrFramesTotal(0);\n };\n\n // Buffer for assembling scanned COSE chunks\n const qrChunksBufferRef = React.useRef({ id: null, total: 0, seen: new Set(), items: [] });\n\n const generateQRCode = async (data) => {\n try {\n const originalSize = typeof data === 'string' ? data.length : JSON.stringify(data).length;\n console.log(`\uD83D\uDCCA Original QR Code data size: ${originalSize} characters`);\n // Small payload: \u043F\u0440\u044F\u043C\u043E\u0439 JSON \u0432 \u043E\u0434\u0438\u043D QR (\u0431\u0435\u0437 \u0441\u0436\u0430\u0442\u0438\u044F, \u0431\u0435\u0437 \u043E\u0431\u0451\u0440\u0442\u043E\u043A)\n const payload = typeof data === 'string' ? data : JSON.stringify(data);\n const isDesktop = (typeof window !== 'undefined') && ((window.innerWidth || 0) >= 1024);\n const QR_SIZE = isDesktop ? 720 : 512;\n if (payload.length <= MAX_QR_LEN) {\n if (!window.generateQRCode) throw new Error('QR code generator unavailable');\n stopQrAnimation();\n const qrDataUrl = await window.generateQRCode(payload, { errorCorrectionLevel: 'M', size: QR_SIZE, margin: 2 });\n setQrCodeUrl(qrDataUrl);\n setQrFramesTotal(1);\n setQrFrameIndex(1);\n return;\n }\n\n // \u0411\u043E\u043B\u044C\u0448\u043E\u0439 payload: RAW \u0430\u043D\u0438\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 QR \u0431\u0435\u0437 \u0441\u0436\u0430\u0442\u0438\u044F\n console.log('\uD83C\uDF9E\uFE0F Using RAW animated QR frames (no compression)');\n stopQrAnimation();\n const id = `raw_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const FRAME_MAX = Math.max(300, Math.min(750, Math.floor(MAX_QR_LEN * 0.6)));\n const total = Math.ceil(payload.length / FRAME_MAX);\n const rawChunks = [];\n for (let i = 0; i < total; i++) {\n const seq = i + 1;\n const part = payload.slice(i * FRAME_MAX, (i + 1) * FRAME_MAX);\n rawChunks.push(JSON.stringify({ hdr: { v: 1, id, seq, total, rt: 'raw' }, body: part }));\n }\n if (!window.generateQRCode) throw new Error('QR code generator unavailable');\n if (rawChunks.length === 1) {\n const url = await window.generateQRCode(rawChunks[0], { errorCorrectionLevel: 'M', margin: 2, size: QR_SIZE });\n setQrCodeUrl(url);\n setQrFramesTotal(1);\n setQrFrameIndex(1);\n return;\n }\n qrAnimationRef.current.chunks = rawChunks;\n qrAnimationRef.current.idx = 0;\n qrAnimationRef.current.active = true;\n setQrFramesTotal(rawChunks.length);\n setQrFrameIndex(1);\n const EC_OPTS = { errorCorrectionLevel: 'M', margin: 2, size: QR_SIZE };\n const renderNext = async () => {\n const { chunks, idx, active } = qrAnimationRef.current;\n if (!active || !chunks.length) return;\n const current = chunks[idx % chunks.length];\n try {\n const url = await window.generateQRCode(current, EC_OPTS);\n setQrCodeUrl(url);\n } catch (e) {\n console.warn('Animated QR render error (raw):', e);\n }\n const nextIdx = (idx + 1) % chunks.length;\n qrAnimationRef.current.idx = nextIdx;\n setQrFrameIndex(nextIdx + 1);\n };\n await renderNext();\n const ua = (typeof navigator !== 'undefined' && navigator.userAgent) ? navigator.userAgent : '';\n const isIOS = /iPhone|iPad|iPod/i.test(ua);\n const intervalMs = isIOS ? 2500 : 2000; // Slower animation for better readability\n qrAnimationRef.current.timer = setInterval(renderNext, intervalMs);\n return;\n } catch (error) {\n console.error('QR code generation failed:', error);\n setMessages(prev => [...prev, {\n message: `\u274C QR code generation failed: ${error.message}`,\n type: 'error'\n }]);\n }\n };\n\n const reconstructFromTemplate = (templateData) => {\n // Reconstruct full offer from template\n const fullOffer = {\n type: \"enhanced_secure_offer\",\n version: templateData.version,\n timestamp: templateData.timestamp,\n sessionId: templateData.sessionId,\n connectionId: templateData.connectionId,\n verificationCode: templateData.verificationCode,\n salt: templateData.salt,\n sdp: templateData.sdp,\n keyFingerprints: templateData.keyFingerprints,\n capabilities: templateData.capabilities,\n \n // Reconstruct ECDH key object\n ecdhPublicKey: {\n keyType: \"ECDH\",\n keyData: templateData.ecdhKeyData,\n timestamp: templateData.timestamp - 1000, // Approximate\n version: templateData.version,\n signature: templateData.ecdhSignature\n },\n \n // Reconstruct ECDSA key object\n ecdsaPublicKey: {\n keyType: \"ECDSA\",\n keyData: templateData.ecdsaKeyData,\n timestamp: templateData.timestamp - 999, // Approximate\n version: templateData.version,\n signature: templateData.ecdsaSignature\n },\n \n // Reconstruct auth challenge\n authChallenge: {\n challenge: templateData.authChallenge,\n timestamp: templateData.timestamp,\n nonce: templateData.authNonce,\n version: templateData.version\n },\n \n // Generate security level (can be recalculated)\n securityLevel: {\n level: \"CRITICAL\",\n score: 20,\n color: \"red\",\n verificationResults: {\n encryption: { passed: false, details: \"Encryption not working\", points: 0 },\n keyExchange: { passed: true, details: \"Simple key exchange verified\", points: 15 },\n messageIntegrity: { passed: false, details: \"Message integrity failed\", points: 0 },\n rateLimiting: { passed: true, details: \"Rate limiting active\", points: 5 },\n ecdsa: { passed: false, details: \"Enhanced session required - feature not available\", points: 0 },\n metadataProtection: { passed: false, details: \"Enhanced session required - feature not available\", points: 0 },\n pfs: { passed: false, details: \"Enhanced session required - feature not available\", points: 0 },\n nestedEncryption: { passed: false, details: \"Enhanced session required - feature not available\", points: 0 },\n packetPadding: { passed: false, details: \"Enhanced session required - feature not available\", points: 0 },\n advancedFeatures: { passed: false, details: \"Premium session required - feature not available\", points: 0 }\n },\n timestamp: templateData.timestamp,\n details: \"Real verification: 20/100 security checks passed (2/4 available)\",\n isRealData: true,\n passedChecks: 2,\n totalChecks: 4,\n sessionType: \"demo\",\n maxPossibleScore: 50\n }\n };\n \n return fullOffer;\n };\n\n const handleQRScan = async (scannedData) => {\n try {\n console.log('\uD83D\uDD0D Processing scanned QR data...');\n console.log('\uD83D\uDCCA Current mode - showOfferStep:', showOfferStep);\n console.log('\uD83D\uDCCA Scanned data length:', scannedData.length);\n console.log('\uD83D\uDCCA Scanned data first 100 chars:', scannedData.substring(0, 100));\n console.log('\uD83D\uDCCA window.receiveAndProcess available:', !!window.receiveAndProcess);\n \n // Try to parse as JSON first\n const parsedData = JSON.parse(scannedData);\n console.log('\uD83D\uDCCA Parsed data structure:', parsedData);\n \n // QR with hdr/body: COSE or RAW animated frames\n if (parsedData.hdr && parsedData.body) {\n const { hdr } = parsedData;\n // Initialize/rotate buffer by id\n if (!qrChunksBufferRef.current.id || qrChunksBufferRef.current.id !== hdr.id) {\n qrChunksBufferRef.current = { id: hdr.id, total: hdr.total || 1, seen: new Set(), items: [], lastUpdateMs: Date.now() };\n try {\n document.dispatchEvent(new CustomEvent('qr-scan-progress', { detail: { id: hdr.id, seq: 0, total: hdr.total || 1 } }));\n } catch {}\n }\n // Deduplicate & record\n if (!qrChunksBufferRef.current.seen.has(hdr.seq)) {\n qrChunksBufferRef.current.seen.add(hdr.seq);\n qrChunksBufferRef.current.items.push(scannedData);\n qrChunksBufferRef.current.lastUpdateMs = Date.now();\n }\n // Emit progress based on unique frames captured\n try {\n const uniqueCount = qrChunksBufferRef.current.seen.size;\n document.dispatchEvent(new CustomEvent('qr-scan-progress', { detail: { id: hdr.id, seq: uniqueCount, total: qrChunksBufferRef.current.total || hdr.total || 0 } }));\n } catch {}\n const isComplete = qrChunksBufferRef.current.seen.size >= (qrChunksBufferRef.current.total || 1);\n if (!isComplete) {\n // Explicitly keep scanner open\n return Promise.resolve(false);\n }\n // Completed: decide RAW vs COSE\n if (hdr.rt === 'raw') {\n try {\n // Sort by seq and concatenate bodies\n const parts = qrChunksBufferRef.current.items\n .map(s => JSON.parse(s))\n .sort((a, b) => (a.hdr.seq || 0) - (b.hdr.seq || 0))\n .map(p => p.body || '');\n const fullText = parts.join('');\n const payloadObj = JSON.parse(fullText);\n if (showOfferStep) {\n setAnswerInput(JSON.stringify(payloadObj, null, 2));\n } else {\n setOfferInput(JSON.stringify(payloadObj, null, 2));\n }\n setMessages(prev => [...prev, { message: '\u2705 All frames captured. RAW payload reconstructed.', type: 'success' }]);\n try { document.dispatchEvent(new CustomEvent('qr-scan-complete', { detail: { id: hdr.id } })); } catch {}\n // Close scanner from caller by returning true\n qrChunksBufferRef.current = { id: null, total: 0, seen: new Set(), items: [] };\n setShowQRScannerModal(false);\n return Promise.resolve(true);\n } catch (e) {\n console.warn('RAW multi-frame reconstruction failed:', e);\n return Promise.resolve(false);\n }\n } else if (window.receiveAndProcess) {\n try {\n const results = await window.receiveAndProcess(qrChunksBufferRef.current.items);\n if (results.length > 0) {\n const { payloadObj } = results[0];\n if (showOfferStep) {\n setAnswerInput(JSON.stringify(payloadObj, null, 2));\n } else {\n setOfferInput(JSON.stringify(payloadObj, null, 2));\n }\n setMessages(prev => [...prev, { message: '\u2705 All frames captured. COSE payload reconstructed.', type: 'success' }]);\n try { document.dispatchEvent(new CustomEvent('qr-scan-complete', { detail: { id: hdr.id } })); } catch {}\n qrChunksBufferRef.current = { id: null, total: 0, seen: new Set(), items: [] };\n setShowQRScannerModal(false);\n return Promise.resolve(true);\n }\n } catch (e) {\n console.warn('COSE multi-chunk processing failed:', e);\n }\n return Promise.resolve(false);\n } else {\n return Promise.resolve(false);\n }\n }\n \n // Check if this is a template-based QR code\n if (parsedData.type === 'enhanced_secure_offer_template') {\n console.log('QR scan: Template-based offer detected, reconstructing...');\n const fullOffer = reconstructFromTemplate(parsedData);\n \n // Determine which input to populate based on current mode\n if (showOfferStep) {\n // In \"Waiting for peer's response\" mode - populate answerInput\n setAnswerInput(JSON.stringify(fullOffer, null, 2));\n console.log('\uD83D\uDCF1 Template data populated to answerInput (waiting for response mode)');\n } else {\n // In \"Paste secure invitation\" mode - populate offerInput\n setOfferInput(JSON.stringify(fullOffer, null, 2));\n console.log('\uD83D\uDCF1 Template data populated to offerInput (paste invitation mode)');\n }\n setMessages(prev => [...prev, {\n message: '\uD83D\uDCF1 QR code scanned successfully! Full offer reconstructed from template.',\n type: 'success'\n }]);\n setShowQRScannerModal(false); // Close QR scanner modal\n return true;\n }\n // Check if this is a reference-based QR code\n else if (parsedData.type === 'secure_offer_reference' && parsedData.referenceId) {\n // Try to get the full offer data from localStorage\n const fullOfferData = localStorage.getItem(`qr_offer_${parsedData.referenceId}`);\n if (fullOfferData) {\n const fullOffer = JSON.parse(fullOfferData);\n // Determine which input to populate based on current mode\n if (showOfferStep) {\n // In \"Waiting for peer's response\" mode - populate answerInput\n setAnswerInput(JSON.stringify(fullOffer, null, 2));\n console.log('\uD83D\uDCF1 Reference data populated to answerInput (waiting for response mode)');\n } else {\n // In \"Paste secure invitation\" mode - populate offerInput\n setOfferInput(JSON.stringify(fullOffer, null, 2));\n console.log('\uD83D\uDCF1 Reference data populated to offerInput (paste invitation mode)');\n }\n setMessages(prev => [...prev, {\n message: '\uD83D\uDCF1 QR code scanned successfully! Full offer data retrieved.',\n type: 'success'\n }]);\n setShowQRScannerModal(false); // Close QR scanner modal\n return true;\n } else {\n setMessages(prev => [...prev, {\n message: '\u274C QR code reference found but full data not available. Please use copy/paste.',\n type: 'error'\n }]);\n return false;\n }\n } else {\n // Check if this is compressed data (missing SDP)\n if (!parsedData.sdp) {\n setMessages(prev => [...prev, {\n message: '\u26A0\uFE0F QR code contains compressed data (SDP removed). Please use copy/paste for full data.',\n type: 'warning'\n }]);\n }\n \n // Determine which input to populate based on current mode\n if (showOfferStep) {\n // In \"Waiting for peer's response\" mode - populate answerInput\n console.log('QR scan: Populating answerInput with:', parsedData);\n setAnswerInput(JSON.stringify(parsedData, null, 2));\n } else {\n // In \"Paste secure invitation\" mode - populate offerInput\n console.log('QR scan: Populating offerInput with:', parsedData);\n setOfferInput(JSON.stringify(parsedData, null, 2));\n }\n setMessages(prev => [...prev, {\n message: '\uD83D\uDCF1 QR code scanned successfully!',\n type: 'success'\n }]);\n setShowQRScannerModal(false);\n return true;\n }\n } catch (error) {\n // If not JSON, use as plain text\n if (showOfferStep) {\n // In \"Waiting for peer's response\" mode - populate answerInput\n setAnswerInput(scannedData);\n } else {\n // In \"Paste secure invitation\" mode - populate offerInput\n setOfferInput(scannedData);\n }\n setMessages(prev => [...prev, {\n message: '\uD83D\uDCF1 QR code scanned successfully!',\n type: 'success'\n }]);\n setShowQRScannerModal(false);\n return true;\n }\n };\n \n const handleCreateOffer = async () => {\n try {\n console.log('\uD83C\uDFAF handleCreateOffer called');\n // All security features are enabled by default\n \n setOfferData('');\n setShowOfferStep(false);\n setShowQRCode(false);\n setQrCodeUrl('');\n \n console.log('\uD83C\uDFAF Calling createSecureOffer...');\n const offer = await webrtcManagerRef.current.createSecureOffer();\n console.log('\uD83C\uDFAF createSecureOffer returned:', offer ? 'success' : 'null');\n \n // Store offer data directly (no encryption needed with SAS)\n setOfferData(offer);\n setShowOfferStep(true);\n \n // Generate QR code for the offer data\n // Use compact JSON (no pretty-printing) to reduce size\n const offerString = typeof offer === 'object' ? JSON.stringify(offer) : offer;\n console.log('Generating QR code for data length:', offerString.length);\n console.log('First 100 chars of offer data:', offerString.substring(0, 100));\n await generateQRCode(offerString);\n \n const existingMessages = messages.filter(m => \n m.type === 'system' && \n (m.message.includes('Secure invitation created') || m.message.includes('Send the encrypted code'))\n );\n \n if (existingMessages.length === 0) {\n setMessages(prev => [...prev, { \n message: '\uD83D\uDD10 Secure invitation created and encrypted!', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n setMessages(prev => [...prev, { \n message: '\uD83D\uDCE4 Send the invitation code to your interlocutor via a secure channel (voice call, SMS, etc.)..', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n }\n \n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } catch (error) {\n setMessages(prev => [...prev, { \n message: `\u274C Error creating invitation: ${error.message}`, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n }\n };\n \n const handleCreateAnswer = async () => {\n try {\n console.log('handleCreateAnswer called, offerInput:', offerInput);\n console.log('offerInput.trim():', offerInput.trim());\n console.log('offerInput.trim() length:', offerInput.trim().length);\n \n if (!offerInput.trim()) {\n setMessages(prev => [...prev, { \n message: '\u26A0\uFE0F You need to insert the invitation code from your interlocutor.', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n return;\n }\n \n try {\n setMessages(prev => [...prev, { \n message: '\uD83D\uDD04 Processing the secure invitation...', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n let offer;\n try {\n // Parse the offer data directly (no decryption needed with SAS)\n offer = JSON.parse(offerInput.trim());\n } catch (parseError) {\n throw new Error(`Invalid invitation format: ${parseError.message}`);\n }\n \n if (!offer || typeof offer !== 'object') {\n throw new Error('The invitation must be an object');\n }\n \n // Support both compact and legacy offer formats\n const isValidOfferType = (offer.t === 'offer') || (offer.type === 'enhanced_secure_offer');\n if (!isValidOfferType) {\n throw new Error('Invalid invitation type. Expected offer or enhanced_secure_offer');\n }\n \n console.log('Creating secure answer for offer:', offer);\n const answer = await webrtcManagerRef.current.createSecureAnswer(offer);\n console.log('Secure answer created:', answer);\n \n // Store answer data directly (no encryption needed with SAS)\n setAnswerData(answer);\n setShowAnswerStep(true);\n \n // Mark answer as created for state management\n markAnswerCreated();\n \n const existingResponseMessages = messages.filter(m => \n m.type === 'system' && \n (m.message.includes('Secure response created') || m.message.includes('Send the response'))\n );\n \n if (existingResponseMessages.length === 0) {\n setMessages(prev => [...prev, { \n message: '\u2705 Secure response created!', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n setMessages(prev => [...prev, { \n message: '\uD83D\uDCE4 Send the response code to the initiator via a secure channel..', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n }\n \n // Update security level after creating answer\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } catch (error) {\n console.error('Error in handleCreateAnswer:', error);\n setMessages(prev => [...prev, { \n message: `\u274C Error processing the invitation: ${error.message}`, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n }\n } catch (error) {\n console.error('Error in handleCreateAnswer:', error);\n setMessages(prev => [...prev, { \n message: `\u274C Invitation processing error: ${error.message}`, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n }\n };\n \n const handleConnect = async () => {\n try {\n if (!answerInput.trim()) {\n setMessages(prev => [...prev, { \n message: '\u26A0\uFE0F You need to insert the response code from your interlocutor.', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n return;\n }\n \n try {\n setMessages(prev => [...prev, { \n message: '\uD83D\uDD04 Processing the secure response...', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n let answer;\n try {\n // Parse the answer data directly (no decryption needed with SAS)\n answer = JSON.parse(answerInput.trim());\n } catch (parseError) {\n throw new Error(`Invalid response format: ${parseError.message}`);\n }\n \n if (!answer || typeof answer !== 'object') {\n throw new Error('The response must be an object');\n }\n \n // Support both compact and legacy formats\n const answerType = answer.t || answer.type;\n if (!answerType || (answerType !== 'answer' && answerType !== 'enhanced_secure_answer')) {\n throw new Error('Invalid response type. Expected answer or enhanced_secure_answer');\n }\n \n await webrtcManagerRef.current.handleSecureAnswer(answer);\n \n // All security features are enabled by default - no session activation needed\n if (pendingSession) {\n setPendingSession(null);\n setMessages(prev => [...prev, { \n message: `\u2705 All security features enabled by default`, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n }\n \n setMessages(prev => [...prev, { \n message: '\uD83D\uDD04 Finalizing the secure connection...', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n // Update security level after handling answer\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } catch (error) {\n console.error('Error in handleConnect inner try:', error);\n \n // \u0411\u043E\u043B\u0435\u0435 \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u043E\u0448\u0438\u0431\u043E\u043A\n let errorMessage = 'Connection setup error';\n if (error.message.includes('CRITICAL SECURITY FAILURE')) {\n if (error.message.includes('ECDH public key structure')) {\n errorMessage = '\uD83D\uDD11 Invalid response code - missing or corrupted cryptographic key. Please check the code and try again.';\n } else if (error.message.includes('ECDSA public key structure')) {\n errorMessage = '\uD83D\uDD10 Invalid response code - missing signature verification key. Please check the code and try again.';\n } else {\n errorMessage = '\uD83D\uDD12 Security validation failed - possible attack detected';\n }\n } else if (error.message.includes('too old') || error.message.includes('replay')) {\n errorMessage = '\u23F0 Response data is outdated - please use a fresh invitation';\n } else if (error.message.includes('MITM') || error.message.includes('signature')) {\n errorMessage = '\uD83D\uDEE1\uFE0F Security breach detected - connection rejected';\n } else if (error.message.includes('Invalid') || error.message.includes('format')) {\n errorMessage = '\uD83D\uDCDD Invalid response format - please check the code';\n } else {\n errorMessage = `\u274C ${error.message}`;\n }\n \n setMessages(prev => [...prev, { \n message: errorMessage, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now(),\n showRetryButton: true\n }]);\n \n // \u0421\u0431\u0440\u043E\u0441 \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u043E\u0448\u0438\u0431\u043E\u043A \u043A\u0440\u043E\u043C\u0435 replay attack\n if (!error.message.includes('too old') && !error.message.includes('replay')) {\n setPendingSession(null);\n setSessionTimeLeft(0);\n }\n \n // \u0423\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u043C \u0441\u0442\u0430\u0442\u0443\u0441 failed \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0432 \u0445\u0435\u0434\u0435\u0440\u0435\n setConnectionStatus('failed');\n \n // \u041E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u0438\n console.log('\uD83D\uDEA8 Error occurred, but keeping connection status as connecting:');\n console.log(' - errorMessage:', error.message);\n console.log(' - connectionStatus:', 'connecting (kept)');\n console.log(' - isVerified:', false);\n console.log(' - willShowChat:', keyFingerprint && keyFingerprint !== '');\n } \n } catch (error) {\n console.error('Error in handleConnect outer try:', error);\n \n // \u0411\u043E\u043B\u0435\u0435 \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u043E\u0448\u0438\u0431\u043E\u043A\n let errorMessage = 'Connection setup error';\n if (error.message.includes('CRITICAL SECURITY FAILURE')) {\n if (error.message.includes('ECDH public key structure')) {\n errorMessage = '\uD83D\uDD11 Invalid response code - missing or corrupted cryptographic key. Please check the code and try again.';\n } else if (error.message.includes('ECDSA public key structure')) {\n errorMessage = '\uD83D\uDD10 Invalid response code - missing signature verification key. Please check the code and try again.';\n } else {\n errorMessage = '\uD83D\uDD12 Security validation failed - possible attack detected';\n }\n } else if (error.message.includes('too old') || error.message.includes('replay')) {\n errorMessage = '\u23F0 Response data is outdated - please use a fresh invitation';\n } else if (error.message.includes('MITM') || error.message.includes('signature')) {\n errorMessage = '\uD83D\uDEE1\uFE0F Security breach detected - connection rejected';\n } else if (error.message.includes('Invalid') || error.message.includes('format')) {\n errorMessage = '\uD83D\uDCDD Invalid response format - please check the code';\n } else {\n errorMessage = `\u274C ${error.message}`;\n }\n \n setMessages(prev => [...prev, { \n message: errorMessage, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now(),\n showRetryButton: true\n }]);\n \n // \u0421\u0431\u0440\u043E\u0441 \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u043E\u0448\u0438\u0431\u043E\u043A \u043A\u0440\u043E\u043C\u0435 replay attack\n if (!error.message.includes('too old') && !error.message.includes('replay')) {\n setPendingSession(null);\n setSessionTimeLeft(0);\n }\n \n // \u0423\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u043C \u0441\u0442\u0430\u0442\u0443\u0441 failed \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0432 \u0445\u0435\u0434\u0435\u0440\u0435\n setConnectionStatus('failed');\n \n // \u041E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u0438\n console.log('\uD83D\uDEA8 Error occurred in outer catch, but keeping connection status as connecting:');\n console.log(' - errorMessage:', error.message);\n console.log(' - connectionStatus:', 'connecting (kept)');\n console.log(' - isVerified:', false);\n console.log(' - willShowChat:', keyFingerprint && keyFingerprint !== '');\n }\n };\n \n const handleVerifyConnection = (isValid) => {\n if (isValid) {\n webrtcManagerRef.current.confirmVerification();\n // Mark local verification as confirmed\n setLocalVerificationConfirmed(true);\n } else {\n setMessages(prev => [...prev, { \n message: '\u274C Verification rejected. The connection is unsafe! Session reset..', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n // Clear verification states\n setLocalVerificationConfirmed(false);\n setRemoteVerificationConfirmed(false);\n setBothVerificationsConfirmed(false);\n setShowVerification(false);\n setVerificationCode('');\n \n // Reset UI to initial state\n setConnectionStatus('disconnected');\n setOfferData(null);\n setAnswerData(null);\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setKeyFingerprint('');\n setSecurityLevel(null);\n setIsVerified(false);\n setMessages([]);\n \n setSessionTimeLeft(0);\n setPendingSession(null);\n \n // Dispatch disconnected event for SessionTimer\n document.dispatchEvent(new CustomEvent('disconnected'));\n \n handleDisconnect();\n }\n };\n \n const handleSendMessage = async () => {\n if (!messageInput.trim()) {\n return;\n }\n \n if (!webrtcManagerRef.current) {\n return;\n }\n \n if (!webrtcManagerRef.current.isConnected()) {\n return;\n }\n \n try {\n \n // Add the message to local messages immediately (sent message)\n addMessageWithAutoScroll(messageInput.trim(), 'sent');\n \n // Use sendMessage for simple text messages instead of sendSecureMessage\n await webrtcManagerRef.current.sendMessage(messageInput);\n setMessageInput('');\n } catch (error) {\n const msg = String(error?.message || error);\n if (!/queued for sending|Data channel not ready/i.test(msg)) {\n addMessageWithAutoScroll(`\u274C Sending error: ${msg}`,'system');\n }\n }\n };\n \n const handleClearData = () => {\n // \u041E\u0447\u0438\u0449\u0430\u0435\u043C \u0432\u0441\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\n setOfferData('');\n setAnswerData('');\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setShowVerification(false);\n setShowQRCode(false);\n setShowQRScanner(false);\n setShowQRScannerModal(false);\n setQrCodeUrl('');\n setVerificationCode('');\n setIsVerified(false);\n setKeyFingerprint('');\n setSecurityLevel(null);\n setConnectionStatus('disconnected');\n setMessages([]);\n setMessageInput('');\n \n // Clear verification states\n setLocalVerificationConfirmed(false);\n setRemoteVerificationConfirmed(false);\n setBothVerificationsConfirmed(false);\n \n // PAKE passwords removed - using SAS verification instead \n \n // \u041D\u0435 \u043E\u0447\u0438\u0449\u0430\u0435\u043C \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u043F\u0440\u0438 \u043E\u0447\u0438\u0441\u0442\u043A\u0435 \u0434\u0430\u043D\u043D\u044B\u0445\n // \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043C\u043E\u0433 \u0432\u0438\u0434\u0435\u0442\u044C \u043E\u0448\u0438\u0431\u043A\u0438\n // if (typeof console.clear === 'function') {\n // console.clear();\n // }\n \n // Cleanup session state\n setSessionTimeLeft(0);\n \n setPendingSession(null);\n document.dispatchEvent(new CustomEvent('peer-disconnect'));\n // Session manager removed - all features enabled by default\n };\n \n const handleDisconnect = () => {\n setSessionTimeLeft(0);\n \n // Mark as user-initiated disconnect\n updateConnectionState({ \n status: 'disconnected',\n isUserInitiatedDisconnect: true \n });\n \n // Cleanup session state\n if (webrtcManagerRef.current) {\n webrtcManagerRef.current.disconnect();\n }\n \n setKeyFingerprint('');\n setVerificationCode('');\n setSecurityLevel(null);\n setIsVerified(false);\n setShowVerification(false);\n setConnectionStatus('disconnected');\n \n // Clear verification states\n setLocalVerificationConfirmed(false);\n setRemoteVerificationConfirmed(false);\n setBothVerificationsConfirmed(false);\n \n // Reset UI to initial state (user-initiated disconnect always clears data)\n setConnectionStatus('disconnected');\n setShowVerification(false);\n setOfferData(null);\n setAnswerData(null);\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setKeyFingerprint('');\n setVerificationCode('');\n setSecurityLevel(null);\n setIsVerified(false);\n \n setMessages([]);\n \n // \u041D\u0435 \u043E\u0447\u0438\u0449\u0430\u0435\u043C \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u043F\u0440\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438\n // \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043C\u043E\u0433 \u0432\u0438\u0434\u0435\u0442\u044C \u043E\u0448\u0438\u0431\u043A\u0438\n // if (typeof console.clear === 'function') {\n // console.clear();\n // }\n \n document.dispatchEvent(new CustomEvent('peer-disconnect'));\n document.dispatchEvent(new CustomEvent('disconnected'));\n \n document.dispatchEvent(new CustomEvent('session-cleanup', {\n detail: { \n timestamp: Date.now(),\n reason: 'manual_disconnect'\n }\n }));\n \n setTimeout(() => {\n setSessionTimeLeft(0);\n }, 500);\n \n handleClearData();\n \n setTimeout(() => {\n // Session manager removed - all features enabled by default\n }, 1000);\n };\n \n const handleSessionActivated = (session) => {\n let message;\n if (session.type === 'demo') {\n message = `\uD83C\uDFAE Demo session activated for 6 minutes. You can create invitations!`;\n } else {\n message = `\u2705 All security features enabled by default. You can create invitations!`;\n }\n \n addMessageWithAutoScroll(message, 'system');\n \n };\n \n React.useEffect(() => {\n if (connectionStatus === 'connected' && isVerified) {\n addMessageWithAutoScroll('\uD83C\uDF89 Secure connection successfully established and verified! You can now communicate safely with full protection against MITM attacks and Perfect Forward Secrecy..', 'system');\n \n }\n }, [connectionStatus, isVerified]);\n \n const isConnectedAndVerified = (connectionStatus === 'connected' || connectionStatus === 'verified') && isVerified;\n \n // \u041E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u0438 \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0447\u0430\u0442\u0430\n console.log('\uD83D\uDD0D Chat activation check:');\n console.log(' - connectionStatus:', connectionStatus);\n console.log(' - isVerified:', isVerified);\n console.log(' - keyFingerprint:', keyFingerprint);\n console.log(' - isConnectedAndVerified:', isConnectedAndVerified);\n console.log(' - bothVerificationsConfirmed:', bothVerificationsConfirmed);\n console.log(' - localVerificationConfirmed:', localVerificationConfirmed);\n console.log(' - remoteVerificationConfirmed:', remoteVerificationConfirmed);\n \n React.useEffect(() => {\n // All security features are enabled by default - no session activation needed\n if (isConnectedAndVerified && pendingSession && connectionStatus !== 'failed') {\n setPendingSession(null);\n setSessionTimeLeft(0); \n addMessageWithAutoScroll('\u2705 All security features enabled by default', 'system');\n }\n }, [isConnectedAndVerified, pendingSession, connectionStatus]);\n \n return React.createElement('div', { \n className: \"minimal-bg min-h-screen\" \n }, [\n React.createElement(EnhancedMinimalHeader, {\n key: 'header',\n status: connectionStatus,\n fingerprint: keyFingerprint,\n verificationCode: verificationCode,\n onDisconnect: handleDisconnect,\n isConnected: isConnectedAndVerified,\n securityLevel: securityLevel,\n // sessionManager removed - all features enabled by default\n sessionTimeLeft: sessionTimeLeft,\n webrtcManager: webrtcManagerRef.current\n }),\n \n React.createElement('main', {\n key: 'main'\n }, \n (() => {\n console.log('\uD83D\uDD0D Main render decision:', {\n isConnectedAndVerified,\n connectionStatus,\n isVerified,\n keyFingerprint: !!keyFingerprint\n });\n return isConnectedAndVerified;\n })()\n ? (() => {\n console.log('\uD83D\uDD0D Passing scrollToBottom to EnhancedChatInterface:', typeof scrollToBottom, scrollToBottom);\n return React.createElement(EnhancedChatInterface, {\n messages: messages,\n messageInput: messageInput,\n setMessageInput: setMessageInput,\n onSendMessage: handleSendMessage,\n onDisconnect: handleDisconnect,\n keyFingerprint: keyFingerprint,\n isVerified: isVerified,\n chatMessagesRef: chatMessagesRef,\n scrollToBottom: scrollToBottom,\n webrtcManager: webrtcManagerRef.current\n });\n })()\n : React.createElement(EnhancedConnectionSetup, {\n onCreateOffer: handleCreateOffer,\n onCreateAnswer: handleCreateAnswer,\n onConnect: handleConnect,\n onClearData: handleClearData,\n onVerifyConnection: handleVerifyConnection,\n connectionStatus: connectionStatus,\n offerData: offerData,\n answerData: answerData,\n offerInput: offerInput,\n setOfferInput: setOfferInput,\n answerInput: answerInput,\n setAnswerInput: setAnswerInput,\n showOfferStep: showOfferStep,\n showAnswerStep: showAnswerStep,\n verificationCode: verificationCode,\n showVerification: showVerification,\n showQRCode: showQRCode,\n qrCodeUrl: qrCodeUrl,\n showQRScanner: showQRScanner,\n setShowQRCode: setShowQRCode,\n setShowQRScanner: setShowQRScanner,\n setShowQRScannerModal: setShowQRScannerModal,\n messages: messages,\n localVerificationConfirmed: localVerificationConfirmed,\n remoteVerificationConfirmed: remoteVerificationConfirmed,\n bothVerificationsConfirmed: bothVerificationsConfirmed,\n // PAKE passwords removed - using SAS verification instead\n })\n ),\n \n // PAKE Password Modal removed - using SAS verification instead\n \n // Payment Modal removed - all security features enabled by default\n\n (() => {\n console.log('Rendering QRScanner, showQRScannerModal:', showQRScannerModal, 'QRScanner available:', !!window.QRScanner);\n return window.QRScanner ? React.createElement(window.QRScanner, {\n key: 'qr-scanner-modal',\n onScan: handleQRScan,\n onClose: () => setShowQRScannerModal(false),\n isVisible: showQRScannerModal,\n continuous: true\n }) : React.createElement('div', {\n key: 'qr-scanner-error',\n className: \"hidden\"\n }, 'QRScanner not loaded');\n })()\n ]);\n };\n function initializeApp() {\n if (window.EnhancedSecureCryptoUtils && window.EnhancedSecureWebRTCManager) {\n ReactDOM.render(React.createElement(EnhancedSecureP2PChat), document.getElementById('root'));\n } else {\n console.error('\u274C \u041C\u043E\u0434\u0443\u043B\u0438 \u043D\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u044B:', {\n hasCrypto: !!window.EnhancedSecureCryptoUtils,\n hasWebRTC: !!window.EnhancedSecureWebRTCManager\n });\n }\n }\n // \u0413\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u044B\u0439 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A \u043E\u0448\u0438\u0431\u043E\u043A \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0435\u043D\u0438\u044F \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u044F \u043E\u0448\u0438\u0431\u043E\u043A \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u044C\n if (typeof window !== 'undefined') {\n // \u041E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A \u043D\u0435\u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043D\u044B\u0445 \u043F\u0440\u043E\u043C\u0438\u0441\u043E\u0432\n window.addEventListener('unhandledrejection', (event) => {\n console.error('\uD83D\uDEA8 Unhandled promise rejection:', event.reason);\n event.preventDefault(); // \u041F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u043C \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u0435 \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n });\n \n // \u041E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u044B\u0445 \u043E\u0448\u0438\u0431\u043E\u043A\n window.addEventListener('error', (event) => {\n console.error('\uD83D\uDEA8 Global error:', event.error);\n event.preventDefault(); // \u041F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u043C \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u0435 \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n });\n \n if (!window.initializeApp) {\n window.initializeApp = initializeApp;\n }\n }\n // Render Enhanced Application\n ReactDOM.render(React.createElement(EnhancedSecureP2PChat), document.getElementById('root'));"], - "mappings": "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", + "sourcesContent": ["// QRScanner will be loaded as a script\n \n // Slider Component\n const UniqueFeatureSlider = () => {\n const [currentSlide, setCurrentSlide] = React.useState(0);\n \n const slides = [\n {\n icon: \"fas fa-shield-halved\",\n color: \"orange\",\n title: \"18-Layer Military Security\",\n description: \"Revolutionary defense system with ECDH P-384 + AES-GCM 256 + ECDSA + Complete ASN.1 Validation. Enhanced Security Edition provides military-grade protection exceeding government standards with complete key structure verification.\"\n },\n {\n icon: \"fas fa-network-wired\",\n color: \"purple\",\n title: \"Pure P2P WebRTC Architecture\",\n description: \"Direct peer-to-peer connections without any servers. Impossible to censor, block, or monitor. Complete decentralization with zero infrastructure.\"\n },\n {\n icon: \"fas fa-sync-alt\",\n color: \"green\",\n title: \"Perfect Forward Secrecy\",\n description: \"Automatic key rotation every 5 minutes or 100 messages. Non-extractable keys with hardware protection ensure past messages remain secure.\"\n },\n {\n icon: \"fas fa-user-secret\",\n color: \"cyan\",\n title: \"Advanced Traffic Obfuscation\",\n description: \"Fake traffic generation, packet padding, and pattern masking make communication indistinguishable from random noise. Defeats traffic analysis.\"\n },\n {\n icon: \"fas fa-eye-slash\",\n color: \"blue\",\n title: \"Zero Data Collection\",\n description: \"No registration, no servers, no logs. Messages exist only in browser memory. Complete anonymity with instant anonymous channels.\"\n },\n {\n icon: \"fas fa-code\",\n color: \"emerald\",\n title: \"100% Open Source Security\",\n description: \"All code is open for audit under MIT license. Uses only standard WebCrypto APIs. Cryptography runs directly in browser without server dependencies.\"\n }\n ];\n \n const nextSlide = () => setCurrentSlide((prev) => (prev + 1) % slides.length);\n const prevSlide = () => setCurrentSlide((prev) => (prev - 1 + slides.length) % slides.length);\n const goToSlide = (index) => setCurrentSlide(index);\n \n React.useEffect(() => {\n const timer = setInterval(() => {\n nextSlide();\n }, 15000);\n return () => clearInterval(timer);\n }, []);\n \n return React.createElement('div', {\n className: \"mt-12\"\n }, [\n React.createElement('div', {\n key: 'header',\n className: \"text-center mb-8\"\n }, [\n React.createElement('h3', {\n key: 'title',\n className: \"text-2xl font-semibold text-primary mb-3\"\n }, 'Why SecureBit.chat is unique'),\n React.createElement('p', {\n key: 'subtitle',\n className: \"text-secondary max-w-2xl mx-auto\"\n }, 'The only messenger with military-grade cryptography')\n ]),\n \n React.createElement('div', {\n key: 'slider-container',\n className: \"relative max-w-4xl mx-auto\"\n }, [\n React.createElement('div', {\n key: 'slider-wrapper',\n className: \"overflow-hidden rounded-xl\"\n }, [\n React.createElement('div', {\n key: 'slides',\n className: \"flex transition-transform duration-500 ease-in-out\",\n style: { transform: `translateX(-${currentSlide * 100}%)` }\n }, slides.map((slide, index) =>\n React.createElement('div', {\n key: index,\n className: \"w-full flex-shrink-0 px-4\"\n }, [\n React.createElement('div', {\n key: 'slide-content',\n className: \"card-minimal rounded-xl p-8 text-center min-h-[300px] flex flex-col justify-center relative overflow-hidden\"\n }, [\n // Background icon\n React.createElement('i', {\n key: 'bg-icon',\n className: `${slide.icon} absolute right-[-100px] top-1/2 -translate-y-1/2 opacity-10 text-[300px] pointer-events-none ${\n slide.color === 'orange' ? 'text-orange-500' :\n slide.color === 'yellow' ? 'text-yellow-500' :\n slide.color === 'purple' ? 'text-purple-500' :\n slide.color === 'green' ? 'text-green-500' :\n slide.color === 'cyan' ? 'text-cyan-500' :\n slide.color === 'blue' ? 'text-blue-500' :\n 'text-emerald-500'\n }`\n }),\n \n // Content\n React.createElement('h4', {\n key: 'slide-title',\n className: \"text-xl font-semibold text-primary mb-4 relative z-10\"\n }, slide.title),\n React.createElement('p', {\n key: 'slide-description',\n className: \"text-secondary leading-relaxed max-w-2xl mx-auto relative z-10\"\n }, slide.description)\n ])\n ])\n ))\n ]),\n \n // Navigation\n React.createElement('button', {\n key: 'prev-btn',\n onClick: prevSlide,\n className: \"absolute left-2 top-1/2 transform -translate-y-1/2 w-10 h-10 bg-gray-600/80 hover:bg-gray-500/80 text-white rounded-full flex items-center justify-center transition-all duration-200 z-10\"\n }, [\n React.createElement('i', {\n key: 'prev-icon',\n className: \"fas fa-chevron-left\"\n })\n ]),\n React.createElement('button', {\n key: 'next-btn',\n onClick: nextSlide,\n className: \"absolute right-2 top-1/2 transform -translate-y-1/2 w-10 h-10 bg-gray-600/80 hover:bg-gray-500/80 text-white rounded-full flex items-center justify-center transition-all duration-200 z-10\"\n }, [\n React.createElement('i', {\n key: 'next-icon',\n className: \"fas fa-chevron-right\"\n })\n ])\n ]),\n \n // Enhanced dots navigation (\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u044B\u0435 \u0442\u043E\u0447\u043A\u0438)\n React.createElement('div', {\n key: 'dots-container',\n className: \"flex justify-center space-x-3 mt-6\"\n }, slides.map((slide, index) =>\n React.createElement('button', {\n key: index,\n onClick: () => goToSlide(index),\n className: `relative group transition-all duration-300 ${\n index === currentSlide\n ? 'w-12 h-4 bg-orange-500 rounded-full'\n : 'w-4 h-4 bg-gray-600 hover:bg-gray-500 rounded-full hover:scale-125'\n }`\n }, [\n // Tooltip on hover\n React.createElement('div', {\n key: 'tooltip',\n className: \"absolute -top-10 left-1/2 transform -translate-x-1/2 bg-gray-800 text-white text-xs px-2 py-1 rounded opacity-0 group-hover:opacity-100 transition-opacity duration-200 whitespace-nowrap pointer-events-none\"\n }, slide.title)\n ])\n ))\n ]);\n };\n \n \n \n const ComparisonTable = () => {\n const [selectedFeature, setSelectedFeature] = React.useState(null);\n \n const messengers = [\n {\n name: \"SecureBit.chat\",\n logo:
\n \n
,\n type: \"P2P WebRTC\",\n version: \"Latest\",\n color: \"orange\",\n },\n {\n name: \"Signal\",\n logo: (\n \n \n \n \n ),\n type: \"Centralized\",\n version: \"Latest\",\n color: \"blue\",\n },\n {\n name: \"Threema\",\n logo: (\n \n \n \n \n \n \n \n ),\n type: \"Centralized\",\n version: \"Latest\",\n color: \"green\",\n },\n {\n name: \"Session\",\n logo: (\n \n \n \n \n ),\n type: \"Onion Network\",\n version: \"Latest\",\n color: \"cyan\",\n },\n ];\n \n const features = [\n {\n name: \"Security Architecture\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"18-layer military-grade defense system with complete ASN.1 validation\" },\n signal: { status: \"\u2705\", detail: \"Signal Protocol with double ratchet\" },\n threema: { status: \"\u2705\", detail: \"Standard security implementation\" },\n session: { status: \"\u2705\", detail: \"Modified Signal Protocol + Onion routing\" },\n },\n {\n name: \"Cryptography\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"ECDH P-384 + AES-GCM 256 + ECDSA P-384\" },\n signal: { status: \"\u2705\", detail: \"Signal Protocol + Double Ratchet\" },\n threema: { status: \"\u2705\", detail: \"NaCl + XSalsa20 + Poly1305\" },\n session: { status: \"\u2705\", detail: \"Modified Signal Protocol\" },\n },\n {\n name: \"Perfect Forward Secrecy\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Auto rotation every 5 minutes or 100 messages\" },\n signal: { status: \"\u2705\", detail: \"Double Ratchet algorithm\" },\n threema: { status: \"\u26A0\uFE0F\", detail: \"Partial (group chats)\" },\n session: { status: \"\u2705\", detail: \"Session Ratchet algorithm\" },\n },\n {\n name: \"Architecture\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Pure P2P WebRTC without servers\" },\n signal: { status: \"\u274C\", detail: \"Centralized Signal servers\" },\n threema: { status: \"\u274C\", detail: \"Threema servers in Switzerland\" },\n session: { status: \"\u26A0\uFE0F\", detail: \"Onion routing via network nodes\" },\n },\n {\n name: \"Registration Anonymity\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"No registration required, instant anonymous channels\" },\n signal: { status: \"\u274C\", detail: \"Phone number required\" },\n threema: { status: \"\u2705\", detail: \"ID generated locally\" },\n session: { status: \"\u2705\", detail: \"Random session ID\" },\n },\n {\n name: \"Payment Integration\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Lightning Network satoshis per session + WebLN\" },\n signal: { status: \"\u274C\", detail: \"No payment system\" },\n threema: { status: \"\u274C\", detail: \"No payment system\" },\n session: { status: \"\u274C\", detail: \"No payment system\" },\n },\n {\n name: \"Metadata Protection\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Full metadata encryption + traffic obfuscation\" },\n signal: { status: \"\u26A0\uFE0F\", detail: \"Sealed Sender (partial)\" },\n threema: { status: \"\u26A0\uFE0F\", detail: \"Minimal metadata\" },\n session: { status: \"\u2705\", detail: \"Onion routing hides metadata\" },\n },\n {\n name: \"Traffic Obfuscation\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Fake traffic + pattern masking + packet padding\" },\n signal: { status: \"\u274C\", detail: \"No traffic obfuscation\" },\n threema: { status: \"\u274C\", detail: \"No traffic obfuscation\" },\n session: { status: \"\u2705\", detail: \"Onion routing provides obfuscation\" },\n },\n {\n name: \"Open Source\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"100% open + auditable + MIT license\" },\n signal: { status: \"\u2705\", detail: \"Fully open\" },\n threema: { status: \"\u26A0\uFE0F\", detail: \"Only clients open\" },\n session: { status: \"\u2705\", detail: \"Fully open\" },\n },\n {\n name: \"MITM Protection\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Out-of-band verification + mutual auth + ECDSA\" },\n signal: { status: \"\u2705\", detail: \"Safety numbers verification\" },\n threema: { status: \"\u2705\", detail: \"QR code scanning\" },\n session: { status: \"\u26A0\uFE0F\", detail: \"Basic key verification\" },\n },\n {\n name: \"Economic Model\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Sustainable pay-per-session model\" },\n signal: { status: \"\u26A0\uFE0F\", detail: \"Donations and grants dependency\" },\n threema: { status: \"\u2705\", detail: \"One-time app purchase\" },\n session: { status: \"\u26A0\uFE0F\", detail: \"Donations dependency\" },\n },\n {\n name: \"Censorship Resistance\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Impossible to block P2P + no servers to target\" },\n signal: { status: \"\u26A0\uFE0F\", detail: \"Blocked in authoritarian countries\" },\n threema: { status: \"\u26A0\uFE0F\", detail: \"May be blocked\" },\n session: { status: \"\u2705\", detail: \"Onion routing bypasses blocks\" },\n },\n {\n name: \"Data Storage\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Zero data storage - only in browser memory\" },\n signal: { status: \"\u26A0\uFE0F\", detail: \"Local database storage\" },\n threema: { status: \"\u26A0\uFE0F\", detail: \"Local + optional backup\" },\n session: { status: \"\u26A0\uFE0F\", detail: \"Local database storage\" },\n },\n {\n name: \"Key Security\",\n lockbit: { status: \"\uD83C\uDFC6\", detail: \"Non-extractable keys + hardware protection\" },\n signal: { status: \"\u2705\", detail: \"Secure key storage\" },\n threema: { status: \"\u2705\", detail: \"Local key storage\" },\n session: { status: \"\u2705\", detail: \"Secure key storage\" },\n },\n {\n name: \"Post-Quantum Roadmap\",\n lockbit: { status: \"\u2705\", detail: \"Planned v5.0 - CRYSTALS-Kyber/Dilithium\" },\n signal: { status: \"\u26A0\uFE0F\", detail: \"PQXDH in development\" },\n threema: { status: \"\u274C\", detail: \"Not announced\" },\n session: { status: \"\u274C\", detail: \"Not announced\" },\n },\n ];\n \n const getStatusIcon = (status) => {\n const statusMap = {\n \"\uD83C\uDFC6\": { icon: \"\uD83C\uDFC6\", color: \"text-yellow-400\" },\n \"\u2705\": { icon: \"\u2705\", color: \"text-green-400\" },\n \"\u26A0\uFE0F\": { icon: \"\u26A0\uFE0F\", color: \"text-yellow-400\" },\n \"\u274C\": { icon: \"\u274C\", color: \"text-red-400\" },\n };\n return statusMap[status] || { icon: status, color: \"text-gray-400\" };\n };\n \n const toggleFeatureDetail = (index) => {\n setSelectedFeature(selectedFeature === index ? null : index);\n };\n \n return (\n
\n {/* Title */}\n
\n

\n Enhanced Security Edition Comparison\n

\n

\n Enhanced Security Edition vs leading secure messengers\n

\n
\n \uD83C\uDFC6\n \n Category Leader - Military-Grade Security\n \n
\n
\n \n {/* Table container */}\n
\n {/* Mobile Alert */}\n
\n

\n \uD83D\uDCA1 Rotate your device horizontally for better viewing\n

\n
\n \n {/* Table */}\n
\n \n {/* Table Header */}\n \n \n \n Security Criterion\n \n {messengers.map((messenger, index) => (\n \n
\n
{messenger.logo}
\n
\n {messenger.name}\n
\n
{messenger.type}
\n
{messenger.version}
\n
\n \n ))}\n \n \n \n {/* Table body*/}\n \n {features.map((feature, featureIndex) => (\n \n toggleFeatureDetail(featureIndex)}\n >\n \n
\n {feature.name}\n \n
\n \n \n \n {getStatusIcon(feature.lockbit.status).icon}\n \n \n \n \n {getStatusIcon(feature.signal.status).icon}\n \n \n \n \n {getStatusIcon(feature.threema.status).icon}\n \n \n \n \n {getStatusIcon(feature.session.status).icon}\n \n \n \n \n {/* Details */}\n {selectedFeature === featureIndex && (\n \n Technical Details:\n \n
\n {feature.lockbit.detail}\n
\n \n \n
\n {feature.signal.detail}\n
\n \n \n
\n {feature.threema.detail}\n
\n \n \n
\n {feature.session.detail}\n
\n \n \n )}\n
\n ))}\n \n \n
\n \n {/* Legend */}\n
\n
\n \uD83C\uDFC6\n Category Leader\n
\n
\n \u2705\n Excellent\n
\n
\n \u26A0\uFE0F\n Partial/Limited\n
\n
\n \u274C\n Not Available\n
\n
\n \n {/* Legend */}\n
\n
\n

\n \n SecureBit.chat Enhanced Security Edition Summary\n

\n

\n SecureBit.chat dominates in 11 out of 15 security categories, establishing itself as the most secure P2P messenger available.\n The Enhanced Security Edition introduces revolutionary 18-layer defense architecture with complete ASN.1 validation, and military-grade cryptography that exceeds government and enterprise standards.\n

\n
\n
\n
\uD83D\uDD10 Cryptographic Superiority
\n

\n ECDH P-384 + AES-GCM 256 + ECDSA P-384 + Complete ASN.1 Validation with non-extractable keys and 18-layer defense system\n

\n
\n
\n
\uD83C\uDF10 True P2P Architecture
\n

\n Pure WebRTC connections with zero servers, impossible to censor or shutdown, complete anonymity\n

\n
\n
\n
\uD83C\uDFAD Traffic Obfuscation
\n

\n Advanced fake traffic generation, packet padding, and pattern masking defeat traffic analysis\n

\n
\n
\n
\n
\n \n {/* Version information */}\n
\n
\n \uD83D\uDE80\n Enhanced Security Edition v4.02.985 - ECDH + DTLS + SAS - \n Active Production Release\n | Next: v5.0 Post-Quantum\n
\n
\n
\n
\n );\n };\n \n function Roadmap() {\n const [selectedPhase, setSelectedPhase] = React.useState(null);\n const phases = [\n {\n version: \"v1.0\",\n title: \"Start of Development\",\n status: \"done\",\n date: \"Early 2025\",\n description: \"Idea, prototype, and infrastructure setup\",\n features: [\n \"Concept and requirements formation\",\n \"Stack selection: WebRTC, P2P, cryptography\",\n \"First messaging prototypes\",\n \"Repository creation and CI\",\n \"Basic encryption architecture\",\n \"UX/UI design\"\n ]\n },\n {\n version: \"v1.5\",\n title: \"Alpha Release\",\n status: \"done\",\n date: \"Spring 2025\",\n description: \"First public alpha: basic chat and key exchange\",\n features: [\n \"Basic P2P messaging via WebRTC\",\n \"Simple E2E encryption (demo scheme)\",\n \"Stable signaling and reconnection\",\n \"Minimal UX for testing\",\n \"Feedback collection from early testers\"\n ]\n },\n {\n version: \"v2.0\",\n title: \"Security Hardened\",\n status: \"done\",\n date: \"Summer 2025\",\n description: \"Security strengthening and stable branch release\",\n features: [\n \"ECDH/ECDSA implementation in production\",\n \"Perfect Forward Secrecy and key rotation\",\n \"Improved authentication checks\",\n \"File encryption and large payload transfers\",\n \"Audit of basic cryptoprocesses\"\n ]\n },\n {\n version: \"v3.0\",\n title: \"Scaling & Stability\",\n status: \"done\",\n date: \"Fall 2025\",\n description: \"Network scaling and stability improvements\",\n features: [\n \"Optimization of P2P connections and NAT traversal\",\n \"Reconnection mechanisms and message queues\",\n \"Reduced battery consumption on mobile\",\n \"Support for multi-device synchronization\",\n \"Monitoring and logging tools for developers\"\n ]\n },\n {\n version: \"v3.5\",\n title: \"Privacy-first Release\",\n status: \"done\",\n date: \"Winter 2025\",\n description: \"Focus on privacy: minimizing metadata\",\n features: [\n \"Metadata protection and fingerprint reduction\",\n \"Experiments with onion routing and DHT\",\n \"Options for anonymous connections\",\n \"Preparation for open code audit\",\n \"Improved user verification processes\"\n ]\n },\n \n // current and future phases\n {\n version: \"v4.02.985\",\n title: \"Enhanced Security Edition\",\n status: \"current\",\n date: \"Now\",\n description: \"Current version with ECDH + DTLS + SAS security, 18-layer military-grade cryptography and complete ASN.1 validation\",\n features: [\n \"ECDH + DTLS + SAS triple-layer security\",\n \"ECDH P-384 + AES-GCM 256-bit encryption\",\n \"DTLS fingerprint verification\",\n \"SAS (Short Authentication String) verification\",\n \"Perfect Forward Secrecy with key rotation\",\n \"Enhanced MITM attack prevention\",\n \"Complete ASN.1 DER validation\",\n \"OID and EC point verification\",\n \"SPKI structure validation\",\n \"P2P WebRTC architecture\",\n \"Metadata protection\",\n \"100% open source code\"\n ]\n },\n {\n version: \"v4.5\",\n title: \"Mobile & Desktop Edition\",\n status: \"development\",\n date: \"Q2 2025\",\n description: \"Native apps for all platforms\",\n features: [\n \"PWA app for mobile\",\n \"Electron app for desktop\",\n \"Real-time notifications\",\n \"Automatic reconnection\",\n \"Battery optimization\",\n \"Cross-device synchronization\",\n \"Improved UX/UI\",\n \"Support for files up to 100MB\"\n ]\n },\n {\n version: \"v5.0\",\n title: \"Quantum-Resistant Edition\",\n status: \"planned\",\n date: \"Q4 2025\",\n description: \"Protection against quantum computers\",\n features: [\n \"Post-quantum cryptography CRYSTALS-Kyber\",\n \"SPHINCS+ digital signatures\",\n \"Hybrid scheme: classic + PQ\",\n \"Quantum-safe key exchange\",\n \"Updated hashing algorithms\",\n \"Migration of existing sessions\",\n \"Compatibility with v4.x\",\n \"Quantum-resistant protocols\"\n ]\n },\n {\n version: \"v5.5\",\n title: \"Group Communications\",\n status: \"planned\",\n date: \"Q2 2026\",\n description: \"Group chats with preserved privacy\",\n features: [\n \"P2P group connections up to 8 participants\",\n \"Mesh networking for groups\",\n \"Signal Double Ratchet for groups\",\n \"Anonymous groups without metadata\",\n \"Ephemeral groups (disappear after session)\",\n \"Cryptographic group administration\",\n \"Group member auditing\"\n ]\n },\n {\n version: \"v6.0\",\n title: \"Decentralized Network\",\n status: \"research\",\n date: \"2027\",\n description: \"Fully decentralized network\",\n features: [\n \"LockBit node mesh network\",\n \"DHT for peer discovery\",\n \"Built-in onion routing\",\n \"Tokenomics and node incentives\",\n \"Governance via DAO\",\n \"Interoperability with other networks\",\n \"Cross-platform compatibility\",\n \"Self-healing network\"\n ]\n },\n {\n version: \"v7.0\",\n title: \"AI Privacy Assistant\",\n status: \"research\",\n date: \"2028+\",\n description: \"AI for privacy and security\",\n features: [\n \"Local AI threat analysis\",\n \"Automatic MITM detection\",\n \"Adaptive cryptography\",\n \"Personalized security recommendations\",\n \"Zero-knowledge machine learning\",\n \"Private AI assistant\",\n \"Predictive security\",\n \"Autonomous attack protection\"\n ]\n }\n ];\n \n \n const getStatusConfig = (status) => {\n switch (status) {\n case 'current':\n return {\n color: 'green',\n bgClass: 'bg-green-500/10 border-green-500/20',\n textClass: 'text-green-400',\n icon: 'fas fa-check-circle',\n label: 'Current Version'\n };\n case 'development':\n return {\n color: 'orange',\n bgClass: 'bg-orange-500/10 border-orange-500/20',\n textClass: 'text-orange-400',\n icon: 'fas fa-code',\n label: 'In Development'\n };\n case 'planned':\n return {\n color: 'blue',\n bgClass: 'bg-blue-500/10 border-blue-500/20',\n textClass: 'text-blue-400',\n icon: 'fas fa-calendar-alt',\n label: 'Planned'\n };\n case 'research':\n return {\n color: 'purple',\n bgClass: 'bg-purple-500/10 border-purple-500/20',\n textClass: 'text-purple-400',\n icon: 'fas fa-flask',\n label: 'Research'\n };\n case 'done':\n return {\n color: 'gray',\n bgClass: 'bg-gray-500/10 border-gray-500/20',\n textClass: 'text-gray-300',\n icon: 'fas fa-flag-checkered',\n label: 'Released'\n };\n default:\n return {\n color: 'gray',\n bgClass: 'bg-gray-500/10 border-gray-500/20',\n textClass: 'text-gray-400',\n icon: 'fas fa-question',\n label: 'Unknown'\n };\n }\n };\n \n \n const togglePhaseDetail = (index) => {\n setSelectedPhase(selectedPhase === index ? null : index);\n };\n return (\n
\n
\n

\n Development Roadmap\n

\n

\n Evolution of SecureBit.chat : from initial development to quantum-resistant decentralized network with complete ASN.1 validation\n

\n \n \n \n Click on a version for details\n \n
\n
\n \n
\n
\n {/* The line has been removed */}\n \n
\n {phases.map((phase, index) => {\n const statusConfig = getStatusConfig(phase.status);\n const isExpanded = selectedPhase === index;\n \n return (\n
\n {/* The dots are visible only on sm and larger screens */}\n \n togglePhaseDetail(index)}\n key={`phase-button-${index}`}\n className={`card-minimal rounded-xl p-4 text-left w-full transition-all duration-300 ${\n isExpanded\n ? \"ring-2 ring-\" + statusConfig.color + \"-500/30\"\n : \"\"\n }`}\n >\n \n \n \n \n {phase.version}\n \n
\n \n
\n \n {phase.title}\n \n \n {phase.description}\n

\n
\n
\n \n \n \n \n \n {statusConfig.label}\n \n
\n \n
{phase.date}
\n \n
\n \n \n {isExpanded && (\n \n \n \n Key features:\n \n \n \n {phase.features.map((feature, featureIndex) => (\n \n \n \n {feature}\n \n \n ))}\n \n \n )}\n \n \n );\n })}\n \n \n \n \n
\n \n \n Join the future of privacy\n \n

\n SecureBit.chat grows thanks to the community. Your ideas and feedback help shape the future of secure communication with complete ASN.1 validation.\n

\n \n \n \n \n GitHub Repository\n \n \n \n \n Feedback\n \n
\n \n \n \n );\n }\n \n \n // Enhanced Copy Button with better UX\n const EnhancedCopyButton = ({ text, className = \"\", children }) => {\n const [copied, setCopied] = React.useState(false);\n \n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n console.error('Copy failed:', error);\n // Fallback for older browsers\n const textArea = document.createElement('textarea');\n textArea.value = text;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n };\n \n return React.createElement('button', {\n onClick: handleCopy,\n className: `${className} transition-all duration-200`\n }, [\n React.createElement('i', {\n key: 'icon',\n className: `${copied ? 'fas fa-check accent-green' : 'fas fa-copy text-secondary'} mr-2`\n }),\n copied ? 'Copied!' : children\n ]);\n };\n \n // Verification Component\n const VerificationStep = ({ verificationCode, onConfirm, onReject, localConfirmed, remoteConfirmed, bothConfirmed }) => {\n return React.createElement('div', {\n className: \"card-minimal rounded-xl p-6 border-purple-500/20\"\n }, [\n React.createElement('div', {\n key: 'header',\n className: \"flex items-center mb-4\"\n }, [\n React.createElement('div', {\n key: 'icon',\n className: \"w-10 h-10 bg-purple-500/10 border border-purple-500/20 rounded-lg flex items-center justify-center mr-3\"\n }, [\n React.createElement('i', {\n className: 'fas fa-shield-alt accent-purple'\n })\n ]),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-medium text-primary\"\n }, \"Security verification\")\n ]),\n React.createElement('div', {\n key: 'content',\n className: \"space-y-4\"\n }, [\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-sm\"\n }, \"Verify the security code with your contact via another communication channel (voice, SMS, etc.):\"),\n React.createElement('div', {\n key: 'code-display',\n className: \"text-center\"\n }, [\n React.createElement('div', {\n key: 'code',\n className: \"verification-code text-2xl py-4\"\n }, verificationCode)\n ]),\n // Verification status indicators\n React.createElement('div', {\n key: 'verification-status',\n className: \"space-y-2\"\n }, [\n React.createElement('div', {\n key: 'local-status',\n className: `flex items-center justify-between p-2 rounded-lg ${localConfirmed ? 'bg-green-500/10 border border-green-500/20' : 'bg-gray-500/10 border border-gray-500/20'}`\n }, [\n React.createElement('span', {\n key: 'local-label',\n className: \"text-sm text-secondary\"\n }, \"Your confirmation:\"),\n React.createElement('div', {\n key: 'local-indicator',\n className: \"flex items-center\"\n }, [\n React.createElement('i', {\n key: 'local-icon',\n className: `fas ${localConfirmed ? 'fa-check-circle text-green-400' : 'fa-clock text-gray-400'} mr-2`\n }),\n React.createElement('span', {\n key: 'local-text',\n className: `text-sm ${localConfirmed ? 'text-green-400' : 'text-gray-400'}`\n }, localConfirmed ? 'Confirmed' : 'Pending')\n ])\n ]),\n React.createElement('div', {\n key: 'remote-status',\n className: `flex items-center justify-between p-2 rounded-lg ${remoteConfirmed ? 'bg-green-500/10 border border-green-500/20' : 'bg-gray-500/10 border border-gray-500/20'}`\n }, [\n React.createElement('span', {\n key: 'remote-label',\n className: \"text-sm text-secondary\"\n }, \"Peer confirmation:\"),\n React.createElement('div', {\n key: 'remote-indicator',\n className: \"flex items-center\"\n }, [\n React.createElement('i', {\n key: 'remote-icon',\n className: `fas ${remoteConfirmed ? 'fa-check-circle text-green-400' : 'fa-clock text-gray-400'} mr-2`\n }),\n React.createElement('span', {\n key: 'remote-text',\n className: `text-sm ${remoteConfirmed ? 'text-green-400' : 'text-gray-400'}`\n }, remoteConfirmed ? 'Confirmed' : 'Pending')\n ])\n ])\n ]),\n React.createElement('div', {\n key: 'warning',\n className: \"p-3 bg-yellow-500/10 border border-yellow-500/20 rounded-lg\"\n }, [\n React.createElement('p', {\n className: \"text-yellow-400 text-sm flex items-center\"\n }, [\n React.createElement('i', {\n className: 'fas fa-exclamation-triangle mr-2'\n }),\n 'Make sure the codes match exactly.!'\n ])\n ]),\n React.createElement('div', {\n key: 'buttons',\n className: \"flex space-x-3\"\n }, [\n React.createElement('button', {\n key: 'confirm',\n onClick: onConfirm,\n disabled: localConfirmed,\n className: `flex-1 py-3 px-4 rounded-lg font-medium transition-all duration-200 ${localConfirmed ? 'bg-gray-500/20 text-gray-400 cursor-not-allowed' : 'btn-verify text-white'}`\n }, [\n React.createElement('i', {\n className: `fas ${localConfirmed ? 'fa-check-circle' : 'fa-check'} mr-2`\n }),\n localConfirmed ? 'Confirmed' : 'The codes match'\n ]),\n React.createElement('button', {\n key: 'reject',\n onClick: onReject,\n className: \"flex-1 bg-red-500/10 hover:bg-red-500/20 text-red-400 border border-red-500/20 py-3 px-4 rounded-lg font-medium transition-all duration-200\"\n }, [\n React.createElement('i', {\n className: 'fas fa-times mr-2'\n }),\n 'The codes do not match'\n ])\n ])\n ])\n ]);\n };\n \n // Enhanced Chat Message with better security indicators\n const EnhancedChatMessage = ({ message, type, timestamp }) => {\n const formatTime = (ts) => {\n return new Date(ts).toLocaleTimeString('ru-RU', { \n hour: '2-digit', \n minute: '2-digit',\n second: '2-digit'\n });\n };\n \n const getMessageStyle = () => {\n switch (type) {\n case 'sent':\n return {\n container: \"ml-auto bg-orange-500/15 border-orange-500/20 text-primary\",\n icon: \"fas fa-lock accent-orange\",\n label: \"Encrypted\"\n };\n case 'received':\n return {\n container: \"mr-auto card-minimal text-primary\",\n icon: \"fas fa-unlock-alt accent-green\",\n label: \"Decrypted\"\n };\n case 'system':\n return {\n container: \"mx-auto bg-yellow-500/10 border border-yellow-500/20 text-yellow-400\",\n icon: \"fas fa-info-circle accent-yellow\",\n label: \"System\"\n };\n default:\n return {\n container: \"mx-auto card-minimal text-secondary\",\n icon: \"fas fa-circle text-muted\",\n label: \"Unknown\"\n };\n }\n };\n \n const style = getMessageStyle();\n \n return React.createElement('div', {\n className: `message-slide mb-3 p-3 rounded-lg max-w-md break-words ${style.container} border`\n }, [\n React.createElement('div', {\n key: 'content',\n className: \"flex items-start space-x-2\"\n }, [\n React.createElement('i', {\n key: 'icon',\n className: `${style.icon} text-sm mt-0.5 opacity-70`\n }),\n React.createElement('div', {\n key: 'text',\n className: \"flex-1\"\n }, [\n React.createElement('div', {\n key: 'message',\n className: \"text-sm\"\n }, message),\n timestamp && React.createElement('div', {\n key: 'meta',\n className: \"flex items-center justify-between mt-1 text-xs opacity-50\"\n }, [\n React.createElement('span', {\n key: 'time'\n }, formatTime(timestamp)),\n React.createElement('span', {\n key: 'status',\n className: \"text-xs\"\n }, style.label)\n ])\n ])\n ])\n ]);\n };\n \n // Enhanced Connection Setup with verification\n const EnhancedConnectionSetup = ({\n messages, \n onCreateOffer, \n onCreateAnswer, \n onConnect, \n onClearData,\n onVerifyConnection,\n connectionStatus,\n offerData,\n answerData,\n offerInput,\n setOfferInput,\n answerInput,\n setAnswerInput,\n showOfferStep,\n showAnswerStep,\n verificationCode,\n showVerification,\n showQRCode,\n qrCodeUrl,\n showQRScanner,\n setShowQRCode,\n setShowQRScanner,\n setShowQRScannerModal,\n offerPassword,\n answerPassword,\n localVerificationConfirmed,\n remoteVerificationConfirmed,\n bothVerificationsConfirmed\n }) => {\n const [mode, setMode] = React.useState('select');\n \n const resetToSelect = () => {\n setMode('select');\n onClearData();\n };\n \n const handleVerificationConfirm = () => {\n onVerifyConnection(true);\n };\n \n const handleVerificationReject = () => {\n onVerifyConnection(false);\n };\n \n if (showVerification) {\n return React.createElement('div', {\n className: \"min-h-[calc(100vh-104px)] flex items-center justify-center p-4\"\n }, [\n React.createElement('div', {\n key: 'verification',\n className: \"w-full max-w-md\"\n }, [\n React.createElement(VerificationStep, {\n verificationCode: verificationCode,\n onConfirm: handleVerificationConfirm,\n onReject: handleVerificationReject,\n localConfirmed: localVerificationConfirmed,\n remoteConfirmed: remoteVerificationConfirmed,\n bothConfirmed: bothVerificationsConfirmed\n })\n ])\n ]);\n }\n \n if (mode === 'select') {\n return React.createElement('div', {\n className: \"min-h-[calc(100vh-104px)] flex items-center justify-center p-4\"\n }, [\n React.createElement('div', {\n key: 'selector',\n className: \"w-full max-w-4xl\"\n }, [\n React.createElement('div', {\n key: 'header',\n className: \"text-center mb-8\"\n }, [\n React.createElement('h2', {\n key: 'title',\n className: \"text-2xl font-semibold text-primary mb-3\"\n }, 'Start secure communication'),\n React.createElement('p', {\n key: 'subtitle',\n className: \"text-secondary max-w-2xl mx-auto\"\n }, \"Choose a connection method for a secure channel with ECDH encryption and Perfect Forward Secrecy.\")\n ]),\n \n React.createElement('div', {\n key: 'options',\n className: \"grid md:grid-cols-2 gap-6 max-w-3xl mx-auto\"\n }, [\n // Create Connection\n React.createElement('div', {\n key: 'create',\n onClick: () => setMode('create'),\n className: \"card-minimal rounded-xl p-6 cursor-pointer group\"\n }, [\n React.createElement('div', {\n key: 'icon',\n className: \"w-12 h-12 bg-blue-500/10 border border-blue-500/20 rounded-lg flex items-center justify-center mx-auto mb-4\"\n }, [\n React.createElement('i', {\n className: 'fas fa-plus text-xl text-blue-400'\n })\n ]),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-semibold text-primary text-center mb-3\"\n }, \"Create channel\"),\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-center text-sm mb-4\"\n }, \"Initiate a new secure connection with encrypted exchange\"),\n React.createElement('div', {\n key: 'features',\n className: \"space-y-2\"\n }, [\n React.createElement('div', {\n key: 'f1',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-key accent-orange mr-2 text-xs'\n }),\n 'Generating ECDH keys'\n ]),\n React.createElement('div', {\n key: 'f2',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-shield-alt accent-orange mr-2 text-xs'\n }),\n 'Verification code'\n ]),\n React.createElement('div', {\n key: 'f3',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-sync-alt accent-purple mr-2 text-xs'\n }),\n 'PFS key rotation'\n ])\n ])\n ]),\n \n // Join Connection\n React.createElement('div', {\n key: 'join',\n onClick: () => setMode('join'),\n className: \"card-minimal rounded-xl p-6 cursor-pointer group\"\n }, [\n React.createElement('div', {\n key: 'icon',\n className: \"w-12 h-12 bg-green-500/10 border border-green-500/20 rounded-lg flex items-center justify-center mx-auto mb-4\"\n }, [\n React.createElement('i', {\n className: 'fas fa-link text-xl accent-green'\n })\n ]),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-semibold text-primary text-center mb-3\"\n }, \"Join\"),\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-center text-sm mb-4\"\n }, \"Connect to an existing secure channel\"),\n React.createElement('div', {\n key: 'features',\n className: \"space-y-2\"\n }, [\n React.createElement('div', {\n key: 'f1',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-paste accent-green mr-2 text-xs'\n }),\n 'Paste Offer invitation'\n ]),\n React.createElement('div', {\n key: 'f2',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-check-circle accent-green mr-2 text-xs'\n }),\n 'Automatic verification'\n ]),\n React.createElement('div', {\n key: 'f3',\n className: \"flex items-center text-sm text-muted\"\n }, [\n React.createElement('i', {\n className: 'fas fa-sync-alt accent-purple mr-2 text-xs'\n }),\n 'PFS protection'\n ])\n ])\n ])\n ]),\n \n \n React.createElement('div', {\n key: 'security-features',\n className: \"grid grid-cols-2 md:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4 max-w-6xl mx-auto mt-8\"\n }, [\n React.createElement('div', { key: 'feature1', className: \"text-center p-3 sm:p-4\" }, [\n React.createElement('div', { key: 'icon', className: \"w-10 h-10 sm:w-12 sm:h-12 bg-green-500/10 border border-green-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3\" }, [\n React.createElement('i', { className: 'fas fa-key accent-green' })\n ]),\n React.createElement('h4', { key: 'title', className: \"text-xs sm:text-sm font-medium text-primary mb-1\" }, \"ECDH P-384 Key Exchange\"),\n React.createElement('p', { key: 'desc', className: \"text-xs text-muted leading-tight\" }, \"Military-grade elliptic curve key exchange\")\n ]),\n React.createElement('div', { key: 'feature2', className: \"text-center p-3 sm:p-4\" }, [\n React.createElement('div', { key: 'icon', className: \"w-10 h-10 sm:w-12 sm:h-12 bg-purple-500/10 border border-purple-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3\" }, [\n React.createElement('i', { className: 'fas fa-user-shield accent-purple' })\n ]),\n React.createElement('h4', { key: 'title', className: \"text-xs sm:text-sm font-medium text-primary mb-1\" }, \"MITM Protection\"),\n React.createElement('p', { key: 'desc', className: \"text-xs text-muted leading-tight\" }, \"Out-of-band verification against attacks\")\n ]),\n React.createElement('div', { key: 'feature3', className: \"text-center p-3 sm:p-4\" }, [\n React.createElement('div', { key: 'icon', className: \"w-10 h-10 sm:w-12 sm:h-12 bg-orange-500/10 border border-orange-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3\" }, [\n React.createElement('i', { className: 'fas fa-lock accent-orange' })\n ]),\n React.createElement('h4', { key: 'title', className: \"text-xs sm:text-sm font-medium text-primary mb-1\" }, \"AES-GCM 256 Encryption\"),\n React.createElement('p', { key: 'desc', className: \"text-xs text-muted leading-tight\" }, \"Authenticated encryption standard\")\n ]),\n React.createElement('div', { key: 'feature4', className: \"text-center p-3 sm:p-4\" }, [\n React.createElement('div', { key: 'icon', className: \"w-10 h-10 sm:w-12 sm:h-12 bg-cyan-500/10 border border-cyan-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3\" }, [\n React.createElement('i', { className: 'fas fa-sync-alt accent-cyan' })\n ]),\n React.createElement('h4', { key: 'title', className: \"text-xs sm:text-sm font-medium text-primary mb-1\" }, \"Perfect Forward Secrecy\"),\n React.createElement('p', { key: 'desc', className: \"text-xs text-muted leading-tight\" }, \"Automatic key rotation every 5 minutes\")\n ]),\n React.createElement('div', { key: 'feature5', className: \"text-center p-3 sm:p-4\" }, [\n React.createElement('div', { key: 'icon', className: \"w-10 h-10 sm:w-12 sm:h-12 bg-blue-500/10 border border-blue-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3\" }, [\n React.createElement('i', { className: 'fas fa-signature accent-blue' })\n ]),\n React.createElement('h4', { key: 'title', className: \"text-xs sm:text-sm font-medium text-primary mb-1\" }, \"ECDSA P-384 Signatures\"),\n React.createElement('p', { key: 'desc', className: \"text-xs text-muted leading-tight\" }, \"Digital signatures for message integrity\")\n ]),\n ]),\n \n React.createElement(UniqueFeatureSlider, { key: 'unique-features-slider' }),\n \n React.createElement(DownloadApps, { key: 'download-apps' }),\n \n React.createElement(ComparisonTable, { key: 'comparison-table' }), \n \n React.createElement(Roadmap, { key: 'roadmap' }),\n ])\n ]);\n }\n \n if (mode === 'create') {\n return React.createElement('div', {\n className: \"min-h-[calc(100vh-104px)] flex items-center justify-center p-4\"\n }, [\n React.createElement('div', {\n key: 'create-flow',\n className: \"w-full max-w-3xl space-y-6\"\n }, [\n React.createElement('div', {\n key: 'header',\n className: \"text-center\"\n }, [\n React.createElement('button', {\n key: 'back',\n onClick: resetToSelect,\n className: \"mb-4 text-secondary hover:text-primary transition-colors flex items-center mx-auto text-sm\"\n }, [\n React.createElement('i', {\n className: 'fas fa-arrow-left mr-2'\n }),\n 'Back to selection'\n ]),\n React.createElement('h2', {\n key: 'title',\n className: \"text-xl font-semibold text-primary mb-2\"\n }, 'Creating a secure channel')\n ]),\n \n // Step 1\n React.createElement('div', {\n key: 'step1',\n className: \"card-minimal rounded-xl p-6\"\n }, [\n React.createElement('div', {\n key: 'step-header',\n className: \"flex items-center mb-4\"\n }, [\n React.createElement('div', {\n key: 'number',\n className: \"step-number mr-3\"\n }, '1'),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-medium text-primary\"\n }, \"Generating ECDH keys and verification code\")\n ]),\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-sm mb-4\"\n }, \"Creating cryptographically strong keys and codes to protect against attacks\"),\n React.createElement('button', {\n key: 'create-btn',\n onClick: onCreateOffer,\n disabled: connectionStatus === 'connecting' || showOfferStep,\n className: `w-full btn-primary text-white py-3 px-4 rounded-lg font-medium transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed`\n }, [\n React.createElement('i', {\n className: 'fas fa-shield-alt mr-2'\n }),\n showOfferStep ? 'Keys created \u2713' : 'Create secure keys'\n ]),\n \n showOfferStep && React.createElement('div', {\n key: 'offer-result',\n className: \"mt-6 space-y-4\"\n }, [\n React.createElement('div', {\n key: 'success',\n className: \"p-3 bg-green-500/10 border border-green-500/20 rounded-lg\"\n }, [\n React.createElement('p', {\n className: \"text-green-400 text-sm font-medium flex items-center\"\n }, [\n React.createElement('i', {\n className: 'fas fa-check-circle mr-2'\n }),\n 'Secure invitation created! Send the code to your contact:'\n ])\n ]),\n React.createElement('div', {\n key: 'offer-data',\n className: \"space-y-3\"\n }, [\n React.createElement('textarea', {\n key: 'textarea',\n value: typeof offerData === 'object' ? JSON.stringify(offerData, null, 2) : offerData,\n readOnly: true,\n rows: 8,\n className: \"w-full p-3 bg-custom-bg border border-gray-500/20 rounded-lg font-mono text-xs text-secondary resize-none custom-scrollbar\"\n }),\n React.createElement('div', {\n key: 'buttons',\n className: \"flex gap-2\"\n }, [\n React.createElement(EnhancedCopyButton, {\n key: 'copy',\n text: typeof offerData === 'object' ? JSON.stringify(offerData, null, 2) : offerData,\n className: \"flex-1 px-3 py-2 bg-orange-500/10 hover:bg-orange-500/20 text-orange-400 border border-orange-500/20 rounded text-sm font-medium\"\n }, 'Copy invitation code'),\n React.createElement('button', {\n key: 'qr-toggle',\n onClick: async () => {\n const next = !showQRCode;\n setShowQRCode(next);\n if (next) {\n try {\n const payload = typeof offerData === 'object' ? JSON.stringify(offerData) : offerData;\n if (payload && payload.length) {\n await generateQRCode(payload);\n }\n } catch (e) {\n console.warn('QR regenerate on toggle failed:', e);\n }\n }\n },\n className: \"px-3 py-2 bg-blue-500/10 hover:bg-blue-500/20 text-blue-400 border border-blue-500/20 rounded text-sm font-medium transition-all duration-200\"\n }, [\n React.createElement('i', {\n key: 'icon',\n className: showQRCode ? 'fas fa-eye-slash mr-1' : 'fas fa-qrcode mr-1'\n }),\n showQRCode ? 'Hide QR' : 'Show QR'\n ])\n ]),\n showQRCode && qrCodeUrl && React.createElement('div', {\n key: 'qr-container',\n className: \"mt-4 p-4 bg-gray-800/50 border border-gray-600/30 rounded-lg text-center\"\n }, [\n React.createElement('h4', {\n key: 'qr-title',\n className: \"text-sm font-medium text-primary mb-3\"\n }, 'Scan QR code to connect'),\n React.createElement('div', {\n key: 'qr-wrapper',\n className: \"flex justify-center\"\n }, [\n React.createElement('img', {\n key: 'qr-image',\n src: qrCodeUrl,\n alt: \"QR Code for secure connection\",\n className: \"max-w-none h-auto border border-gray-600/30 rounded w-[20rem] sm:w-[24rem] md:w-[28rem] lg:w-[32rem]\"\n }),\n (typeof qrFramesTotal !== 'undefined' && typeof qrFrameIndex !== 'undefined' && qrFramesTotal > 1) && React.createElement('div', {\n key: 'qr-frame-indicator',\n className: \"ml-3 self-center text-xs text-gray-300\"\n }, `Frame ${Math.max(1, qrFrameIndex || 1)}/${qrFramesTotal}`)\n ]),\n React.createElement('p', {\n key: 'qr-description',\n className: \"text-xs text-gray-400 mt-2\"\n }, 'Your contact can scan this QR code to quickly join the secure session')\n ])\n ])\n ])\n ]),\n \n // Step 2 - Session Type Selection\n // showOfferStep && React.createElement('div', {\n // key: 'step2',\n // className: \"card-minimal rounded-xl p-6\"\n // }, [\n // React.createElement('div', {\n // key: 'step-header',\n // className: \"flex items-center mb-4\"\n // }, [\n // React.createElement('div', {\n // key: 'number',\n // className: \"w-8 h-8 bg-green-500 text-white rounded-lg flex items-center justify-center font-semibold text-sm mr-3\"\n // }, '2'),\n // React.createElement('h3', {\n // key: 'title',\n // className: \"text-lg font-medium text-primary\"\n // }, \"Select session type\")\n // ]),\n // React.createElement('p', {\n // key: 'description',\n // className: \"text-secondary text-sm mb-4\"\n // }, \"Choose a session plan or use limited demo mode for testing.\"),\n // React.createElement(SessionTypeSelector, {\n // key: 'session-selector',\n // onSelectType: (sessionType) => {\n // // Save the selected session type\n // setSelectedSessionType(sessionType);\n // console.log('\uD83C\uDFAF Session type selected:', sessionType);\n \n // // FIX: For demo sessions, we immediately call automatic activation\n // if (sessionType === 'demo') {\n // console.log('\uD83C\uDFAE Demo session selected, scheduling automatic activation...');\n // // Delay activation for 2 seconds to stabilize\n // setTimeout(() => {\n // if (sessionManager) {\n // console.log('\uD83D\uDE80 Triggering demo session activation from selection...');\n // handleDemoVerification();\n // }\n // }, 2000);\n // }\n \n // // Open a modal payment window\n // if (typeof window.showPaymentModal === 'function') {\n // window.showPaymentModal(sessionType);\n // } else {\n // // Fallback - show session information\n // console.log('Selected session type:', sessionType);\n // }\n // },\n // onCancel: resetToSelect,\n // sessionManager: window.sessionManager\n // })\n // ]),\n \n // Step 3 - Waiting for response\n showOfferStep && React.createElement('div', {\n key: 'step2',\n className: \"card-minimal rounded-xl p-6\"\n }, [\n React.createElement('div', {\n key: 'step-header',\n className: \"flex items-center mb-4\"\n }, [\n React.createElement('div', {\n key: 'number',\n className: \"w-8 h-8 bg-blue-500 text-white rounded-lg flex items-center justify-center font-semibold text-sm mr-3\"\n }, '2'),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-medium text-primary\"\n }, \"Waiting for the peer's response\")\n ]),\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-sm mb-4\"\n }, \"Paste the encrypted invitation code from your contact.\"),\n React.createElement('div', {\n key: 'buttons',\n className: \"flex gap-2 mb-4\"\n }, [\n React.createElement('button', {\n key: 'scan-btn',\n onClick: () => setShowQRScannerModal(true),\n className: \"px-4 py-2 bg-purple-500/10 hover:bg-purple-500/20 text-purple-400 border border-purple-500/20 rounded text-sm font-medium transition-all duration-200\"\n }, [\n React.createElement('i', {\n key: 'icon',\n className: 'fas fa-qrcode mr-2'\n }),\n 'Scan QR Code'\n ])\n ]),\n React.createElement('textarea', {\n key: 'input',\n value: answerInput,\n onChange: (e) => {\n setAnswerInput(e.target.value);\n // Mark answer as created when user manually enters data\n if (e.target.value.trim().length > 0) {\n markAnswerCreated();\n }\n },\n rows: 6,\n placeholder: \"Paste the encrypted response code from your contact or scan QR code...\",\n className: \"w-full p-3 bg-custom-bg border border-gray-500/20 rounded-lg resize-none mb-4 text-secondary placeholder-gray-500 focus:border-orange-500/40 focus:outline-none transition-all custom-scrollbar text-sm\"\n }),\n React.createElement('button', {\n key: 'connect-btn',\n onClick: onConnect,\n disabled: !answerInput.trim(),\n className: \"w-full btn-secondary text-white py-3 px-4 rounded-lg font-medium transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed\"\n }, [\n React.createElement('i', {\n className: 'fas fa-rocket mr-2'\n }),\n 'Establish connection'\n ])\n ])\n ])\n ]);\n }\n \n if (mode === 'join') {\n return React.createElement('div', {\n className: \"min-h-[calc(100vh-104px)] flex items-center justify-center p-4\"\n }, [\n React.createElement('div', {\n key: 'join-flow',\n className: \"w-full max-w-3xl space-y-6\"\n }, [\n React.createElement('div', {\n key: 'header',\n className: \"text-center\"\n }, [\n React.createElement('button', {\n key: 'back',\n onClick: resetToSelect,\n className: \"mb-4 text-secondary hover:text-primary transition-colors flex items-center mx-auto text-sm\"\n }, [\n React.createElement('i', {\n className: 'fas fa-arrow-left mr-2'\n }),\n 'Back to selection'\n ]),\n React.createElement('h2', {\n key: 'title',\n className: \"text-xl font-semibold text-primary mb-2\"\n }, 'Joining the secure channel')\n ]),\n \n // Step 1\n React.createElement('div', {\n key: 'step1',\n className: \"card-minimal rounded-xl p-6\"\n }, [\n React.createElement('div', {\n key: 'step-header',\n className: \"flex items-center mb-4\"\n }, [\n React.createElement('div', {\n key: 'number',\n className: \"w-8 h-8 bg-green-500 text-white rounded-lg flex items-center justify-center font-semibold text-sm mr-3\"\n }, '1'),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-medium text-primary\"\n }, \"Paste secure invitation\")\n ]),\n React.createElement('p', {\n key: 'description',\n className: \"text-secondary text-sm mb-4\"\n }, \"Copy and paste the encrypted invitation code from the initiator.\"),\n React.createElement('textarea', {\n key: 'input',\n value: offerInput,\n onChange: (e) => {\n setOfferInput(e.target.value);\n // Mark answer as created when user manually enters data\n if (e.target.value.trim().length > 0) {\n markAnswerCreated();\n }\n },\n rows: 8,\n placeholder: \"Paste the encrypted invitation code or scan QR code...\",\n className: \"w-full p-3 bg-custom-bg border border-gray-500/20 rounded-lg resize-none mb-4 text-secondary placeholder-gray-500 focus:border-green-500/40 focus:outline-none transition-all custom-scrollbar text-sm\"\n }),\n React.createElement('div', {\n key: 'buttons',\n className: \"flex gap-2 mb-4\"\n }, [\n React.createElement('button', {\n key: 'scan-btn',\n onClick: () => setShowQRScannerModal(true),\n className: \"px-4 py-2 bg-purple-500/10 hover:bg-purple-500/20 text-purple-400 border border-purple-500/20 rounded text-sm font-medium transition-all duration-200\"\n }, [\n React.createElement('i', {\n key: 'icon',\n className: 'fas fa-qrcode mr-2'\n }),\n 'Scan QR Code'\n ]),\n React.createElement('button', {\n key: 'process-btn',\n onClick: onCreateAnswer,\n disabled: !offerInput.trim() || connectionStatus === 'connecting',\n className: \"flex-1 btn-secondary text-white py-2 px-4 rounded-lg font-medium transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed\"\n }, [\n React.createElement('i', {\n className: 'fas fa-cogs mr-2'\n }),\n 'Process invitation'\n ])\n ]),\n showQRScanner && React.createElement('div', {\n key: 'qr-scanner',\n className: \"p-4 bg-gray-800/50 border border-gray-600/30 rounded-lg text-center\"\n }, [\n React.createElement('h4', {\n key: 'scanner-title',\n className: \"text-sm font-medium text-primary mb-3\"\n }, 'QR Code Scanner'),\n React.createElement('p', {\n key: 'scanner-description',\n className: \"text-xs text-gray-400 mb-3\"\n }, 'Use your device camera to scan the QR code from the invitation'),\n React.createElement('button', {\n key: 'open-scanner',\n onClick: () => {\n console.log('Open Camera Scanner clicked, showQRScannerModal will be set to true');\n console.log('QRScanner available:', !!window.QRScanner);\n console.log('setShowQRScannerModal function:', typeof setShowQRScannerModal);\n if (typeof setShowQRScannerModal === 'function') {\n setShowQRScannerModal(true);\n } else {\n console.error('setShowQRScannerModal is not a function:', setShowQRScannerModal);\n }\n },\n className: \"w-full px-4 py-3 bg-purple-600 hover:bg-purple-500 text-white rounded-lg font-medium transition-all duration-200 mb-3\"\n }, [\n React.createElement('i', {\n key: 'camera-icon',\n className: 'fas fa-camera mr-2'\n }),\n 'Open Camera Scanner'\n ]),\n React.createElement('button', {\n key: 'test-qr',\n onClick: async () => {\n console.log('Creating test QR code...');\n if (window.generateQRCode) {\n const testData = '{\"type\":\"test\",\"message\":\"Hello QR Scanner!\"}';\n const qrUrl = await window.generateQRCode(testData);\n console.log('Test QR code generated:', qrUrl);\n // Open QR code in new tab for testing\n const newWindow = window.open();\n newWindow.document.write(``);\n }\n },\n className: \"px-3 py-1 bg-green-600/20 hover:bg-green-600/30 text-green-300 border border-green-500/20 rounded text-xs font-medium transition-all duration-200 mr-2\"\n }, 'Test QR'),\n React.createElement('button', {\n key: 'close-scanner',\n onClick: () => setShowQRScanner(false),\n className: \"px-3 py-1 bg-gray-600/20 hover:bg-gray-600/30 text-gray-300 border border-gray-500/20 rounded text-xs font-medium transition-all duration-200\"\n }, 'Close Scanner')\n ])\n ]),\n \n // Step 2\n showAnswerStep && React.createElement('div', {\n key: 'step2',\n className: \"card-minimal rounded-xl p-6\"\n }, [\n React.createElement('div', {\n key: 'step-header',\n className: \"flex items-center mb-4\"\n }, [\n React.createElement('div', {\n key: 'number',\n className: \"step-number mr-3\"\n }, '2'),\n React.createElement('h3', {\n key: 'title',\n className: \"text-lg font-medium text-primary\"\n }, \"Sending a secure response\")\n ]),\n React.createElement('div', {\n key: 'success',\n className: \"p-3 bg-green-500/10 border border-green-500/20 rounded-lg mb-4\"\n }, [\n React.createElement('p', {\n className: \"text-green-400 text-sm font-medium flex items-center\"\n }, [\n React.createElement('i', {\n className: 'fas fa-check-circle mr-2'\n }),\n 'Secure response created! Send this code to the initiator:'\n ])\n ]),\n React.createElement('div', {\n key: 'answer-data',\n className: \"space-y-3 mb-4\"\n }, [\n React.createElement('textarea', {\n key: 'textarea',\n value: typeof answerData === 'object' ? JSON.stringify(answerData, null, 2) : answerData,\n readOnly: true,\n rows: 6,\n className: \"w-full p-3 bg-custom-bg border border-green-500/20 rounded-lg font-mono text-xs text-secondary resize-none custom-scrollbar\"\n }),\n React.createElement(EnhancedCopyButton, {\n key: 'copy',\n text: typeof answerData === 'object' ? JSON.stringify(answerData, null, 2) : answerData,\n className: \"w-full px-3 py-2 bg-green-500/10 hover:bg-green-500/20 text-green-400 border border-green-500/20 rounded text-sm font-medium\"\n }, 'Copy response code')\n ]),\n React.createElement('div', {\n key: 'info',\n className: \"p-3 bg-purple-500/10 border border-purple-500/20 rounded-lg\"\n }, [\n React.createElement('p', {\n className: \"text-purple-400 text-sm flex items-center justify-center\"\n }, [\n React.createElement('i', {\n className: 'fas fa-shield-alt mr-2'\n }),\n 'The connection will be established with verification'\n ])\n ])\n ])\n ])\n ]);\n }\n };\n \n // Global scroll function - defined outside components to ensure availability\n const createScrollToBottomFunction = (chatMessagesRef) => {\n return () => {\n console.log('\uD83D\uDD0D Global scrollToBottom called, chatMessagesRef:', chatMessagesRef.current);\n if (chatMessagesRef && chatMessagesRef.current) {\n const scrollAttempt = () => {\n if (chatMessagesRef.current) {\n chatMessagesRef.current.scrollTo({\n top: chatMessagesRef.current.scrollHeight,\n behavior: 'smooth'\n });\n }\n };\n scrollAttempt();\n \n setTimeout(scrollAttempt, 50);\n setTimeout(scrollAttempt, 150);\n setTimeout(scrollAttempt, 300);\n \n requestAnimationFrame(() => {\n setTimeout(scrollAttempt, 100);\n });\n }\n };\n };\n \n const EnhancedChatInterface = ({\n messages,\n messageInput,\n setMessageInput,\n onSendMessage,\n onDisconnect,\n keyFingerprint,\n isVerified,\n chatMessagesRef,\n scrollToBottom,\n webrtcManager\n }) => {\n const [showScrollButton, setShowScrollButton] = React.useState(false);\n const [showFileTransfer, setShowFileTransfer] = React.useState(false);\n \n // \u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u043F\u0440\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439\n React.useEffect(() => {\n if (chatMessagesRef.current && messages.length > 0) {\n const { scrollTop, scrollHeight, clientHeight } = chatMessagesRef.current;\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 100;\n if (isNearBottom) {\n const smoothScroll = () => {\n if (chatMessagesRef.current) {\n chatMessagesRef.current.scrollTo({\n top: chatMessagesRef.current.scrollHeight,\n behavior: 'smooth'\n });\n }\n };\n smoothScroll();\n setTimeout(smoothScroll, 50);\n setTimeout(smoothScroll, 150);\n }\n }\n }, [messages, chatMessagesRef]);\n \n // \u041E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A \u0441\u043A\u0440\u043E\u043B\u043B\u0430\n const handleScroll = () => {\n if (chatMessagesRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = chatMessagesRef.current;\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 100;\n setShowScrollButton(!isNearBottom);\n }\n };\n \n // \u041F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u0432\u043D\u0438\u0437 \u043F\u043E \u043A\u043D\u043E\u043F\u043A\u0435\n const handleScrollToBottom = () => {\n console.log('\uD83D\uDD0D handleScrollToBottom called, scrollToBottom type:', typeof scrollToBottom);\n if (typeof scrollToBottom === 'function') {\n scrollToBottom();\n setShowScrollButton(false);\n } else {\n console.error('\u274C scrollToBottom is not a function:', scrollToBottom);\n // Fallback: direct scroll\n if (chatMessagesRef.current) {\n chatMessagesRef.current.scrollTo({\n top: chatMessagesRef.current.scrollHeight,\n behavior: 'smooth'\n });\n }\n setShowScrollButton(false);\n }\n };\n \n // \u041E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A \u043D\u0430\u0436\u0430\u0442\u0438\u044F Enter\n const handleKeyPress = (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n onSendMessage();\n }\n };\n \n // \u0418\u0421\u041F\u0420\u0410\u0412\u041B\u0415\u041D\u0418\u0415: \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0433\u043E\u0442\u043E\u0432\u043D\u043E\u0441\u0442\u0438 \u0434\u043B\u044F \u0444\u0430\u0439\u043B\u043E\u0432\u044B\u0445 \u0442\u0440\u0430\u043D\u0441\u0444\u0435\u0440\u043E\u0432\n const isFileTransferReady = () => {\n if (!webrtcManager) return false;\n \n const connected = webrtcManager.isConnected ? webrtcManager.isConnected() : false;\n const verified = webrtcManager.isVerified || false;\n const hasDataChannel = webrtcManager.dataChannel && webrtcManager.dataChannel.readyState === 'open';\n \n return connected && verified && hasDataChannel;\n };\n \n // \u0412\u043E\u0437\u0432\u0440\u0430\u0442 JSX \u0447\u0435\u0440\u0435\u0437 React.createElement\n return React.createElement(\n 'div',\n {\n className: \"chat-container flex flex-col\",\n style: { backgroundColor: '#272827', height: 'calc(100vh - 64px)' }\n },\n [\n // \u041E\u0431\u043B\u0430\u0441\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439\n React.createElement(\n 'div',\n { className: \"flex-1 flex flex-col overflow-hidden\" },\n React.createElement(\n 'div',\n { className: \"flex-1 max-w-4xl mx-auto w-full p-4 overflow-hidden\" },\n React.createElement(\n 'div',\n {\n ref: chatMessagesRef,\n onScroll: handleScroll,\n className: \"h-full overflow-y-auto space-y-3 hide-scrollbar pr-2 scroll-smooth\"\n },\n messages.length === 0 ?\n React.createElement(\n 'div',\n { className: \"flex items-center justify-center h-full\" },\n React.createElement(\n 'div',\n { className: \"text-center max-w-md\" },\n [\n React.createElement(\n 'div',\n { className: \"w-16 h-16 bg-green-500/10 border border-green-500/20 rounded-xl flex items-center justify-center mx-auto mb-4\" },\n React.createElement(\n 'svg',\n { className: \"w-8 h-8 text-green-500\", fill: \"none\", stroke: \"currentColor\", viewBox: \"0 0 24 24\" },\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n })\n )\n ),\n React.createElement('h3', { className: \"text-lg font-medium text-gray-300 mb-2\" }, \"Secure channel is ready!\"),\n React.createElement('p', { className: \"text-gray-400 text-sm mb-4\" }, \"All messages are protected by modern cryptographic algorithms\"),\n React.createElement(\n 'div',\n { className: \"text-left space-y-2\" },\n [\n ['End-to-end encryption', 'M5 13l4 4L19 7'],\n ['Protection against replay attacks', 'M5 13l4 4L19 7'],\n ['Integrity verification', 'M5 13l4 4L19 7'],\n ['Perfect Forward Secrecy', 'M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15']\n ].map(([text, d], i) =>\n React.createElement(\n 'div',\n { key: `f${i}`, className: \"flex items-center text-sm text-gray-400\" },\n [\n React.createElement(\n 'svg',\n {\n className: `w-4 h-4 mr-3 ${i === 3 ? 'text-purple-500' : 'text-green-500'}`,\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\"\n },\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: d\n })\n ),\n text\n ]\n )\n )\n )\n ]\n )\n ) :\n messages.map((msg) =>\n React.createElement(EnhancedChatMessage, {\n key: msg.id,\n message: msg.message,\n type: msg.type,\n timestamp: msg.timestamp\n })\n )\n )\n )\n ),\n \n // \u041A\u043D\u043E\u043F\u043A\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432\u043D\u0438\u0437\n showScrollButton &&\n React.createElement(\n 'button',\n {\n onClick: handleScrollToBottom,\n className: \"fixed right-6 w-12 h-12 bg-green-500/20 hover:bg-green-500/30 border border-green-500/30 text-green-400 rounded-full flex items-center justify-center transition-all duration-200 shadow-lg z-50\",\n style: { bottom: '160px' }\n },\n React.createElement(\n 'svg',\n { className: \"w-6 h-6\", fill: \"none\", stroke: \"currentColor\", viewBox: \"0 0 24 24\" },\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M19 14l-7 7m0 0l-7-7m7 7V3\"\n })\n )\n ),\n \n // \u0421\u0435\u043A\u0446\u0438\u044F \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0444\u0430\u0439\u043B\u043E\u0432\n React.createElement(\n 'div',\n {\n className: \"flex-shrink-0 border-t border-gray-500/10\",\n style: { backgroundColor: '#272827' }\n },\n React.createElement(\n 'div',\n { className: \"max-w-4xl mx-auto px-4\" },\n [\n React.createElement(\n 'button',\n {\n onClick: () => setShowFileTransfer(!showFileTransfer),\n className: `flex items-center text-sm text-gray-400 hover:text-gray-300 transition-colors py-4 ${showFileTransfer ? 'mb-4' : ''}`\n },\n [\n React.createElement(\n 'svg',\n {\n className: `w-4 h-4 mr-2 transform transition-transform ${showFileTransfer ? 'rotate-180' : ''}`,\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\"\n },\n showFileTransfer ?\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M5 15l7-7 7 7\"\n }) :\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M15.172 7l-6.586 6.586a2 2 0 102.828 2.828l6.414-6.586a4 4 0 00-5.656-5.656l-6.415 6.585a6 6 0 108.486 8.486L20.5 13\"\n })\n ),\n showFileTransfer ? 'Hide file transfer' : 'Send files'\n ]\n ),\n // \u0418\u0421\u041F\u0420\u0410\u0412\u041B\u0415\u041D\u0418\u0415: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\n showFileTransfer &&\n React.createElement(window.FileTransferComponent || (() => \n React.createElement('div', {\n className: \"p-4 text-center text-red-400\"\n }, 'FileTransferComponent not loaded')\n ), {\n webrtcManager: webrtcManager,\n isConnected: isFileTransferReady()\n })\n ]\n )\n ),\n \n // \u041E\u0431\u043B\u0430\u0441\u0442\u044C \u0432\u0432\u043E\u0434\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439\n React.createElement(\n 'div',\n { className: \"border-t border-gray-500/10\" },\n React.createElement(\n 'div',\n { className: \"max-w-4xl mx-auto p-4\" },\n React.createElement(\n 'div',\n { className: \"flex items-stretch space-x-3\" },\n [\n React.createElement(\n 'div',\n { className: \"flex-1 relative\" },\n [\n React.createElement('textarea', {\n value: messageInput,\n onChange: (e) => setMessageInput(e.target.value),\n onKeyDown: handleKeyPress,\n placeholder: \"Enter message to encrypt...\",\n rows: 2,\n maxLength: 2000,\n style: { backgroundColor: '#272827' },\n className: \"w-full p-3 border border-gray-600 rounded-lg resize-none text-gray-300 placeholder-gray-500 focus:border-green-500/40 focus:outline-none transition-all custom-scrollbar text-sm\"\n }),\n React.createElement(\n 'div',\n { className: \"absolute bottom-2 right-3 flex items-center space-x-2 text-xs text-gray-400\" },\n [\n React.createElement('span', null, `${messageInput.length}/2000`),\n React.createElement('span', null, \"\u2022 Enter to send\")\n ]\n )\n ]\n ),\n React.createElement(\n 'button',\n {\n onClick: onSendMessage,\n disabled: !messageInput.trim(),\n className: \"bg-green-400/20 text-green-400 p-3 rounded-lg transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center min-h-[72px]\"\n },\n React.createElement(\n 'svg',\n { className: \"w-6 h-6\", fill: \"none\", stroke: \"currentColor\", viewBox: \"0 0 24 24\" },\n React.createElement('path', {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M12 19l9 2-9-18-9 18 9-2zm0 0v-8\"\n })\n )\n )\n ]\n )\n )\n )\n ]\n );\n };\n \n \n // Main Enhanced Application Component\n const EnhancedSecureP2PChat = () => {\n console.log('\uD83D\uDD0D EnhancedSecureP2PChat component initialized');\n const [messages, setMessages] = React.useState([]);\n const [connectionStatus, setConnectionStatus] = React.useState('disconnected');\n \n // Moved scrollToBottom logic to be available globally\n const [messageInput, setMessageInput] = React.useState('');\n const [offerData, setOfferData] = React.useState('');\n const [answerData, setAnswerData] = React.useState('');\n const [offerInput, setOfferInput] = React.useState('');\n const [answerInput, setAnswerInput] = React.useState('');\n const [keyFingerprint, setKeyFingerprint] = React.useState('');\n const [verificationCode, setVerificationCode] = React.useState('');\n const [showOfferStep, setShowOfferStep] = React.useState(false);\n const [showAnswerStep, setShowAnswerStep] = React.useState(false);\n const [showVerification, setShowVerification] = React.useState(false);\n const [showQRCode, setShowQRCode] = React.useState(false);\n const [qrCodeUrl, setQrCodeUrl] = React.useState('');\n const [showQRScanner, setShowQRScanner] = React.useState(false);\n const [showQRScannerModal, setShowQRScannerModal] = React.useState(false);\n const [isVerified, setIsVerified] = React.useState(false);\n const [securityLevel, setSecurityLevel] = React.useState(null);\n \n // Mutual verification states\n const [localVerificationConfirmed, setLocalVerificationConfirmed] = React.useState(false);\n const [remoteVerificationConfirmed, setRemoteVerificationConfirmed] = React.useState(false);\n const [bothVerificationsConfirmed, setBothVerificationsConfirmed] = React.useState(false);\n \n // PAKE password states removed - using SAS verification instead\n \n // Session state - all security features enabled by default\n const [sessionTimeLeft, setSessionTimeLeft] = React.useState(0);\n const [pendingSession, setPendingSession] = React.useState(null);\n \n // All security features are enabled by default - no payment required\n \n \n \n // ============================================\n // CENTRALIZED CONNECTION STATE MANAGEMENT\n // ============================================\n \n const [connectionState, setConnectionState] = React.useState({\n status: 'disconnected',\n hasActiveAnswer: false,\n answerCreatedAt: null,\n isUserInitiatedDisconnect: false\n });\n \n // Centralized connection state handler\n const updateConnectionState = (newState, options = {}) => {\n const { preserveAnswer = false, isUserAction = false } = options;\n \n setConnectionState(prev => ({\n ...prev,\n ...newState,\n isUserInitiatedDisconnect: isUserAction,\n hasActiveAnswer: preserveAnswer ? prev.hasActiveAnswer : false,\n answerCreatedAt: preserveAnswer ? prev.answerCreatedAt : null\n }));\n };\n \n // Check if we should preserve answer data\n const shouldPreserveAnswerData = () => {\n const now = Date.now();\n const answerAge = now - (connectionState.answerCreatedAt || 0);\n const maxPreserveTime = 30000; // 30 seconds\n \n // \u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u0430\u043C\u0438\u0445 \u0434\u0430\u043D\u043D\u044B\u0445\n const hasAnswerData = (answerData && answerData.trim().length > 0) || \n (answerInput && answerInput.trim().length > 0);\n \n const shouldPreserve = (connectionState.hasActiveAnswer && \n answerAge < maxPreserveTime && \n !connectionState.isUserInitiatedDisconnect) ||\n (hasAnswerData && answerAge < maxPreserveTime && \n !connectionState.isUserInitiatedDisconnect);\n \n console.log('\uD83D\uDD0D shouldPreserveAnswerData check:', {\n hasActiveAnswer: connectionState.hasActiveAnswer,\n hasAnswerData: hasAnswerData,\n answerAge: answerAge,\n maxPreserveTime: maxPreserveTime,\n isUserInitiatedDisconnect: connectionState.isUserInitiatedDisconnect,\n shouldPreserve: shouldPreserve,\n answerData: answerData ? 'exists' : 'null',\n answerInput: answerInput ? 'exists' : 'null'\n });\n \n return shouldPreserve;\n };\n \n // Mark answer as created\n const markAnswerCreated = () => {\n updateConnectionState({\n hasActiveAnswer: true,\n answerCreatedAt: Date.now()\n });\n };\n \n // Global functions for cleanup\n React.useEffect(() => {\n window.forceCleanup = () => {\n handleClearData();\n if (webrtcManagerRef.current) {\n webrtcManagerRef.current.disconnect();\n }\n };\n\n window.clearLogs = () => {\n if (typeof console.clear === 'function') {\n console.clear();\n }\n };\n \n return () => {\n delete window.forceCleanup;\n delete window.clearLogs;\n };\n }, []);\n \n const webrtcManagerRef = React.useRef(null);\n // Expose for modules/UI that run outside this closure (e.g., inline handlers)\n // Safe because it's a ref object and we maintain it centrally here\n window.webrtcManagerRef = webrtcManagerRef;\n \n const addMessageWithAutoScroll = React.useCallback((message, type) => {\n const newMessage = {\n message,\n type,\n id: Date.now() + Math.random(),\n timestamp: Date.now()\n };\n \n setMessages(prev => {\n const updated = [...prev, newMessage];\n \n setTimeout(() => {\n if (chatMessagesRef?.current) {\n const container = chatMessagesRef.current;\n try {\n const { scrollTop, scrollHeight, clientHeight } = container;\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 100;\n \n if (isNearBottom || prev.length === 0) {\n requestAnimationFrame(() => {\n if (container && container.scrollTo) {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'smooth'\n });\n }\n });\n }\n } catch (error) {\n console.warn('Scroll error:', error);\n container.scrollTop = container.scrollHeight;\n }\n }\n }, 50);\n \n return updated;\n });\n }, []);\n \n // Update security level based on real verification\n const updateSecurityLevel = React.useCallback(async () => {\n if (window.isUpdatingSecurity) {\n return;\n }\n \n window.isUpdatingSecurity = true;\n \n try {\n if (webrtcManagerRef.current) {\n // All security features are enabled by default - always show MAXIMUM level\n setSecurityLevel({\n level: 'MAXIMUM',\n score: 100,\n color: 'green',\n details: 'All security features enabled by default',\n passedChecks: 10,\n totalChecks: 10,\n isRealData: true\n });\n \n if (window.DEBUG_MODE) {\n const currentLevel = webrtcManagerRef.current.ecdhKeyPair && webrtcManagerRef.current.ecdsaKeyPair \n ? await webrtcManagerRef.current.calculateSecurityLevel()\n : {\n level: 'MAXIMUM',\n score: 100,\n sessionType: 'premium',\n passedChecks: 10,\n totalChecks: 10\n };\n console.log('\uD83D\uDD12 Security level updated:', {\n level: currentLevel.level,\n score: currentLevel.score,\n sessionType: currentLevel.sessionType,\n passedChecks: currentLevel.passedChecks,\n totalChecks: currentLevel.totalChecks\n });\n }\n }\n } catch (error) {\n console.error('Failed to update security level:', error);\n setSecurityLevel({\n level: 'ERROR',\n score: 0,\n color: 'red',\n details: 'Verification failed'\n });\n } finally {\n setTimeout(() => {\n window.isUpdatingSecurity = false;\n }, 2000);\n }\n }, []);\n \n // Session time ticker - unlimited sessions\n React.useEffect(() => {\n const timer = setInterval(() => {\n // Sessions are unlimited - no time restrictions\n setSessionTimeLeft(0);\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n \n // Sessions are unlimited - no expiration handler needed\n \n // All security features are enabled by default - no demo sessions needed\n const chatMessagesRef = React.useRef(null);\n \n // Create scroll function using global helper\n const scrollToBottom = createScrollToBottomFunction(chatMessagesRef);\n \n // Auto-scroll when messages change\n React.useEffect(() => {\n if (messages.length > 0 && chatMessagesRef.current) {\n scrollToBottom();\n setTimeout(scrollToBottom, 50);\n setTimeout(scrollToBottom, 150);\n }\n }, [messages]);\n \n // PAKE password functions removed - using SAS verification instead\n \n React.useEffect(() => {\n // Prevent multiple initializations\n if (webrtcManagerRef.current) {\n console.log('\u26A0\uFE0F WebRTC Manager already initialized, skipping...');\n return;\n }\n \n const handleMessage = (message, type) => {\n // \u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0430 \u0444\u0430\u0439\u043B\u043E\u0432\u044B\u0435 \u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F\n if (typeof message === 'string' && message.trim().startsWith('{')) {\n try {\n const parsedMessage = JSON.parse(message);\n const blockedTypes = [\n 'file_transfer_start',\n 'file_transfer_response',\n 'file_chunk',\n 'chunk_confirmation',\n 'file_transfer_complete',\n 'file_transfer_error',\n 'heartbeat',\n 'verification',\n 'verification_response',\n 'verification_confirmed',\n 'verification_both_confirmed',\n 'peer_disconnect',\n 'key_rotation_signal',\n 'key_rotation_ready',\n 'security_upgrade'\n ];\n if (parsedMessage.type && blockedTypes.includes(parsedMessage.type)) {\n console.log(`\uD83D\uDED1 Blocked system/file message from chat: ${parsedMessage.type}`);\n return; // \u041D\u0435 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u043C \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0435 \u0438 \u0444\u0430\u0439\u043B\u043E\u0432\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u0447\u0430\u0442\u0435\n }\n } catch (parseError) {\n // \u041D\u0435 JSON - \u044D\u0442\u043E \u043D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E \u0434\u043B\u044F \u043E\u0431\u044B\u0447\u043D\u044B\u0445 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439\n }\n }\n \n addMessageWithAutoScroll(message, type);\n };\n \n const handleStatusChange = (status) => {\n console.log('handleStatusChange called with status:', status);\n console.log('\uD83D\uDD0D Status change details:');\n console.log(' - oldStatus:', connectionStatus);\n console.log(' - newStatus:', status);\n console.log(' - isVerified:', isVerified);\n console.log(' - willShowChat:', status === 'connected' && isVerified);\n setConnectionStatus(status);\n \n if (status === 'connected') {\n document.dispatchEvent(new CustomEvent('new-connection'));\n \n // \u041D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0435\u043C \u0432\u0435\u0440\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044E \u043F\u0440\u0438 'connected' - \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 'verified'\n // setIsVerified(true);\n // setShowVerification(false);\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } else if (status === 'verifying') {\n console.log('Setting showVerification to true for verifying status');\n setShowVerification(true);\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } else if (status === 'verified') {\n setIsVerified(true);\n setShowVerification(false);\n setBothVerificationsConfirmed(true);\n // CRITICAL: Set connectionStatus to 'connected' to show chat\n setConnectionStatus('connected');\n // Force immediate update of isVerified state\n setTimeout(() => {\n setIsVerified(true);\n }, 0);\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } else if (status === 'connecting') {\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } else if (status === 'disconnected') {\n // \u041E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u043C \u0446\u0435\u043D\u0442\u0440\u0430\u043B\u0438\u0437\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435\n updateConnectionState({ status: 'disconnected' });\n setConnectionStatus('disconnected');\n \n // \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u043C, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0432\u0435\u0442\u0430\n if (shouldPreserveAnswerData()) {\n console.log('\uD83D\uDEE1\uFE0F Preserving answer data after recent creation');\n setIsVerified(false);\n setShowVerification(false);\n return;\n }\n \n // \u041F\u0440\u0438 \u0440\u0430\u0437\u0440\u044B\u0432\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u043E\u0447\u0438\u0449\u0430\u0435\u043C \u0432\u0441\u0435 \u0434\u0430\u043D\u043D\u044B\u0435\n setIsVerified(false);\n setShowVerification(false);\n \n // Dispatch disconnected event for SessionTimer\n document.dispatchEvent(new CustomEvent('disconnected'));\n \n // Clear verification states\n setLocalVerificationConfirmed(false);\n setRemoteVerificationConfirmed(false);\n setBothVerificationsConfirmed(false);\n \n // Clear connection data\n setOfferData(null);\n setAnswerData(null);\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setKeyFingerprint('');\n setVerificationCode('');\n setSecurityLevel(null);\n \n // Reset session and timer\n setSessionTimeLeft(0);\n \n // Return to main page after a short delay\n setTimeout(() => {\n setConnectionStatus('disconnected');\n setShowVerification(false);\n \n // \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u043C, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0432\u0435\u0442\u0430\n if (shouldPreserveAnswerData()) {\n console.log('\uD83D\uDEE1\uFE0F Preserving answer data in setTimeout after recent creation');\n return;\n }\n \n setOfferData(null);\n setAnswerData(null);\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setMessages([]);\n }, 1000);\n \n // \u041D\u0435 \u043E\u0447\u0438\u0449\u0430\u0435\u043C \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u043F\u0440\u0438 \u0440\u0430\u0437\u0440\u044B\u0432\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\n // \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043C\u043E\u0433 \u0432\u0438\u0434\u0435\u0442\u044C \u043E\u0448\u0438\u0431\u043A\u0438\n } else if (status === 'peer_disconnected') {\n setSessionTimeLeft(0);\n \n document.dispatchEvent(new CustomEvent('peer-disconnect'));\n \n // A short delay before clearing to display the status\n setTimeout(() => {\n setKeyFingerprint('');\n setVerificationCode('');\n setSecurityLevel(null);\n setIsVerified(false);\n setShowVerification(false);\n setConnectionStatus('disconnected');\n \n // Clear verification states\n setLocalVerificationConfirmed(false);\n setRemoteVerificationConfirmed(false);\n setBothVerificationsConfirmed(false);\n \n // \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u043C, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0432\u0435\u0442\u0430\n if (shouldPreserveAnswerData()) {\n console.log('\uD83D\uDEE1\uFE0F Preserving answer data in peer_disconnected after recent creation');\n return;\n }\n \n // Clear connection data\n setOfferData(null);\n setAnswerData(null);\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setMessages([]);\n \n // \u041D\u0435 \u043E\u0447\u0438\u0449\u0430\u0435\u043C \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u043F\u0440\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438 \u043F\u0438\u0440\u0430\n // \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\n // if (typeof console.clear === 'function') {\n // console.clear();\n // }\n \n // Session manager removed - all features enabled by default\n }, 2000);\n }\n };\n \n const handleKeyExchange = (fingerprint) => {\n console.log('handleKeyExchange called with fingerprint:', fingerprint);\n if (fingerprint === '') {\n setKeyFingerprint('');\n } else {\n setKeyFingerprint(fingerprint);\n console.log('Key fingerprint set in UI:', fingerprint);\n }\n };\n \n const handleVerificationRequired = (code) => {\n console.log('handleVerificationRequired called with code:', code);\n if (code === '') {\n setVerificationCode('');\n setShowVerification(false);\n } else {\n setVerificationCode(code);\n setShowVerification(true);\n console.log('Verification code set, showing verification UI');\n }\n };\n \n const handleVerificationStateChange = (state) => {\n console.log('handleVerificationStateChange called with state:', state);\n setLocalVerificationConfirmed(state.localConfirmed);\n setRemoteVerificationConfirmed(state.remoteConfirmed);\n setBothVerificationsConfirmed(state.bothConfirmed);\n };\n \n // Callback for handling response errors\n const handleAnswerError = (errorType, errorMessage) => {\n if (errorType === 'replay_attack') {\n // Reset the session upon replay attack\n setSessionTimeLeft(0);\n setPendingSession(null);\n \n addMessageWithAutoScroll('\uD83D\uDCA1 Data is outdated. Please create a new invitation or use a current response code.', 'system');\n \n if (typeof console.clear === 'function') {\n console.clear();\n }\n } else if (errorType === 'security_violation') {\n // Reset the session upon security breach\n setSessionTimeLeft(0);\n setPendingSession(null);\n \n addMessageWithAutoScroll(`\uD83D\uDD12 Security breach: ${errorMessage}`, 'system');\n \n if (typeof console.clear === 'function') {\n console.clear();\n }\n }\n };\n \n // Create WebRTC Manager only once\n console.log('\uD83D\uDD27 Initializing WebRTC Manager...');\n \n if (typeof console.clear === 'function') {\n console.clear();\n }\n \n webrtcManagerRef.current = new EnhancedSecureWebRTCManager(\n handleMessage, \n handleStatusChange, \n handleKeyExchange,\n handleVerificationRequired,\n handleAnswerError,\n handleVerificationStateChange\n );\n \n handleMessage('\uD83D\uDE80 SecureBit.chat Enhanced Security Edition v4.02.985 - ECDH + DTLS + SAS initialized. Ready to establish a secure connection with ECDH key exchange, DTLS fingerprint verification, and SAS authentication to prevent MITM attacks.', 'system');\n \n const handleBeforeUnload = (event) => {\n if (event.type === 'beforeunload' && !isTabSwitching) {\n console.log('\uD83D\uDD0C Page unloading (closing tab) - sending disconnect notification');\n \n if (webrtcManagerRef.current && webrtcManagerRef.current.isConnected()) {\n try {\n webrtcManagerRef.current.sendSystemMessage({\n type: 'peer_disconnect',\n reason: 'user_disconnect',\n timestamp: Date.now()\n });\n } catch (error) {\n console.log('Could not send disconnect notification:', error.message);\n }\n \n setTimeout(() => {\n if (webrtcManagerRef.current) {\n webrtcManagerRef.current.disconnect();\n }\n }, 100);\n } else if (webrtcManagerRef.current) {\n webrtcManagerRef.current.disconnect();\n }\n } else if (isTabSwitching) {\n console.log('\uD83D\uDCF1 Tab switching detected - NOT disconnecting');\n event.preventDefault();\n event.returnValue = '';\n }\n };\n \n window.addEventListener('beforeunload', handleBeforeUnload);\n \n let isTabSwitching = false;\n let tabSwitchTimeout = null;\n \n const handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n console.log('\uD83D\uDCF1 Page hidden (tab switch) - keeping connection alive');\n isTabSwitching = true;\n \n if (tabSwitchTimeout) {\n clearTimeout(tabSwitchTimeout);\n }\n \n tabSwitchTimeout = setTimeout(() => {\n isTabSwitching = false;\n }, 5000); \n \n } else if (document.visibilityState === 'visible') {\n console.log('\uD83D\uDCF1 Page visible (tab restored) - connection maintained');\n isTabSwitching = false;\n \n if (tabSwitchTimeout) {\n clearTimeout(tabSwitchTimeout);\n tabSwitchTimeout = null;\n }\n }\n };\n \n document.addEventListener('visibilitychange', handleVisibilityChange);\n \n // Setup file transfer callbacks\n if (webrtcManagerRef.current) {\n webrtcManagerRef.current.setFileTransferCallbacks(\n // Progress callback\n (progress) => {\n console.log('File progress:', progress);\n },\n \n // File received callback\n (fileData) => {\n const sizeMb = Math.max(1, Math.round((fileData.fileSize || 0) / (1024 * 1024)));\n const downloadMessage = React.createElement('div', {\n className: 'flex items-center space-x-2'\n }, [\n React.createElement('span', { key: 'label' }, `\uD83D\uDCE5 File received: ${fileData.fileName} (${sizeMb} MB)`),\n React.createElement('button', {\n key: 'btn',\n className: 'px-3 py-1 rounded bg-blue-600 hover:bg-blue-700 text-white text-xs',\n onClick: async () => {\n try {\n const url = await fileData.getObjectURL();\n const a = document.createElement('a');\n a.href = url;\n a.download = fileData.fileName;\n a.click();\n // \u0414\u0430\u0435\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443 \u0432\u0440\u0435\u043C\u044F \u043D\u0430\u0447\u0430\u0442\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0443, \u0437\u0430\u0442\u0435\u043C \u043E\u0441\u0432\u043E\u0431\u043E\u0436\u0434\u0430\u0435\u043C URL\n setTimeout(() => fileData.revokeObjectURL(url), 15000);\n } catch (e) {\n console.error('Download failed:', e);\n addMessageWithAutoScroll(`\u274C File upload error: ${String(e?.message || e)}`, 'system');\n }\n }\n }, 'Download')\n ]);\n \n addMessageWithAutoScroll(downloadMessage, 'system');\n },\n \n // Error callback\n (error) => {\n console.error('File transfer error:', error);\n \n if (error.includes('Connection not ready')) {\n addMessageWithAutoScroll(`\u26A0\uFE0F File transfer error: connection not ready. Try again later.`, 'system');\n } else if (error.includes('File too large')) {\n addMessageWithAutoScroll(`\u26A0\uFE0F File is too big. Maximum size: 100 MB`, 'system');\n } else {\n addMessageWithAutoScroll(`\u274C File transfer error: ${error}`, 'system');\n }\n }\n );\n }\n \n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload);\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n \n if (tabSwitchTimeout) {\n clearTimeout(tabSwitchTimeout);\n tabSwitchTimeout = null;\n }\n \n if (webrtcManagerRef.current) {\n console.log('\uD83E\uDDF9 Cleaning up WebRTC Manager...');\n webrtcManagerRef.current.disconnect();\n webrtcManagerRef.current = null;\n }\n };\n }, []); // Empty dependency array to run only once\n \n // All security features are enabled by default - no session purchase needed\n \n const compressOfferData = (offerData) => {\n try {\n // Parse the offer data if it's a string\n const offer = typeof offerData === 'string' ? JSON.parse(offerData) : offerData;\n \n // Create a minimal version with only the most essential data\n const minimalOffer = {\n type: offer.type,\n version: offer.version,\n timestamp: offer.timestamp,\n sessionId: offer.sessionId,\n connectionId: offer.connectionId,\n verificationCode: offer.verificationCode,\n salt: offer.salt,\n // Use only key fingerprints instead of full keys\n keyFingerprints: offer.keyFingerprints,\n // Add a reference to get full data\n fullDataAvailable: true,\n compressionLevel: 'minimal'\n };\n \n return JSON.stringify(minimalOffer);\n } catch (error) {\n console.error('Error compressing offer data:', error);\n return offerData; // Return original if compression fails\n }\n };\n\n const createQRReference = (offerData) => {\n try {\n // Create a unique reference ID for this offer\n const referenceId = `offer_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n \n // Store the full offer data in localStorage with the reference ID\n localStorage.setItem(`qr_offer_${referenceId}`, JSON.stringify(offerData));\n \n // Create a minimal QR code with just the reference\n const qrReference = {\n type: 'secure_offer_reference',\n referenceId: referenceId,\n timestamp: Date.now(),\n message: 'Scan this QR code and use the reference ID to get full offer data'\n };\n \n return JSON.stringify(qrReference);\n } catch (error) {\n console.error('Error creating QR reference:', error);\n return null;\n }\n };\n\n const createTemplateOffer = (offer) => {\n // Minimal template to keep QR within single image capacity\n const templateOffer = {\n type: 'enhanced_secure_offer_template',\n version: '4.0',\n sessionId: offer.sessionId,\n connectionId: offer.connectionId,\n verificationCode: offer.verificationCode,\n timestamp: offer.timestamp,\n // Avoid bulky fields (SDP, raw keys); keep only fingerprints and essentials\n keyFingerprints: offer.keyFingerprints,\n // Keep concise auth hints (omit large nonces)\n authChallenge: offer?.authChallenge?.challenge,\n // Optionally include a compact capability hint if small\n capabilities: Array.isArray(offer.capabilities) && offer.capabilities.length <= 5\n ? offer.capabilities\n : undefined\n };\n \n return templateOffer;\n };\n\n // Conservative QR payload limit (characters). Adjust per error correction level.\n const MAX_QR_LEN = 800;\n const [qrFramesTotal, setQrFramesTotal] = React.useState(0);\n const [qrFrameIndex, setQrFrameIndex] = React.useState(0);\n\n // Animated QR state (for multi-chunk COSE)\n const qrAnimationRef = React.useRef({ timer: null, chunks: [], idx: 0, active: false });\n const stopQrAnimation = () => {\n try { if (qrAnimationRef.current.timer) { clearInterval(qrAnimationRef.current.timer); } } catch {}\n qrAnimationRef.current = { timer: null, chunks: [], idx: 0, active: false };\n setQrFrameIndex(0);\n setQrFramesTotal(0);\n };\n\n // Buffer for assembling scanned COSE chunks\n const qrChunksBufferRef = React.useRef({ id: null, total: 0, seen: new Set(), items: [] });\n\n const generateQRCode = async (data) => {\n try {\n const originalSize = typeof data === 'string' ? data.length : JSON.stringify(data).length;\n console.log(`\uD83D\uDCCA Original QR Code data size: ${originalSize} characters`);\n // Small payload: \u043F\u0440\u044F\u043C\u043E\u0439 JSON \u0432 \u043E\u0434\u0438\u043D QR (\u0431\u0435\u0437 \u0441\u0436\u0430\u0442\u0438\u044F, \u0431\u0435\u0437 \u043E\u0431\u0451\u0440\u0442\u043E\u043A)\n const payload = typeof data === 'string' ? data : JSON.stringify(data);\n const isDesktop = (typeof window !== 'undefined') && ((window.innerWidth || 0) >= 1024);\n const QR_SIZE = isDesktop ? 720 : 512;\n if (payload.length <= MAX_QR_LEN) {\n if (!window.generateQRCode) throw new Error('QR code generator unavailable');\n stopQrAnimation();\n const qrDataUrl = await window.generateQRCode(payload, { errorCorrectionLevel: 'M', size: QR_SIZE, margin: 2 });\n setQrCodeUrl(qrDataUrl);\n setQrFramesTotal(1);\n setQrFrameIndex(1);\n return;\n }\n\n // \u0411\u043E\u043B\u044C\u0448\u043E\u0439 payload: RAW \u0430\u043D\u0438\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 QR \u0431\u0435\u0437 \u0441\u0436\u0430\u0442\u0438\u044F\n console.log('\uD83C\uDF9E\uFE0F Using RAW animated QR frames (no compression)');\n stopQrAnimation();\n const id = `raw_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const FRAME_MAX = Math.max(300, Math.min(750, Math.floor(MAX_QR_LEN * 0.6)));\n const total = Math.ceil(payload.length / FRAME_MAX);\n const rawChunks = [];\n for (let i = 0; i < total; i++) {\n const seq = i + 1;\n const part = payload.slice(i * FRAME_MAX, (i + 1) * FRAME_MAX);\n rawChunks.push(JSON.stringify({ hdr: { v: 1, id, seq, total, rt: 'raw' }, body: part }));\n }\n if (!window.generateQRCode) throw new Error('QR code generator unavailable');\n if (rawChunks.length === 1) {\n const url = await window.generateQRCode(rawChunks[0], { errorCorrectionLevel: 'M', margin: 2, size: QR_SIZE });\n setQrCodeUrl(url);\n setQrFramesTotal(1);\n setQrFrameIndex(1);\n return;\n }\n qrAnimationRef.current.chunks = rawChunks;\n qrAnimationRef.current.idx = 0;\n qrAnimationRef.current.active = true;\n setQrFramesTotal(rawChunks.length);\n setQrFrameIndex(1);\n const EC_OPTS = { errorCorrectionLevel: 'M', margin: 2, size: QR_SIZE };\n const renderNext = async () => {\n const { chunks, idx, active } = qrAnimationRef.current;\n if (!active || !chunks.length) return;\n const current = chunks[idx % chunks.length];\n try {\n const url = await window.generateQRCode(current, EC_OPTS);\n setQrCodeUrl(url);\n } catch (e) {\n console.warn('Animated QR render error (raw):', e);\n }\n const nextIdx = (idx + 1) % chunks.length;\n qrAnimationRef.current.idx = nextIdx;\n setQrFrameIndex(nextIdx + 1);\n };\n await renderNext();\n const ua = (typeof navigator !== 'undefined' && navigator.userAgent) ? navigator.userAgent : '';\n const isIOS = /iPhone|iPad|iPod/i.test(ua);\n const intervalMs = isIOS ? 2500 : 2000; // Slower animation for better readability\n qrAnimationRef.current.timer = setInterval(renderNext, intervalMs);\n return;\n } catch (error) {\n console.error('QR code generation failed:', error);\n setMessages(prev => [...prev, {\n message: `\u274C QR code generation failed: ${error.message}`,\n type: 'error'\n }]);\n }\n };\n\n const reconstructFromTemplate = (templateData) => {\n // Reconstruct full offer from template\n const fullOffer = {\n type: \"enhanced_secure_offer\",\n version: templateData.version,\n timestamp: templateData.timestamp,\n sessionId: templateData.sessionId,\n connectionId: templateData.connectionId,\n verificationCode: templateData.verificationCode,\n salt: templateData.salt,\n sdp: templateData.sdp,\n keyFingerprints: templateData.keyFingerprints,\n capabilities: templateData.capabilities,\n \n // Reconstruct ECDH key object\n ecdhPublicKey: {\n keyType: \"ECDH\",\n keyData: templateData.ecdhKeyData,\n timestamp: templateData.timestamp - 1000, // Approximate\n version: templateData.version,\n signature: templateData.ecdhSignature\n },\n \n // Reconstruct ECDSA key object\n ecdsaPublicKey: {\n keyType: \"ECDSA\",\n keyData: templateData.ecdsaKeyData,\n timestamp: templateData.timestamp - 999, // Approximate\n version: templateData.version,\n signature: templateData.ecdsaSignature\n },\n \n // Reconstruct auth challenge\n authChallenge: {\n challenge: templateData.authChallenge,\n timestamp: templateData.timestamp,\n nonce: templateData.authNonce,\n version: templateData.version\n },\n \n // Generate security level (can be recalculated)\n securityLevel: {\n level: \"CRITICAL\",\n score: 20,\n color: \"red\",\n verificationResults: {\n encryption: { passed: false, details: \"Encryption not working\", points: 0 },\n keyExchange: { passed: true, details: \"Simple key exchange verified\", points: 15 },\n messageIntegrity: { passed: false, details: \"Message integrity failed\", points: 0 },\n rateLimiting: { passed: true, details: \"Rate limiting active\", points: 5 },\n ecdsa: { passed: false, details: \"Enhanced session required - feature not available\", points: 0 },\n metadataProtection: { passed: false, details: \"Enhanced session required - feature not available\", points: 0 },\n pfs: { passed: false, details: \"Enhanced session required - feature not available\", points: 0 },\n nestedEncryption: { passed: false, details: \"Enhanced session required - feature not available\", points: 0 },\n packetPadding: { passed: false, details: \"Enhanced session required - feature not available\", points: 0 },\n advancedFeatures: { passed: false, details: \"Premium session required - feature not available\", points: 0 }\n },\n timestamp: templateData.timestamp,\n details: \"Real verification: 20/100 security checks passed (2/4 available)\",\n isRealData: true,\n passedChecks: 2,\n totalChecks: 4,\n sessionType: \"demo\",\n maxPossibleScore: 50\n }\n };\n \n return fullOffer;\n };\n\n const handleQRScan = async (scannedData) => {\n try {\n console.log('\uD83D\uDD0D Processing scanned QR data...');\n console.log('\uD83D\uDCCA Current mode - showOfferStep:', showOfferStep);\n console.log('\uD83D\uDCCA Scanned data length:', scannedData.length);\n console.log('\uD83D\uDCCA Scanned data first 100 chars:', scannedData.substring(0, 100));\n console.log('\uD83D\uDCCA window.receiveAndProcess available:', !!window.receiveAndProcess);\n \n // Try to parse as JSON first\n const parsedData = JSON.parse(scannedData);\n console.log('\uD83D\uDCCA Parsed data structure:', parsedData);\n \n // QR with hdr/body: COSE or RAW animated frames\n if (parsedData.hdr && parsedData.body) {\n const { hdr } = parsedData;\n // Initialize/rotate buffer by id\n if (!qrChunksBufferRef.current.id || qrChunksBufferRef.current.id !== hdr.id) {\n qrChunksBufferRef.current = { id: hdr.id, total: hdr.total || 1, seen: new Set(), items: [], lastUpdateMs: Date.now() };\n try {\n document.dispatchEvent(new CustomEvent('qr-scan-progress', { detail: { id: hdr.id, seq: 0, total: hdr.total || 1 } }));\n } catch {}\n }\n // Deduplicate & record\n if (!qrChunksBufferRef.current.seen.has(hdr.seq)) {\n qrChunksBufferRef.current.seen.add(hdr.seq);\n qrChunksBufferRef.current.items.push(scannedData);\n qrChunksBufferRef.current.lastUpdateMs = Date.now();\n }\n // Emit progress based on unique frames captured\n try {\n const uniqueCount = qrChunksBufferRef.current.seen.size;\n document.dispatchEvent(new CustomEvent('qr-scan-progress', { detail: { id: hdr.id, seq: uniqueCount, total: qrChunksBufferRef.current.total || hdr.total || 0 } }));\n } catch {}\n const isComplete = qrChunksBufferRef.current.seen.size >= (qrChunksBufferRef.current.total || 1);\n if (!isComplete) {\n // Explicitly keep scanner open\n return Promise.resolve(false);\n }\n // Completed: decide RAW vs COSE\n if (hdr.rt === 'raw') {\n try {\n // Sort by seq and concatenate bodies\n const parts = qrChunksBufferRef.current.items\n .map(s => JSON.parse(s))\n .sort((a, b) => (a.hdr.seq || 0) - (b.hdr.seq || 0))\n .map(p => p.body || '');\n const fullText = parts.join('');\n const payloadObj = JSON.parse(fullText);\n if (showOfferStep) {\n setAnswerInput(JSON.stringify(payloadObj, null, 2));\n } else {\n setOfferInput(JSON.stringify(payloadObj, null, 2));\n }\n setMessages(prev => [...prev, { message: '\u2705 All frames captured. RAW payload reconstructed.', type: 'success' }]);\n try { document.dispatchEvent(new CustomEvent('qr-scan-complete', { detail: { id: hdr.id } })); } catch {}\n // Close scanner from caller by returning true\n qrChunksBufferRef.current = { id: null, total: 0, seen: new Set(), items: [] };\n setShowQRScannerModal(false);\n return Promise.resolve(true);\n } catch (e) {\n console.warn('RAW multi-frame reconstruction failed:', e);\n return Promise.resolve(false);\n }\n } else if (window.receiveAndProcess) {\n try {\n const results = await window.receiveAndProcess(qrChunksBufferRef.current.items);\n if (results.length > 0) {\n const { payloadObj } = results[0];\n if (showOfferStep) {\n setAnswerInput(JSON.stringify(payloadObj, null, 2));\n } else {\n setOfferInput(JSON.stringify(payloadObj, null, 2));\n }\n setMessages(prev => [...prev, { message: '\u2705 All frames captured. COSE payload reconstructed.', type: 'success' }]);\n try { document.dispatchEvent(new CustomEvent('qr-scan-complete', { detail: { id: hdr.id } })); } catch {}\n qrChunksBufferRef.current = { id: null, total: 0, seen: new Set(), items: [] };\n setShowQRScannerModal(false);\n return Promise.resolve(true);\n }\n } catch (e) {\n console.warn('COSE multi-chunk processing failed:', e);\n }\n return Promise.resolve(false);\n } else {\n return Promise.resolve(false);\n }\n }\n \n // Check if this is a template-based QR code\n if (parsedData.type === 'enhanced_secure_offer_template') {\n console.log('QR scan: Template-based offer detected, reconstructing...');\n const fullOffer = reconstructFromTemplate(parsedData);\n \n // Determine which input to populate based on current mode\n if (showOfferStep) {\n // In \"Waiting for peer's response\" mode - populate answerInput\n setAnswerInput(JSON.stringify(fullOffer, null, 2));\n console.log('\uD83D\uDCF1 Template data populated to answerInput (waiting for response mode)');\n } else {\n // In \"Paste secure invitation\" mode - populate offerInput\n setOfferInput(JSON.stringify(fullOffer, null, 2));\n console.log('\uD83D\uDCF1 Template data populated to offerInput (paste invitation mode)');\n }\n setMessages(prev => [...prev, {\n message: '\uD83D\uDCF1 QR code scanned successfully! Full offer reconstructed from template.',\n type: 'success'\n }]);\n setShowQRScannerModal(false); // Close QR scanner modal\n return true;\n }\n // Check if this is a reference-based QR code\n else if (parsedData.type === 'secure_offer_reference' && parsedData.referenceId) {\n // Try to get the full offer data from localStorage\n const fullOfferData = localStorage.getItem(`qr_offer_${parsedData.referenceId}`);\n if (fullOfferData) {\n const fullOffer = JSON.parse(fullOfferData);\n // Determine which input to populate based on current mode\n if (showOfferStep) {\n // In \"Waiting for peer's response\" mode - populate answerInput\n setAnswerInput(JSON.stringify(fullOffer, null, 2));\n console.log('\uD83D\uDCF1 Reference data populated to answerInput (waiting for response mode)');\n } else {\n // In \"Paste secure invitation\" mode - populate offerInput\n setOfferInput(JSON.stringify(fullOffer, null, 2));\n console.log('\uD83D\uDCF1 Reference data populated to offerInput (paste invitation mode)');\n }\n setMessages(prev => [...prev, {\n message: '\uD83D\uDCF1 QR code scanned successfully! Full offer data retrieved.',\n type: 'success'\n }]);\n setShowQRScannerModal(false); // Close QR scanner modal\n return true;\n } else {\n setMessages(prev => [...prev, {\n message: '\u274C QR code reference found but full data not available. Please use copy/paste.',\n type: 'error'\n }]);\n return false;\n }\n } else {\n // Check if this is compressed data (missing SDP)\n if (!parsedData.sdp) {\n setMessages(prev => [...prev, {\n message: '\u26A0\uFE0F QR code contains compressed data (SDP removed). Please use copy/paste for full data.',\n type: 'warning'\n }]);\n }\n \n // Determine which input to populate based on current mode\n if (showOfferStep) {\n // In \"Waiting for peer's response\" mode - populate answerInput\n console.log('QR scan: Populating answerInput with:', parsedData);\n setAnswerInput(JSON.stringify(parsedData, null, 2));\n } else {\n // In \"Paste secure invitation\" mode - populate offerInput\n console.log('QR scan: Populating offerInput with:', parsedData);\n setOfferInput(JSON.stringify(parsedData, null, 2));\n }\n setMessages(prev => [...prev, {\n message: '\uD83D\uDCF1 QR code scanned successfully!',\n type: 'success'\n }]);\n setShowQRScannerModal(false);\n return true;\n }\n } catch (error) {\n // If not JSON, use as plain text\n if (showOfferStep) {\n // In \"Waiting for peer's response\" mode - populate answerInput\n setAnswerInput(scannedData);\n } else {\n // In \"Paste secure invitation\" mode - populate offerInput\n setOfferInput(scannedData);\n }\n setMessages(prev => [...prev, {\n message: '\uD83D\uDCF1 QR code scanned successfully!',\n type: 'success'\n }]);\n setShowQRScannerModal(false);\n return true;\n }\n };\n \n const handleCreateOffer = async () => {\n try {\n console.log('\uD83C\uDFAF handleCreateOffer called');\n // All security features are enabled by default\n \n setOfferData('');\n setShowOfferStep(false);\n setShowQRCode(false);\n setQrCodeUrl('');\n \n console.log('\uD83C\uDFAF Calling createSecureOffer...');\n const offer = await webrtcManagerRef.current.createSecureOffer();\n console.log('\uD83C\uDFAF createSecureOffer returned:', offer ? 'success' : 'null');\n \n // Store offer data directly (no encryption needed with SAS)\n setOfferData(offer);\n setShowOfferStep(true);\n \n // Generate QR code for the offer data\n // Use compact JSON (no pretty-printing) to reduce size\n const offerString = typeof offer === 'object' ? JSON.stringify(offer) : offer;\n console.log('Generating QR code for data length:', offerString.length);\n console.log('First 100 chars of offer data:', offerString.substring(0, 100));\n await generateQRCode(offerString);\n \n const existingMessages = messages.filter(m => \n m.type === 'system' && \n (m.message.includes('Secure invitation created') || m.message.includes('Send the encrypted code'))\n );\n \n if (existingMessages.length === 0) {\n setMessages(prev => [...prev, { \n message: '\uD83D\uDD10 Secure invitation created and encrypted!', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n setMessages(prev => [...prev, { \n message: '\uD83D\uDCE4 Send the invitation code to your interlocutor via a secure channel (voice call, SMS, etc.)..', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n }\n \n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } catch (error) {\n setMessages(prev => [...prev, { \n message: `\u274C Error creating invitation: ${error.message}`, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n }\n };\n \n const handleCreateAnswer = async () => {\n try {\n console.log('handleCreateAnswer called, offerInput:', offerInput);\n console.log('offerInput.trim():', offerInput.trim());\n console.log('offerInput.trim() length:', offerInput.trim().length);\n \n if (!offerInput.trim()) {\n setMessages(prev => [...prev, { \n message: '\u26A0\uFE0F You need to insert the invitation code from your interlocutor.', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n return;\n }\n \n try {\n setMessages(prev => [...prev, { \n message: '\uD83D\uDD04 Processing the secure invitation...', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n let offer;\n try {\n // Parse the offer data directly (no decryption needed with SAS)\n offer = JSON.parse(offerInput.trim());\n } catch (parseError) {\n throw new Error(`Invalid invitation format: ${parseError.message}`);\n }\n \n if (!offer || typeof offer !== 'object') {\n throw new Error('The invitation must be an object');\n }\n \n // Support both compact and legacy offer formats\n const isValidOfferType = (offer.t === 'offer') || (offer.type === 'enhanced_secure_offer');\n if (!isValidOfferType) {\n throw new Error('Invalid invitation type. Expected offer or enhanced_secure_offer');\n }\n \n console.log('Creating secure answer for offer:', offer);\n const answer = await webrtcManagerRef.current.createSecureAnswer(offer);\n console.log('Secure answer created:', answer);\n \n // Store answer data directly (no encryption needed with SAS)\n setAnswerData(answer);\n setShowAnswerStep(true);\n \n // Mark answer as created for state management\n markAnswerCreated();\n \n const existingResponseMessages = messages.filter(m => \n m.type === 'system' && \n (m.message.includes('Secure response created') || m.message.includes('Send the response'))\n );\n \n if (existingResponseMessages.length === 0) {\n setMessages(prev => [...prev, { \n message: '\u2705 Secure response created!', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n setMessages(prev => [...prev, { \n message: '\uD83D\uDCE4 Send the response code to the initiator via a secure channel..', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n }\n \n // Update security level after creating answer\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } catch (error) {\n console.error('Error in handleCreateAnswer:', error);\n setMessages(prev => [...prev, { \n message: `\u274C Error processing the invitation: ${error.message}`, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n }\n } catch (error) {\n console.error('Error in handleCreateAnswer:', error);\n setMessages(prev => [...prev, { \n message: `\u274C Invitation processing error: ${error.message}`, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n }\n };\n \n const handleConnect = async () => {\n try {\n if (!answerInput.trim()) {\n setMessages(prev => [...prev, { \n message: '\u26A0\uFE0F You need to insert the response code from your interlocutor.', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n return;\n }\n \n try {\n setMessages(prev => [...prev, { \n message: '\uD83D\uDD04 Processing the secure response...', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n let answer;\n try {\n // Parse the answer data directly (no decryption needed with SAS)\n answer = JSON.parse(answerInput.trim());\n } catch (parseError) {\n throw new Error(`Invalid response format: ${parseError.message}`);\n }\n \n if (!answer || typeof answer !== 'object') {\n throw new Error('The response must be an object');\n }\n \n // Support both compact and legacy formats\n const answerType = answer.t || answer.type;\n if (!answerType || (answerType !== 'answer' && answerType !== 'enhanced_secure_answer')) {\n throw new Error('Invalid response type. Expected answer or enhanced_secure_answer');\n }\n \n await webrtcManagerRef.current.handleSecureAnswer(answer);\n \n // All security features are enabled by default - no session activation needed\n if (pendingSession) {\n setPendingSession(null);\n setMessages(prev => [...prev, { \n message: `\u2705 All security features enabled by default`, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n }\n \n setMessages(prev => [...prev, { \n message: '\uD83D\uDD04 Finalizing the secure connection...', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n // Update security level after handling answer\n if (!window.isUpdatingSecurity) {\n updateSecurityLevel().catch(console.error);\n }\n } catch (error) {\n console.error('Error in handleConnect inner try:', error);\n \n // \u0411\u043E\u043B\u0435\u0435 \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u043E\u0448\u0438\u0431\u043E\u043A\n let errorMessage = 'Connection setup error';\n if (error.message.includes('CRITICAL SECURITY FAILURE')) {\n if (error.message.includes('ECDH public key structure')) {\n errorMessage = '\uD83D\uDD11 Invalid response code - missing or corrupted cryptographic key. Please check the code and try again.';\n } else if (error.message.includes('ECDSA public key structure')) {\n errorMessage = '\uD83D\uDD10 Invalid response code - missing signature verification key. Please check the code and try again.';\n } else {\n errorMessage = '\uD83D\uDD12 Security validation failed - possible attack detected';\n }\n } else if (error.message.includes('too old') || error.message.includes('replay')) {\n errorMessage = '\u23F0 Response data is outdated - please use a fresh invitation';\n } else if (error.message.includes('MITM') || error.message.includes('signature')) {\n errorMessage = '\uD83D\uDEE1\uFE0F Security breach detected - connection rejected';\n } else if (error.message.includes('Invalid') || error.message.includes('format')) {\n errorMessage = '\uD83D\uDCDD Invalid response format - please check the code';\n } else {\n errorMessage = `\u274C ${error.message}`;\n }\n \n setMessages(prev => [...prev, { \n message: errorMessage, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now(),\n showRetryButton: true\n }]);\n \n // \u0421\u0431\u0440\u043E\u0441 \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u043E\u0448\u0438\u0431\u043E\u043A \u043A\u0440\u043E\u043C\u0435 replay attack\n if (!error.message.includes('too old') && !error.message.includes('replay')) {\n setPendingSession(null);\n setSessionTimeLeft(0);\n }\n \n // \u0423\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u043C \u0441\u0442\u0430\u0442\u0443\u0441 failed \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0432 \u0445\u0435\u0434\u0435\u0440\u0435\n setConnectionStatus('failed');\n \n // \u041E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u0438\n console.log('\uD83D\uDEA8 Error occurred, but keeping connection status as connecting:');\n console.log(' - errorMessage:', error.message);\n console.log(' - connectionStatus:', 'connecting (kept)');\n console.log(' - isVerified:', false);\n console.log(' - willShowChat:', keyFingerprint && keyFingerprint !== '');\n } \n } catch (error) {\n console.error('Error in handleConnect outer try:', error);\n \n // \u0411\u043E\u043B\u0435\u0435 \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u043E\u0448\u0438\u0431\u043E\u043A\n let errorMessage = 'Connection setup error';\n if (error.message.includes('CRITICAL SECURITY FAILURE')) {\n if (error.message.includes('ECDH public key structure')) {\n errorMessage = '\uD83D\uDD11 Invalid response code - missing or corrupted cryptographic key. Please check the code and try again.';\n } else if (error.message.includes('ECDSA public key structure')) {\n errorMessage = '\uD83D\uDD10 Invalid response code - missing signature verification key. Please check the code and try again.';\n } else {\n errorMessage = '\uD83D\uDD12 Security validation failed - possible attack detected';\n }\n } else if (error.message.includes('too old') || error.message.includes('replay')) {\n errorMessage = '\u23F0 Response data is outdated - please use a fresh invitation';\n } else if (error.message.includes('MITM') || error.message.includes('signature')) {\n errorMessage = '\uD83D\uDEE1\uFE0F Security breach detected - connection rejected';\n } else if (error.message.includes('Invalid') || error.message.includes('format')) {\n errorMessage = '\uD83D\uDCDD Invalid response format - please check the code';\n } else {\n errorMessage = `\u274C ${error.message}`;\n }\n \n setMessages(prev => [...prev, { \n message: errorMessage, \n type: 'system',\n id: Date.now(),\n timestamp: Date.now(),\n showRetryButton: true\n }]);\n \n // \u0421\u0431\u0440\u043E\u0441 \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u043E\u0448\u0438\u0431\u043E\u043A \u043A\u0440\u043E\u043C\u0435 replay attack\n if (!error.message.includes('too old') && !error.message.includes('replay')) {\n setPendingSession(null);\n setSessionTimeLeft(0);\n }\n \n // \u0423\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u043C \u0441\u0442\u0430\u0442\u0443\u0441 failed \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0432 \u0445\u0435\u0434\u0435\u0440\u0435\n setConnectionStatus('failed');\n \n // \u041E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u0438\n console.log('\uD83D\uDEA8 Error occurred in outer catch, but keeping connection status as connecting:');\n console.log(' - errorMessage:', error.message);\n console.log(' - connectionStatus:', 'connecting (kept)');\n console.log(' - isVerified:', false);\n console.log(' - willShowChat:', keyFingerprint && keyFingerprint !== '');\n }\n };\n \n const handleVerifyConnection = (isValid) => {\n if (isValid) {\n webrtcManagerRef.current.confirmVerification();\n // Mark local verification as confirmed\n setLocalVerificationConfirmed(true);\n } else {\n setMessages(prev => [...prev, { \n message: '\u274C Verification rejected. The connection is unsafe! Session reset..', \n type: 'system',\n id: Date.now(),\n timestamp: Date.now()\n }]);\n \n // Clear verification states\n setLocalVerificationConfirmed(false);\n setRemoteVerificationConfirmed(false);\n setBothVerificationsConfirmed(false);\n setShowVerification(false);\n setVerificationCode('');\n \n // Reset UI to initial state\n setConnectionStatus('disconnected');\n setOfferData(null);\n setAnswerData(null);\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setKeyFingerprint('');\n setSecurityLevel(null);\n setIsVerified(false);\n setMessages([]);\n \n setSessionTimeLeft(0);\n setPendingSession(null);\n \n // Dispatch disconnected event for SessionTimer\n document.dispatchEvent(new CustomEvent('disconnected'));\n \n handleDisconnect();\n }\n };\n \n const handleSendMessage = async () => {\n if (!messageInput.trim()) {\n return;\n }\n \n if (!webrtcManagerRef.current) {\n return;\n }\n \n if (!webrtcManagerRef.current.isConnected()) {\n return;\n }\n \n try {\n \n // Add the message to local messages immediately (sent message)\n addMessageWithAutoScroll(messageInput.trim(), 'sent');\n \n // Use sendMessage for simple text messages instead of sendSecureMessage\n await webrtcManagerRef.current.sendMessage(messageInput);\n setMessageInput('');\n } catch (error) {\n const msg = String(error?.message || error);\n if (!/queued for sending|Data channel not ready/i.test(msg)) {\n addMessageWithAutoScroll(`\u274C Sending error: ${msg}`,'system');\n }\n }\n };\n \n const handleClearData = () => {\n // \u041E\u0447\u0438\u0449\u0430\u0435\u043C \u0432\u0441\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\n setOfferData('');\n setAnswerData('');\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setShowVerification(false);\n setShowQRCode(false);\n setShowQRScanner(false);\n setShowQRScannerModal(false);\n setQrCodeUrl('');\n setVerificationCode('');\n setIsVerified(false);\n setKeyFingerprint('');\n setSecurityLevel(null);\n setConnectionStatus('disconnected');\n setMessages([]);\n setMessageInput('');\n \n // Clear verification states\n setLocalVerificationConfirmed(false);\n setRemoteVerificationConfirmed(false);\n setBothVerificationsConfirmed(false);\n \n // PAKE passwords removed - using SAS verification instead \n \n // \u041D\u0435 \u043E\u0447\u0438\u0449\u0430\u0435\u043C \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u043F\u0440\u0438 \u043E\u0447\u0438\u0441\u0442\u043A\u0435 \u0434\u0430\u043D\u043D\u044B\u0445\n // \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043C\u043E\u0433 \u0432\u0438\u0434\u0435\u0442\u044C \u043E\u0448\u0438\u0431\u043A\u0438\n // if (typeof console.clear === 'function') {\n // console.clear();\n // }\n \n // Cleanup session state\n setSessionTimeLeft(0);\n \n setPendingSession(null);\n document.dispatchEvent(new CustomEvent('peer-disconnect'));\n // Session manager removed - all features enabled by default\n };\n \n const handleDisconnect = () => {\n setSessionTimeLeft(0);\n \n // Mark as user-initiated disconnect\n updateConnectionState({ \n status: 'disconnected',\n isUserInitiatedDisconnect: true \n });\n \n // Cleanup session state\n if (webrtcManagerRef.current) {\n webrtcManagerRef.current.disconnect();\n }\n \n setKeyFingerprint('');\n setVerificationCode('');\n setSecurityLevel(null);\n setIsVerified(false);\n setShowVerification(false);\n setConnectionStatus('disconnected');\n \n // Clear verification states\n setLocalVerificationConfirmed(false);\n setRemoteVerificationConfirmed(false);\n setBothVerificationsConfirmed(false);\n \n // Reset UI to initial state (user-initiated disconnect always clears data)\n setConnectionStatus('disconnected');\n setShowVerification(false);\n setOfferData(null);\n setAnswerData(null);\n setOfferInput('');\n setAnswerInput('');\n setShowOfferStep(false);\n setShowAnswerStep(false);\n setKeyFingerprint('');\n setVerificationCode('');\n setSecurityLevel(null);\n setIsVerified(false);\n \n setMessages([]);\n \n // \u041D\u0435 \u043E\u0447\u0438\u0449\u0430\u0435\u043C \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u043F\u0440\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438\n // \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043C\u043E\u0433 \u0432\u0438\u0434\u0435\u0442\u044C \u043E\u0448\u0438\u0431\u043A\u0438\n // if (typeof console.clear === 'function') {\n // console.clear();\n // }\n \n document.dispatchEvent(new CustomEvent('peer-disconnect'));\n document.dispatchEvent(new CustomEvent('disconnected'));\n \n document.dispatchEvent(new CustomEvent('session-cleanup', {\n detail: { \n timestamp: Date.now(),\n reason: 'manual_disconnect'\n }\n }));\n \n setTimeout(() => {\n setSessionTimeLeft(0);\n }, 500);\n \n handleClearData();\n \n setTimeout(() => {\n // Session manager removed - all features enabled by default\n }, 1000);\n };\n \n const handleSessionActivated = (session) => {\n let message;\n if (session.type === 'demo') {\n message = `\uD83C\uDFAE Demo session activated for 6 minutes. You can create invitations!`;\n } else {\n message = `\u2705 All security features enabled by default. You can create invitations!`;\n }\n \n addMessageWithAutoScroll(message, 'system');\n \n };\n \n React.useEffect(() => {\n if (connectionStatus === 'connected' && isVerified) {\n addMessageWithAutoScroll('\uD83C\uDF89 Secure connection successfully established and verified! You can now communicate safely with full protection against MITM attacks and Perfect Forward Secrecy..', 'system');\n \n }\n }, [connectionStatus, isVerified]);\n \n const isConnectedAndVerified = (connectionStatus === 'connected' || connectionStatus === 'verified') && isVerified;\n \n // \u041E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u0438 \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0447\u0430\u0442\u0430\n console.log('\uD83D\uDD0D Chat activation check:');\n console.log(' - connectionStatus:', connectionStatus);\n console.log(' - isVerified:', isVerified);\n console.log(' - keyFingerprint:', keyFingerprint);\n console.log(' - isConnectedAndVerified:', isConnectedAndVerified);\n console.log(' - bothVerificationsConfirmed:', bothVerificationsConfirmed);\n console.log(' - localVerificationConfirmed:', localVerificationConfirmed);\n console.log(' - remoteVerificationConfirmed:', remoteVerificationConfirmed);\n \n React.useEffect(() => {\n // All security features are enabled by default - no session activation needed\n if (isConnectedAndVerified && pendingSession && connectionStatus !== 'failed') {\n setPendingSession(null);\n setSessionTimeLeft(0); \n addMessageWithAutoScroll('\u2705 All security features enabled by default', 'system');\n }\n }, [isConnectedAndVerified, pendingSession, connectionStatus]);\n \n return React.createElement('div', { \n className: \"minimal-bg min-h-screen\" \n }, [\n React.createElement(EnhancedMinimalHeader, {\n key: 'header',\n status: connectionStatus,\n fingerprint: keyFingerprint,\n verificationCode: verificationCode,\n onDisconnect: handleDisconnect,\n isConnected: isConnectedAndVerified,\n securityLevel: securityLevel,\n // sessionManager removed - all features enabled by default\n sessionTimeLeft: sessionTimeLeft,\n webrtcManager: webrtcManagerRef.current\n }),\n \n React.createElement('main', {\n key: 'main'\n }, \n (() => {\n console.log('\uD83D\uDD0D Main render decision:', {\n isConnectedAndVerified,\n connectionStatus,\n isVerified,\n keyFingerprint: !!keyFingerprint\n });\n return isConnectedAndVerified;\n })()\n ? (() => {\n console.log('\uD83D\uDD0D Passing scrollToBottom to EnhancedChatInterface:', typeof scrollToBottom, scrollToBottom);\n return React.createElement(EnhancedChatInterface, {\n messages: messages,\n messageInput: messageInput,\n setMessageInput: setMessageInput,\n onSendMessage: handleSendMessage,\n onDisconnect: handleDisconnect,\n keyFingerprint: keyFingerprint,\n isVerified: isVerified,\n chatMessagesRef: chatMessagesRef,\n scrollToBottom: scrollToBottom,\n webrtcManager: webrtcManagerRef.current\n });\n })()\n : React.createElement(EnhancedConnectionSetup, {\n onCreateOffer: handleCreateOffer,\n onCreateAnswer: handleCreateAnswer,\n onConnect: handleConnect,\n onClearData: handleClearData,\n onVerifyConnection: handleVerifyConnection,\n connectionStatus: connectionStatus,\n offerData: offerData,\n answerData: answerData,\n offerInput: offerInput,\n setOfferInput: setOfferInput,\n answerInput: answerInput,\n setAnswerInput: setAnswerInput,\n showOfferStep: showOfferStep,\n showAnswerStep: showAnswerStep,\n verificationCode: verificationCode,\n showVerification: showVerification,\n showQRCode: showQRCode,\n qrCodeUrl: qrCodeUrl,\n showQRScanner: showQRScanner,\n setShowQRCode: setShowQRCode,\n setShowQRScanner: setShowQRScanner,\n setShowQRScannerModal: setShowQRScannerModal,\n messages: messages,\n localVerificationConfirmed: localVerificationConfirmed,\n remoteVerificationConfirmed: remoteVerificationConfirmed,\n bothVerificationsConfirmed: bothVerificationsConfirmed,\n // PAKE passwords removed - using SAS verification instead\n })\n ),\n \n // PAKE Password Modal removed - using SAS verification instead\n \n // Payment Modal removed - all security features enabled by default\n\n (() => {\n console.log('Rendering QRScanner, showQRScannerModal:', showQRScannerModal, 'QRScanner available:', !!window.QRScanner);\n return window.QRScanner ? React.createElement(window.QRScanner, {\n key: 'qr-scanner-modal',\n onScan: handleQRScan,\n onClose: () => setShowQRScannerModal(false),\n isVisible: showQRScannerModal,\n continuous: true\n }) : React.createElement('div', {\n key: 'qr-scanner-error',\n className: \"hidden\"\n }, 'QRScanner not loaded');\n })()\n ]);\n };\n function initializeApp() {\n if (window.EnhancedSecureCryptoUtils && window.EnhancedSecureWebRTCManager) {\n ReactDOM.render(React.createElement(EnhancedSecureP2PChat), document.getElementById('root'));\n } else {\n console.error('\u274C \u041C\u043E\u0434\u0443\u043B\u0438 \u043D\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u044B:', {\n hasCrypto: !!window.EnhancedSecureCryptoUtils,\n hasWebRTC: !!window.EnhancedSecureWebRTCManager\n });\n }\n }\n // \u0413\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u044B\u0439 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A \u043E\u0448\u0438\u0431\u043E\u043A \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0435\u043D\u0438\u044F \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u044F \u043E\u0448\u0438\u0431\u043E\u043A \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u044C\n if (typeof window !== 'undefined') {\n // \u041E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A \u043D\u0435\u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043D\u044B\u0445 \u043F\u0440\u043E\u043C\u0438\u0441\u043E\u0432\n window.addEventListener('unhandledrejection', (event) => {\n console.error('\uD83D\uDEA8 Unhandled promise rejection:', event.reason);\n event.preventDefault(); // \u041F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u043C \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u0435 \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n });\n \n // \u041E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u044B\u0445 \u043E\u0448\u0438\u0431\u043E\u043A\n window.addEventListener('error', (event) => {\n console.error('\uD83D\uDEA8 Global error:', event.error);\n event.preventDefault(); // \u041F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u043C \u043F\u043E\u043F\u0430\u0434\u0430\u043D\u0438\u0435 \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n });\n \n if (!window.initializeApp) {\n window.initializeApp = initializeApp;\n }\n }\n // Render Enhanced Application\n ReactDOM.render(React.createElement(EnhancedSecureP2PChat), document.getElementById('root'));"], + "mappings": "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", "names": ["markAnswerCreated", "offerData", "qrFramesTotal", "qrFrameIndex", "generateQRCode"] } diff --git a/doc/API.md b/doc/API.md index b4f2773..a60dfec 100644 --- a/doc/API.md +++ b/doc/API.md @@ -2,14 +2,13 @@ ## 🏗️ Architecture Overview -SecureBit.chat is built as a client-side application with no backend servers. The "API" consists of JavaScript classes and methods that handle cryptography, P2P connections, and Lightning Network integration. **Version 4.02.442 introduces complete ASN.1 validation for enhanced key security.** +SecureBit.chat is built as a client-side application with no backend servers. The "API" consists of JavaScript classes and methods that handle cryptography, P2P connections. **Version 4.02.442 introduces complete ASN.1 validation for enhanced key security.** ## 📋 Table of Contents 1. [Core Classes](#-core-classes) - [EnhancedSecureCryptoUtils](#-enhancedsecurecryptoutils) - [EnhancedSecureWebRTCManager](#-enhancedsecurewebrtcmanager) - - [LightningNetworkManager](#-lightningnetworkmanager) 2. [Security Framework APIs](#-security-framework-apis) - [SecureKeyManager](#-securekeymanager) - [ConnectionMutexManager](#-connectionmutexmanager) @@ -848,356 +847,6 @@ Cleanly disconnects and cleans up all resources. confirmVerification() javascriptconfirmVerification(): void Confirms that verification codes match (called after manual verification). -⚡ PayPerSessionManager -Handles Lightning Network payment integration. -Constructor -javascriptnew PayPerSessionManager() -Session Types -typescriptinterface SessionPricing { - free: { sats: 0, hours: 1/60, usd: 0.00 }; - basic: { sats: 500, hours: 1, usd: 0.20 }; - premium: { sats: 1000, hours: 4, usd: 0.40 }; - extended: { sats: 2000, hours: 24, usd: 0.80 }; -} -Payment Methods -createInvoice() -javascriptcreateInvoice(sessionType: string): LightningInvoice -Creates Lightning invoice for session payment. -Parameters: - -sessionType - One of: 'free', 'basic', 'premium', 'extended' - -Returns: -typescriptinterface LightningInvoice { - amount: number; // satoshis - memo: string; - sessionType: string; - timestamp: number; - paymentHash: string; - lightningAddress: string; -} -Example: -javascriptconst sessionManager = new PayPerSessionManager(); -const invoice = sessionManager.createInvoice('premium'); -console.log(`Pay ${invoice.amount} sats to ${invoice.lightningAddress}`); -verifyPayment() -javascriptasync verifyPayment(preimage: string, paymentHash: string): Promise -Verifies Lightning payment preimage. -Parameters: - -preimage - Payment preimage (64 hex characters) -paymentHash - Payment hash from invoice - -Returns: true if payment is valid -activateSession() -javascriptactivateSession(sessionType: string, preimage: string): Session -Activates paid session. -Returns: -typescriptinterface Session { - type: string; - startTime: number; - expiresAt: number; - preimage: string; -} -Session Management -hasActiveSession() -javascripthasActiveSession(): boolean -Returns true if there's an active, non-expired session. -getTimeLeft() -javascriptgetTimeLeft(): number -Returns milliseconds remaining in current session. -Example: -javascriptconst timeLeft = sessionManager.getTimeLeft(); -const hoursLeft = Math.floor(timeLeft / (1000 * 60 * 60)); -console.log(`${hoursLeft} hours remaining`); -cleanup() -javascriptcleanup(): void -Cleans up session data and timers. -🔧 Integration Examples -Basic P2P Chat Setup -javascript// Initialize WebRTC manager -const webrtcManager = new EnhancedSecureWebRTCManager( - (message, type) => { - console.log(`${type}: ${message}`); - addMessageToUI(message, type); - }, - (status) => { - console.log(`Status: ${status}`); - updateStatusIndicator(status); - }, - (fingerprint) => { - console.log(`Key fingerprint: ${fingerprint}`); - displayFingerprint(fingerprint); - }, - (code) => { - console.log(`Verification code: ${code}`); - showVerificationModal(code); - } -); - -// Create secure offer -const offer = await webrtcManager.createSecureOffer(); -console.log('Share this encrypted offer:', JSON.stringify(offer)); - -// Send message (after connection established) -await webrtcManager.sendSecureMessage('Hello, secure world!'); -Lightning Payment Integration -javascript// Initialize session manager -const sessionManager = new PayPerSessionManager(); - -// Create invoice for premium session -const invoice = sessionManager.createInvoice('premium'); -console.log(`Pay ${invoice.amount} sats to: ${invoice.lightningAddress}`); - -// Handle payment (WebLN) -if (window.webln) { - try { - await window.webln.enable(); - const result = await window.webln.sendPayment({ - amount: invoice.amount, - memo: invoice.memo - }); - - // Verify and activate session - const isValid = await sessionManager.verifyPayment( - result.preimage, - invoice.paymentHash - ); - - if (isValid) { - const session = sessionManager.activateSession('premium', result.preimage); - console.log(`Session active until: ${new Date(session.expiresAt)}`); - } - } catch (error) { - console.error('WebLN payment failed:', error); - } -} -Custom Cryptographic Operations -javascript// Generate fresh key pairs -const ecdhKeys = await EnhancedSecureCryptoUtils.generateECDHKeyPair(); -const ecdsaKeys = await EnhancedSecureCryptoUtils.generateECDSAKeyPair(); - -// Create and verify signature -const data = 'Important message to sign'; -const signature = await EnhancedSecureCryptoUtils.signData( - ecdsaKeys.privateKey, - data -); - -const isValid = await EnhancedSecureCryptoUtils.verifySignature( - ecdsaKeys.publicKey, - signature, - data -); -console.log('Signature valid:', isValid); - -// Derive shared keys -const salt = EnhancedSecureCryptoUtils.generateSalt(); -const sharedKeys = await EnhancedSecureCryptoUtils.deriveSharedKeys( - ecdhKeys.privateKey, - remotePublicKey, - salt -); - -// Encrypt message -const encrypted = await EnhancedSecureCryptoUtils.encryptMessage( - "Secret message", - sharedKeys.encryptionKey, - sharedKeys.macKey, - sharedKeys.metadataKey, - "msg_001", - 1 -); -Full Connection Flow -javascript// Complete initiator flow -async function initiatorFlow() { - // 1. Create WebRTC manager - const manager = new EnhancedSecureWebRTCManager( - handleMessage, - handleStatusChange, - handleKeyExchange, - handleVerification - ); - - // 2. Create offer - const offer = await manager.createSecureOffer(); - - // 3. Encrypt offer for sharing - const password = EnhancedSecureCryptoUtils.generateSecurePassword(); - const encryptedOffer = await EnhancedSecureCryptoUtils.encryptData(offer, password); - - // 4. Share encrypted offer and password with peer - console.log('Encrypted offer:', encryptedOffer); - console.log('Password:', password); - - // 5. Wait for encrypted answer from peer - const encryptedAnswer = await getAnswerFromPeer(); - const answerPassword = await getPasswordFromPeer(); - - // 6. Decrypt and process answer - const answer = await EnhancedSecureCryptoUtils.decryptData( - encryptedAnswer, - answerPassword - ); - await manager.handleSecureAnswer(answer); - - // 7. Verify out-of-band codes - await verifySecurityCodes(); - - // 8. Start secure communication - await manager.sendSecureMessage("Hello from initiator!"); -} -Responder Flow -javascriptasync function responderFlow() { - // 1. Get encrypted offer from initiator - const encryptedOffer = await getOfferFromPeer(); - const offerPassword = await getPasswordFromPeer(); - - // 2. Decrypt offer - const offer = await EnhancedSecureCryptoUtils.decryptData( - encryptedOffer, - offerPassword - ); - - // 3. Create WebRTC manager - const manager = new EnhancedSecureWebRTCManager( - handleMessage, - handleStatusChange, - handleKeyExchange, - handleVerification - ); - - // 4. Create answer - const answer = await manager.createSecureAnswer(offer); - - // 5. Encrypt answer for sharing - const password = EnhancedSecureCryptoUtils.generateSecurePassword(); - const encryptedAnswer = await EnhancedSecureCryptoUtils.encryptData(answer, password); - - // 6. Share encrypted answer and password - await sendAnswerToPeer(encryptedAnswer); - await sendPasswordToPeer(password); - - // 7. Verify out-of-band codes - await verifySecurityCodes(); - - // 8. Start secure communication - await manager.sendSecureMessage("Hello from responder!"); -} -🔒 Security Considerations -Key Security - -All keys are non-extractable - Cannot be exported from WebCrypto -Hardware security module - Keys protected by browser's HSM -Perfect Forward Secrecy - Old messages stay secure even if current keys compromised -Automatic key rotation - Keys change every 5 minutes - -Message Security - -Authenticated encryption - AES-GCM provides confidentiality + integrity -Metadata protection - Message metadata separately encrypted -Replay protection - Sequence numbers prevent message replay -Rate limiting - Prevents spam and DoS attacks - -Connection Security - -Out-of-band verification - Manual code verification prevents MITM -Mutual authentication - Both parties prove identity -Direct P2P - No intermediate servers to compromise -WebRTC encryption - DTLS transport layer security - -Payment Security - -Lightning Network - No credit card or banking data exposure -Preimage verification - Cryptographic proof of payment -No payment data stored - Payments verified and discarded - -🐛 Error Handling -Common Error Types -typescript// Cryptographic errors -class CryptoError extends Error { - constructor(message: string) { - super(`Crypto Error: ${message}`); - this.name = 'CryptoError'; - } -} - -// Connection errors -class ConnectionError extends Error { - constructor(message: string) { - super(`Connection Error: ${message}`); - this.name = 'ConnectionError'; - } -} - -// Payment errors -class PaymentError extends Error { - constructor(message: string) { - super(`Payment Error: ${message}`); - this.name = 'PaymentError'; - } -} -Error Recovery Patterns -javascript// Robust message sending with retry -async function sendMessageWithRetry(manager, message, maxRetries = 3) { - for (let attempt = 1; attempt <= maxRetries; attempt++) { - try { - await manager.sendSecureMessage(message); - return; // Success - } catch (error) { - console.warn(`Send attempt ${attempt} failed:`, error.message); - - if (error.message.includes('Session expired')) { - throw new PaymentError('Session expired - payment required'); - } - - if (error.message.includes('Rate limit')) { - // Wait before retry - await new Promise(resolve => setTimeout(resolve, 1000 * attempt)); - continue; - } - - if (attempt === maxRetries) { - throw error; // Final attempt failed - } - } - } -} - -// Connection error handling -function handleConnectionError(error) { - if (error.message.includes('MITM')) { - alert('⚠️ Security threat detected! Connection terminated.'); - return 'security_threat'; - } - - if (error.message.includes('timeout')) { - return 'timeout'; - } - - if (error.message.includes('ice')) { - return 'nat_traversal'; - } - - return 'unknown'; -} - -// Payment error handling -function handlePaymentError(error) { - if (error.message.includes('preimage')) { - return 'invalid_payment'; - } - - if (error.message.includes('expired')) { - return 'session_expired'; - } - - if (error.message.includes('webln')) { - return 'webln_failed'; - } - - return 'payment_failed'; -} 🧪 Testing Unit Testing Examples javascript// Test encryption/decryption round-trip diff --git a/doc/CONTRIBUTING.md b/doc/CONTRIBUTING.md index 691a482..88fbc30 100644 --- a/doc/CONTRIBUTING.md +++ b/doc/CONTRIBUTING.md @@ -2,7 +2,7 @@ 🎉 **Thank you for your interest in contributing to SecureBit.chat!** -We're building the most secure P2P messenger with Lightning Network integration, and we need your help to make it even better. **Version 4.02.442 introduces complete ASN.1 validation for enhanced key security.** + **Version 4.02.442 introduces complete ASN.1 validation for enhanced key security.** ## 🌟 Ways to Contribute diff --git a/index.html b/index.html index da12742..3793c0d 100644 --- a/index.html +++ b/index.html @@ -72,14 +72,14 @@ - - + + - + diff --git a/package.json b/package.json index bdd8943..8167328 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "chat", "encryption", "webrtc", - "lightning", "privacy", "security" ], diff --git a/src/app.jsx b/src/app.jsx index db00ec4..75604e5 100644 --- a/src/app.jsx +++ b/src/app.jsx @@ -11,12 +11,6 @@ title: "18-Layer Military Security", description: "Revolutionary defense system with ECDH P-384 + AES-GCM 256 + ECDSA + Complete ASN.1 Validation. Enhanced Security Edition provides military-grade protection exceeding government standards with complete key structure verification." }, - { - icon: "fas fa-bolt", - color: "yellow", - title: "Lightning Network Payments", - description: "First messenger with Lightning Network integration. Pay-per-session with satoshis via WebLN. Sustainable economic model without ads or data harvesting." - }, { icon: "fas fa-network-wired", color: "purple", @@ -74,7 +68,7 @@ React.createElement('p', { key: 'subtitle', className: "text-secondary max-w-2xl mx-auto" - }, 'The only messenger with military-grade cryptography and Lightning payments') + }, 'The only messenger with military-grade cryptography') ]), React.createElement('div', { @@ -509,7 +503,7 @@

SecureBit.chat dominates in 11 out of 15 security categories, establishing itself as the most secure P2P messenger available. - The Enhanced Security Edition introduces revolutionary 18-layer defense architecture with complete ASN.1 validation, Lightning Network integration, and military-grade cryptography that exceeds government and enterprise standards. + The Enhanced Security Edition introduces revolutionary 18-layer defense architecture with complete ASN.1 validation, and military-grade cryptography that exceeds government and enterprise standards.

@@ -518,12 +512,6 @@ ECDH P-384 + AES-GCM 256 + ECDSA P-384 + Complete ASN.1 Validation with non-extractable keys and 18-layer defense system

-
-
⚡ Lightning Integration
-

- First messenger with Lightning Network payments - sustainable economic model with instant satoshi transactions -

-
🌐 True P2P Architecture

@@ -646,7 +634,6 @@ "Complete ASN.1 DER validation", "OID and EC point verification", "SPKI structure validation", - "Lightning Network payments", "P2P WebRTC architecture", "Metadata protection", "100% open source code" @@ -698,7 +685,6 @@ "Signal Double Ratchet for groups", "Anonymous groups without metadata", "Ephemeral groups (disappear after session)", - "Group Lightning payments", "Cryptographic group administration", "Group member auditing" ] @@ -1487,350 +1473,8 @@ React.createElement('h4', { key: 'title', className: "text-xs sm:text-sm font-medium text-primary mb-1" }, "ECDSA P-384 Signatures"), React.createElement('p', { key: 'desc', className: "text-xs text-muted leading-tight" }, "Digital signatures for message integrity") ]), - React.createElement('div', { key: 'feature6', className: "text-center p-3 sm:p-4" }, [ - React.createElement('div', { key: 'icon', className: "w-10 h-10 sm:w-12 sm:h-12 bg-yellow-500/10 border border-yellow-500/20 rounded-lg flex items-center justify-center mx-auto mb-2 sm:mb-3" }, [ - React.createElement('i', { className: 'fas fa-bolt accent-yellow' }) - ]), - React.createElement('h4', { key: 'title', className: "text-xs sm:text-sm font-medium text-primary mb-1" }, "Lightning Payments"), - React.createElement('p', { key: 'desc', className: "text-xs text-muted leading-tight" }, "Pay-per-session via WebLN") - ]) ]), - // Wallet Logos Section - React.createElement('div', { - key: 'wallet-logos-section', - className: "mt-8" - }, [ - React.createElement('div', { - key: 'wallet-logos-header', - className: "text-center mb-4" - }, [ - React.createElement('h3', { - key: 'title', - className: "text-lg font-medium text-primary mb-2" - }, "Supported Lightning wallets"), - React.createElement('p', { - key: 'subtitle', - className: "text-secondary text-sm" - }, "To pay for sessions, use any of the popular wallets.") - ]), - React.createElement('div', { - key: 'wallet-logos-container', - className: "wallet-logos-container" - }, [ - React.createElement('div', { - key: 'wallet-logos-track', - className: "wallet-logos-track" - }, [ - // First set of logos - React.createElement('a', { - key: 'alby1-link', - href: "https://getalby.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo alby" - }, [ - React.createElement('img', { - key: 'alby-img1', - src: "logo/alby.svg", - alt: "Alby Lightning Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'zeus1-link', - href: "https://zeusln.app", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo zeus" - }, [ - React.createElement('img', { - key: 'zeus-img1', - src: "logo/zeus.svg", - alt: "Zeus Lightning Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'wos1-link', - href: "https://www.walletofsatoshi.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo wos" - }, [ - React.createElement('img', { - key: 'wos-img1', - src: "logo/wos.svg", - alt: "Wallet of Satoshi", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'muun1-link', - href: "https://muun.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo muun" - }, [ - React.createElement('img', { - key: 'muun-img1', - src: "logo/muun.svg", - alt: "Muun Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'atomic1-link', - href: "https://atomicwallet.io", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo atomic" - }, [ - React.createElement('img', { - key: 'atomic-img1', - src: "logo/atomic.svg", - alt: "Atomic Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'breez1-link', - href: "https://breez.technology/mobile/", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo breez" - }, [ - React.createElement('img', { - key: 'breez-img1', - src: "logo/breez.svg", - alt: "Breez Lightning Wallet", - }) - ]), - React.createElement('a', { - key: 'lightning-labs1-link', - href: "https://lightning.engineering", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo lightning-labs" - }, [ - React.createElement('img', { - key: 'lightning-labs-img1', - src: "logo/lightning-labs.svg", - alt: "Lightning Labs", - }) - ]), - React.createElement('a', { - key: 'lnbits1-link', - href: "https://lnbits.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo lnbits" - }, [ - React.createElement('img', { - key: 'lnbits-img1', - src: "logo/lnbits.svg", - alt: "LNbits", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'strike1-link', - href: "https://strike.me", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo strike" - }, [ - React.createElement('img', { - key: 'strike-img1', - src: "logo/strike.svg", - alt: "Strike", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'impervious1-link', - href: "https://impervious.ai", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo impervious" - }, [ - React.createElement('img', { - key: 'impervious-img1', - src: "logo/impervious.svg", - alt: "Impervious", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'bitcoin-lightning1-link', - href: "https://www.blink.sv/", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo bitcoin-lightning" - }, [ - React.createElement('img', { - key: 'blink-img1', - src: "logo/blink.svg", - alt: "Blink Wallet", - className: "wallet-logo-img" - }) - ]), - // Second set of logos - React.createElement('a', { - key: 'alby2-link', - href: "https://getalby.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo alby" - }, [ - React.createElement('img', { - key: 'alby-img2', - src: "logo/alby.svg", - alt: "Alby Lightning Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'zeus2-link', - href: "https://zeusln.app", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo zeus" - }, [ - React.createElement('img', { - key: 'zeus-img2', - src: "logo/zeus.svg", - alt: "Zeus Lightning Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'wos2-link', - href: "https://www.walletofsatoshi.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo wos" - }, [ - React.createElement('img', { - key: 'wos-img2', - src: "logo/wos.svg", - alt: "Wallet of Satoshi", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'muun2-link', - href: "https://muun.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo muun" - }, [ - React.createElement('img', { - key: 'muun-img2', - src: "logo/muun.svg", - alt: "Muun Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'atomic2-link', - href: "https://atomicwallet.io", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo atomic" - }, [ - React.createElement('img', { - key: 'atomic-img2', - src: "logo/atomic.svg", - alt: "Atomic Wallet", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'breez2-link', - href: "https://breez.technology/mobile/", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo breez" - }, [ - React.createElement('img', { - key: 'breez-img2', - src: "logo/breez.svg", - alt: "Breez Lightning Wallet", - }) - ]), - React.createElement('a', { - key: 'lightning-labs2-link', - href: "https://lightning.engineering", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo lightning-labs" - }, [ - React.createElement('img', { - key: 'lightning-labs-img2', - src: "logo/lightning-labs.svg", - alt: "Lightning Labs", - }) - ]), - React.createElement('a', { - key: 'lnbits2-link', - href: "https://lnbits.com", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo lnbits" - }, [ - React.createElement('img', { - key: 'lnbits-img2', - src: "logo/lnbits.svg", - alt: "LNbits", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'strike2-link', - href: "https://strike.me", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo strike" - }, [ - React.createElement('img', { - key: 'strike-img2', - src: "logo/strike.svg", - alt: "Strike", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'impervious2-link', - href: "https://impervious.ai", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo impervious" - }, [ - React.createElement('img', { - key: 'impervious-img2', - src: "logo/impervious.svg", - alt: "Impervious", - className: "wallet-logo-img" - }) - ]), - React.createElement('a', { - key: 'bitcoin-lightning2-link', - href: "https://www.blink.sv/", - target: "_blank", - rel: "noindex nofollow", - className: "wallet-logo bitcoin-lightning" - }, [ - React.createElement('img', { - key: 'blink-img2', - src: "logo/blink.svg", - alt: "Blink Wallet", - className: "wallet-logo-img" - }) - ]) - ]) - ]) - ]), React.createElement(UniqueFeatureSlider, { key: 'unique-features-slider' }), React.createElement(DownloadApps, { key: 'download-apps' }), diff --git a/src/pwa/pwa-manager.js b/src/pwa/pwa-manager.js index 4bc37bb..1d39933 100644 --- a/src/pwa/pwa-manager.js +++ b/src/pwa/pwa-manager.js @@ -962,7 +962,6 @@ class PWAOfflineManager {

  • • P2P connections (WebRTC)
  • -
  • • Lightning Network payments
  • • Real-time messaging
  • • Session verification
  • • Key exchange with new peers
  • diff --git a/sw.js b/sw.js index e70f0c5..e19b141 100644 --- a/sw.js +++ b/sw.js @@ -17,7 +17,6 @@ const STATIC_ASSETS = [ '/src/components/ui/Header.jsx', '/src/components/ui/PasswordModal.jsx', '/src/components/ui/SessionTypeSelector.jsx', - '/src/components/ui/LightningPayment.jsx', '/src/components/ui/PaymentModal.jsx', '/src/components/ui/DownloadApps.jsx', '/src/styles/main.css', @@ -42,8 +41,7 @@ const NETWORK_FIRST_PATTERNS = [ /\.js$/, /\.jsx$/, /\/src\//, - /api/, - /lightning/ + /api/ ]; // Cache first patterns (static assets) diff --git a/test-lnbits-integration.html b/test-lnbits-integration.html deleted file mode 100644 index b518ad6..0000000 --- a/test-lnbits-integration.html +++ /dev/null @@ -1,554 +0,0 @@ - - - - - - LNbits Integration Test - - - -
    -

    🔧 Тест интеграции LNbits

    - -
    -

    📋 Конфигурация

    -

    API URL: https://demo.lnbits.com

    -

    API Key: a7226682253f4dd7bdb2d9487a9a59f8

    -

    Wallet ID: 649903697b03457d8b12c4eae7b2fab9

    -
    - -
    -

    🧪 Тесты

    - - - - - - - - -
    - -
    -

    📊 Результаты

    -
    -
    - -
    -

    📝 Логи

    -
    -
    -
    - - - - - - - - - - -