• 20-08-2025, 12:22:17
    #1
    // =============================================================================
    // FRONTEND - ELECTRON API BAĞLANTISI - Preload script ile güvenli iletişim
    // =============================================================================
    console.log('🚀 Frontend başlatılıyor...');
    // Electron API'nin yüklenmesini bekle
    function waitForElectronAPI() {
      return new Promise((resolve) => {
        if (window.electronAPI) {
          resolve();
        } else {
          setTimeout(() => waitForElectronAPI().then(resolve), 100);
        }
      });
    }
    // =============================================================================
    // BASE MANAGER - Ortak fonksiyonlar
    // =============================================================================
    class BaseManager {
      constructor() {
        this.eventListeners = new Map();
      }
      clearEventListeners(group) {
        if (this.eventListeners.has(group)) {
          const listeners = this.eventListeners.get(group);
          listeners.forEach(({ element, event, handler }) => {
            element.removeEventListener(event, handler);
          });
          this.eventListeners.delete(group);
        }
      }
      handleError(error, operation, statusElementId = 'status-log') {
        const errorMessage = error?.message || 'Bilinmeyen hata';
        console.error(`❌ ${operation} hatası:`, error);
        
        if (window.scrapingManager?.showStatus) {
          window.scrapingManager.showStatus(`❌ ${operation}: ${errorMessage}`, 'error', statusElementId);
        }
        
        return { success: false, error: errorMessage };
      }
      async safeExecute(operation, operationName, statusElementId = 'status-log') {
        try {
          const result = await operation();
          return { success: true, result };
        } catch (error) {
          return this.handleError(error, operationName, statusElementId);
        }
      }
      destroy() {
        this.eventListeners.forEach((_, group) => {
          this.clearEventListeners(group);
        });
      }
    }
    // =============================================================================
    // TAB YÖNETİM SİSTEMİ - Tab'lar arasında geçişi sağlar
    // =============================================================================
    class TabManager extends BaseManager {
      constructor() {
        super();
        this.activeTab = 'scraping';
      }
      init() {
        this.bindTabEvents();
      }
      bindTabEvents() {
        this.clearEventListeners('tab-events');
        
        const tabBtns = document.querySelectorAll('.tab-btn');
        const tabEventListeners = [];
        
        tabBtns.forEach(btn => {
          const handler = () => {
            const targetTab = btn.dataset.tab;
            this.switchTab(targetTab);
          };
          btn.addEventListener('click', handler);
          tabEventListeners.push({ element: btn, event: 'click', handler });
        });
        
        this.eventListeners.set('tab-events', tabEventListeners);
      }
    
    
      switchTab(tabName) {
        // Tüm tab butonlarından active class'ını kaldır
        document.querySelectorAll('.tab-btn').forEach(btn => btn.classList.remove('active'));
        // Tüm tab panellerinden active class'ını kaldır
        document.querySelectorAll('.tab-pane').forEach(pane => pane.classList.remove('active'));
        // Seçilen tab butonuna active class'ı ekle
        const targetBtn = document.querySelector(`[data-tab="${tabName}"]`);
        if (targetBtn) {
          targetBtn.classList.add('active');
        }
        
        // Seçilen tab paneline active class'ı ekle
        const targetPane = document.querySelector(`#${tabName}`);
        if (targetPane) {
          targetPane.classList.add('active');
        }
        this.activeTab = tabName;
        console.log(`✅ Tab değiştirildi: ${tabName}`);
        // WhatsApp tab'ına geçildiğinde kişileri yükle
        if (tabName === 'messaging') {
          setTimeout(() => {
            if (window.whatsappManager) {
              window.whatsappManager.loadWhatsAppContacts();
            }
          }, 100);
        }
      }
    
    }
    // =============================================================================
    // SCRAPING MODÜLÜ - Google Maps veri toplama işlemleri
    // =============================================================================
    class ScrapingManager extends BaseManager {
      constructor() {
        super();
        this.isRunning = false;
        this.currentResults = [];
        this.currentQuery = '';
        this.init();
        this.setupRealtimeListeners();
      }
      init() {
        this.bindScrapingEvents();
        console.log('✅ Scraping kontrolleri bağlandı');
      }
      bindScrapingEvents() {
        this.clearEventListeners('scraping-events');
        
        const eventConfig = [
          { id: 'start-scraping', handler: () => this.startScraping() },
          { id: 'stop-scraping', handler: () => this.stopScraping() },
          { id: 'export-excel', handler: () => this.exportToExcel() },
          { id: 'send-to-messaging', handler: () => this.transferToWhatsApp() },
          { id: 'clear-table', handler: () => this.clearResultsTable() }
        ];
        const scrapingEventListeners = [];
        
        eventConfig.forEach(({ id, handler }) => {
          const element = document.getElementById(id);
          if (element) {
            const boundHandler = handler.bind(this);
            element.addEventListener('click', boundHandler);
            scrapingEventListeners.push({ element, event: 'click', handler: boundHandler });
          } else {
            console.warn(`⚠️ Element bulunamadı: ${id}`);
          }
        });
        
        this.eventListeners.set('scraping-events', scrapingEventListeners);
      }
    
    
      setupRealtimeListeners() {
        if (!window.electronAPI) {
          console.warn('⚠️ ElectronAPI henüz hazır değil');
          return;
        }
        window.electronAPI.onScrapingProgress((progress) => {
          console.log('📊 Progress güncellendi:', progress);
          
          if (progress.name && (progress.mobile || progress.landline)) {
            console.log('🔥 Yeni sonuç:', progress.name, progress.mobile, progress.landline);
            
            if (!this.isDuplicateResult(progress)) {
              this.addResultToTable(progress);
              console.log('✅ Tabloya eklendi:', progress.name);
            } else {
              console.log('⭕ Sonuç zaten tabloda:', progress.name);
            }
          } 
          else if (progress.message) {
            this.showStatus(progress.message, progress.status || 'info');
          }
        });
        window.electronAPI.onScrapingFeedback((feedback) => {
          this.showStatus(feedback.message, feedback.status || 'info');
        });
      }
      isDuplicateResult(result) {
        if (!result.name) return true;
        
        return this.currentResults.some(existing => {
          const sameName = existing.name === result.name;
          const sameMobile = existing.mobile && result.mobile && existing.mobile === result.mobile;
          const sameLandline = existing.landline && result.landline && existing.landline === result.landline;
          
          return sameName && (sameMobile || sameLandline);
        });
      }
      async startScraping() {
        if (this.isRunning) {
          this.showStatus('⚠️ Arama zaten devam ediyor!', 'warning');
          return;
        }
        const queriesElement = document.getElementById('search-queries');
        if (!queriesElement) {
          console.error('❌ search-queries elementi bulunamadı');
          this.showStatus('❌ Arama kutusu bulunamadı!', 'error');
          return;
        }
        const queries = queriesElement.value.split('\n').map(q => q.trim()).filter(q => q);
        if (!queries.length) {
          this.showStatus('⚠️ Lütfen en az bir arama terimi girin!', 'warning');
          return;
        }
        const options = {
          collectName: document.getElementById('collect-name')?.checked ?? true,
          collectMobile: document.getElementById('collect-mobile')?.checked ?? true,
          collectLandline: document.getElementById('collect-landline')?.checked ?? false,
          delayMin: parseInt(document.getElementById('delay-min')?.value) || 3,
          delayMax: parseInt(document.getElementById('delay-max')?.value) || 5
        };
        console.log('🔍 Arama seçenekleri:', options);
        try {
          this.setScrapingState(true);
          this.showStatus('🔍 Arama başlatılıyor...', 'info');
          const result = await window.electronAPI.startScraping(queries, options);
          if (result.success) {
            this.showStatus(`✅ ${result.message}`, 'success');
          } else {
            this.showStatus(`❌ ${result.message}`, 'error');
          }
        } catch (error) {
          console.error('❌ Scraping hatası:', error);
          this.showStatus(`❌ ${error.message}`, 'error');
        } finally {
          this.setScrapingState(false);
        }
      }
      async stopScraping() {
        if (!this.isRunning) {
          this.showStatus('⚠️ Durdurulacak bir arama yok!', 'warning');
          return;
        }
        try {
          const result = await window.electronAPI.stopScraping();
          this.showStatus(result.message, result.success ? 'success' : 'error');
          this.setScrapingState(false);
        } catch (error) {
          console.error('❌ Durdurma hatası:', error);
          this.showStatus(`❌ ${error.message}`, 'error');
        }
      }
      setScrapingState(isRunning) {
        this.isRunning = isRunning;
        const startBtn = document.getElementById('start-scraping');
        const stopBtn = document.getElementById('stop-scraping');
        
        if (!startBtn || !stopBtn) {
          console.error('❌ Scraping butonları bulunamadı');
          return;
        }
        
        if (startBtn) startBtn.disabled = isRunning;
        if (stopBtn) stopBtn.disabled = !isRunning;
      }
      standardizePhoneNumber(phone) {
        if (!phone) return '';
        
        // Sadece rakamları al
        let cleaned = phone.toString().replace(/[^\d]/g, '');
        
        // Türkiye formatlarını kontrol et
        if (cleaned.startsWith('90')) {
          // 905xxxxxxxxx formatı
          if (cleaned.length === 12) {
            return '+' + cleaned;
          }
        } else if (cleaned.startsWith('5')) {
          // 5xxxxxxxxx formatı
          if (cleaned.length === 10) {
            return '+90' + cleaned;
          }
        } else if (cleaned.startsWith('0')) {
          // 05xxxxxxxxx formatı
          cleaned = cleaned.substring(1); // 0'ı kaldır
          if (cleaned.length === 10 && cleaned.startsWith('5')) {
            return '+90' + cleaned;
          }
        }
        
        // +90 ile başlıyorsa kontrol et
        if (phone.toString().startsWith('+90')) {
          const withoutCountry = phone.toString().substring(3).replace(/[^\d]/g, '');
          if (withoutCountry.length === 10 && withoutCountry.startsWith('5')) {
            return '+90' + withoutCountry;
          }
        }
        
        // Geçerli format bulunamazsa boş string döndür
        return '';
      }
      truncateText(text, maxLength) {
        if (!text) return '-';
        return text.length > maxLength ? text.slice(0, maxLength - 3) + '...' : text;
      }
      addResultToTable(result) {
        console.log('🎯 addResultToTable çağrıldı:', result);
        
        if (!result || !result.name) {
          console.log('❌ İsim yok:', result);
          return;
        }
        
        if (!result.mobile && !result.landline) {
          console.log('❌ Telefon numarası yok:', result);
          return;
        }
        
        if (this.isDuplicateResult(result)) {
          console.log('⭕ Duplicate sonuç:', result.name);
          return;
        }
        const tbody = document.querySelector('#results-table tbody');
        if (!tbody) {
          console.error('❌ Tablo tbody bulunamadı');
          return;
        }
        const row = document.createElement('tr');
        row.innerHTML = `
          <td><input type="checkbox" class="contact-checkbox"></td>
          <td title="${result.name}">${this.truncateText(result.name, 50)}</td>
          <td>${this.standardizePhoneNumber(result.mobile) || '-'}</td>
          <td>${this.standardizePhoneNumber(result.landline) || '-'}</td>
          <td title="${result.source}">${this.truncateText(result.source, 20) || '-'}</td>
          <td>${new Date(result.scraped_at || Date.now()).toLocaleDateString('tr-TR')}</td>
        `;
        
        tbody.appendChild(row);
        this.currentResults.push(result);
        
        console.log('✅ Tabloya başarıyla eklendi:', {
          name: result.name,
          mobile: result.mobile || 'YOK',
          landline: result.landline || 'YOK'
        });
        
        tbody.scrollTop = tbody.scrollHeight;
      }
      showStatus(message, status, elementId = 'status-log') {
        const logContainer = document.getElementById(elementId);
        if (!logContainer) return;
        const logEntry = document.createElement('div');
        logEntry.textContent = `[${new Date().toLocaleTimeString('tr-TR')}] ${message}`;
        logEntry.style.color = {
          success: 'var(--success)',
          error: 'var(--error)',
          warning: 'var(--warning)',
          info: 'var(--info)'
        }[status] || 'var(--text-primary)';
        logContainer.appendChild(logEntry);
        logContainer.scrollTop = logContainer.scrollHeight;
      }
      async exportToExcel() {
        try {
          if (!this.currentResults.length) {
            this.showStatus('⚠️ Dışa aktarılacak veri yok!', 'warning');
            return;
          }
          const result = await window.electronAPI.exportExcel(this.currentResults);
          this.showStatus(`✅ ${result.message}`, 'success');
        } catch (error) {
          console.error('❌ Excel dışa aktarma hatası:', error);
          this.showStatus(`❌ Excel dışa aktarma hatası: ${error.message}`, 'error');
        }
      }
      async transferToWhatsApp() {
        const checkboxes = document.querySelectorAll('#results-table input[type="checkbox"]:checked');
        const selectedContacts = Array.from(checkboxes).map(cb => {
          const row = cb.closest('tr');
          const index = Array.from(row.parentNode.children).indexOf(row);
          return this.currentResults[index];
        });
        if (!selectedContacts.length) {
          this.showStatus('⚠️ Lütfen en az bir kişi seçin!', 'warning');
          return;
        }
        try {
          this.showStatus('📤 Kişiler WhatsApp\'a aktarılıyor...', 'info');
          
          // Sadece mobil numarası olan kişileri filtrele
          const validContacts = selectedContacts.filter(contact => {
            if (!contact.mobile) {
              console.warn('⚠️ Mobil numara olmayan kişi atlandı:', contact);
              return false;
            }
            return true;
          });
          
          if (validContacts.length === 0) {
            this.showStatus('⚠️ Seçili kişilerde geçerli mobil numara bulunamadı!', 'warning');
            return;
          }
          
          const result = await window.electronAPI.transferToWhatsApp(validContacts);
          if (result.success) {
            const message = result.duplicates > 0 
              ? `✅ ${result.added} kişi eklendi, ${result.duplicates} tekrar atlandı`
              : `✅ ${result.added} kişi WhatsApp'a aktarıldı`;
            this.showStatus(message, 'success');
            window.tabManager.switchTab('messaging');
          } else {
            this.showStatus(`❌ ${result.message}`, 'error');
          }
        } catch (error) {
          console.error('❌ Transfer hatası:', error);
          this.showStatus(`❌ ${error.message}`, 'error');
        }
      }
      clearResultsTable() {
        const tbody = document.querySelector('#results-table tbody');
        if (tbody) {
          tbody.innerHTML = '';
          this.currentResults = [];
          this.showStatus('✅ Tablo temizlendi', 'success');
        }
      }
    
    }
    // =============================================================================
    // WHATSAPP YÖNETİM SİSTEMİ - WhatsApp entegrasyonu
    // =============================================================================
    class WhatsAppManager extends BaseManager {
      constructor() {
        super();
        this.isConnected = false;
        this.isConnecting = false;
        this.connectionRetries = 0;
        this.maxRetries = 3;
        this.retryDelay = 5000;
        this.whatsappContacts = [];
        this.connectionCheckInterval = null;
        this.init();
        this.setupRealtimeListeners();
        this.startConnectionMonitoring();
      }
      init() {
        console.log('🚀 WhatsApp Manager başlatılıyor...');
        this.bindWhatsAppEvents();
        this.updateConnectionStatus();
      }
      bindWhatsAppEvents() {
        this.clearEventListeners('whatsapp-events');
        
        const eventConfig = [
          // Bağlantı kontrolleri
          { id: 'connect-whatsapp', handler: () => this.connectWhatsApp() },
          { id: 'disconnect-whatsapp', handler: () => this.disconnectWhatsApp() },
          
          
          // Kişi yönetimi
          { id: 'import-contacts', handler: () => this.importContacts() },
          { id: 'clear-all-contacts', handler: () => this.clearAllContacts() },
          { id: 'clear-selected-contacts', handler: () => this.clearSelectedContacts() },
          
          // Manuel kişi ekleme
          { id: 'add-manual-contact', handler: () => this.addManualContact() }
        ];
        const whatsappEventListeners = [];
        
        eventConfig.forEach(({ id, handler }) => {
          const element = document.getElementById(id);
          if (element) {
            const boundHandler = handler.bind(this);
            element.addEventListener('click', boundHandler);
            whatsappEventListeners.push({ element, event: 'click', handler: boundHandler });
          }
        });
    
    
        // Contact checkbox event delegation
        const contactList = document.getElementById('whatsapp-contact-list');
        if (contactList) {
          const checkboxHandler = (e) => {
            if (e.target.classList.contains('contact-checkbox')) {
              this.onContactSelect(e.target);
            }
          };
          contactList.addEventListener('change', checkboxHandler);
          whatsappEventListeners.push({ element: contactList, event: 'change', handler: checkboxHandler });
        }
        
        this.eventListeners.set('whatsapp-events', whatsappEventListeners);
      }
    
    
      setupRealtimeListeners() {
        if (!window.electronAPI?.whatsapp) {
          console.warn('⚠️ WhatsApp ElectronAPI henüz hazır değil');
          return;
        }
        // WhatsApp bağlantı durumu
        window.electronAPI.onWhatsAppQR((qrCode) => {
          this.showQRCode(qrCode);
        });
        window.electronAPI.onWhatsAppReady(() => {
          this.isConnected = true;
          this.isConnecting = false;
          this.connectionRetries = 0;
          this.updateConnectionStatus();
          this.hideQRCode();
          window.scrapingManager.showStatus('✅ WhatsApp başarıyla bağlandı!', 'success', 'whatsapp-status-log');
        });
        window.electronAPI.onWhatsAppDisconnected((reason) => {
          this.isConnected = false;
          this.isConnecting = false;
          this.updateConnectionStatus();
          window.scrapingManager.showStatus(`❌ WhatsApp bağlantısı kesildi: ${reason || 'Bilinmeyen sebep'}`, 'error', 'whatsapp-status-log');
          
          // Otomatik yeniden bağlanma denemesi
          if (this.connectionRetries < this.maxRetries) {
            setTimeout(() => {
              window.scrapingManager.showStatus('🔄 Otomatik yeniden bağlanma deneniyor...', 'info', 'whatsapp-status-log');
              this.connectWhatsApp();
            }, this.retryDelay);
          }
        });
    
      }
      // =============================================================================
      // WHATSAPP BAĞLANTI YÖNETİMİ
      // =============================================================================
      async connectWhatsApp() {
        try {
          this.isConnecting = true;
          this.updateConnectionStatus();
          window.scrapingManager.showStatus('📱 WhatsApp bağlanıyor...', 'info', 'whatsapp-status-log');
          this.showQRLoading();
          
          const result = await window.electronAPI.whatsapp.connect();
          
          if (result.success) {
            window.scrapingManager.showStatus('🔄 QR kod bekleniyor...', 'info', 'whatsapp-status-log');
            this.updateConnectionButton(false);
          } else {
            this.isConnecting = false;
            this.connectionRetries++;
            this.updateConnectionStatus();
            this.hideQRArea();
            window.scrapingManager.showStatus(`❌ ${result.message}`, 'error', 'whatsapp-status-log');
            
            // Otomatik yeniden deneme
            if (this.connectionRetries < this.maxRetries) {
              setTimeout(() => {
                window.scrapingManager.showStatus(`🔄 ${this.retryDelay/1000} saniye sonra yeniden denenecek...`, 'info', 'whatsapp-status-log');
                setTimeout(() => this.connectWhatsApp(), this.retryDelay);
              }, 1000);
            }
          }
        } catch (error) {
          console.error('❌ WhatsApp bağlantı hatası:', error);
          this.isConnecting = false;
          this.connectionRetries++;
          this.updateConnectionStatus();
          this.hideQRArea();
          window.scrapingManager.showStatus(`❌ Bağlantı hatası: ${error.message}`, 'error', 'whatsapp-status-log');
        }
      }
      async disconnectWhatsApp() {
        try {
          const result = await window.electronAPI.whatsapp.disconnect();
          window.scrapingManager.showStatus(result.message, result.success ? 'success' : 'error', 'whatsapp-status-log');
          
          if (result.success) {
            this.isConnected = false;
            this.isConnecting = false;
            this.connectionRetries = 0;
            this.updateConnectionStatus();
            this.hideQRArea();
            this.stopConnectionMonitoring();
          }
        } catch (error) {
          console.error('❌ WhatsApp bağlantı kesme hatası:', error);
          window.scrapingManager.showStatus(`❌ Bağlantı kesme hatası: ${error.message}`, 'error', 'whatsapp-status-log');
        }
      }
      updateConnectionStatus() {
        const statusIndicator = document.querySelector('.status-indicator');
        const statusText = document.querySelector('.status-text');
        
        if (statusIndicator && statusText) {
          if (this.isConnected) {
            statusIndicator.className = 'status-indicator connected';
            statusText.textContent = 'Bağlı ✓';
            this.connectionRetries = 0; // Reset retry counter on successful connection
          } else if (this.isConnecting) {
            statusIndicator.className = 'status-indicator connecting';
            statusText.textContent = 'Bağlanıyor...';
          } else {
            statusIndicator.className = 'status-indicator disconnected';
            statusText.textContent = this.connectionRetries > 0 ? 
              `Bağlantı Bekleniyor (${this.connectionRetries}/${this.maxRetries})` : 
              'Bağlantı Bekleniyor';
          }
        }
        
        this.updateConnectionButton(this.isConnected);
      }
      updateConnectionButton(isConnected) {
        const connectBtn = document.getElementById('connect-whatsapp');
        const disconnectBtn = document.getElementById('disconnect-whatsapp');
        
        if (!connectBtn) {
          console.error('❌ WhatsApp bağlantı butonu bulunamadı');
          return;
        }
        
        if (connectBtn) {
          connectBtn.style.display = isConnected ? 'none' : 'block';
        }
        
        if (!disconnectBtn && isConnected) {
          const btn = document.createElement('button');
          btn.id = 'disconnect-whatsapp';
          btn.className = 'btn btn-danger';
          btn.innerHTML = '<i class="fas fa-unlink"></i> Bağlantıyı Kes';
          btn.addEventListener('click', () => this.disconnectWhatsApp());
          
          if (connectBtn && connectBtn.parentNode) {
            connectBtn.parentNode.insertBefore(btn, connectBtn.nextSibling);
          }
        } else if (disconnectBtn) {
          disconnectBtn.style.display = isConnected ? 'block' : 'none';
        }
      }
      showQRLoading() {
        const qrArea = document.getElementById('qr-area');
        if (qrArea) {
          qrArea.style.display = 'block';
          qrArea.innerHTML = `
            <div class="qr-placeholder">
              <div class="qr-loading">
                <i class="fas fa-spinner fa-spin"></i>
                <p>QR Kod yükleniyor...</p>
              </div>
            </div>
            <p class="help-text">Telefonunuzla QR kodu okutacaksınız</p>
          `;
        }
      }
      showQRCode(qrCode) {
        const qrArea = document.getElementById('qr-area');
        if (qrArea) {
          qrArea.style.display = 'block';
          qrArea.innerHTML = `
            <div class="qr-code">
              <img src="${qrCode}" alt="WhatsApp QR Code" style="max-width: 200px;">
            </div>
            <p class="help-text">Telefonunuzla QR kodu okutun</p>
          `;
          window.scrapingManager.showStatus('📱 QR kodu telefonunuzla tarayın', 'info', 'whatsapp-status-log');
        }
      }
      hideQRArea() {
        const qrArea = document.getElementById('qr-area');
        if (qrArea) {
          qrArea.style.display = 'none';
        }
      }
      hideQRCode() {
        this.hideQRArea();
      }
      // =============================================================================
      // KİŞİ İÇE AKTARMA SİSTEMİ
      // =============================================================================
      async importContacts() {
        try {
          const result = await window.electronAPI.importExcel();
          if (result.success) {
            window.scrapingManager.showStatus(`✅ ${result.message}`, 'success', 'whatsapp-status-log');
            await this.loadWhatsAppContacts();
          } else {
            window.scrapingManager.showStatus(`❌ ${result.message}`, 'error', 'whatsapp-status-log');
          }
        } catch (error) {
          console.error('❌ Kişi içe aktarma hatası:', error);
          window.scrapingManager.showStatus('❌ Kişi içe aktarma başarısız', 'error', 'whatsapp-status-log');
        }
      }
      // =============================================================================
      // MANUEL KİŞİ EKLEME SİSTEMİ
      // =============================================================================
      async addManualContact() {
        const nameInput = document.getElementById('manual-contact-name');
        const phoneInput = document.getElementById('manual-contact-phone');
        
        if (!phoneInput) {
          console.error('❌ Manuel kişi ekleme input\'ı bulunamadı');
          window.scrapingManager.showStatus('❌ Form elementi bulunamadı!', 'error', 'whatsapp-status-log');
          return;
        }
        
        const name = nameInput?.value?.trim() || '';
        const phone = phoneInput?.value?.trim();
        
        if (!phone) {
          window.scrapingManager.showStatus('⚠️ Telefon numarası gerekli!', 'warning', 'whatsapp-status-log');
          phoneInput.focus();
          return;
        }
        
        // Telefon numarası formatını düzelt
        const formattedPhone = window.scrapingManager.standardizePhoneNumber(phone);
        if (!formattedPhone) {
          window.scrapingManager.showStatus('⚠️ Geçerli bir telefon numarası girin! Format: +905xxxxxxxxx veya 5xxxxxxxxx', 'warning', 'whatsapp-status-log');
          phoneInput.focus();
          phoneInput.select();
          return;
        }
        
        try {
          // İsim varsa kullan, yoksa otomatik oluştur
          const contactName = name || `Kişi ${formattedPhone.slice(-4)}`;
          
          const contactData = {
            name: contactName,
            mobile: formattedPhone,
            source: 'Manuel Ekleme'
          };
          
          const result = await window.electronAPI.contacts.addToWhatsApp(contactData);
          
          if (result.success) {
            window.scrapingManager.showStatus(`✅ ${contactName} kişi listesine eklendi`, 'success', 'whatsapp-status-log');
            
            // Formu temizle ve focus ver
            if (nameInput) nameInput.value = '';
            phoneInput.value = '';
            phoneInput.focus();
            
            // Listeyi yenile
            await this.loadWhatsAppContacts();
          } else {
            window.scrapingManager.showStatus(`❌ ${result.message}`, 'error', 'whatsapp-status-log');
            phoneInput.focus();
            phoneInput.select();
          }
        } catch (error) {
          console.error('❌ Manuel kişi ekleme hatası:', error);
          window.scrapingManager.showStatus('❌ Kişi eklenemedi', 'error', 'whatsapp-status-log');
          phoneInput.focus();
          phoneInput.select();
        }
      }
      
    
      // =============================================================================
      // KİŞİ YÖNETİMİ VE WHATSAPP LİSTESİ
      // =============================================================================
      async loadWhatsAppContacts() {
        try {
          const result = await window.electronAPI.contacts.getWhatsAppContacts();
          if (result.success) {
            this.whatsappContacts = result.data; // Doğru: result.data bir dizi
            console.log('✅ WhatsApp kişileri yüklendi:', this.whatsappContacts.length);
            this.renderWhatsAppContactList();
          } else {
            window.scrapingManager.showStatus(`❌ WhatsApp kişi yükleme hatası: ${result.message}`, 'error', 'whatsapp-status-log');
          }
        } catch (error) {
          console.error('❌ WhatsApp kişi yükleme hatası:', error);
          window.scrapingManager.showStatus(`❌ WhatsApp kişi yükleme hatası: ${error.message}`, 'error', 'whatsapp-status-log');
        }
      }
      renderWhatsAppContactList() {
        const contactList = document.getElementById('contact-list');
        if (!contactList) {
          console.error('❌ contact-list elementi bulunamadı');
          return;
        }
        
        contactList.innerHTML = '';
        
        if (!Array.isArray(this.whatsappContacts)) {
          console.warn('⚠️ WhatsApp kişileri dizi değil:', this.whatsappContacts);
          return;
        }
        
        // Boş liste durumunu kontrol et
        const emptyState = document.getElementById('empty-contacts');
        if (this.whatsappContacts.length === 0) {
          if (emptyState) emptyState.style.display = 'block';
          return;
        }
        if (emptyState) emptyState.style.display = 'none';
        
        this.whatsappContacts.forEach(contact => {
          if (!contact || !contact.id) {
            console.warn('⚠️ Geçersiz kişi verisi:', contact);
            return;
          }
          
          // Sadece isim ve mobil numara göster
          if (!contact.mobile) {
            console.warn('⚠️ Mobil numara olmayan kişi atlandı:', contact);
            return;
          }
          
          const contactItem = document.createElement('div');
          contactItem.className = 'contact-item';
          contactItem.innerHTML = `
            <div class="contact-checkbox-wrapper">
              <input type="checkbox" class="contact-checkbox" data-id="${contact.id}">
            </div>
            <div class="contact-info">
              <div class="contact-name">${this.escapeHtml(contact.name || 'İsimsiz')}</div>
              <div class="contact-phone">${this.escapeHtml(contact.mobile)}</div>
            </div>
            <div class="contact-actions">
              <button class="btn btn-sm btn-danger" onclick="window.whatsappManager.removeContact('${contact.id}')" title="Kişiyi sil">
                <i class="fas fa-trash"></i>
              </button>
            </div>
          `;
          contactList.appendChild(contactItem);
        });
        
        this.updateContactCount();
      }
      async removeContact(contactId) {
        // Focus yönetimi için güçlü çözüm
        const focusManager = this.createFocusManager();
        
        if (!confirm('Bu kişiyi listeden çıkarmak istediğinizden emin misiniz?')) {
          focusManager.restoreFocus();
          return;
        }
        try {
          await window.electronAPI.contacts.removeFromWhatsApp(contactId);
          window.scrapingManager.showStatus('✅ Kişi listeden çıkarıldı', 'success', 'whatsapp-status-log');
          await this.loadWhatsAppContacts();
          
          // İşlem başarılı - focus'u manuel input'a yönlendir
          focusManager.setFocusToManualInput();
          
        } catch (error) {
          console.error('❌ Kişi silme hatası:', error);
          window.scrapingManager.showStatus('❌ Kişi silinemedi', 'error', 'whatsapp-status-log');
          focusManager.restoreFocus();
        }
      }
      onContactSelect(checkbox) {
        this.updateContactCount();
      }
    
    
      async clearAllContacts() {
        const focusManager = this.createFocusManager();
        
        if (!confirm('Tüm kişileri listeden çıkarmak istediğinizden emin misiniz? Bu işlem geri alınamaz.')) {
          focusManager.restoreFocus();
          return;
        }
        try {
          await window.electronAPI.contacts.clearAllWhatsApp();
          window.scrapingManager.showStatus('✅ Tüm kişiler listeden çıkarıldı', 'success', 'whatsapp-status-log');
          await this.loadWhatsAppContacts();
          focusManager.setFocusToManualInput();
          
        } catch (error) {
          console.error('❌ Tüm kişileri silme hatası:', error);
          window.scrapingManager.showStatus('❌ Kişiler silinemedi', 'error', 'whatsapp-status-log');
          focusManager.restoreFocus();
        }
      }
      async clearSelectedContacts() {
        const selectedContacts = this.getSelectedContacts();
        if (selectedContacts.length === 0) {
          window.scrapingManager.showStatus('⚠️ Silinecek kişi seçilmedi', 'warning', 'whatsapp-status-log');
          return;
        }
        const focusManager = this.createFocusManager();
        if (!confirm(`Seçili ${selectedContacts.length} kişiyi listeden çıkarmak istediğinizden emin misiniz?`)) {
          focusManager.restoreFocus();
          return;
        }
        try {
          const contactIds = selectedContacts.map(contact => contact.id);
          await window.electronAPI.contacts.removeMultipleFromWhatsApp(contactIds);
          window.scrapingManager.showStatus(`✅ ${selectedContacts.length} kişi listeden çıkarıldı`, 'success', 'whatsapp-status-log');
          await this.loadWhatsAppContacts();
          focusManager.setFocusToManualInput();
          
        } catch (error) {
          console.error('❌ Seçili kişileri silme hatası:', error);
          window.scrapingManager.showStatus('❌ Seçili kişiler silinemedi', 'error', 'whatsapp-status-log');
          focusManager.restoreFocus();
        }
      }
      getSelectedContacts() {
        const checkboxes = document.querySelectorAll('#whatsapp-contact-list input[type="checkbox"]:checked');
        const selectedIds = Array.from(checkboxes).map(cb => parseInt(cb.dataset.id));
        return this.whatsappContacts.filter(contact => selectedIds.includes(contact.id));
      }
      updateContactCount() {
        const selected = this.getSelectedContacts();
        const selectedCountEl = document.getElementById('selected-count');
        const totalCountEl = document.getElementById('total-contacts-count');
        
        if (selectedCountEl) selectedCountEl.textContent = selected.length;
        if (totalCountEl) totalCountEl.textContent = this.whatsappContacts.length;
      }
      // =============================================================================
      // FOCUS YÖNETİM SİSTEMİ - Focus kaybını önleyen güçlü çözüm
      // =============================================================================
      createFocusManager() {
        const activeElement = document.activeElement;
        const activeElementInfo = {
          element: activeElement,
          tagName: activeElement?.tagName,
          id: activeElement?.id,
          className: activeElement?.className
        };
        
        console.log('🎯 Focus Manager oluşturuldu:', activeElementInfo);
        
        const focusManager = {
           restoreFocus: () => {
             // Çoklu fallback stratejisi
             setTimeout(() => {
               // 1. Öncelik: Orijinal elementi geri yükle
               if (activeElement && typeof activeElement.focus === 'function' && document.contains(activeElement)) {
                 try {
                   activeElement.focus();
                   console.log('✅ Orijinal focus geri yüklendi:', activeElementInfo);
                   return;
                 } catch (e) {
                   console.warn('⚠️ Orijinal focus geri yüklenemedi:', e);
                 }
               }
               
               // 2. Fallback: Manuel input'a focus ver
               focusManager.setFocusToManualInput();
             }, 50);
           },
           
           setFocusToManualInput: () => {
            // Çoklu deneme ile güvenli focus
            const attempts = [0, 100, 200, 500];
            
            attempts.forEach(delay => {
              setTimeout(() => {
                const phoneInput = document.getElementById('manual-contact-phone');
                const nameInput = document.getElementById('manual-contact-name');
                
                // Önce telefon input'unu dene
                if (phoneInput && phoneInput.offsetParent !== null && !phoneInput.disabled) {
                  try {
                    phoneInput.focus();
                    console.log('✅ Manuel telefon input\'una focus verildi');
                    return;
                  } catch (e) {
                    console.warn('⚠️ Telefon input focus hatası:', e);
                  }
                }
                
                // Sonra isim input'unu dene
                if (nameInput && nameInput.offsetParent !== null && !nameInput.disabled) {
                  try {
                    nameInput.focus();
                    console.log('✅ Manuel isim input\'una focus verildi');
                    return;
                  } catch (e) {
                    console.warn('⚠️ İsim input focus hatası:', e);
                  }
                }
                
                // Son çare: body'ye focus ver
                if (delay === 500) {
                  try {
                    document.body.focus();
                    console.log('✅ Body\'ye focus verildi (son çare)');
                  } catch (e) {
                    console.error('❌ Hiçbir focus stratejisi çalışmadı:', e);
                  }
                }
              }, delay);
            });
           }
         };
         
         return focusManager;
       }
    
    
      // =============================================================================
      // YARDIMCI FONKSİYONLAR
      // =============================================================================
      escapeHtml(text) {
        if (!text) return '';
        
        const map = {
          '&': '&amp;',
          '<': '&lt;',
          '>': '&gt;',
          '"': '&quot;',
          "'": '''
        };
        
        return text.replace(/[&<>"']/g, (m) => map[m]);
      }
      // =============================================================================
      // BAĞLANTI İZLEME SİSTEMİ
      // =============================================================================
      
      startConnectionMonitoring() {
        // Her 30 saniyede bir bağlantı durumunu kontrol et
        this.connectionCheckInterval = setInterval(async () => {
          if (this.isConnected && window.electronAPI?.whatsapp) {
            try {
              const status = await window.electronAPI.whatsapp.getStatus();
              if (!status.isConnected && this.isConnected) {
                console.warn('⚠️ Bağlantı durumu tutarsızlığı tespit edildi');
                this.isConnected = false;
                this.updateConnectionStatus();
                window.scrapingManager.showStatus('⚠️ Bağlantı durumu güncellendi', 'warning', 'whatsapp-status-log');
              }
            } catch (error) {
              console.error('❌ Bağlantı durumu kontrolü hatası:', error);
            }
          }
        }, 30000);
      }
      
      stopConnectionMonitoring() {
        if (this.connectionCheckInterval) {
          clearInterval(this.connectionCheckInterval);
          this.connectionCheckInterval = null;
        }
      }
      
      destroy() {
        super.destroy();
        this.stopConnectionMonitoring();
      }
    }
    
    // =============================================================================
    // UYGULAMA BAŞLATMA
    // =============================================================================
    async function initializeApp() {
      try {
        console.log('⏳ ElectronAPI bekleniyor...');
        await waitForElectronAPI();
        console.log('✅ ElectronAPI hazır');
        window.tabManager = new TabManager();
        window.tabManager.init();
        window.scrapingManager = new ScrapingManager();
        window.whatsappManager = new WhatsAppManager();
        console.log('🎉 Google Maps WhatsApp Tool Frontend başlatıldı');
        window.scrapingManager.showStatus('✨ Sistem hazır - Arama yapmaya başlayabilirsiniz', 'success');
        window.scrapingManager.showStatus('✨ WhatsApp modülü hazır', 'success', 'whatsapp-status-log');
        
        window.addEventListener('beforeunload', () => {
          if (window.tabManager) window.tabManager.destroy();
          if (window.scrapingManager) window.scrapingManager.destroy();
          if (window.whatsappManager) window.whatsappManager.destroy();
        });
        
      } catch (error) {
        console.error('❌ Uygulama başlatma hatası:', error);
      }
    }
    document.addEventListener('DOMContentLoaded', initializeApp);
    Mesaj listesindeki bir numarayı sildiğimde input alanlarına tıklanmıyor sanki donmuş gibi oluyor ama pencerenin dışında bir yere örneğin masaüstünde boş bir alana tıklayıp tekrar her hangi bir input alanına tıkladığında sorun düzeliyor.
    focus sorunu olarak geçiyormuş sanırım ama mantığını anlayamadım.
    bunu nasıl araştırmam gerekiyor. soruna sebep olan kısmı nasıl tespit etmem gerekiyor?
  • 20-08-2025, 12:34:54
    #2
    Selam, mesajı sildikten sonra muhtemelen ilgili alandaki div veya başka bir alanıda siliyor olabilirsin. kotnrol et. yada aşağıdaki adımları uygu istersen. duruma göre bakalım
    Bunları tek seferde sayfaya yapıştır:
    Bunlar bize “hangi eleman tıklamayı alıyor”/“kim üstte kalmış”ı anında gösterecek. Çıkan elemana göre çözümü netleştiririz.


    // 1) Pointer üstte kim var?
    document.addEventListener('pointerdown', e => {
    const t = document.elementFromPoint(e.clientX, e.clientY);
    console.log('[DOWN on]', t?.tagName, t?.id, t?.className, t);
    });

    // 2) Focus akışını izle
    ['focus','blur'].forEach(ev=>{
    window.addEventListener(ev, () => {
    console.log(`[${ev}] active:`, document.activeElement?.id, document.activeElement);
    }, true);
    });

    // 3) Overlay yakala (tam ekran fixed + yüksek z-index’li)
    setInterval(()=>{
    const nodes=[...document.querySelectorAll('*')].filter(el=>{
    const s=getComputedStyle(el);
    if (s.display==='none') return false;
    const full = s.position==='fixed' && s.top==='0px' && s.left==='0px' && s.right==='0px' && s.bottom==='0px';
    return full && parseInt(s.zIndex||0) >= 1000 && s.pointerEvents!=='none';
    });
    if (nodes.length) console.log('Overlay candidate(s):', nodes);
    }, 1000);