@@ -29,6 +29,7 @@ import useEventListener from '@/plugins/useEventListener';
2929import compressFiles from '@/api/server/files/compressFiles' ;
3030import decompressFiles from '@/api/server/files/decompressFiles' ;
3131import isEqual from 'react-fast-compare' ;
32+ import ConfirmationModal from '@/components/elements/ConfirmationModal' ;
3233
3334type ModalType = 'rename' | 'move' ;
3435
@@ -54,6 +55,7 @@ const FileDropdownMenu = ({ file }: { file: FileObject }) => {
5455 const onClickRef = useRef < DropdownMenu > ( null ) ;
5556 const [ showSpinner , setShowSpinner ] = useState ( false ) ;
5657 const [ modal , setModal ] = useState < ModalType | null > ( null ) ;
58+ const [ showConfirmation , setShowConfirmation ] = useState ( false ) ;
5759
5860 const uuid = ServerContext . useStoreState ( state => state . server . data ! . uuid ) ;
5961 const { mutate } = useFileManagerSwr ( ) ;
@@ -123,47 +125,58 @@ const FileDropdownMenu = ({ file }: { file: FileObject }) => {
123125 } ;
124126
125127 return (
126- < DropdownMenu
127- ref = { onClickRef }
128- renderToggle = { onClick => (
129- < div css = { tw `p-3 hover:text-white` } onClick = { onClick } >
130- < FontAwesomeIcon icon = { faEllipsisH } />
131- { ! ! modal &&
132- < RenameFileModal
133- visible
134- appear
135- files = { [ file . name ] }
136- useMoveTerminology = { modal === 'move' }
137- onDismissed = { ( ) => setModal ( null ) }
138- />
139- }
140- < SpinnerOverlay visible = { showSpinner } fixed size = { 'large' } />
141- </ div >
142- ) }
143- >
144- < Can action = { 'file.update' } >
145- < Row onClick = { ( ) => setModal ( 'rename' ) } icon = { faPencilAlt } title = { 'Rename' } />
146- < Row onClick = { ( ) => setModal ( 'move' ) } icon = { faLevelUpAlt } title = { 'Move' } />
147- </ Can >
148- { file . isFile &&
149- < Can action = { 'file.create' } >
150- < Row onClick = { doCopy } icon = { faCopy } title = { 'Copy' } />
151- </ Can >
152- }
153- { file . isArchiveType ( ) ?
128+ < >
129+ < ConfirmationModal
130+ visible = { showConfirmation }
131+ title = { `Delete this ${ file . isFile ? 'File' : 'Directory' } ?` }
132+ buttonText = { `Yes, Delete ${ file . isFile ? 'File' : 'Directory' } ` }
133+ onConfirmed = { doDeletion }
134+ onModalDismissed = { ( ) => setShowConfirmation ( false ) }
135+ >
136+ Deleting files is a permanent operation, you cannot undo this action.
137+ </ ConfirmationModal >
138+ < DropdownMenu
139+ ref = { onClickRef }
140+ renderToggle = { onClick => (
141+ < div css = { tw `p-3 hover:text-white` } onClick = { onClick } >
142+ < FontAwesomeIcon icon = { faEllipsisH } />
143+ { ! ! modal &&
144+ < RenameFileModal
145+ visible
146+ appear
147+ files = { [ file . name ] }
148+ useMoveTerminology = { modal === 'move' }
149+ onDismissed = { ( ) => setModal ( null ) }
150+ />
151+ }
152+ < SpinnerOverlay visible = { showSpinner } fixed size = { 'large' } />
153+ </ div >
154+ ) }
155+ >
156+ < Can action = { 'file.update' } >
157+ < Row onClick = { ( ) => setModal ( 'rename' ) } icon = { faPencilAlt } title = { 'Rename' } />
158+ < Row onClick = { ( ) => setModal ( 'move' ) } icon = { faLevelUpAlt } title = { 'Move' } />
159+ </ Can >
160+ { file . isFile &&
154161 < Can action = { 'file.create' } >
155- < Row onClick = { doUnarchive } icon = { faBoxOpen } title = { 'Unarchive ' } />
162+ < Row onClick = { doCopy } icon = { faCopy } title = { 'Copy ' } />
156163 </ Can >
157- :
158- < Can action = { 'file.archive' } >
159- < Row onClick = { doArchive } icon = { faFileArchive } title = { 'Archive' } />
164+ }
165+ { file . isArchiveType ( ) ?
166+ < Can action = { 'file.create' } >
167+ < Row onClick = { doUnarchive } icon = { faBoxOpen } title = { 'Unarchive' } />
168+ </ Can >
169+ :
170+ < Can action = { 'file.archive' } >
171+ < Row onClick = { doArchive } icon = { faFileArchive } title = { 'Archive' } />
172+ </ Can >
173+ }
174+ < Row onClick = { doDownload } icon = { faFileDownload } title = { 'Download' } />
175+ < Can action = { 'file.delete' } >
176+ < Row onClick = { ( ) => setShowConfirmation ( true ) } icon = { faTrashAlt } title = { 'Delete' } $danger />
160177 </ Can >
161- }
162- < Row onClick = { doDownload } icon = { faFileDownload } title = { 'Download' } />
163- < Can action = { 'file.delete' } >
164- < Row onClick = { doDeletion } icon = { faTrashAlt } title = { 'Delete' } $danger />
165- </ Can >
166- </ DropdownMenu >
178+ </ DropdownMenu >
179+ </ >
167180 ) ;
168181} ;
169182
0 commit comments