@@ -5,7 +5,7 @@ import { Button } from '@neos-project/react-ui-components';
55import { createUseMediaUiStyles , MediaUiTheme , useIntl , useNotify } from '@media-ui/core/src' ;
66import { useUploadDialogState , useUploadFiles } from '@media-ui/feature-asset-upload/src/hooks' ;
77import { useCallback } from 'react' ;
8- import { UploadedFile } from '@media-ui/feature-asset-upload/src/interfaces' ;
8+ import { FilesUploadState , UploadedFile } from '@media-ui/feature-asset-upload/src/interfaces' ;
99import { PreviewSection , UploadSection } from '@media-ui/feature-asset-upload/src/components' ;
1010
1111const useStyles = createUseMediaUiStyles ( ( theme : MediaUiTheme ) => ( {
@@ -30,32 +30,71 @@ const NewAssetUpload = (props: { onComplete: (result: { object: { __identity: st
3030 const handleUpload = useCallback ( ( ) => {
3131 uploadFiles ( dialogState . files . selected )
3232 . then ( ( { data : { uploadFiles } } ) => {
33+ setFiles ( ( prev ) => {
34+ return {
35+ selected : [ ] ,
36+ finished : [
37+ ...prev . finished ,
38+ ...prev . selected . filter ( ( file ) =>
39+ uploadFiles . find ( ( result ) => {
40+ return result . success && result . filename === file . name
41+ ? ( file . uploadStateResult = result . result )
42+ : false ;
43+ } )
44+ ) ,
45+ ] ,
46+ rejected : [
47+ ...prev . rejected ,
48+ ...prev . selected . filter ( ( file ) =>
49+ uploadFiles . find ( ( result ) => {
50+ return ! result . success && result . filename === file . name
51+ ? ( file . uploadStateResult = result . result )
52+ : false ;
53+ } )
54+ ) ,
55+ ] ,
56+ } as FilesUploadState ;
57+ } ) ;
3358 if ( ! uploadFiles [ 0 ] . success ) {
3459 Notify . warning (
60+ translate ( 'uploadDialog.uploadFinishedWithErrors' , 'Some files could not be uploaded' ) ,
3561 translate ( 'uploadDialog.uploadFinishedWithErrors' , 'Some files could not be uploaded' )
3662 ) ;
3763 } else {
3864 Notify . ok ( translate ( 'uploadDialog.uploadFinished' , 'Upload finished' ) ) ;
3965 onComplete ( { object : { __identity : uploadFiles [ 0 ] . assetId } } ) ;
4066 }
67+ setUploadPossible ( false ) ;
4168 } )
4269 . catch ( ( error ) => {
4370 Notify . error ( translate ( 'fileUpload.error' , 'Upload failed' ) , error ) ;
4471 } ) ;
45- } , [ uploadFiles , dialogState . files . selected , Notify , translate , onComplete ] ) ;
72+ } , [ uploadFiles , dialogState . files . selected , setFiles , setUploadPossible , Notify , translate , onComplete ] ) ;
4673
4774 const handleSetFiles = useCallback (
4875 ( files : UploadedFile [ ] ) => {
4976 setFiles ( ( prev ) => {
50- return { ...prev , selected : files } ;
77+ const fileNames = new Set ( ) ;
78+ for ( const file of prev . finished . concat ( prev . rejected ) ) {
79+ fileNames . add ( file . name ) ;
80+ }
81+ const newSelectedFiles = files . filter ( ( file ) => {
82+ return fileNames . has ( file . name ) ? false : fileNames . add ( file . name ) ;
83+ } ) ;
84+ return { ...prev , selected : newSelectedFiles } ;
5185 } ) ;
5286 } ,
5387 [ setFiles ]
5488 ) ;
5589
5690 return (
5791 < section className = { classes . uploadArea } >
58- < UploadSection files = { dialogState . files . selected } loading = { loading } onSetFiles = { handleSetFiles } />
92+ < UploadSection
93+ files = { dialogState . files . selected }
94+ loading = { loading }
95+ onSetFiles = { handleSetFiles }
96+ maxFiles = { 1 }
97+ />
5998 < PreviewSection
6099 files = { dialogState . files }
61100 loading = { loading }
0 commit comments