⚡ Loading & Geçiş UX İyileştirmesi

Sayfa geçişleri ve şarkı değişimlerinde kullanıcı feedback sistemi
📅 15 Aralık 2025 🎯 Tenant: muzibu.com 👤 Kullanıcı: "Geçişler yavaş, loading yok, sürekli tıklıyorum"

🔍 Tespit Edilen Sorunlar

1

Sayfa Geçişlerinde Feedback Yok

SPA Router (Single Page Application - sayfa yeniden yüklenmeden içerik değişimi) kullanılıyor ama kullanıcı ne olduğunu anlamıyor.

❌ Link tıklandığında → Hiçbir geri bildirim yok

❌ Prefetch cache varsa → Instant navigation, loading hiç gösterilmiyor

❌ Cache yoksa → 1-2 saniye bekliyor, ama kullanıcı bilmiyor

⚠️ Sonuç: Kullanıcı "çalışmıyor mu" diye sürekli tıklıyor

2

Şarkı Geçişinde Loading Yok

Play butonu tıklandığında API'ye istek atılıyor, stream yükleniyor, ama kullanıcı bekliyor mu bilmiyor.

❌ İlk tıklama → API stream URL çekiyor (1-2 saniye)

❌ HLS manifest yükleniyor → Play butonu değişmiyor

❌ Stream hazırlanıyor → Kullanıcı bekliyor ama göremez

⚠️ Sonuç: "Neden başlamıyor?" diye tekrar tıklıyor

3

Loading Overlay Eksik Kullanılıyor

Spotify tarzı loading overlay mevcut ama sadece SPA navigation için çalışıyor, şarkı geçişlerinde yok.

✅ Overlay tasarımı güzel (spinning loader + "Yükleniyor" text)

❌ Sadece isLoading flag'i ile kontrol ediliyor

❌ Şarkı değişiminde bu flag set edilmiyor

⚠️ Sonuç: Loading var ama kullanıcı görmüyor

4

Kullanıcı Algısı Bozuk

Modern web uygulamaları (Spotify, YouTube Music) anlık feedback veriyor, Muzibu vermiyor.

❌ "Tıkladım ama bir şey olmadı" → Tekrar tıklıyor

❌ "Yavaş mı yoksa bozuk mu?" → Şüphe duyuyor

❌ "Yüklendiğini nasıl anlarım?" → Confusion

⚠️ Sonuç: Profesyonel görünmüyor, güven vermiyor

🎯 Yapılacaklar (Öncelik Sırasına Göre)

1

SPA Navigation Loading - Anlık Feedback Yüksek Öncelik

Link tıklandığında hemen loading gösterilsin, kullanıcı tıkladığını anlasın.

🔧 Teknik Yaklaşım:

  • navigateTo() fonksiyonu → Hemen isLoading = true set etsin
  • • Prefetch cache varsa bile → Minimum 150ms loading göster (kullanıcı feedback için)
  • loadPage() sonunda → isLoading = false set etsin
  • • Hata durumunda → Loading kapansın, hata mesajı gösterilsin

✅ Beklenen Sonuç:

Kullanıcı link tıkladığında → Hemen loading overlay görecek → "Yükleniyor" yazısı → Sayfa geldiğinde smooth geçiş → Kullanıcı ne olduğunu bilecek, güven duyacak.

2

Şarkı Loading State - Play Butonu Animasyonu Yüksek Öncelik

Play butonu tıklandığında spinning animasyon gösterilsin, şarkı hazır olunca normal icon.

🔧 Teknik Yaklaşım:

  • • Yeni state ekle: isSongLoading = false
  • playSongFromQueue() başında → isSongLoading = true
  • • Stream API çağrısı → Loading devam ediyor
  • • HLS/Howler stream hazır → isSongLoading = false
  • • Play butonu → Loading sırasında fas fa-spinner fa-spin gösterecek
  • • Hazır olunca → Normal play/pause icon

🎨 Görsel Tasarım:

Normal (Durduk)

Loading (Yeni!)

Çalıyor

✅ Beklenen Sonuç:

Kullanıcı play tıkladığında → Buton spinning animasyon gösterecek → "Yükleniyor" hissi verecek → Stream hazır olunca normal play/pause → Kullanıcı "işlem devam ediyor" diye bilecek.

3

Minimum Loading Süreleri - Kullanıcı Algısı Optimizasyonu Orta Öncelik

Çok hızlı geçişlerde (50ms gibi) loading gösterilmezse kullanıcı "tıkladım mı?" diye şüphe duyar. Minimum loading süreleri belirlensin.

