diff --git a/assets/vue/app/domain/manga/application/store/mangaStore.js b/assets/vue/app/domain/manga/application/store/mangaStore.js
index b8c4926..81450c5 100644
--- a/assets/vue/app/domain/manga/application/store/mangaStore.js
+++ b/assets/vue/app/domain/manga/application/store/mangaStore.js
@@ -231,6 +231,16 @@ export const useMangaStore = defineStore('manga', {
console.error('Erreur lors du masquage du chapitre:', error);
throw error;
}
+ },
+
+ // --- Download Volume Action ---
+ async downloadVolume(mangaId, volumeNumber) {
+ try {
+ await mangaRepository.downloadVolume(mangaId, volumeNumber);
+ } catch (error) {
+ console.error('Erreur lors du téléchargement du volume:', error);
+ throw error;
+ }
}
}
});
diff --git a/assets/vue/app/domain/manga/infrastructure/api/apiMangaRepository.js b/assets/vue/app/domain/manga/infrastructure/api/apiMangaRepository.js
index c86c67c..c6f6fcc 100644
--- a/assets/vue/app/domain/manga/infrastructure/api/apiMangaRepository.js
+++ b/assets/vue/app/domain/manga/infrastructure/api/apiMangaRepository.js
@@ -243,4 +243,44 @@ export class ApiMangaRepository {
throw error;
}
}
+
+ async downloadVolume(mangaId, volumeNumber) {
+ try {
+ const response = await fetch(`/api/mangas/${mangaId}/volumes/${volumeNumber}/download`);
+ if (!response.ok) {
+ throw new Error('Failed to download volume');
+ }
+
+ // Récupérer le nom du fichier depuis les headers
+ const contentDisposition = response.headers.get('Content-Disposition');
+ let filename = `volume-${volumeNumber}.zip`;
+
+ if (contentDisposition) {
+ const filenameMatch = contentDisposition.match(/filename="?(.+)"?/);
+ if (filenameMatch) {
+ filename = filenameMatch[1];
+ }
+ }
+
+ // Créer un blob à partir de la réponse
+ const blob = await response.blob();
+
+ // Créer un lien de téléchargement temporaire
+ const url = window.URL.createObjectURL(blob);
+ const link = document.createElement('a');
+ link.href = url;
+ link.download = filename;
+ document.body.appendChild(link);
+ link.click();
+
+ // Nettoyer
+ document.body.removeChild(link);
+ window.URL.revokeObjectURL(url);
+
+ return true;
+ } catch (error) {
+ console.error('API Error:', error);
+ throw error;
+ }
+ }
}
diff --git a/assets/vue/app/domain/manga/presentation/components/MangaVolume.vue b/assets/vue/app/domain/manga/presentation/components/MangaVolume.vue
index abc1da6..6dc9b1a 100644
--- a/assets/vue/app/domain/manga/presentation/components/MangaVolume.vue
+++ b/assets/vue/app/domain/manga/presentation/components/MangaVolume.vue
@@ -41,8 +41,15 @@
}">
-