Aktif Hata Düzeltme Planı

Alpine Queue Duplicate Key Hatası

queue-overlay.blade.php x-for döngüsü düzeltme planı

Problem Özeti

Basit Anlatım

Müzik çalar kuyruğunda (queue overlay) aynı şarkı birden fazla kez eklendiğinde veya bazı şarkıların kimlik numarası (ID) eksik olduğunda, sistem karışıyor ve liste düzgün görüntülenemiyor. Bu durum özellikle şarkı sıralaması değiştirilirken sorunlara yol açıyor.

Teknik Detaylar

HATA 1: Duplicate key on x-for - Aynı song_id birden fazla item'da kullanılıyor
HATA 2: x-for ":key" is undefined - song?.song_id bazen undefined dönüyor
HATA 3: Cannot read 'after' - Alpine DOM senkronizasyonu bozuluyor

Etkilenen Dosyalar

queue-overlay.blade.php

resources/views/themes/muzibu/components/

Satır 348

player-core.js

public/themes/muzibu/js/player/core/

cleanQueue()

Düzeltme Planı (3 Adım)

1

cleanQueue() Fonksiyonunu Güncelle

Öncelik: Yüksek

Mevcut fonksiyon sadece null/undefined filtreliyor. Duplicate song_id'leri de filtrelemeli.

Mevcut Kod:

cleanQueue(songs) {
    if (!Array.isArray(songs)) return [];
    return songs.filter(song =>
        song !== null &&
        song !== undefined &&
        typeof song === 'object'
    );
}

Yeni Kod:

cleanQueue(songs) {
    if (!Array.isArray(songs)) return [];
    const seen = new Set();
    return songs.filter(song => {
        if (!song || typeof song !== 'object')
            return false;
        const id = song.song_id || song.id;
        if (!id || seen.has(id)) return false;
        seen.add(id);
        return true;
    });
}

Ne Yapacak: Queue'ya eklenen şarkılar arasında duplicate varsa, sadece ilkini tutacak.

2

x-for :key Stratejisini Değiştir

Öncelik: Yüksek

Unique key için index'i de dahil ederek her zaman benzersiz key garantisi sağla.

Mevcut:

:key="song?.song_id ||
      ('queue-fallback-' + index)"

Yeni:

:key="'queue-' + index + '-' +
      (song?.song_id || 'x')"

Neden: Index her zaman unique, song_id opsiyonel. Bu kombinasyon asla duplicate olamaz.

3

Sortable onEnd DOM Senkronizasyonu

Öncelik: Orta

Sortable.js DOM değişikliği yapıyor, sonra Alpine de yapıyor - çakışma oluyor. Mevcut fix'i güçlendir.

onEnd: (evt) => {
    $refs.queueList.classList.remove('queue-dragging');
    if (evt.oldIndex === evt.newIndex) return;

    // Sortable'ın DOM değişikliğini geri al
    // ... mevcut kod ...

    // Queue güncellemesini microtask'a taşı
    queueMicrotask(() => {
        const movedSong = queue[evt.oldIndex];
        const newQueue = [...queue];
        newQueue.splice(evt.oldIndex, 1);
        newQueue.splice(evt.newIndex, 0, movedSong);
        // ... queueIndex güncelleme ...
        queue = newQueue;
    });
}

Alternatif: requestAnimationFrame kullanarak DOM senkronizasyonunu güvence altına al.

Test Senaryoları

1
Aynı şarkıyı 2x "Sıraya Ekle" ile ekle → Duplicate olmamalı
2
Queue overlay'i aç → Console'da "Duplicate key" hatası olmamalı
3
Şarkıları sürükle-bırak ile sırala → Hata vermemeli, düzgün çalışmalı
4
Playlist çal → Queue düzgün yüklenmeli, cover'lar görünmeli
5
Şarkı bitince → Sonraki şarkıya geçmeli, "undefined after" hatası olmamalı

Risk Analizi

Düşük Riskli

  • • Sadece frontend değişikliği
  • • Veritabanı etkisi yok
  • • Geri alınabilir değişiklikler

Dikkat Edilecekler

  • • cleanQueue değişikliği tüm queue işlemlerini etkiler
  • • Cache temizleme gerekli (npm run prod)
  • • Test sonrası canlıya alınmalı

Düzeltme Sonrası Beklenen Sonuç

%100
Duplicate Key Hatası Giderilir
0
Alpine Console Hatası
Sorunsuz Drag & Drop