Skip to content

Commit 598b932

Browse files
committed
fix: remove remaining usages of withMediaObjectStatus
1 parent 02d49bd commit 598b932

File tree

10 files changed

+192
-271
lines changed

10 files changed

+192
-271
lines changed
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import * as React from 'react'
22
import { ISourceLayerItemProps, SourceLayerItem } from './SourceLayerItem'
33
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
4-
import { withMediaObjectStatus, WithMediaObjectStatusProps } from './withMediaObjectStatus'
4+
import { useContentStatusForPieceInstance } from './withMediaObjectStatus'
55
import { UIStudio } from '../../../lib/api/studios'
66

77
interface IPropsHeader extends Omit<ISourceLayerItemProps, 'contentStatus'> {
88
playlist: DBRundownPlaylist
99
studio: UIStudio
1010
}
1111

12-
export const SourceLayerItemContainer = withMediaObjectStatus<IPropsHeader, {}>()(
13-
(props: IPropsHeader & WithMediaObjectStatusProps) => <SourceLayerItem {...props} />
14-
)
12+
export function SourceLayerItemContainer(props: IPropsHeader): JSX.Element {
13+
const contentStatus = useContentStatusForPieceInstance(props.piece.instance)
14+
15+
return <SourceLayerItem {...props} contentStatus={contentStatus} />
16+
}
Lines changed: 4 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,17 @@
1-
import React, { useEffect, useState } from 'react'
21
import { PieceUi } from './SegmentTimelineContainer'
3-
import { ISourceLayer } from '@sofie-automation/blueprints-integration'
42
import { RundownUtils } from '../../lib/rundown'
53
import { IAdLibListItem } from '../Shelf/AdLibListItem'
64
import { BucketAdLibUi, BucketAdLibActionUi } from '../Shelf/RundownViewBuckets'
75
import { AdLibPieceUi } from '../../lib/shelf'
8-
import { UIStudio } from '../../../lib/api/studios'
96
import { UIBucketContentStatuses, UIPieceContentStatuses } from '../Collections'
10-
import { Piece, PieceStatusCode } from '@sofie-automation/corelib/dist/dataModel/Piece'
7+
import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece'
118
import { PieceContentStatusObj } from '../../../lib/api/pieceContentStatus'
12-
import { deepFreeze } from '@sofie-automation/corelib/dist/lib'
139
import { useTracker } from '../../lib/ReactMeteorData/ReactMeteorData'
1410
import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance'
1511
import { UIBucketContentStatus, UIPieceContentStatus } from '../../../lib/api/rundownNotifications'
1612
import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece'
1713
import { ReadonlyDeep } from 'type-fest'
1814

19-
type AnyPiece = {
20-
piece?: BucketAdLibUi | IAdLibListItem | AdLibPieceUi | PieceUi | BucketAdLibActionUi | undefined
21-
layer?: ISourceLayer | undefined
22-
isLiveLine?: boolean
23-
studio: UIStudio | undefined
24-
}
25-
26-
type IWrappedComponent<IProps extends AnyPiece, IState> = new (props: IProps, state: IState) => React.Component<
27-
IProps,
28-
IState
29-
>
30-
31-
const DEFAULT_STATUS = deepFreeze<PieceContentStatusObj>({
32-
status: PieceStatusCode.UNKNOWN,
33-
messages: [],
34-
progress: undefined,
35-
36-
blacks: [],
37-
freezes: [],
38-
scenes: [],
39-
40-
thumbnailUrl: undefined,
41-
previewUrl: undefined,
42-
43-
packageName: null,
44-
45-
contentDuration: undefined,
46-
})
47-
4815
function unwrapPieceInstance(piece: BucketAdLibUi | IAdLibListItem | AdLibPieceUi | PieceUi | BucketAdLibActionUi) {
4916
if (RundownUtils.isPieceInstance(piece)) {
5017
return piece.instance.piece
@@ -82,52 +49,11 @@ function getStatusDocForPiece(
8249
})
8350
}
8451

