@aller/blink
Version:
A library for tracking user behaviour.
86 lines (76 loc) • 2.1 kB
text/typescript
import { PLAYER_HIDDEN, PLAYER_SHOWN, PLAYER_STICKY } from '../actions';
export interface PlayerEvent {
time: Date;
muted: boolean;
position: number;
volume: number;
sticky?: boolean;
}
export interface PlayerShownEvent extends PlayerEvent {
type: 'shown';
reason: 'tabactive' | 'viewable';
}
export interface PlayerHiddenEvent extends PlayerEvent {
type: 'hidden';
reason: 'tabclose' | 'tabhide' | 'stickyClosed';
}
export interface PlayerStickyEvent extends PlayerEvent {
type: 'sticky';
closed: boolean;
}
export type PlayerStateEvent =
| PlayerShownEvent
| PlayerHiddenEvent
| PlayerStickyEvent;
export interface PlayerState {
[playerId: string]: PlayerStateEvent[];
}
export default function player(state: PlayerState = {}, action: any) {
switch (action.type) {
case PLAYER_SHOWN:
return {
...state,
[action.payload.playerId]: [
...(state[action.payload.playerId] || []),
{
type: 'shown',
reason: action.payload.reason,
time: action.payload.time || new Date(),
muted: action.payload.muted,
position: action.payload.position,
volume: action.payload.volume,
},
],
};
case PLAYER_HIDDEN:
return {
...state,
[action.payload.playerId]: [
...(state[action.payload.playerId] || []),
{
type: 'hidden',
reason: action.payload.reason,
time: action.payload.time || new Date(),
muted: action.payload.muted,
position: action.payload.position,
volume: action.payload.volume,
},
],
};
case PLAYER_STICKY:
return {
...state,
[action.payload.playerId]: [
...(state[action.payload.playerId] || []),
{
type: 'sticky',
time: action.payload.time || new Date(),
sticky: action.payload.sticky,
closed: action.payload.closed,
},
],
};
default:
return state;
}
}