@@ -73,7 +73,6 @@ import {
7373 ShowStyleVariantId ,
7474} from '@sofie-automation/corelib/dist/dataModel/Ids'
7575import { RundownPlaylistCollectionUtil } from '../../../lib/collections/rundownPlaylistUtil'
76- import { TFunction } from 'react-i18next'
7776
7877interface IBucketPanelDragObject {
7978 id : BucketId
@@ -424,7 +423,7 @@ export const BucketPanel = translateWithTracker<Translated<IBucketPanelProps>, I
424423 window . addEventListener ( MOSEvents . dragleave , this . onDragLeave )
425424
426425 RundownViewEventBus . on ( RundownViewEvents . REVEAL_IN_SHELF , this . onRevealInShelf )
427- RundownViewEventBus . on ( RundownViewEvents . TOGGLE_SHELF_DROPZONE , this . onToggleDropFrame . bind ( this ) )
426+ RundownViewEventBus . on ( RundownViewEvents . TOGGLE_SHELF_DROPZONE , this . onToggleDropFrame )
428427 }
429428
430429 componentDidUpdate ( prevProps : IBucketPanelProps & IBucketPanelTrackedProps ) {
@@ -800,7 +799,7 @@ export const BucketPanel = translateWithTracker<Translated<IBucketPanelProps>, I
800799
801800 private onToggleDropFrame = ( e : ToggleShelfDropzoneEvent ) => {
802801 this . setState ( {
803- dropActive : e . display ,
802+ // dropActive: e.display,
804803 dropFrameActive : e . display ? e . id : null ,
805804 } )
806805 }
@@ -844,7 +843,8 @@ export const BucketPanel = translateWithTracker<Translated<IBucketPanelProps>, I
844843 < div
845844 className = { ClassNames ( 'dashboard-panel' , 'dashboard-panel__panel--bucket' , {
846845 'dashboard-panel__panel--bucket-active' : this . state . dropActive ,
847- 'dashboard-panel__panel--sort-dragging' : this . props . isDragging ,
846+ 'dashboard-panel__panel--sort-dragging' :
847+ ( this . props . isDragging || this . state . dropFrameActive ) && ! this . state . dropActive ,
848848 } ) }
849849 data-bucket-id = { this . props . bucket . _id }
850850 ref = { this . setRef }
@@ -929,8 +929,9 @@ export const BucketPanel = translateWithTracker<Translated<IBucketPanelProps>, I
929929 id = { dropZone . _id }
930930 url = { dropZone . url }
931931 hidden = { this . state . dropFrameActive !== dropZone . _id }
932- t = { this . props . t }
933932 showStyleBaseId = { this . props . showStyleBaseId }
933+ onDragEnter = { this . onDragEnter }
934+ onDragLeave = { this . onDragLeave }
934935 />
935936 ) ) }
936937 </ div >
@@ -950,71 +951,75 @@ interface DropzoneHolderProps {
950951 bucketId : BucketId
951952 url : string
952953 hidden : boolean
953- t : TFunction < 'translation' , undefined >
954954 showStyleBaseId : ShowStyleBaseId
955+
956+ onDragEnter ?: ( ) => void
957+ onDragLeave ?: ( ) => void
955958}
956959const DropzoneHolder = ( props : DropzoneHolderProps ) => {
957- let frame : HTMLIFrameElement | null = null
958- let mounted = false
959-
960- const setDropzoneElement = ( frameRef : HTMLIFrameElement | null ) => {
961- frame = frameRef
962- if ( frame && ! mounted ) {
963- registerHandlers ( )
964- mounted = true
965- } else {
966- unregisterHandlers ( )
967- mounted = false
968- }
969- }
970- const registerHandlers = ( ) => {
971- window . addEventListener ( 'message' , onMessage )
972- }
973- const unregisterHandlers = ( ) => {
974- window . removeEventListener ( 'message' , onMessage )
975- }
960+ const [ dropzoneElementRef , setDropzoneElementRef ] = React . useState < HTMLIFrameElement | null > ( null )
976961
977962 const onMessage = ( event : MessageEvent ) => {
978- if ( event . source === frame ?. contentWindow ) {
979- if ( event . data && event . data . event === 'drop' ) {
980- RundownViewEventBus . emit ( RundownViewEvents . ITEM_DROPPED , {
981- id : props . id ,
982- bucketId : props . bucketId ,
983- ev : event ,
984- } )
985- }
963+ // filter out messages from this panel
964+ if ( event . source !== dropzoneElementRef ?. contentWindow ) return
986965
987- if ( event . data && event . data . event === 'data' && event . data . data . trim ( ) . endsWith ( '</mos>' ) ) {
966+ switch ( event . data ?. event ) {
967+ case 'drop' :
988968 RundownViewEventBus . emit ( RundownViewEvents . ITEM_DROPPED , {
989969 id : props . id ,
990970 bucketId : props . bucketId ,
991- message : event . data . data ,
992971 ev : event ,
993972 } )
994- }
995-
996- if ( event . data && event . data . event === 'error' ) {
973+ if ( props . onDragLeave ) props . onDragLeave ( )
974+ break
975+ case 'data' :
976+ if ( event . data . data . trim ( ) . endsWith ( '</mos>' ) ) {
977+ RundownViewEventBus . emit ( RundownViewEvents . ITEM_DROPPED , {
978+ id : props . id ,
979+ bucketId : props . bucketId ,
980+ message : event . data . data ,
981+ ev : event ,
982+ } )
983+ }
984+ break
985+ case 'error' :
997986 RundownViewEventBus . emit ( RundownViewEvents . ITEM_DROPPED , {
998987 id : props . id ,
999988 bucketId : props . bucketId ,
1000989 error : event . data . message ,
1001990 ev : event ,
1002991 } )
1003- }
992+ break
993+ case 'dragEnter' :
994+ if ( props . onDragEnter ) props . onDragEnter ( )
995+ break
996+ case 'dragLeave' :
997+ if ( props . onDragLeave ) props . onDragLeave ( )
998+ break
1004999 }
10051000 }
10061001
1007- React . useEffect (
1008- ( ) => ( ) => {
1002+ React . useEffect ( ( ) => {
1003+ if ( ! dropzoneElementRef ) return
1004+
1005+ const registerHandlers = ( ) => {
1006+ window . addEventListener ( 'message' , onMessage )
1007+ }
1008+ const unregisterHandlers = ( ) => {
1009+ window . removeEventListener ( 'message' , onMessage )
1010+ }
1011+
1012+ registerHandlers ( )
1013+
1014+ return ( ) => {
10091015 unregisterHandlers ( )
1010- } ,
1011- [ ]
1012- )
1016+ }
1017+ } , [ dropzoneElementRef , onMessage ] )
10131018
10141019 return (
10151020 < div className = "dropzone-panel" style = { { visibility : props . hidden ? 'hidden' : 'visible' } } >
10161021 < iframe
1017- ref = { setDropzoneElement }
1022+ ref = { setDropzoneElementRef }
10181023 className = "external-frame-panel__iframe"
10191024 src = { props . url }
10201025 sandbox = "allow-forms allow-popups allow-scripts allow-same-origin"
0 commit comments