Skip to content

Commit 7119763

Browse files
committed
Rewrite manager as class
1 parent b51c3a6 commit 7119763

File tree

4 files changed

+56
-67
lines changed

4 files changed

+56
-67
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"format": "prettier --write \"src/**/*.ts\"",
1111
"lint": "eslint -c .eslintrc.js src/**",
1212
"vp": "npm version prerelease",
13-
"vpp": "npm version prerelease && npm publish",
13+
"vpp": "npm version prerelease && npm publish --tag beta",
1414
"preversion": "npm run test && npm run lint && npm run format",
1515
"version": "npm run build && git add .",
1616
"postversion": "git push && git push --tags"

src/component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export default class Player extends Vue.with(Props) {
4242
},
4343
onStateChange: (event: YT.OnStateChangeEvent) => {
4444
if (event.data !== -1) {
45-
this.$emit(manager.events[event.data], event);
45+
this.$emit(manager.getEvent(event.data), event);
4646
}
4747
},
4848
onError: (event: YT.OnErrorEvent) => {

src/index.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { App, Plugin } from 'vue';
22

3-
import manager from './manager';
43
import PlayerComponent from './component';
4+
import manager from './manager';
55

66
const plugin: Plugin = {
77
install(app: App): void {
@@ -16,8 +16,7 @@ const plugin: Plugin = {
1616

1717
(window as any).onYouTubeIframeAPIReady = () => {
1818
manager.registerFactory((window.YT as unknown) as YT.Player);
19-
manager.registerEvents();
20-
manager.runBacklog();
19+
manager.runQueue();
2120
};
2221
}
2322
},

src/manager.ts

Lines changed: 52 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,72 @@
11
/**
2-
* ManagerCallbackFunction defines a callback function which is used when registering a new player
2+
* RegisterFunc defines a callback function which is used when registering a new player
33
*/
4-
export type ManagerCallbackFunction = (factory: any, uid: string) => void;
4+
export type RegisterFunc = (factory: any, uid: string) => void;
55

66
/**
7-
* Manager manages multiple player instances
7+
* EventsTree defines a lookup table for events emitted by the youtube player
88
*/
9-
export interface Manager {
10-
factory: any | undefined;
11-
players: Array<ManagerCallbackFunction>;
12-
events: Record<string, string>;
13-
uid: number;
9+
export interface EventsTree {
10+
[key: string]: string;
11+
}
1412

15-
/**
16-
* registerFactory registers the player factory
17-
* @param factory The underlying YT factory (usually window.YT)
18-
*/
19-
registerFactory(factory: any): void;
13+
/**
14+
* Manager keeps track of player events and player instances
15+
*/
16+
export class Manager {
17+
private players!: Array<RegisterFunc>;
18+
private events!: EventsTree;
19+
private factory!: any;
20+
private uid!: number;
2021

21-
/**
22-
* registerEvents registers all player state events
23-
*/
24-
registerEvents(): void;
22+
public constructor() {
23+
this.events = {};
24+
this.events[YT.PlayerState.ENDED] = 'ended';
25+
this.events[YT.PlayerState.PLAYING] = 'playing';
26+
this.events[YT.PlayerState.PAUSED] = 'paused';
27+
this.events[YT.PlayerState.BUFFERING] = 'buffering';
28+
this.events[YT.PlayerState.CUED] = 'cued';
29+
}
2530

26-
/**
27-
* register registers a new player via the manager
28-
* @param callback the callback function executed when the player gets loaded into the component
29-
*/
30-
register(callback: ManagerCallbackFunction): void;
31+
public registerFactory(factory: any): void {
32+
this.factory = factory;
33+
}
3134

32-
/**
33-
* runBacklog iterates over registered players, which were unable to initiate because the YouTube API script wasn't
34-
* ready yet
35-
*/
36-
runBacklog(): void;
37-
}
35+
public register(callback: RegisterFunc): void {
36+
this.uid++;
3837

39-
/**
40-
* createManager creates and returns the default manager
41-
*/
42-
export function createManager(): Manager {
43-
return {
44-
factory: undefined,
45-
players: [],
46-
events: {},
47-
uid: 0,
48-
registerFactory(factory: any): void {
49-
this.factory = factory;
50-
},
51-
registerEvents(): void {
52-
this.events[YT.PlayerState.ENDED] = 'ended';
53-
this.events[YT.PlayerState.PLAYING] = 'playing';
54-
this.events[YT.PlayerState.PAUSED] = 'paused';
55-
this.events[YT.PlayerState.BUFFERING] = 'buffering';
56-
this.events[YT.PlayerState.CUED] = 'cued';
57-
},
58-
register(callback: ManagerCallbackFunction): void {
59-
this.uid++;
38+
if (this.factory != undefined) {
39+
callback(this.factory, `vue-youtube-iframe-${this.uid}`);
40+
return;
41+
}
6042

43+
this.players.push(callback);
44+
}
45+
46+
public runQueue(): void {
47+
this.players.forEach((callback) => {
6148
if (this.factory != undefined) {
49+
this.uid++;
6250
callback(this.factory, `vue-youtube-iframe-${this.uid}`);
63-
return;
6451
}
6552

66-
this.players.push(callback);
67-
},
68-
runBacklog(): void {
69-
this.players.forEach((callback) => {
70-
if (this.factory != undefined) {
71-
this.uid++;
72-
callback(this.factory, `vue-youtube-iframe-${this.uid}`);
73-
}
53+
this.players = [];
54+
});
55+
}
56+
57+
public getEvent(key: string): string {
58+
return this.events[key];
59+
}
60+
}
7461

75-
this.players = [];
76-
});
77-
},
78-
};
62+
/**
63+
* createManager creates and returns the default manager
64+
*/
65+
export function createManager(): Manager {
66+
return new Manager();
7967
}
8068

8169
const manager = createManager();
70+
Object.freeze(manager);
71+
8272
export default manager;

0 commit comments

Comments
 (0)