52+
/** @deprecated */
8553
export interface WithMediaObjectStatusProps {
8654
contentStatus: ReadonlyDeep<PieceContentStatusObj> | undefined
8755
}
8856

89-
/**
90-
* @deprecated This can now be achieved by a simple minimongo query against either UIPieceContentStatuses or UIBucketContentStatuses
91-
*/
92-
export function withMediaObjectStatus<IProps extends AnyPiece, IState>(): (
93-
WrappedComponent:
94-
| IWrappedComponent<IProps & WithMediaObjectStatusProps, IState>
95-
| React.FC<IProps & WithMediaObjectStatusProps>
96-
) => React.FC<IProps> {
97-
return (WrappedComponent) => {
98-
return function WithMediaObjectStatusHOCComponent(props: IProps) {
99-
const [invalidationToken, setInvalidationToken] = useState(Date.now())
100-
useEffect(() => {
101-
// Force an invalidation shortly after mounting
102-
const callback = window.requestIdleCallback(
103-
() => {
104-
setInvalidationToken(Date.now())
105-
},
106-
{
107-
timeout: 500,
108-
}
109-
)
110-
return () => {
111-
window.cancelIdleCallback(callback)
112-
}
113-
}, [])
114-
115-
const statusObj: ReadonlyDeep<PieceContentStatusObj> | undefined = useTracker(() => {
116-
const { piece, studio, layer } = props
117-
118-
// Check item status
119-
if (piece && (piece.sourceLayer || layer) && studio) {
120-
// Extract the status or populate some default values
121-
return getStatusDocForPiece(piece)?.status ?? DEFAULT_STATUS
122-
}
123-
return undefined
124-
}, [props.piece, props.studio, props.isLiveLine, invalidationToken])
125-
126-
return <WrappedComponent {...props} contentStatus={statusObj} />
127-
}
128-
}
129-
}
130-
13157
export function useContentStatusForAdlibPiece(
13258
piece: Pick<AdLibPiece, '_id' | 'rundownId'> | undefined
13359
): PieceContentStatusObj | undefined {
@@ -183,7 +109,7 @@ export function useContentStatusForPieceInstance(
183109
}
184110

185111
export function useContentStatusForItem(
186-
piece: BucketAdLibUi | IAdLibListItem | AdLibPieceUi | PieceUi | BucketAdLibActionUi
112+
piece: BucketAdLibUi | IAdLibListItem | AdLibPieceUi | PieceUi | BucketAdLibActionUi | undefined
187113
): ReadonlyDeep<PieceContentStatusObj> | undefined {
188-
return useTracker(() => getStatusDocForPiece(piece)?.status, [piece])
114+
return useTracker(() => piece && getStatusDocForPiece(piece)?.status, [piece])
189115
}
Lines changed: 54 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import * as React from 'react'
22
import ClassNames from 'classnames'
33
import { ISourceLayer, IOutputLayer, IBlueprintActionTriggerMode } from '@sofie-automation/blueprints-integration'
4-
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
54
import { unprotectString } from '../../../lib/lib'
65
import renderItem from './Renderers/ItemRendererFactory'
7-
import { withMediaObjectStatus, WithMediaObjectStatusProps } from '../SegmentTimeline/withMediaObjectStatus'
6+
import { useContentStatusForAdlibPiece } from '../SegmentTimeline/withMediaObjectStatus'
87
import { ContextMenuTrigger } from '@jstarpl/react-contextmenu'
98
import { contextMenuHoldToDisplayTime } from '../../lib/lib'
109
import { setShelfContextMenuContext, ContextType as MenuContextType } from './ShelfContextMenu'
@@ -27,61 +26,59 @@ interface IListViewItemProps {
2726
disabled?: boolean
2827
onSelectAdLib?: (aSLine: IAdLibListItem) => void
2928
onToggleAdLib?: (aSLine: IAdLibListItem, queue: boolean, context: any, mode?: IBlueprintActionTriggerMode) => void
30-
playlist: DBRundownPlaylist
3129
}
3230

33-
export const AdLibListItem = withMediaObjectStatus<IListViewItemProps, {}>()(
34-
class AdLibListItem extends React.Component<IListViewItemProps & WithMediaObjectStatusProps> {
35-
constructor(props: IListViewItemProps & WithMediaObjectStatusProps) {
36-
super(props)
37-
}
31+
export function AdLibListItem({
32+
piece,
33+
studio,
34+
layer,
35+
selected,
36+
disabled,
37+
onSelectAdLib,
38+
onToggleAdLib,
39+
}: IListViewItemProps): JSX.Element {
40+
const contentStatus = useContentStatusForAdlibPiece(piece)
3841

39-
render(): JSX.Element {
40-
return (
41-
<ContextMenuTrigger
42-
id="shelf-context-menu"
43-
attributes={{
44-
className: ClassNames('adlib-panel__list-view__list__segment__item', {
45-
selected: this.props.selected,
46-
invalid: this.props.piece.invalid,
47-
floated: this.props.piece.floated,
48-
disabled: this.props.disabled,
49-
}),
50-
//@ts-expect-error React.HTMLAttributes does not list data attributes, but that's fine
51-
'data-obj-id': this.props.piece._id,
52-
onClick: () => this.props.onSelectAdLib && this.props.onSelectAdLib(this.props.piece),
53-
onContextMenu: () => this.props.onSelectAdLib && this.props.onSelectAdLib(this.props.piece),
54-
onDoubleClick: (e) =>
55-
!this.props.disabled &&
56-
this.props.onToggleAdLib &&
57-
this.props.onToggleAdLib(this.props.piece, e.shiftKey, e),
58-
}}
59-
collect={() =>
60-
setShelfContextMenuContext({
61-
type: MenuContextType.ADLIB,
62-
details: {
63-
adLib: this.props.piece,
64-
onToggle: !this.props.disabled ? this.props.onToggleAdLib : undefined,
65-
disabled: this.props.disabled,
66-
},
67-
})
68-
}
69-
holdToDisplay={contextMenuHoldToDisplayTime()}
70-
renderTag="tr"
71-
key={unprotectString(this.props.piece._id)}
72-
>
73-
{renderItem({
74-
adLibListItem: this.props.piece,
75-
contentStatus: this.props.contentStatus,
76-
layer: this.props.layer,
77-
outputLayer: this.props.piece.outputLayer,
78-
selected: this.props.selected,
79-
status: this.props.contentStatus?.status,
80-
messages: this.props.contentStatus?.messages,
81-
studio: this.props.studio,
82-
})}
83-
</ContextMenuTrigger>
84-
)
85-
}
86-
}
87-
)
42+
return (
43+
<ContextMenuTrigger
44+
id="shelf-context-menu"
45+
attributes={{
46+
className: ClassNames('adlib-panel__list-view__list__segment__item', {
47+
selected: selected,
48+
invalid: piece.invalid,
49+
floated: piece.floated,
50+
disabled: disabled,
51+
}),
52+
//@ts-expect-error React.HTMLAttributes does not list data attributes, but that's fine
53+
'data-obj-id': piece._id,
54+
onClick: () => onSelectAdLib && onSelectAdLib(piece),
55+
onContextMenu: () => onSelectAdLib && onSelectAdLib(piece),
56+
onDoubleClick: (e) => !disabled && onToggleAdLib && onToggleAdLib(piece, e.shiftKey, e),
57+
}}
58+
collect={() =>
59+
setShelfContextMenuContext({
60+
type: MenuContextType.ADLIB,
61+
details: {
62+
adLib: piece,
63+
onToggle: !disabled ? onToggleAdLib : undefined,
64+
disabled: disabled,
65+
},
66+
})
67+
}
68+
holdToDisplay={contextMenuHoldToDisplayTime()}
69+
renderTag="tr"
70+
key={unprotectString(piece._id)}
71+
>
72+
{renderItem({
73+
adLibListItem: piece,
74+
contentStatus: contentStatus,
75+
layer: layer,
76+
outputLayer: piece.outputLayer,
77+
selected: selected,
78+
status: contentStatus?.status,
79+
messages: contentStatus?.messages,
80+
studio: studio,
81+
})}
82+
</ContextMenuTrigger>
83+
)
84+
}

meteor/client/ui/Shelf/AdLibListView.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { RundownUtils } from '../../lib/rundown'
55
import { AdLibListItem, IAdLibListItem } from './AdLibListItem'
66
import { AdLibPieceUi, AdlibSegmentUi } from '../../lib/shelf'
77
import { RundownLayoutFilter, RundownLayoutFilterBase } from '../../../lib/collections/RundownLayouts'
8-
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
98
import { BucketAdLibActionUi, BucketAdLibUi } from './RundownViewBuckets'
109
import { PieceUi } from '../SegmentContainer/withResolvedSegment'
1110
import { IBlueprintActionTriggerMode } from '@sofie-automation/blueprints-integration'
@@ -24,7 +23,6 @@ interface IListViewPropsHeader {
2423
noSegments: boolean
2524
filter: RundownLayoutFilter | undefined
2625
rundownAdLibs?: Array<AdLibPieceUi>
27-
playlist: DBRundownPlaylist
2826
studio: UIStudio
2927
}
3028

@@ -208,7 +206,6 @@ export function AdLibListView(props: Readonly<IListViewPropsHeader>): JSX.Elemen
208206
disabled={adLibPiece.disabled ?? false}
209207
onToggleAdLib={props.onToggleAdLib}
210208
onSelectAdLib={props.onSelectAdLib}
211-
playlist={props.playlist}
212209
/>
213210
)
214211
}

