11import React , { useCallback , useState , useEffect } from 'react' ;
2+ // Helper function to check for .sql extension
3+ const isSqlFile = ( file : File ) : boolean => file . name . toLowerCase ( ) . endsWith ( '.sql' ) ;
4+
5+ // MessageBar styles constant
6+ const messageBarErrorStyles = {
7+ root : { display : "flex" , flexDirection : "column" , alignItems : "left" , background : "#fff4f4" } ,
8+ icon : { display : "none" } ,
9+ } ;
210import { useDropzone , FileRejection , DropzoneOptions } from 'react-dropzone' ;
311import { CircleCheck , X } from 'lucide-react' ;
412import {
@@ -163,14 +171,13 @@ const FileUploadZone: React.FC<FileUploadZoneProps> = ({
163171
164172 const onDrop = useCallback (
165173 ( acceptedFiles : File [ ] , fileRejections : FileRejection [ ] ) => {
166- // Manual extension check: only allow .sql files
167- const validFiles = acceptedFiles . filter ( file => file . name . toLowerCase ( ) . endsWith ( '.sql' ) ) ;
168- const invalidFiles = acceptedFiles . filter ( file => ! file . name . toLowerCase ( ) . endsWith ( '.sql' ) ) ;
174+ // Use helper for .sql extension check
175+ const validFiles = acceptedFiles . filter ( isSqlFile ) ;
176+ const invalidFiles = acceptedFiles . filter ( file => ! isSqlFile ( file ) ) ;
169177
170178 // Check current files count and determine how many more can be added
171179 const remainingSlots = MAX_FILES - uploadingFiles . length ;
172180
173-
174181 if ( validFiles . length > 0 ) {
175182 setFileRejectionErrors ( [ ] ) ; // Clear error notification when valid file is selected
176183 }
@@ -191,26 +198,26 @@ const FileUploadZone: React.FC<FileUploadZoneProps> = ({
191198 if ( onFileUpload ) onFileUpload ( validFiles ) ;
192199 }
193200
194- // Build error messages for invalid extension files
195- const errors : string [ ] = [ ] ;
196- invalidFiles . forEach ( file => {
197- errors . push ( `File '${ file . name } ' is not a valid SQL file. Only .sql files are allowed.` ) ;
198- } ) ;
199-
200- // Existing fileRejections (size/type)
201- if ( fileRejections . length > 0 ) {
202- fileRejections . forEach ( rejection => {
203- rejection . errors . forEach ( err => {
201+ // Efficient error array construction
202+ const errors : string [ ] = [
203+ ...invalidFiles . map ( file =>
204+ `File '${ file . name } ' is not a valid SQL file. Only .sql files are allowed.`
205+ ) ,
206+ ...fileRejections . flatMap ( rejection =>
207+ rejection . errors . map ( err => {
204208 if ( err . code === "file-too-large" ) {
205- errors . push ( `File '${ rejection . file . name } ' exceeds the 200MB size limit. Please upload a file smaller than 200MB.` ) ;
209+ return `File '${ rejection . file . name } ' exceeds the 200MB size limit. Please upload a file smaller than 200MB.` ;
206210 } else if ( err . code === "file-invalid-type" ) {
207- errors . push ( `File '${ rejection . file . name } ' is not a valid SQL file. Only .sql files are allowed.` ) ;
211+ return `File '${ rejection . file . name } ' is not a valid SQL file. Only .sql files are allowed.` ;
208212 } else {
209- errors . push ( `File '${ rejection . file . name } ': ${ err . message } ` ) ;
213+ return `File '${ rejection . file . name } ': ${ err . message } ` ;
210214 }
211- } ) ;
212- } ) ;
213- if ( onFileReject ) onFileReject ( fileRejections ) ;
215+ } )
216+ )
217+ ] ;
218+
219+ if ( fileRejections . length > 0 && onFileReject ) {
220+ onFileReject ( fileRejections ) ;
214221 }
215222 if ( errors . length > 0 ) {
216223 setFileRejectionErrors ( errors ) ;
@@ -552,10 +559,7 @@ const FileUploadZone: React.FC<FileUploadZoneProps> = ({
552559 < MessageBar
553560 messageBarType = { MessageBarType . error }
554561 isMultiline = { true }
555- styles = { {
556- root : { display : "flex" , flexDirection : "column" , alignItems : "left" , background : "#fff4f4" } ,
557- icon : { display : "none" } ,
558- } }
562+ styles = { messageBarErrorStyles }
559563 >
560564 < div style = { { display : "flex" , alignItems : "center" } } >
561565 < X strokeWidth = "2.5px" color = "#d83b01" size = "16px" style = { { marginRight : "8px" } } />
0 commit comments