79 lines
3.1 KiB
JavaScript
79 lines
3.1 KiB
JavaScript
import { computed, watch } from 'vue';
|
|
import { useMangaStore } from '../../application/store/mangaStore';
|
|
import { useMangaChapters } from './useMangaChapters'; // Importe le composable des chapitres
|
|
|
|
export function useMangaVolumes(mangaId) {
|
|
// Récupération du store pour avoir accès aux chapitres mis à jour en temps réel
|
|
const mangaStore = useMangaStore();
|
|
|
|
// Utilise le composable des chapitres pour récupérer les données brutes et les états
|
|
const { data: rawChaptersData, isLoading, isFetching, error, status, refetch } = useMangaChapters(mangaId);
|
|
|
|
// Fonction pour forcer le rechargement des données
|
|
const refresh = () => {
|
|
console.log('useMangaVolumes: Rechargement forcé des chapitres');
|
|
refetch();
|
|
};
|
|
|
|
// Surveiller les changements dans le store pour les chapitres du manga actuel
|
|
watch(
|
|
() => mangaStore.mangaChapters[mangaId.value],
|
|
() => {
|
|
console.log('useMangaVolumes: Changement détecté dans les chapitres du store');
|
|
refresh();
|
|
},
|
|
{ deep: true }
|
|
);
|
|
|
|
// Calcule les volumes à partir des données des chapitres
|
|
const volumes = computed(() => {
|
|
console.log('useMangaVolumes: Recalcul des volumes');
|
|
const chaptersArray = rawChaptersData.value || []; // Utilise la data retournée par useMangaChapters
|
|
if (chaptersArray.length === 0) return [];
|
|
|
|
const volumeMap = new Map();
|
|
chaptersArray.forEach(chapter => {
|
|
const volumeNumber = chapter.volume || '00';
|
|
if (!volumeMap.has(volumeNumber)) {
|
|
volumeMap.set(volumeNumber, {
|
|
number: volumeNumber,
|
|
downloadedChapter: 0,
|
|
totalChapter: 0,
|
|
chapters: []
|
|
});
|
|
}
|
|
const volumeEntry = volumeMap.get(volumeNumber);
|
|
volumeEntry.chapters.push({
|
|
...chapter,
|
|
isAvailable: Boolean(chapter.isAvailable)
|
|
});
|
|
volumeEntry.totalChapter++;
|
|
if (chapter.isAvailable) {
|
|
volumeEntry.downloadedChapter++;
|
|
}
|
|
});
|
|
|
|
return Array.from(volumeMap.values()).sort((a, b) => {
|
|
// Cas spécial pour le volume 00, qui doit apparaître en premier
|
|
if (a.number === '00') return -1;
|
|
if (b.number === '00') return 1;
|
|
|
|
// Pour tous les autres volumes, tri décroissant
|
|
const numA = Number(a.number);
|
|
const numB = Number(b.number);
|
|
return numB - numA;
|
|
});
|
|
});
|
|
|
|
// Retourne les volumes calculés et propage les états pertinents de useMangaChapters
|
|
return {
|
|
volumes, // Les données transformées
|
|
isLoading, // L'état de chargement initial des chapitres
|
|
isFetching, // L'état de rafraîchissement des chapitres
|
|
error, // L'erreur potentielle lors du fetch des chapitres
|
|
status, // L'état global ('pending', 'error', 'success')
|
|
refresh
|
|
// On pourrait aussi retourner rawChaptersData si nécessaire ailleurs
|
|
};
|
|
}
|