@@ -16,18 +16,6 @@ import { Sheet, SheetContent, SheetTrigger } from "./ui/sheet";
16
16
import { Pin } from "lucide-react" ;
17
17
import { StoredSubjects } from "@/interface" ;
18
18
19
- export async function downloadFile ( url : string , filename : string ) {
20
- try {
21
- const response = await axios . get ( url , { responseType : "blob" } ) ;
22
- const blob = new Blob ( [ response . data ] ) ;
23
- const link = document . createElement ( "a" ) ;
24
- link . href = window . URL . createObjectURL ( blob ) ;
25
- link . download = filename ;
26
- link . click ( ) ;
27
- window . URL . revokeObjectURL ( link . href ) ;
28
- } catch ( error ) { }
29
- }
30
-
31
19
const CatalogueContent = ( ) => {
32
20
const router = useRouter ( ) ;
33
21
const searchParams = useSearchParams ( ) ;
@@ -175,18 +163,38 @@ const CatalogueContent = () => {
175
163
[ ] ,
176
164
) ;
177
165
166
+ const getSecureUrl = ( url : string ) : string =>
167
+ url . startsWith ( "http://" ) ? url . replace ( "http://" , "https://" ) : url ;
168
+
169
+ const generateFileName = ( paper : IPaper ) : string => {
170
+ const extension = paper . final_url . split ( "." ) . pop ( ) ;
171
+ return `${ extractBracketContent ( paper . subject ) } -${ paper . exam } -${ paper . slot } -${ paper . year } .${ extension } ` ;
172
+ } ;
173
+
174
+ const downloadFile = async ( url : string , filename : string ) : Promise < void > => {
175
+ try {
176
+ const response = await axios . get ( url , { responseType : "blob" } ) ;
177
+ const blob = new Blob ( [ response . data ] ) ;
178
+ const link = document . createElement ( "a" ) ;
179
+ link . href = window . URL . createObjectURL ( blob ) ;
180
+ link . download = filename ;
181
+ link . click ( ) ;
182
+ window . URL . revokeObjectURL ( link . href ) ;
183
+ } catch ( error ) {
184
+ console . error ( "Download failed:" , error ) ;
185
+ }
186
+ } ;
187
+
178
188
const handleDownloadAll = useCallback ( async ( ) => {
179
- /* if (typeof window !== "undefined" && window.gtag) {
180
- window.gtag("event", "download_all_clicked", {
181
- event_category: "Paper Downloads",
182
- event_label: "Download All Clicked",
183
- });
184
- } */
189
+ const uniquePapers = Array . from (
190
+ new Set ( selectedPapers . map ( ( paper ) => paper . _id ) ) ,
191
+ ) . map ( ( id ) => selectedPapers . find ( ( paper ) => paper . _id === id ) ) as IPaper [ ] ;
185
192
186
- for ( const paper of selectedPapers ) {
187
- const extension = paper . final_url . split ( "." ) . pop ( ) ;
188
- const fileName = `${ extractBracketContent ( paper . subject ) } -${ paper . exam } -${ paper . slot } -${ paper . year } .${ extension } ` ;
189
- await downloadFile ( paper . final_url , fileName ) ;
193
+ for ( const paper of uniquePapers ) {
194
+ await downloadFile (
195
+ getSecureUrl ( paper . final_url ) ,
196
+ generateFileName ( paper ) ,
197
+ ) ;
190
198
}
191
199
} , [ selectedPapers ] ) ;
192
200
@@ -272,7 +280,7 @@ const CatalogueContent = () => {
272
280
273
281
return (
274
282
< div className = "relative flex min-h-screen justify-center p-0 md:justify-normal" >
275
- < div className = "hidden w-[30 %] min-w-fit md:block" >
283
+ < div className = "hidden ! w-[22 %] min-w-[22%] max-w-[22%] flex-shrink-0 md:block" >
276
284
< SideBar
277
285
filtersNotPulled = { filtersNotPulled }
278
286
loading = { loading }
0 commit comments