@@ -26,6 +26,8 @@ import {
2626 downloadFile ,
2727} from "@/util/download_paper" ;
2828import type { ICourses } from "@/interface" ;
29+ import JSZip from "jszip" ;
30+ import { toast } from "react-hot-toast" ;
2931
3032const CatalogueContent = ( ) => {
3133 const router = useRouter ( ) ;
@@ -226,17 +228,36 @@ const CatalogueContent = () => {
226228 [ ] ,
227229 ) ;
228230
229- const handleDownloadAll = useCallback ( async ( ) => {
231+ const handleDownloadSelected = useCallback ( async ( ) => {
232+ const zip = new JSZip ( ) ;
230233 const uniquePapers = Array . from (
231234 new Set ( selectedPapers . map ( ( paper ) => paper . _id ) ) ,
232235 ) . map ( ( id ) => selectedPapers . find ( ( paper ) => paper . _id === id ) ) as IPaper [ ] ;
233-
236+ if ( ! uniquePapers ) {
237+ toast . error ( "No papers selected for download." ) ;
238+ }
234239 for ( const paper of uniquePapers ) {
235- await downloadFile (
236- getSecureUrl ( paper . final_url ) ,
237- generateFileName ( paper ) ,
238- ) ;
240+ try {
241+ const response = await fetch ( getSecureUrl ( paper . final_url ) ) ;
242+ const blob = await response . blob ( ) ;
243+ const filename = generateFileName ( paper ) ;
244+ zip . file ( filename , blob ) ;
245+ } catch ( err ) {
246+ // Optionally handle individual download errors
247+ console . error ( `Failed to fetch ${ paper . final_url } ` , err ) ;
248+ }
239249 }
250+
251+ const zipBlob = await zip . generateAsync ( { type : "blob" } ) ;
252+ const url = URL . createObjectURL ( zipBlob ) ;
253+ const a = document . createElement ( "a" ) ;
254+ a . href = url ;
255+ a . download = "papers.zip" ;
256+ document . body . appendChild ( a ) ;
257+ a . click ( ) ;
258+ a . remove ( ) ;
259+ URL . revokeObjectURL ( url ) ;
260+ toast . success ( "Download Initiated" )
240261 } , [ selectedPapers ] ) ;
241262
242263 const handleApplyFilters = useCallback (
@@ -338,7 +359,7 @@ const CatalogueContent = () => {
338359 selectedPapers = { selectedPapers }
339360 subject = { subject }
340361 filterOptions = { filterOptions }
341- handleDownloadAll = { handleDownloadAll }
362+ handleDownloadSelected = { handleDownloadSelected }
342363 closeFilters = { closeFilters }
343364 />
344365 </ div > }
@@ -374,7 +395,7 @@ const CatalogueContent = () => {
374395 selectedPapers = { selectedPapers }
375396 subject = { subject }
376397 filterOptions = { filterOptions }
377- handleDownloadAll = { handleDownloadAll }
398+ handleDownloadSelected = { handleDownloadSelected }
378399 closeFilters = { closeFilters }
379400 />
380401 </ SheetContent >
0 commit comments