Skip to content

Commit cfbaba9

Browse files
author
Mint de Wit
committed
chore: buckets api dragEnter and Leave
1 parent 489c17b commit cfbaba9

File tree

1 file changed

+50
-45
lines changed

1 file changed

+50
-45
lines changed

meteor/client/ui/Shelf/BucketPanel.tsx

Lines changed: 50 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ import {
7373
ShowStyleVariantId,
7474
} from '@sofie-automation/corelib/dist/dataModel/Ids'
7575
import { RundownPlaylistCollectionUtil } from '../../../lib/collections/rundownPlaylistUtil'
76-
import { TFunction } from 'react-i18next'
7776

7877
interface 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
}
956959
const 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

Comments
 (0)