Skip to content

Commit 740c6bc

Browse files
Merge pull request #53 from flowplayer/chore/fa-712/updates
Refactor: [FA-712] useFlowplayer hook
2 parents e9e26c0 + 1e14b2b commit 740c6bc

File tree

7 files changed

+905
-832
lines changed

7 files changed

+905
-832
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
### Resources
1717
<!-- [Documentation](https://developer.wowza.com/docs/wowza-flowplayer/guides/add-the-player-using-typescript.md/) -->
18-
* [Examples and Guides](https://developer.wowza.com/docs/wowza-flowplayer/player/embed/embed-with-standalone/#use-npm)
18+
* [Examples and Guides](https://developer.wowza.com/docs/wowza-flowplayer/player/components/react/)
1919
* [Releases](https://github.com/flowplayer/react-flowplayer/releases)
2020
* [Support](https://www.wowza.com/support)
2121

demo/demo.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ const Main = () => {
3939
// Listen to player events for the demo
4040
useEffect(() => {
4141
if (!playerApi) return;
42-
playerApi.on([PAUSE, PLAYING], stateHandler);
42+
playerApi.on(PAUSE, stateHandler);
43+
playerApi.on(PLAYING, stateHandler);
4344

4445
return () => {
4546
// Cleanup on unmount

package.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,23 @@
1616
"prepublish": "yarn build"
1717
},
1818
"peerDependencies": {
19-
"@flowplayer/player": "^3.11.1",
19+
"@flowplayer/player": "^3.21.0",
2020
"react": ">= 17.0.2"
2121
},
2222
"devDependencies": {
23-
"@flowplayer/player": "^3.11.1",
23+
"@flowplayer/player": "^3.21.0",
2424
"@types/react": "^16.9.55",
2525
"@types/react-dom": "^16.9.9",
26-
"css-loader": "^5.0.1",
26+
"css-loader": "^7.1.2",
2727
"react": "^17.0.2",
2828
"react-dom": "^17.0.2",
29-
"style-loader": "^2.0.0",
30-
"ts-loader": "^9.3.1",
31-
"tsd": "^0.31.0",
32-
"typescript": "^4.7.4",
33-
"webpack": "^5.73.0",
34-
"webpack-cli": "^4.10.0",
35-
"webpack-dev-server": "4.9.2"
29+
"style-loader": "^4.0.0",
30+
"ts-loader": "^9.5.2",
31+
"tsd": "^0.31.2",
32+
"typescript": "^5.7.3",
33+
"webpack": "^5.97.1",
34+
"webpack-cli": "^6.0.1",
35+
"webpack-dev-server": "^5.2.0"
3636
},
3737
"files": [
3838
"lib/*.js",

src/hooks.tsx

Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,16 @@
1-
import { RefObject, useEffect, useMemo, useState } from "react";
2-
import flowplayer from "@flowplayer/player";
3-
import type { Plugin } from "@flowplayer/player";
4-
/**
5-
* Hook to use Flowplayer API in an async way - tries to solve the chicken/egg problem
6-
*/
1+
import { RefObject, useEffect, useState } from "react";
2+
import flowplayer, { type Player } from "@flowplayer/player";
3+
74
export const useFlowplayer = (ref: RefObject<HTMLDivElement>) => {
8-
// Store flowplayer instances to a state value in order to force re-renders when new instances are available
9-
const [flowplayerInstances, setFlowplayerInstances] = useState(flowplayer.instances.slice());
105

11-
const ReactFlowplayerDetectExtension = useMemo(
12-
() =>
13-
class implements Plugin {
14-
init() {
15-
setFlowplayerInstances(flowplayer.instances.slice());
16-
}
17-
},
18-
[],
19-
);
6+
const [player, setPlayer] = useState<Player>();
207

21-
// Detect new flowplayer instances to keep up to date
228
useEffect(() => {
23-
// If API is already created we don't need the extension
24-
if (
25-
ref?.current &&
26-
(flowplayer.instances as any[]).some((instance) => instance.root == ref?.current)
27-
) {
28-
setFlowplayerInstances(flowplayer.instances.slice());
29-
return () => {};
9+
if (ref.current) {
10+
const newPlayer = flowplayer(ref.current);
11+
setPlayer(newPlayer);
3012
}
31-
flowplayer(ReactFlowplayerDetectExtension);
32-
return () => {
33-
(flowplayer.extensions as any[]).filter((ext) => ext !== ReactFlowplayerDetectExtension);
34-
};
35-
}, []);
13+
}, [ref]);
3614

37-
return useMemo(() => {
38-
return ref?.current ? flowplayer(ref.current) : null;
39-
}, [flowplayerInstances]);
15+
return player;
4016
};

test/index.test-d.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@ import React, { useRef } from "react";
44
import { Player } from "@flowplayer/player";
55

66
// - useFlowplayer returns Player instance -
7-
const playerRef = useRef<HTMLDivElement>(null);
7+
const playerRef = useRef<HTMLDivElement | null>(null);
88
const playerApi = useFlowplayer(playerRef);
9-
expectType<Player | null>(playerApi);
10-
9+
if (playerApi) expectType<Player>(playerApi);
1110
// - basic initalization -
1211
const _uplayer = (
1312
<Flowplayer src={"demoSrc"} token={"DEMO_TOKEN"} ref={playerRef} />

tsconfig.json

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
{
2-
"include": [
3-
"src/*",
4-
"demo/index.d.ts"
5-
],
6-
"exclude": [
7-
"test/**/*.test-d.tsx" // we have a separate task where types are tested
8-
],
9-
"compilerOptions": {
10-
"target": "es2015",
11-
"jsx": "react",
12-
"allowSyntheticDefaultImports": true,
13-
"strict": true,
14-
"outDir": "./lib",
15-
"moduleResolution": "node"
16-
}
17-
}
2+
"include": [
3+
"src/*",
4+
"demo/index.d.ts"
5+
],
6+
"exclude": [
7+
"test/**/*.test-d.tsx" // we have a separate task where types are tested
8+
],
9+
"compilerOptions": {
10+
"target": "es2015",
11+
"jsx": "react",
12+
"skipLibCheck": true,
13+
"allowSyntheticDefaultImports": true,
14+
"strict": true,
15+
"outDir": "./lib",
16+
"moduleResolution": "node"
17+
}
18+
}

0 commit comments

Comments
 (0)