11import React , {
2+ forwardRef ,
23 lazy ,
34 memo ,
45 Suspense ,
56 useEffect ,
7+ useImperativeHandle ,
68 useMemo ,
79 useRef ,
810 useState ,
@@ -14,6 +16,7 @@ import FileUploader from '../common/FileUploader';
1416import BrowserEditor from './BrowserEditor' ;
1517import FolderStructure from './FolderStructure' ;
1618import MenuBar from './MenuBar' ;
19+ import CloseIcon from '../icons/close.svg' ;
1720
1821
1922function StaticFigure ( props ) {
@@ -91,19 +94,20 @@ const FilesList = memo((props: any) => {
9194} ) ;
9295
9396
94- export default function FileSelectDialog ( props ) {
95- const { realm, baseUrl, csrfToken, selectFile } = props ;
97+ const FileSelectDialog = forwardRef ( ( props : any , forwardedRef ) => {
98+ const { realm, baseUrl, csrfToken} = props ;
9699 const [ structure , setStructure ] = useState ( {
97100 root_folder : null ,
98101 last_folder : null ,
99102 files : null ,
100103 offset : null ,
104+ recursive : false ,
101105 search_query : '' ,
102106 labels : [ ] ,
103107 } ) ;
104- const [ uploadedFile , setUploadedFile ] = useState ( null ) ;
105108 const ref = useRef ( null ) ;
106109 const uploaderRef = useRef ( null ) ;
110+ const [ uploadedFile , setUploadedFile ] = useState ( null ) ;
107111 const dialog = ref . current ?. closest ( 'dialog' ) ;
108112
109113 useEffect ( ( ) => {
@@ -112,19 +116,7 @@ export default function FileSelectDialog(props) {
112116 }
113117 } , [ uploadedFile ] ) ;
114118
115- useEffect ( ( ) => {
116- if ( ! dialog ) {
117- return ;
118- }
119- const dialogClosed = ( ) => {
120- setUploadedFile ( null ) ;
121- } ;
122-
123- dialog . addEventListener ( 'close' , dialogClosed ) ;
124- return ( ) => {
125- dialog . removeEventListener ( 'close' , dialogClosed ) ;
126- } ;
127- } , [ dialog ] ) ;
119+ useImperativeHandle ( forwardedRef , ( ) => ( { dismissAndClose} ) ) ;
128120
129121 const setCurrentFolder = ( folderId ) => {
130122 setStructure ( prevStructure => {
@@ -230,49 +222,87 @@ export default function FileSelectDialog(props) {
230222 setUploadedFile ( uploadedFiles [ 0 ] ) ;
231223 }
232224
225+ function selectFile ( fileInfo ) {
226+ props . selectFile ( fileInfo ) ;
227+ setUploadedFile ( null ) ;
228+ props . closeDialog ( ) ;
229+ }
230+
231+ function dismissAndClose ( ) {
232+ if ( uploadedFile ?. file_info ) {
233+ const changeUrl = `${ baseUrl } ${ uploadedFile . file_info . id } /change` ;
234+ fetch ( changeUrl , {
235+ method : 'DELETE' ,
236+ headers : {
237+ 'X-CSRFToken' : csrfToken ,
238+ } ,
239+ } ) . then ( async response => {
240+ if ( response . ok ) {
241+ props . selectFile ( null ) ;
242+ } else {
243+ alert ( response . statusText ) ;
244+ }
245+ } ) ;
246+ }
247+ setUploadedFile ( null ) ;
248+ props . closeDialog ( ) ;
249+ }
250+
233251 return ( < >
234252 < div className = "wrapper" ref = { ref } >
235253 { uploadedFile ?
236- < BrowserEditor
237- uploadedFile = { uploadedFile }
238- mainContent = { ref . current }
239- settings = { { csrfToken, baseUrl, selectFile, labels : structure . labels } }
240- /> : < >
241- < MenuBar
242- refreshFilesList = { refreshFilesList }
243- setSearchQuery = { setSearchQuery }
244- openUploader = { ( ) => uploaderRef . current . openUploader ( ) }
245- labels = { structure . labels }
246- />
247- < div className = "browser-body" >
248- < nav className = "folder-structure" >
249- < ul role = "navigation" >
250- { structure . root_folder && < FolderStructure
251- baseUrl = { baseUrl }
252- folder = { structure . root_folder }
253- lastFolderId = { structure . last_folder }
254- setCurrentFolder = { setCurrentFolder }
255- refreshStructure = { refreshStructure }
256- /> }
257- </ ul >
258- </ nav >
259- < FileUploader
260- folderId = { structure . last_folder }
261- handleUpload = { handleUpload }
262- ref = { uploaderRef }
263- settings = { { csrf_token : csrfToken , base_url : baseUrl } }
264- > {
265- structure . files === null ?
266- < div className = "status" > { gettext ( "Loading files…" ) } </ div > :
267- < FilesList
268- structure = { structure }
269- fetchFiles = { fetchFiles }
270- selectFile = { selectFile }
254+ < BrowserEditor
255+ uploadedFile = { uploadedFile }
256+ mainContent = { ref . current }
257+ settings = { { csrfToken, baseUrl, selectFile, dismissAndClose, labels : structure . labels } }
258+ /> : < >
259+ < MenuBar
260+ refreshFilesList = { refreshFilesList }
261+ setSearchQuery = { setSearchQuery }
262+ openUploader = { ( ) => uploaderRef . current . openUploader ( ) }
263+ labels = { structure . labels }
271264 />
272- } </ FileUploader >
273- </ div >
274- </ > }
265+ < div className = "browser-body" >
266+ < nav className = "folder-structure" >
267+ < ul role = "navigation" >
268+ { structure . root_folder && < FolderStructure
269+ baseUrl = { baseUrl }
270+ folder = { structure . root_folder }
271+ lastFolderId = { structure . last_folder }
272+ setCurrentFolder = { setCurrentFolder }
273+ toggleRecursive = { toggleRecursive }
274+ refreshStructure = { refreshStructure }
275+ isListed = { structure . recursive ? false : null }
276+ /> }
277+ </ ul >
278+ </ nav >
279+ < FileUploader
280+ folderId = { structure . last_folder }
281+ handleUpload = { handleUpload }
282+ ref = { uploaderRef }
283+ settings = { { csrf_token : csrfToken , base_url : baseUrl } }
284+ > {
285+ structure . files === null ?
286+ < div className = "status" > { gettext ( "Loading files…" ) } </ div > :
287+ < FilesList
288+ structure = { structure }
289+ fetchFiles = { fetchFiles }
290+ selectFile = { selectFile }
291+ />
292+ } </ FileUploader >
293+ </ div >
294+ </ > }
295+ </ div >
296+ < div
297+ className = "close-button"
298+ role = "button"
299+ onClick = { dismissAndClose }
300+ aria-label = { gettext ( "Close dialog" ) }
301+ >
302+ < CloseIcon />
275303 </ div >
276- < Tooltip id = "django-finder-tooltip" place = "bottom-start" />
304+ < Tooltip id = "django-finder-tooltip" place = "bottom-start" />
277305 </ > ) ;
278- }
306+ } ) ;
307+
308+ export default FileSelectDialog ;
0 commit comments