38980-vm/app-9w9pd00g5j41/GOOGLE_MAPS_UPDATE.md
2026-03-04 18:25:09 +00:00

7.0 KiB
Raw Permalink Blame History

Google Maps Komponenti Güncelleme Raporu

Yapılan Değişiklikler

1. GoogleMap Komponenti Güncellendi

Dosya: src/components/ui/GoogleMap.tsx

Yeni Özellikler:

  • Dinamik Script Yükleme: Google Maps API'si artık dinamik olarak yükleniyor
  • Yükleme Durumu: Harita yüklenirken skeleton loader gösteriliyor
  • Hata Yönetimi: Yükleme hatalarında kullanıcı dostu hata mesajı ve "Sayfayı Yenile" butonu
  • Animasyonlu Marker: Seçili marker'lar bounce animasyonu ile vurgulanıyor
  • Gelişmiş Zoom Kontrolü: addListenerOnce ile daha stabil zoom kontrolü
  • Boş Marker Kontrolü: Marker yoksa gereksiz işlemler yapılmıyor

Değişiklikler:

// ÖNCE: Doğrudan window.google kullanımı
useEffect(() => {
  if (!mapRef.current || !window.google) return;
  // ...
}, []);

// SONRA: Dinamik script yükleme ile
useEffect(() => {
  loadGoogleMapsScript()
    .then(() => setIsScriptLoaded(true))
    .catch((error) => {
      console.error('Google Maps yükleme hatası:', error);
      setLoadError('Harita yüklenemedi. Lütfen sayfayı yenileyin.');
    });
}, []);

2. Google Maps Loader Utility Oluşturuldu

Dosya: src/utils/google-maps-loader.ts (YENİ)

Özellikler:

  • Singleton pattern ile tek seferlik yükleme
  • Promise tabanlı asenkron yükleme
  • Duplicate script kontrolü
  • API key doğrulama
  • Hata yönetimi ve Türkçe hata mesajları
  • places ve geometry kütüphaneleri dahil

Fonksiyonlar:

// Google Maps API'sini yükle
loadGoogleMapsScript(): Promise<void>

// Yüklenip yüklenmediğini kontrol et
isGoogleMapsLoaded(): boolean

3. Environment Variable Eklendi

Dosya: .env

# Google Maps API Key - https://console.cloud.google.com/google/maps-apis
VITE_GOOGLE_MAPS_API_KEY=YOUR_GOOGLE_MAPS_API_KEY_HERE

Kullanım Talimatları

Google Maps API Key Alma

  1. Google Cloud Console'a gidin:

  2. Yeni bir proje oluşturun veya mevcut projeyi seçin

  3. APIs & Services > Library'ye gidin

  4. "Maps JavaScript API" arayın ve etkinleştirin

  5. APIs & Services > Credentials'a gidin

  6. "CREATE CREDENTIALS" > "API key" seçin

  7. API key'i kopyalayın

  8. .env dosyasını düzenleyin:

    VITE_GOOGLE_MAPS_API_KEY=AIzaSyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    
  9. Uygulamayı yeniden başlatın:

    npm run dev
    

API Key Güvenliği

Önemli: Production ortamında API key'inizi korumak için:

  1. API Key Restrictions ayarlayın:

    • HTTP referrers (web sites) seçin
    • Domain'inizi ekleyin: https://yourdomain.com/*
  2. API Restrictions ayarlayın:

    • "Restrict key" seçin
    • Sadece "Maps JavaScript API" seçin

Yeni Özellikler

1. Loading State (Yükleme Durumu)

if (!isScriptLoaded) {
  return (
    <div className={className}>
      <Skeleton className="w-full h-full bg-muted" />
    </div>
  );
}

2. Error State (Hata Durumu)

if (loadError) {
  return (
    <div className={className}>
      <div>
        <p>⚠️ {loadError}</p>
        <button onClick={() => window.location.reload()}>
          Sayfayı Yenile
        </button>
      </div>
    </div>
  );
}

3. Animasyonlu Marker

const marker = new google.maps.Marker({
  // ...
  animation: isActive ? google.maps.Animation.BOUNCE : undefined,
});

// Seçili marker'a animasyon ekle
marker.setAnimation(google.maps.Animation.BOUNCE);
setTimeout(() => marker.setAnimation(null), 2000);

