Files
Mangarr/assets/vue/app/domain/manga/presentation/composables/useMangaVolumes.js

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
};
}