Skip to content
This repository was archived by the owner on Feb 18, 2025. It is now read-only.

Commit 119a6ee

Browse files
committed
chore: first commit
1 parent 9a9d01e commit 119a6ee

26 files changed

+6082
-0
lines changed

.editorconfig

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
root = true
2+
3+
[*]
4+
indent_style = space
5+
indent_size = 2
6+
trim_trailing_whitespace = true
7+
insert_final_newline = true
8+
9+
[*.sh]
10+
indent_style = tab
11+
indent_size = 2
12+
13+
[Makefile]
14+
indent_style = tab

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
node_modules
2+
dist
3+
.vscode
4+
yarn-error.log

index.html

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="UTF-8" />
6+
<meta name="google" content="notranslate">
7+
<meta name="apple-mobile-web-app-capable" content="yes">
8+
<meta name="apple-mobile-web-app-status-bar-style" content="black">
9+
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no">
10+
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
11+
<title>Web-Player-SDK UI Samples</title>
12+
<link href="dist/bundle.css" rel="stylesheet">
13+
<style>
14+
html {
15+
height: 100%;
16+
}
17+
18+
body {
19+
height: 100%;
20+
min-height: 100%;
21+
}
22+
23+
#app-container {
24+
height: 100%;
25+
padding: 0;
26+
margin: 0;
27+
}
28+
</style>
29+
</head>
30+
31+
<body>
32+
<div id="app-container"></div>
33+
<script type="text/javascript" src="dist/bundle.js"></script>
34+
</body>
35+
36+
</html>

package.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"name": "player-ui-customization-sample",
3+
"version": "1.0.0",
4+
"main": "index.js",
5+
"author": "kiwi <[email protected]>",
6+
"license": "MIT",
7+
"scripts": {
8+
"start": "webpack-dev-server"
9+
},
10+
"dependencies": {
11+
"@material-ui/core": "^4.9.5",
12+
"@material-ui/icons": "^4.9.1",
13+
"@types/react-dom": "^16.9.5",
14+
"clsx": "^1.1.0",
15+
"lodash": "^4.17.15",
16+
"prop-types": "^15.7.2",
17+
"react": "^16.13.0",
18+
"react-dom": "^16.13.0",
19+
"typescript": "^3.8.3",
20+
"webpack": "^4.41.6"
21+
},
22+
"devDependencies": {
23+
"@types/lodash": "^4.14.149",
24+
"@types/react": "^16.9.23",
25+
"http-server": "^0.12.1",
26+
"npm-run-all": "^4.1.5",
27+
"svg-inline-loader": "^0.8.2",
28+
"ts-loader": "^6.2.1",
29+
"webpack-cli": "^3.3.11",
30+
"webpack-dev-server": "^3.10.3"
31+
}
32+
}

