@@ -6,42 +6,58 @@ import { readFile } from '../toolbarActions/toolbarFunctions';
66
77const app = ( { superState, dispatcher } ) => {
88 const fileRef = React . useRef ( ) ;
9+ const superStateRef = React . useRef ( superState ) ;
10+ const dispatcherRef = React . useRef ( dispatcher ) ;
11+
12+ useEffect ( ( ) => {
13+ superStateRef . current = superState ;
14+ dispatcherRef . current = dispatcher ;
15+ } ) ;
916
1017 useEffect ( ( ) => {
1118 dispatcher ( { type : T . SET_FILE_REF , payload : fileRef } ) ;
1219 const p = document . getElementsByTagName ( 'body' ) [ 0 ] ;
1320 const c = document . getElementsByClassName ( 'drag-drop-area' ) [ 0 ] ;
1421 let cc = 0 ;
15- p . addEventListener ( 'dragenter' , ( e ) => {
22+
23+ const onDragEnter = ( e ) => {
1624 e . preventDefault ( ) ;
1725 cc += 1 ;
1826 if ( cc === 1 ) c . classList . remove ( 'hidden' ) ;
19- } ) ;
20- p . addEventListener ( 'dragleave' , ( e ) => {
27+ } ;
28+ const onDragLeave = ( e ) => {
2129 e . preventDefault ( ) ;
2230 cc -= 1 ;
2331 if ( cc === 0 ) c . classList . add ( 'hidden' ) ;
24- } ) ;
25-
26- p . addEventListener ( 'dragover' , ( e ) => {
32+ } ;
33+ const onDragOver = ( e ) => { e . preventDefault ( ) ; } ;
34+ const onDragReset = ( e ) => {
2735 e . preventDefault ( ) ;
28- } ) ;
29- [ 'dragend' , 'dragexit' , 'drop' ] . forEach ( ( dragEvent ) => {
30- p . addEventListener ( dragEvent , ( e ) => {
31- e . preventDefault ( ) ;
32- cc = 0 ;
33- c . classList . add ( 'hidden' ) ;
34- } ) ;
35- } ) ;
36-
37- p . addEventListener ( 'drop' , ( e ) => {
36+ cc = 0 ;
37+ c . classList . add ( 'hidden' ) ;
38+ } ;
39+ const onDrop = ( e ) => {
3840 e . preventDefault ( ) ;
3941 fileRef . current . value = null ;
4042 if ( e . dataTransfer . files . length === 1
4143 && e . dataTransfer . files [ 0 ] . name . split ( '.' ) . slice ( - 1 ) [ 0 ] === 'graphml' ) {
42- readFile ( superState , dispatcher , e . dataTransfer . files [ 0 ] ) ;
44+ readFile ( superStateRef . current , dispatcherRef . current , e . dataTransfer . files [ 0 ] ) ;
4345 }
44- } ) ;
46+ } ;
47+
48+ p . addEventListener ( 'dragenter' , onDragEnter ) ;
49+ p . addEventListener ( 'dragleave' , onDragLeave ) ;
50+ p . addEventListener ( 'dragover' , onDragOver ) ;
51+ [ 'dragend' , 'dragexit' , 'drop' ] . forEach ( ( dragEvent ) => p . addEventListener ( dragEvent , onDragReset ) ) ;
52+ p . addEventListener ( 'drop' , onDrop ) ;
53+
54+ return ( ) => {
55+ p . removeEventListener ( 'dragenter' , onDragEnter ) ;
56+ p . removeEventListener ( 'dragleave' , onDragLeave ) ;
57+ p . removeEventListener ( 'dragover' , onDragOver ) ;
58+ [ 'dragend' , 'dragexit' , 'drop' ] . forEach ( ( dragEvent ) => p . removeEventListener ( dragEvent , onDragReset ) ) ;
59+ p . removeEventListener ( 'drop' , onDrop ) ;
60+ } ;
4561 } , [ ] ) ;
4662 return (
4763 < div className = "drag-drop-area hidden" >
0 commit comments