4. Gelişmiş Zoom Kontrolü

// ÖNCE: addListener (her idle event'te çalışır)
const listener = google.maps.event.addListener(map, 'idle', () => {
  if (map.getZoom()! > 15) map.setZoom(15);
  google.maps.event.removeListener(listener);
});

// SONRA: addListenerOnce (sadece bir kez çalışır)
const listener = google.maps.event.addListenerOnce(map, 'idle', () => {
  const currentZoom = map.getZoom();
  if (currentZoom && currentZoom > 15) {
    map.setZoom(15);
  }
});

Test Senaryoları

Test 1: Normal Yükleme

  1. Geçerli API key ile uygulamayı başlatın
  2. Harita sayfasına gidin
  3. Skeleton loader görünmeli
  4. Harita başarıyla yüklenmeli

Test 2: API Key Eksik

  1. .env dosyasından VITE_GOOGLE_MAPS_API_KEY silin
  2. Uygulamayı başlatın
  3. Harita sayfasına gidin
  4. Hata mesajı görünmeli: "Google Maps API anahtarı bulunamadı..."

Test 3: Geçersiz API Key

  1. .env dosyasına geçersiz bir key girin
  2. Uygulamayı başlatın
  3. Harita sayfasına gidin
  4. Hata mesajı görünmeli ve "Sayfayı Yenile" butonu çalışmalı

Test 4: Marker Animasyonları

  1. Haritada marker'lara tıklayın
  2. Marker bounce animasyonu yapmalı
  3. Info window açılmalı
  4. Harita marker'a odaklanmalı

Test 5: Hover Efektleri

  1. Marker'ların üzerine gelin
  2. Marker boyutu büyümeli
  3. Renk değişmeli
  4. Z-index artmalı

Teknik Detaylar

Değiştirilen Dosyalar

  • src/components/ui/GoogleMap.tsx (GÜNCELLENDİ)
  • src/utils/google-maps-loader.ts (YENİ)
  • .env (GÜNCELLENDİ)

Eklenen Bağımlılıklar

  • Yok (Mevcut bağımlılıklar kullanıldı)

Lint Durumu

Tüm dosyalar lint kontrolünden geçti (112 dosya)

TypeScript Uyumluluğu

Tüm tip tanımlamaları mevcut google.maps tipleri kullanılıyor Null safety kontrolleri eklendi

Performans İyileştirmeleri

  1. Singleton Pattern: Google Maps script'i sadece bir kez yüklenir
  2. Promise Caching: Aynı anda birden fazla yükleme isteği tek promise'e yönlendirilir
  3. Conditional Rendering: Marker yoksa gereksiz işlemler yapılmaz
  4. Event Listener Optimization: addListenerOnce ile gereksiz event listener'lar önlenir
  5. Memory Management: Component unmount olduğunda tüm marker'lar ve polyline temizlenir

Sorun Giderme

Harita Yüklenmiyor

  1. .env dosyasında VITE_GOOGLE_MAPS_API_KEY var mı kontrol edin
  2. API key'in geçerli olduğundan emin olun
  3. Google Cloud Console'da "Maps JavaScript API" etkin mi kontrol edin
  4. Browser console'da hata mesajlarını kontrol edin

Marker'lar Görünmüyor

  1. markers prop'unun doğru formatta olduğundan emin olun
  2. position değerlerinin geçerli lat/lng olduğunu kontrol edin
  3. activeDayId filtresi kullanılıyorsa, marker'ların dayId değerlerini kontrol edin

Animasyonlar Çalışmıyor

  1. Google Maps API'nin tamamen yüklendiğinden emin olun
  2. google.maps.Animation nesnesinin mevcut olduğunu kontrol edin
  3. Browser console'da JavaScript hataları olup olmadığını kontrol edin

Sonuç

GoogleMap komponenti başarıyla güncellendi ve aşağıdaki iyileştirmeler yapıldı:

Dinamik script yükleme
Yükleme ve hata durumları
Animasyonlu marker'lar
Gelişmiş zoom kontrolü
Performans optimizasyonları
Türkçe hata mesajları
API key yönetimi

Tüm değişiklikler lint kontrolünden geçti ve production'a hazır durumda.