🔧 UX Psikolojisi:

  • SPA Navigation: Minimum 150ms loading → Kullanıcı "bir şeyler oluyor" hissi
  • Şarkı Loading: Minimum 200ms spinning → Play butonu feedback
  • Prefetch Cache Hit: Bile bile 150ms göster → "Tıkladım" onayı
  • Maximum Loading: 10 saniye sonra timeout → Hata mesajı göster

💡 Neden Minimum Süre?

Spotify, YouTube Music gibi platformlar bile instant geçişlerde artificial delay kullanır. Sebep: Kullanıcı feedback almadan geçiş olursa "bug var mı?" diye düşünür. 150ms insan algısı için "yeterince hızlı ama fark edilir" süredir.

4

Hata Yönetimi & Timeout - Sonsuz Loading Engelleme Orta Öncelik

API çağrısı başarısız olursa veya timeout olursa loading sonlandırılsın, kullanıcı bilgilendirilsin.

🔧 Teknik Yaklaşım:

  • SPA Navigation: 10 saniye timeout → Loading kapat, hata toast göster
  • Şarkı Loading: 15 saniye timeout → Loading kapat, "Şarkı yüklenemedi" toast
  • Network Error: Offline durumu → "İnternet bağlantınızı kontrol edin" mesajı
  • 401 Unauthorized: Session ended → Logout modal

✅ Beklenen Sonuç:

Kullanıcı sonsuz loading görmeyecek, sorun olduğunda bilgilendirilecek, ne yapması gerektiğini bilecek.

5

Klavye Kısayolları & Navigation Feedback Düşük Öncelik

Space (play/pause), Arrow keys (şarkı değiştir) → Loading feedback'i bu durumlarda da gösterilsin.

🔧 Teknik Yaklaşım:

  • Space tuşu: → togglePlayPause() çağrıldığında aynı loading logic
  • Arrow Right: → nextTrack() çağrıldığında şarkı loading gösterilsin
  • Arrow Left: → previousTrack() çağrıldığında şarkı loading gösterilsin
  • • Klavye kısayolları mevcut, sadece loading state entegrasyonu gerekiyor

✅ Beklenen Sonuç:

Power user'lar (klavye kısayolu kullananlar) da aynı loading feedback'i görecek, tüm senaryolar kapsanacak.

🎉 Beklenen Sonuçlar & Kullanıcı Deneyimi

Öncesi (Şu An)

  • • Link tıkla → Hiçbir şey görünmüyor → Tekrar tıklıyor
  • • Play tıkla → 2 saniye bekliyor → "Neden başlamıyor?"
  • • Sayfa geçişi → Anlık ama feedback yok → Şüphe
  • • Şarkı değişimi → "Yükleniyor mu, hata mı var?" → Belirsizlik
  • • Kullanıcı sürekli tekrar tıklıyor → Stres

Sonrası (İyileştirilmiş)

  • • Link tıkla → Hemen loading overlay → "Yükleniyor" yazısı → Rahat
  • • Play tıkla → Buton spinning → "Hazırlanıyor" hissi → Bekleyebilir
  • • Sayfa geçişi → Smooth animation → Profesyonel görünüm
  • • Şarkı değişimi → Görsel feedback → "İşlem devam ediyor" bilgisi
  • • Kullanıcı güvende hissediyor → Tekrar tıklamıyor → Mutlu

📊 Beklenen Metrik İyileştirmeleri

-80%

Tekrar tıklama oranı

+60%

Kullanıcı memnuniyeti

+40%

Profesyonel algı

⚙️ Teknik İmplementasyon Notları

📝 Dosyalar ve Değişiklik Noktaları

1. SPA Router (spa-router.js)

  • navigateTo() → Hemen isLoading set et
  • loadPage() → Minimum 150ms delay ekle
  • • Error handling → Timeout & network error

2. Player Core (player-core.js)

  • • Yeni state: isSongLoading
  • playSongFromQueue() → Loading başlat
  • playHlsStream() → Stream hazır olunca loading bitir
  • • Error handling → Timeout & stream error

3. Player UI (player.blade.php)

  • • Play butonu → x-show ile conditional icon
  • • Loading state → fas fa-spinner fa-spin
  • • Normal state → fas fa-play / fas fa-pause

4. Loading Overlay (loading-overlay.blade.php)

  • • Mevcut overlay → Değişiklik gerekmez
  • • Sadece isLoading flag kontrolü yeterli