meteor/client/ui/Shelf/AdLibPanel.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,6 @@ export function AdLibPanel({
760760
showStyleBase={showStyleBase}
761761
searchFilter={searchFilter}
762762
filter={filter as RundownLayoutFilter}
763-
playlist={playlist}
764763
studio={studio}
765764
noSegments={!withSegments}
766765
/>

meteor/client/ui/Shelf/AdLibRegionPanel.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import {
2525
} from '../../lib/shelf'
2626
import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance'
2727
import { PieceUi } from '../SegmentTimeline/SegmentTimelineContainer'
28-
import { withMediaObjectStatus, WithMediaObjectStatusProps } from '../SegmentTimeline/withMediaObjectStatus'
28+
import { useContentStatusForPieceInstance, WithMediaObjectStatusProps } from '../SegmentTimeline/withMediaObjectStatus'
2929
import { ISourceLayer } from '@sofie-automation/blueprints-integration'
3030
import { UIStudios } from '../Collections'
3131
import { Meteor } from 'meteor/meteor'
@@ -233,10 +233,15 @@ class AdLibRegionPanelBase extends React.Component<
233233
}
234234
}
235235

236-
export const AdLibRegionPanelWithStatus = withMediaObjectStatus<
237-
Translated<IAdLibPanelProps & IAdLibRegionPanelProps & AdLibFetchAndFilterProps & IAdLibRegionPanelTrackedProps>,
238-
{}
239-
>()(AdLibRegionPanelBase)
236+
function AdLibRegionPanelWithStatus(
237+
props: Translated<
238+
IAdLibPanelProps & IAdLibRegionPanelProps & AdLibFetchAndFilterProps & IAdLibRegionPanelTrackedProps
239+
>
240+
) {
241+
const contentStatus = useContentStatusForPieceInstance(props.piece?.instance)
242+
243+
return <AdLibRegionPanelBase {...props} contentStatus={contentStatus} />
244+
}
240245

241246
export const AdLibRegionPanel = translateWithTracker<
242247
Translated<IAdLibPanelProps & IAdLibRegionPanelProps>,

0 commit comments

Comments
 (0)