src/index.tsx

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
import React, { useEffect, useState } from 'react'
2+
import _ from 'lodash'
3+
import ReactDOM from 'react-dom'
4+
5+
import BodyContainer from './uiComponents/BodyContainer'
6+
import PlayButton from './uiComponents/PlayerUi/BigButton/PlayButton'
7+
import LoadingIcon from './uiComponents/PlayerUi/BigButton/LoadingIcon'
8+
9+
import initStraasPlayer from './straasPlayer'
10+
import ControlPanel from './uiComponents/PlayerUi/ControlPanel/ControlPanel'
11+
12+
const eventDispatcher: HTMLElement = document.getElementById('app-container')!
13+
14+
function triggerPlay(eventDispatcher: HTMLElement, stateSetter: React.Dispatch<React.SetStateAction<boolean>>) {
15+
eventDispatcher.dispatchEvent(new Event('requestPlay'))
16+
stateSetter(true)
17+
}
18+
19+
type IndexableObject = {
20+
[index: string]: any
21+
}
22+
23+
function initShowControlPanelFunction() {
24+
let isShowControlPanel: boolean = false
25+
let setShowControlPanel: React.Dispatch<React.SetStateAction<boolean>> = () => { }
26+
const debouncedHideControl = _.debounce(function hideControl() {
27+
if (isShowControlPanel) {
28+
setShowControlPanel(!isShowControlPanel)
29+
}
30+
}, 5000)
31+
32+
return _.throttle(function showControl(
33+
localIsShowControlPanel: boolean,
34+
localSetShowControlPanel: React.Dispatch<React.SetStateAction<boolean>>
35+
) {
36+
isShowControlPanel = localIsShowControlPanel
37+
setShowControlPanel = localSetShowControlPanel
38+
if (isShowControlPanel) {
39+
debouncedHideControl()
40+
}
41+
else {
42+
setShowControlPanel(!isShowControlPanel)
43+
}
44+
}, 1000, { leading: true })
45+
}
46+
47+
const showControlFunction = initShowControlPanelFunction()
48+
49+
const App = () => {
50+
const className = 'body-container'
51+
const [isPlayerReady, setPlayerReady] = useState(false)
52+
const [isShowControlPanel, setShowControlPanel] = useState(true)
53+
const [isPlayInited, setPlayInited] = useState(false)
54+
const [hasPlayed, setHasPlayed] = useState(false)
55+
const [isPlaying, setPlaying] = useState(false)
56+
const [currentTime, setCurrentTime] = useState(0)
57+
const [isFullscreen, setFullscreen] = useState(false)
58+
const [levels, setLevels] = useState([])
59+
const [currentLevel, setCurrentLevel] = useState({})
60+
const [duration, setDuration] = useState(0)
61+
const [levelSwitching, setLevelSwitching] = useState(false)
62+
const [playbackSpeed, setPlaybackSpeed] = useState(0)
63+
const [volume, setVolume] = useState(0)
64+
const [muted, setMuted] = useState(false)
65+
const [playerInstance, setPlayerInstance] = useState<IndexableObject | null>(null)
66+
67+
eventDispatcher.addEventListener('canplay', () => {
68+
setPlayerReady(true)
69+
})
70+
71+
eventDispatcher.addEventListener('play', () => {
72+
setPlaying(true)
73+
})
74+
75+
eventDispatcher.addEventListener('paused', () => {
76+
setPlaying(false)
77+
})
78+
79+
document.body.addEventListener('fullscreenchange', () => {
80+
setFullscreen(!!document.fullscreenElement)
81+
})
82+
83+
eventDispatcher.addEventListener('timeUpdate', () => {
84+
if (playerInstance) {
85+
setCurrentTime(playerInstance.currentTime)
86+
setDuration(_.isFinite(playerInstance.duration) ? playerInstance.duration : 0)
87+
}
88+
})
89+
90+
eventDispatcher.addEventListener('levelMenuRendered', () => {
91+
if (playerInstance) {
92+
setLevels(playerInstance.levels)
93+
}
94+
})
95+
96+
eventDispatcher.addEventListener('levelChange', () => {
97+
if (playerInstance) {
98+
setCurrentLevel(playerInstance.level)
99+
}
100+
101+
setLevelSwitching(false)
102+
})
103+
104+
eventDispatcher.addEventListener('requestLevelChange', () => {
105+
setLevelSwitching(true)
106+
})
107+
108+
eventDispatcher.addEventListener('playing', () => {
109+
playerInstance && setPlaybackSpeed(playerInstance.playbackSpeed)
110+
})
111+
112+
eventDispatcher.addEventListener('playbackSpeedChange', () => {
113+
playerInstance && setPlaybackSpeed(playerInstance.playbackSpeed)
114+
})
115+
116+
eventDispatcher.addEventListener('volumeChange', () => {
117+
playerInstance && setVolume(playerInstance.volume)
118+
playerInstance && setMuted(playerInstance.muted)
119+
})
120+
121+
useEffect(() => {
122+
(async () => {
123+
if (!isPlayInited) {
124+
setPlayInited(true)
125+
setPlayerInstance(await initStraasPlayer(`.${className}`, eventDispatcher))
126+
}
127+
})()
128+
})
129+
130+
return (
131+
<BodyContainer onMouseMove={() => { showControlFunction(isShowControlPanel, setShowControlPanel) }}>
132+
<BodyContainer>
133+
<div style={{ width: '100%', height: '100%' }} className={className} />
134+
</BodyContainer>
135+
{isPlayerReady ? <PlayButton
136+
isPaused={!hasPlayed || !isPlaying}
137+
play={() => triggerPlay(eventDispatcher, setHasPlayed)} /> :
138+
<LoadingIcon />}
139+
{playerInstance ?
140+
<ControlPanel
141+
showControlPanel={hasPlayed && isShowControlPanel}
142+
duration={duration}
143+
currentTime={currentTime}
144+
eventDispatcher={eventDispatcher}
145+
isPlaying={isPlaying}
146+
isFullscreen={isFullscreen}
147+
levels={levels}
148+
currentLevel={currentLevel}
149+
levelSwitching={levelSwitching}
150+
playbackSpeed={playbackSpeed}
151+
volume={volume}
152+
muted={muted}
153+
/> : null}
154+
</BodyContainer >
155+
)
156+
}
157+
158+
ReactDOM.render(<App />, eventDispatcher)
159+

0 commit comments

Comments
 (0)