@@ -5,7 +5,7 @@ import { spaces } from "../common/variables";
55import useTheme from "../useTheme" ;
66import useTranslatedLabels from "../useTranslatedLabels" ;
77import DxcButton from "../button/Button" ;
8- import FileInputPropsType , { RefType } from "./types" ;
8+ import FileInputPropsType , { FileData , RefType } from "./types" ;
99import FileItem from "./FileItem" ;
1010
1111const audioIcon = (
@@ -29,20 +29,31 @@ const fileIcon = (
2929 </ svg >
3030) ;
3131
32- const getFilePreview = ( file ) => {
32+ const getFilePreview = async ( file : File ) : Promise < string | React . JSX . Element > => {
3333 if ( file . type . includes ( "video" ) ) return videoIcon ;
3434 else if ( file . type . includes ( "audio" ) ) return audioIcon ;
35- else if ( file . type . includes ( "image" ) )
36- return new Promise ( ( resolve ) => {
35+ else if ( file . type . includes ( "image" ) ) {
36+ return new Promise < string > ( ( resolve ) => {
3737 const reader = new FileReader ( ) ;
3838 reader . readAsDataURL ( file ) ;
3939 reader . onload = ( e ) => {
40- resolve ( e . target . result ) ;
40+ resolve ( e . target . result as string ) ;
4141 } ;
4242 } ) ;
43- else return fileIcon ;
43+ } else return fileIcon ;
4444} ;
4545
46+ const isFileIncluded = ( file : FileData , fileList : FileData [ ] ) => {
47+ const fileListInfo = fileList . map ( ( existingFile ) => existingFile . file ) ;
48+ return fileListInfo . some ( ( { name, size, type, lastModified, webkitRelativePath } ) =>
49+ name === file . file . name &&
50+ size === file . file . size &&
51+ type === file . file . type &&
52+ lastModified === file . file . lastModified &&
53+ webkitRelativePath === file . file . webkitRelativePath
54+ )
55+ }
56+
4657const DxcFileInput = React . forwardRef < RefType , FileInputPropsType > (
4758 (
4859 {
@@ -66,38 +77,34 @@ const DxcFileInput = React.forwardRef<RefType, FileInputPropsType>(
6677 ref
6778 ) : JSX . Element => {
6879 const [ isDragging , setIsDragging ] = useState ( false ) ;
69- const [ files , setFiles ] = useState ( [ ] ) ;
80+ const [ files , setFiles ] = useState < FileData [ ] > ( [ ] ) ;
7081 const [ fileInputId ] = useState ( `file-input-${ uuidv4 ( ) } ` ) ;
7182
7283 const colorsTheme = useTheme ( ) ;
7384 const translatedLabels = useTranslatedLabels ( ) ;
7485
75- const checkFileSize = ( file ) => {
86+ const checkFileSize = ( file : File ) => {
7687 if ( file . size < minSize ) return translatedLabels . fileInput . fileSizeGreaterThanErrorMessage ;
7788 else if ( file . size > maxSize ) return translatedLabels . fileInput . fileSizeLessThanErrorMessage ;
7889 } ;
7990
80- const getFilesToAdd = async ( selectedFiles ) => {
91+ const getFilesToAdd = async ( selectedFiles : File [ ] ) => {
8192 const filesToAdd = await Promise . all ( selectedFiles . map ( ( selectedFile ) => getFilePreview ( selectedFile ) ) ) . then (
82- ( previews ) =>
93+ ( previews : string [ ] ) =>
8394 selectedFiles . map ( ( file , index ) => {
8495 const fileInfo = { file, error : checkFileSize ( file ) , preview : previews [ index ] } ;
8596 return fileInfo ;
8697 } )
8798 ) ;
88- return filesToAdd ;
99+ return filesToAdd . filter (
100+ file => ! isFileIncluded ( file , files )
101+ )
89102 } ;
90103
91- const addFile = async ( selectedFiles ) => {
92- if ( multiple ) {
93- const filesToAdd = await getFilesToAdd ( selectedFiles ) ;
94- const finalFiles = [ ...files , ...filesToAdd ] ;
95- callbackFile ?.( finalFiles ) ;
96- } else {
97- const fileToAdd =
98- selectedFiles . length === 1 ? await getFilesToAdd ( selectedFiles ) : await getFilesToAdd ( [ selectedFiles [ 0 ] ] ) ;
99- callbackFile ?.( fileToAdd ) ;
100- }
104+ const addFile = async ( selectedFiles : File [ ] ) => {
105+ const filesToAdd = await getFilesToAdd ( multiple ? selectedFiles : selectedFiles . length === 1 ? selectedFiles : [ selectedFiles [ 0 ] ] ) ;
106+ const finalFiles = multiple ? [ ...files , ...filesToAdd ] : filesToAdd ;
107+ callbackFile ?.( finalFiles ) ;
101108 } ;
102109
103110 const selectFiles = ( e ) => {
@@ -157,7 +164,7 @@ const DxcFileInput = React.forwardRef<RefType, FileInputPropsType>(
157164 return { ...file , preview } ;
158165 }
159166 } )
160- ) ;
167+ ) as FileData [ ] ;
161168 setFiles ( valueFiles ) ;
162169 }
163170 } ;
0 commit comments