@@ -26,6 +26,13 @@ import { AdLibPieceUi } from '../../lib/shelf'
26
26
import { protectString } from '../../lib/tempLib'
27
27
import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios'
28
28
import { PieceStatusCode } from '@sofie-automation/corelib/dist/dataModel/Piece'
29
+ import {
30
+ convertPreviewToContents ,
31
+ convertSourceLayerItemToPreview ,
32
+ IPreviewPopUpContext ,
33
+ IPreviewPopUpSession ,
34
+ PreviewPopUpContext ,
35
+ } from '../PreviewPopUp/PreviewPopUpContext'
29
36
30
37
export interface IDashboardButtonProps {
31
38
piece : IAdLibListItem
@@ -51,6 +58,9 @@ export interface IDashboardButtonProps {
51
58
canOverflowHorizontally ?: boolean
52
59
lineBreak ?: string
53
60
}
61
+ interface WithPreviewContext {
62
+ previewContext : IPreviewPopUpContext
63
+ }
54
64
export const DEFAULT_BUTTON_WIDTH = 6.40625
55
65
export const DEFAULT_BUTTON_HEIGHT = 5.625
56
66
export const HOVER_TIMEOUT = 5000
@@ -63,7 +73,7 @@ interface IState {
63
73
}
64
74
65
75
export class DashboardPieceButtonBase < T = { } > extends React . Component <
66
- React . PropsWithChildren < IDashboardButtonProps > & T & WithMediaObjectStatusProps ,
76
+ React . PropsWithChildren < IDashboardButtonProps > & T & WithMediaObjectStatusProps & WithPreviewContext ,
67
77
IState
68
78
> {
69
79
private element : HTMLDivElement | null = null
@@ -78,8 +88,9 @@ export class DashboardPieceButtonBase<T = {}> extends React.Component<
78
88
private pointerId : number | null = null
79
89
private hoverTimeout : number | null = null
80
90
protected inBucket = false
91
+ private previewSession : IPreviewPopUpSession | null = null
81
92
82
- constructor ( props : IDashboardButtonProps & T & WithMediaObjectStatusProps ) {
93
+ constructor ( props : IDashboardButtonProps & T & WithMediaObjectStatusProps & WithPreviewContext ) {
83
94
super ( props )
84
95
85
96
this . state = {
@@ -201,7 +212,7 @@ export class DashboardPieceButtonBase<T = {}> extends React.Component<
201
212
this . element = el
202
213
}
203
214
204
- private handleOnMouseEnter = ( _e : React . MouseEvent < HTMLDivElement > | React . TouchEvent < HTMLDivElement > ) => {
215
+ private handleOnMouseEnter = ( e : React . MouseEvent < HTMLDivElement > | React . TouchEvent < HTMLDivElement > ) => {
205
216
if ( this . element ) {
206
217
const { top, left, width, height } = this . element . getBoundingClientRect ( )
207
218
this . positionAndSize = {
@@ -211,12 +222,27 @@ export class DashboardPieceButtonBase<T = {}> extends React.Component<
211
222
height,
212
223
}
213
224
}
214
- this . setState ( { isHovered : true } )
225
+
226
+ const previewContents = this . props . piece . content . popUpPreview
227
+ ? convertPreviewToContents ( this . props . piece . content . popUpPreview , this . props . contentStatus )
228
+ : this . props . layer
229
+ ? convertSourceLayerItemToPreview ( this . props . layer . type , this . props . piece , this . props . contentStatus )
230
+ : [ ]
231
+ if ( ! previewContents . length ) return
232
+
233
+ this . previewSession = this . props . previewContext . requestPreview ( e . target as any , previewContents , {
234
+ time : this . state . timePosition ,
235
+ } )
215
236
}
216
237
217
238
private handleOnMouseLeave = ( _e : React . MouseEvent < HTMLDivElement > | React . TouchEvent < HTMLDivElement > ) => {
218
239
this . setState ( { isHovered : false } )
219
240
this . positionAndSize = null
241
+
242
+ if ( this . previewSession ) {
243
+ this . previewSession . close ( )
244
+ this . previewSession = null
245
+ }
220
246
}
221
247
222
248
private handleOnPointerEnter = ( e : React . PointerEvent < HTMLDivElement > ) => {
@@ -230,8 +256,18 @@ export class DashboardPieceButtonBase<T = {}> extends React.Component<
230
256
}
231
257
}
232
258
if ( e . pointerType === 'mouse' ) {
233
- this . setState ( { isHovered : true } )
234
259
this . startHoverTimeout ( )
260
+
261
+ const previewContents = this . props . piece . content . popUpPreview
262
+ ? convertPreviewToContents ( this . props . piece . content . popUpPreview , this . props . contentStatus )
263
+ : this . props . layer
264
+ ? convertSourceLayerItemToPreview ( this . props . layer . type , this . props . piece , this . props . contentStatus )
265
+ : [ ]
266
+ if ( ! previewContents . length ) return
267
+
268
+ this . previewSession = this . props . previewContext . requestPreview ( e . target as any , previewContents , {
269
+ time : this . state . timePosition ,
270
+ } )
235
271
}
236
272
}
237
273
@@ -242,6 +278,11 @@ export class DashboardPieceButtonBase<T = {}> extends React.Component<
242
278
this . hoverTimeout = null
243
279
}
244
280
this . positionAndSize = null
281
+
282
+ if ( this . previewSession ) {
283
+ this . previewSession . close ( )
284
+ this . previewSession = null
285
+ }
245
286
}
246
287
247
288
private handleOnMouseMove = ( e : React . MouseEvent < HTMLDivElement > ) => {
@@ -267,6 +308,9 @@ export class DashboardPieceButtonBase<T = {}> extends React.Component<
267
308
Meteor . clearTimeout ( this . hoverTimeout )
268
309
this . startHoverTimeout ( )
269
310
}
311
+ if ( this . previewSession ) {
312
+ this . previewSession . setPointerTime ( timePercentage * sourceDuration )
313
+ }
270
314
}
271
315
272
316
private startHoverTimeout = ( ) => {
@@ -491,6 +535,7 @@ export class DashboardPieceButtonBase<T = {}> extends React.Component<
491
535
492
536
export function DashboardPieceButton ( props : React . PropsWithChildren < IDashboardButtonProps > ) : JSX . Element {
493
537
const contentStatus = useContentStatusForAdlibPiece ( props . piece )
538
+ const previewContext = React . useContext ( PreviewPopUpContext )
494
539
495
- return < DashboardPieceButtonBase { ...props } contentStatus = { contentStatus } />
540
+ return < DashboardPieceButtonBase { ...props } contentStatus = { contentStatus } previewContext = { previewContext } />
496
541
}
0 commit comments