From 5928cfd5f07fbe5bbc4d809de740739d3ca29332 Mon Sep 17 00:00:00 2001 From: "ext.jeremy.guillot@maxicoffee.domains" Date: Fri, 4 Apr 2025 16:06:32 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20ajout=20de=20la=20gestion=20des=20chapi?= =?UTF-8?q?tres=20dans=20le=20store=20Manga=20avec=20des=20actions=20pour?= =?UTF-8?q?=20charger=20et=20mettre=20=C3=A0=20jour=20la=20disponibilit?= =?UTF-8?q?=C3=A9=20des=20chapitres,=20int=C3=A9gration=20d'un=20=C3=A9cou?= =?UTF-8?q?teur=20Mercure=20pour=20les=20mises=20=C3=A0=20jour=20en=20temp?= =?UTF-8?q?s=20r=C3=A9el,=20et=20am=C3=A9lioration=20des=20composants=20d'?= =?UTF-8?q?interface=20utilisateur=20pour=20g=C3=A9rer=20les=20=C3=A9tats?= =?UTF-8?q?=20de=20chargement=20et=20d'erreur.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manga/application/store/mangaStore.js | 66 ++++++++- .../presentation/components/MangaChapter.vue | 35 ++++- .../presentation/components/MangaVolume.vue | 58 ++++++-- .../components/MercureListener.vue | 134 ++++++++++++++++++ .../composables/useMangaChapters.js | 16 ++- .../composables/useMangaVolumes.js | 39 ++++- .../manga/presentation/pages/MangaDetails.vue | 17 ++- .../FetchMangaChaptersHandler.php | 87 ++++++++++-- .../Infrastructure/Client/MangadexClient.php | 8 +- .../CommandHandler/ScrapeChapterHandler.php | 4 + .../ScrapingEventSubscriber.php | 114 +++++++++++++++ 11 files changed, 539 insertions(+), 39 deletions(-) create mode 100644 assets/vue/app/domain/manga/presentation/components/MercureListener.vue create mode 100644 src/Domain/Scraping/Infrastructure/EventSubscriber/ScrapingEventSubscriber.php diff --git a/assets/vue/app/domain/manga/application/store/mangaStore.js b/assets/vue/app/domain/manga/application/store/mangaStore.js index d486e8f..b060ede 100644 --- a/assets/vue/app/domain/manga/application/store/mangaStore.js +++ b/assets/vue/app/domain/manga/application/store/mangaStore.js @@ -28,6 +28,11 @@ export const useMangaStore = defineStore('manga', { // mais les données détaillées ne sont plus stockées ici. currentMangaId: null, + // --- Manga Chapters State --- + mangaChapters: {}, + loadingChapters: false, + chaptersError: null, + // --- Search State --- searchResults: [], loadingSearch: false, @@ -86,6 +91,60 @@ export const useMangaStore = defineStore('manga', { this.currentMangaId = null; }, + // --- Chapters Actions --- + async loadChapters(mangaId) { + if (this.loadingChapters) return; + this.loadingChapters = true; + this.chaptersError = null; + + try { + const chaptersData = await mangaRepository.getChapters(mangaId); + this.mangaChapters[mangaId] = chaptersData; + } catch (err) { + this.chaptersError = err.message; + } finally { + this.loadingChapters = false; + } + }, + + updateChapterAvailability(chapterId, isAvailable = true) { + console.log(`Mise à jour du chapitre ${chapterId}, disponible: ${isAvailable}`); + + // Pour chaque manga dans notre store + Object.keys(this.mangaChapters).forEach(mangaId => { + const chaptersObj = this.mangaChapters[mangaId]; + if (!chaptersObj || !chaptersObj.items) return; + + const chapters = chaptersObj.items; + + // Chercher le chapitre correspondant + const chapterIndex = chapters.findIndex(chapter => chapter.id === chapterId); + + // Si on trouve le chapitre, mettre à jour son état + if (chapterIndex !== -1) { + console.log(`Chapitre trouvé dans le manga ${mangaId}, index: ${chapterIndex}`); + + // Important: créer une nouvelle référence pour que Vue détecte le changement + const updatedChapter = { + ...chapters[chapterIndex], + isAvailable: isAvailable + }; + + // Créer un nouveau tableau pour garantir la réactivité + const updatedChapters = [...chapters]; + updatedChapters[chapterIndex] = updatedChapter; + + // Mise à jour reactive du store + this.mangaChapters[mangaId] = { + ...chaptersObj, + items: updatedChapters + }; + + console.log('Chapitre mis à jour avec succès'); + } + }); + }, + // --- Search Actions --- async searchMangaDex(query) { if (this.loadingSearch) return; @@ -130,16 +189,13 @@ export const useMangaStore = defineStore('manga', { } }, - // --- Chapter Actions --- + // --- Scrape Chapter Action --- async searchChapter(chapterId) { try { await mangaRepository.searchChapter(chapterId); - // Rafraîchir la collection après la recherche - await this.refreshCollectionInBackground(); - return true; } catch (error) { console.error('Erreur lors de la recherche du chapitre:', error); - return false; + throw error; } } } diff --git a/assets/vue/app/domain/manga/presentation/components/MangaChapter.vue b/assets/vue/app/domain/manga/presentation/components/MangaChapter.vue index 0cbd1b2..cf5c9c2 100644 --- a/assets/vue/app/domain/manga/presentation/components/MangaChapter.vue +++ b/assets/vue/app/domain/manga/presentation/components/MangaChapter.vue @@ -11,14 +11,13 @@ params: { chapterId: chapter.id } - }" - class="text-green-500"> + }"> {{ chapter.title || 'Sans titre' }} {{ chapter.title || 'Sans titre' }} -