@@ -6,12 +6,14 @@ import toast from 'react-hot-toast';
66import { Button } from '@/components/ui/button' ;
77import axios , { AxiosError } from 'axios' ;
88import { FiTrash , FiX } from 'react-icons/fi' ;
9+ import Image from 'next/image' ;
910import {
1011 DndContext ,
1112 closestCenter ,
1213 PointerSensor ,
1314 useSensor ,
1415 useSensors ,
16+ DragEndEvent ,
1517} from '@dnd-kit/core' ;
1618import {
1719 arrayMove ,
@@ -53,10 +55,9 @@ export default function Page() {
5355
5456 useEffect ( ( ) => {
5557 return ( ) => {
56-
5758 previews . forEach ( ( item ) => URL . revokeObjectURL ( item . preview ) ) ;
5859 } ;
59- } , [ ] ) ;
60+ } , [ previews ] ) ;
6061
6162 const fileCheckAndSelect = useCallback ( ( acceptedFiles : File [ ] ) => {
6263 const maxFileSize = 5 * 1024 * 1024 ;
@@ -131,7 +132,7 @@ export default function Page() {
131132 const style = {
132133 transform : CSS . Transform . toString ( transform ) ,
133134 transition,
134- zIndex : isDragging ? 50 : undefined ,
135+ // zIndex: 50 ,
135136 } ;
136137 return (
137138 < div ref = { setNodeRef } style = { style } { ...attributes } { ...listeners } >
@@ -140,16 +141,25 @@ export default function Page() {
140141 ) ;
141142 }
142143
143- const handleDndKitDragEnd = ( event : any ) => {
144- const { active, over } = event ;
145- if ( active . id !== over ?. id ) {
146- const oldIndex = previews . findIndex ( ( item ) => item . id === active . id ) ;
147- const newIndex = previews . findIndex ( ( item ) => item . id === over . id ) ;
148- const newPreviews = arrayMove ( previews , oldIndex , newIndex ) ;
149- setPreviews ( newPreviews ) ;
150- setFiles ( newPreviews . map ( ( p ) => p . file ) ) ;
151- }
152- } ;
144+ const handleDndKitDragEnd = ( event : DragEndEvent ) => {
145+ const { active, over } = event ;
146+ if ( over && active . id !== over . id ) {
147+ const oldIndex = previews . findIndex ( ( item ) => item . id === active . id ) ;
148+ const newIndex = previews . findIndex ( ( item ) => item . id === over . id ) ;
149+
150+ const newFiles = arrayMove ( previews . map ( ( p ) => p . file ) , oldIndex , newIndex ) ;
151+
152+ previews . forEach ( ( item ) => URL . revokeObjectURL ( item . preview ) ) ;
153+ const newPreviews = newFiles . map ( ( file , idx ) => ( {
154+ id : `${ file . name } -${ file . lastModified } -${ idx } ` ,
155+ file,
156+ preview : URL . createObjectURL ( file ) ,
157+ } ) ) ;
158+
159+ setFiles ( newFiles ) ;
160+ setPreviews ( newPreviews ) ;
161+ }
162+ } ;
153163
154164 const handleDelete = ( index : number ) => {
155165 const deletedPreview = previews [ index ] ;
@@ -199,8 +209,8 @@ export default function Page() {
199209
200210 setFiles ( [ ] ) ;
201211 setPreviews ( [ ] ) ;
202- } catch ( error ) {
203- // Optionally handle error
212+ } catch {
213+ // Handle error if needed
204214 } finally {
205215 setIsUploading ( false ) ;
206216 }
@@ -268,18 +278,26 @@ export default function Page() {
268278 < SortablePreview key = { item . id } id = { item . id } >
269279 < div className = "relative w-48 h-60" >
270280 < div className = "w-full h-full rounded-2xl outline outline-2 outline-white/80 overflow-hidden" >
271- < div className = "absolute left-0 top-0 w-10 h-10 bg-slate-600 rounded-tl-2xl rounded-br-2xl flex items-center justify-center" >
281+ < div className = "z-10 absolute left-0 top-0 w-10 h-10 bg-slate-600 rounded-tl-2xl rounded-br-2xl flex items-center justify-center" >
272282 < span className = "text-white text-xl" > { index + 1 } </ span >
273283 </ div >
274284 < button
275285 onClick = { ( ) => handleDelete ( index ) }
276- className = "absolute right-0 top-0 w-10 h-10 bg-pink-800 rounded-tr-2xl rounded-bl-2xl flex items-center justify-center"
286+ className = "z-10 absolute right-0 top-0 w-10 h-10 bg-pink-800 rounded-tr-2xl rounded-bl-2xl flex items-center justify-center"
277287 title = "Delete"
278288 >
279289 < FiTrash className = "w-5 h-5 text-white" />
280290 </ button >
281291 { item . file . type . startsWith ( 'image/' ) ? (
282- < img src = { item . preview } alt = { `Page ${ index + 1 } ` } className = "w-full h-full object-cover" />
292+ < div className = "relative w-full h-full" >
293+ < Image
294+ src = { item . preview }
295+ alt = { `Page ${ index + 1 } ` }
296+ fill
297+ className = "object-cover"
298+ unoptimized // Since we're using object URLs
299+ />
300+ </ div >
283301 ) : (
284302 < iframe src = { item . preview } title = { `PDF preview ${ index + 1 } ` } className = "w-full h-full" />
285303 ) }
@@ -322,11 +340,18 @@ export default function Page() {
322340 >
323341 < FiX size = { 24 } />
324342 </ button >
325- { previews [ zoomIndex ] && previews [ zoomIndex ] . file . type . startsWith ( 'image/' ) ? (
326- < img src = { previews [ zoomIndex ] ?. preview } alt = "zoomed preview" className = "max-w-[80vw] max-h-[80vh] rounded-md" />
343+ { previews [ zoomIndex ] ?. file . type . startsWith ( 'image/' ) ? (
344+ < Image
345+ src = { previews [ zoomIndex ] . preview }
346+ alt = "zoomed preview"
347+ className = "max-w-[80vw] max-h-[80vh] rounded-md"
348+ width = { 800 }
349+ height = { 600 }
350+ unoptimized
351+ />
327352 ) : previews [ zoomIndex ] ? (
328353 < iframe
329- src = { previews [ zoomIndex ] ? .preview }
354+ src = { previews [ zoomIndex ] . preview }
330355 className = "w-[80vw] h-[80vh] border rounded-md"
331356 title = { `PDF zoom preview ${ zoomIndex } ` }
332357 />
0 commit comments