-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathloading.tsx
121 lines (108 loc) · 3.44 KB
/
loading.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import style from '../../styles/style.scss';
import {h, Component, VNode} from 'preact';
import {connect} from 'react-redux';
import {bindActions} from '../../utils';
import {actions} from '../../reducers/loading';
import {withPlayer} from '../player';
import {withEventManager} from '../../event';
import {withLogger, WithLoggerProps} from '../logger';
import {PlayerArea} from '../../components/player-area';
import {Spinner} from '../../components/spinner';
import {ReservedPresetAreas} from '../../reducers/shell';
import {WithPlayerProps} from '../player/with-player';
import {WithEventManagerProps} from '../../event/with-event-manager';
/**
* mapping state to props
* @param {*} state - redux store state
* @returns {Object} - mapped state to this component
*/
const mapStateToProps = state => ({
show: state.loading.show,
isMobile: state.shell.isMobile,
adBreak: state.engine.adBreak,
adIsLinear: state.engine.adIsLinear
});
const COMPONENT_NAME = 'Loading';
/**
* Loading component
*
* @class Loading
* @example <Loading />
* @extends {Component}
*/
@connect(mapStateToProps, bindActions(actions))
@withPlayer
@withEventManager
@withLogger(COMPONENT_NAME)
class Loading extends Component<any, any> {
// class Loading extends Component<WithPlayerProps & WithEventManagerProps & WithLoggerProps, any> {
/**
* Creates an instance of Loading.
* @memberof Loading
*/
constructor() {
super();
}
/**
* after component mounted, set event listener to player state change and update the state of loading spinner accordingly.
*
* @returns {void}
* @memberof Loading
*/
componentDidMount() {
const {player, eventManager} = this.props;
eventManager.listen(player, player.Event.PLAYER_STATE_CHANGED, e => {
const StateType = player.State;
if (
e.payload.newState.type === StateType.IDLE ||
e.payload.newState.type === StateType.PLAYING ||
e.payload.newState.type === StateType.PAUSED
) {
this.props.updateLoadingSpinnerState(false);
} else {
this.props.updateLoadingSpinnerState(true);
}
});
eventManager.listen(player, player.Event.AD_BREAK_START, () => {
this.props.updateLoadingSpinnerState(true);
});
eventManager.listen(player, player.Event.AD_PROGRESS, () => {
this.props.updateLoadingSpinnerState(false);
});
eventManager.listen(player, player.Event.AD_STARTED, () => {
if (this.props.adIsLinear) {
this.props.updateLoadingSpinnerState(false);
}
});
eventManager.listen(player, player.Event.ALL_ADS_COMPLETED, () => {
this.props.updateLoadingSpinnerState(false);
});
eventManager.listen(player, player.Event.AUTOPLAY_FAILED, () => {
this.props.updateLoadingSpinnerState(false);
});
eventManager.listen(player, player.Event.PLAYING, () => {
this.props.updateLoadingSpinnerState(false);
});
}
/**
* render component
*
* @param {*} props - component props
* @returns {React$Element} - component element
* @memberof Loading
*/
render(props: any): VNode | undefined {
if (!props.show) return undefined;
return (
<div className={[style.loadingBackdrop, style.show].join(' ')}>
<div className={style.spinnerContainer}>
<PlayerArea name={ReservedPresetAreas.LoadingSpinner}>
<Spinner />
</PlayerArea>
</div>
</div>
);
}
}
Loading.displayName = COMPONENT_NAME;
export {Loading};