usePlayer
Hook to access the player store from within a Player Provider
Import
import { usePlayer } from '@videojs/react';Usage
usePlayer has two overloads:
Store access (no subscription) — returns the store instance without subscribing to changes. Use this to access actions or manually subscribe.
function Controls() {
const store = usePlayer();
// Access actions like store.setVolume, store.play, etc.
}Selector-based subscription — returns the selected value and re-renders when it changes (using shallow equality).
function PlayButton() {
const paused = usePlayer((s) => s.paused);
return <button>{paused ? 'Play' : 'Pause'}</button>;
} usePlayer must be called within a Player Provider created by createPlayer. The scoped usePlayer returned from createPlayer is typed to the specific store, while the standalone export from @videojs/react returns an untyped store.
Examples
Basic Usage
Actions
- State
- Paused
- true
- Time
- 0.0s
- Volume
- 100%
import { createPlayer, features } from '@videojs/react';
import { Video } from '@videojs/react/video';
import './BasicUsage.css';
const Player = createPlayer({ features: [...features.video] });
function Actions() {
const store = Player.usePlayer();
return (
<div className="react-use-player-basic__actions">
<span className="react-use-player-basic__heading">Actions</span>
<div className="react-use-player-basic__buttons">
<button type="button" onClick={() => store.play()}>
Play
</button>
<button type="button" onClick={() => store.pause()}>
Pause
</button>
<button type="button" onClick={() => store.changeVolume(0.5)}>
50% Volume
</button>
</div>
</div>
);
}
function StateDisplay() {
const state = Player.usePlayer((s) => ({
paused: s.paused,
currentTime: s.currentTime,
volume: s.volume,
}));
return (
<dl className="react-use-player-basic__state">
<span className="react-use-player-basic__heading">State</span>
<div>
<dt>Paused</dt>
<dd>{String(state.paused)}</dd>
</div>
<div>
<dt>Time</dt>
<dd>{state.currentTime.toFixed(1)}s</dd>
</div>
<div>
<dt>Volume</dt>
<dd>{Math.round(state.volume * 100)}%</dd>
</div>
</dl>
);
}
export default function BasicUsage() {
return (
<Player.Provider>
<Player.Container className="react-use-player-basic">
<Video
src="https://stream.mux.com/lhnU49l1VGi3zrTAZhDm9LUUxSjpaPW9BL4jY25Kwo4/highest.mp4"
autoPlay
muted
playsInline
/>
<div className="react-use-player-basic__panel">
<Actions />
<StateDisplay />
</div>
</Player.Container>
</Player.Provider>
);
}
.react-use-player-basic {
position: relative;
}
.react-use-player-basic video {
width: 100%;
}
.react-use-player-basic__panel {
display: flex;
gap: 16px;
padding: 12px;
background: rgba(0, 0, 0, 0.05);
border-top: 1px solid rgba(0, 0, 0, 0.1);
}
.react-use-player-basic__heading {
font-weight: 600;
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.05em;
color: #6b7280;
}
.react-use-player-basic__actions {
display: flex;
flex-direction: column;
gap: 8px;
}
.react-use-player-basic__buttons {
display: flex;
gap: 6px;
}
.react-use-player-basic__buttons button {
padding: 4px 12px;
border-radius: 6px;
border: 1px solid #ccc;
background: white;
cursor: pointer;
font-size: 0.8125rem;
}
.react-use-player-basic__state {
display: flex;
flex-direction: column;
gap: 4px;
margin: 0;
font-size: 0.8125rem;
}
.react-use-player-basic__state div {
display: flex;
gap: 8px;
}
.react-use-player-basic__state dt {
color: #6b7280;
min-width: 60px;
}
.react-use-player-basic__state dd {
margin: 0;
font-variant-numeric: tabular-nums;
}
API Reference
Overload 1
Access the player store from within a Player Provider.
Return Value
UnknownStore
Overload 2
Parameters
| Parameter | Type | Default | |
|---|---|---|---|
selector* | ((state: UnknownState) => R) | — |
Return Value
R