@maas/vue-equipment 1.0.0-beta.12 → 1.0.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/nuxt/module.json +1 -1
  2. package/dist/plugins/.turbo/turbo-lint.log +2 -2
  3. package/dist/plugins/MagicPlayer/src/components/MagicPlayerAudio.vue +11 -6
  4. package/dist/plugins/MagicPlayer/src/components/MagicPlayerAudioControls.vue +31 -10
  5. package/dist/plugins/MagicPlayer/src/components/MagicPlayerAudioControls.vue.d.ts +8 -5
  6. package/dist/plugins/MagicPlayer/src/components/MagicPlayerDisplayTime.vue +6 -5
  7. package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue +5 -2
  8. package/dist/plugins/MagicPlayer/src/components/MagicPlayerOverlay.vue +6 -6
  9. package/dist/plugins/MagicPlayer/src/components/MagicPlayerOverlay.vue.d.ts +3 -3
  10. package/dist/plugins/MagicPlayer/src/components/MagicPlayerPoster.vue +5 -9
  11. package/dist/plugins/MagicPlayer/src/components/MagicPlayerPoster.vue.d.ts +1 -2
  12. package/dist/plugins/MagicPlayer/src/components/MagicPlayerProvider.vue +17 -23
  13. package/dist/plugins/MagicPlayer/src/components/MagicPlayerProvider.vue.d.ts +5 -5
  14. package/dist/plugins/MagicPlayer/src/components/MagicPlayerTimeline.vue +91 -83
  15. package/dist/plugins/MagicPlayer/src/components/MagicPlayerVideo.vue +18 -7
  16. package/dist/plugins/MagicPlayer/src/components/MagicPlayerVideoControls.vue +53 -24
  17. package/dist/plugins/MagicPlayer/src/components/MagicPlayerVideoControls.vue.d.ts +8 -6
  18. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerAudioApi.d.ts +0 -4
  19. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerAudioApi.mjs +6 -47
  20. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerControlsApi.d.ts +4 -31
  21. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerControlsApi.mjs +147 -234
  22. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerMediaApi.d.ts +1 -15
  23. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerMediaApi.mjs +17 -164
  24. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerRuntime.d.ts +0 -1
  25. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerRuntime.mjs +6 -24
  26. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerState.d.ts +7 -0
  27. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerState.mjs +56 -0
  28. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerVideoApi.d.ts +0 -5
  29. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerVideoApi.mjs +7 -62
  30. package/dist/plugins/MagicPlayer/src/composables/useMagicPlayer.d.ts +32 -51
  31. package/dist/plugins/MagicPlayer/src/composables/useMagicPlayer.mjs +47 -0
  32. package/dist/plugins/MagicPlayer/src/symbols/index.d.ts +5 -2
  33. package/dist/plugins/MagicPlayer/src/symbols/index.mjs +10 -1
  34. package/dist/plugins/MagicPlayer/src/types/index.d.ts +29 -0
  35. package/package.json +4 -4
  36. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerStateEmitter.d.ts +0 -15
  37. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerStateEmitter.mjs +0 -9
@@ -1,11 +1,13 @@
1
- import { shallowRef, watch, toValue } from "vue";
2
- import { usePlayerStateEmitter } from "./usePlayerStateEmitter.mjs";
1
+ import { shallowRef, toRefs, toValue } from "vue";
3
2
  import { useEventListener } from "@vueuse/core";
3
+ import { usePlayerState } from "./usePlayerState.mjs";
4
4
  export function usePlayerRuntime(args) {
5
5
  let hls;
6
- const loaded = shallowRef(false);
7
6
  const defferedLoading = shallowRef(false);
8
- const { mediaRef, srcType, src } = args;
7
+ const { id, mediaRef, srcType, src } = args;
8
+ const { initializeState } = usePlayerState(toValue(id));
9
+ const state = initializeState();
10
+ const { loaded } = toRefs(state);
9
11
  function useNative() {
10
12
  const el = toValue(mediaRef);
11
13
  if (!el || !src) return;
@@ -61,27 +63,7 @@ export function usePlayerRuntime(args) {
61
63
  hls?.destroy();
62
64
  defferedLoading.value = false;
63
65
  }
64
- const emitter = usePlayerStateEmitter();
65
- emitter.on("update", (payload) => {
66
- if (payload.id !== toValue(args.id)) return;
67
- if (payload.api === "runtime") {
68
- switch (payload.key) {
69
- case "loaded":
70
- loaded.value = payload.value;
71
- break;
72
- }
73
- }
74
- });
75
- watch(loaded, (value) => {
76
- emitter.emit("update", {
77
- id: toValue(args.id),
78
- api: "runtime",
79
- key: "loaded",
80
- value
81
- });
82
- });
83
66
  return {
84
- loaded,
85
67
  initialize,
86
68
  destroy
87
69
  };
@@ -0,0 +1,7 @@
1
+ import { type Ref, type MaybeRef } from 'vue';
2
+ import type { PlayerState } from '../../types/index.js';
3
+ export declare function usePlayerState(id: MaybeRef<string>): {
4
+ initializeState: () => PlayerState;
5
+ deleteState: () => void;
6
+ playerStateStore: Ref<PlayerState[], PlayerState[]>;
7
+ };
@@ -0,0 +1,56 @@
1
+ import { ref, reactive, toValue } from "vue";
2
+ const playerStateStore = ref([]);
3
+ export function usePlayerState(id) {
4
+ function createState(id2) {
5
+ const state = {
6
+ id: id2,
7
+ currentTime: 0,
8
+ duration: 0,
9
+ seeking: false,
10
+ volume: 1,
11
+ rate: 1,
12
+ loaded: false,
13
+ waiting: false,
14
+ ended: false,
15
+ playing: false,
16
+ stalled: false,
17
+ buffered: [],
18
+ muted: false,
19
+ touched: false,
20
+ isFullscreen: false,
21
+ fullscreenTarget: null,
22
+ mouseEntered: false,
23
+ controlsMouseEntered: false,
24
+ dragging: false,
25
+ seekedTime: 0,
26
+ seekedPercentage: 0,
27
+ scrubbedPercentage: 0,
28
+ thumbPercentage: 0,
29
+ popoverOffsetX: 0,
30
+ controlsBarRect: void 0,
31
+ controlsTrackRect: void 0,
32
+ controlsPopoverRect: void 0
33
+ };
34
+ return reactive(state);
35
+ }
36
+ function addState(id2) {
37
+ const state = createState(id2);
38
+ playerStateStore.value = [...playerStateStore.value, state];
39
+ return state;
40
+ }
41
+ function initializeState() {
42
+ let state = playerStateStore.value.find((entry) => {
43
+ return entry.id === id;
44
+ });
45
+ if (!state) state = addState(toValue(id));
46
+ return state;
47
+ }
48
+ function deleteState() {
49
+ playerStateStore.value = playerStateStore.value.filter((x) => x.id !== id);
50
+ }
51
+ return {
52
+ initializeState,
53
+ deleteState,
54
+ playerStateStore
55
+ };
56
+ }
@@ -5,9 +5,6 @@ export type UsePlayerVideoApiArgs = {
5
5
  videoRef?: Ref<HTMLVideoElement | null>;
6
6
  };
7
7
  export declare function usePlayerVideoApi(args: UsePlayerVideoApiArgs): {
8
- mouseEntered: import("vue").ShallowRef<boolean, boolean>;
9
- isFullscreen: Ref<boolean, boolean>;
10
- touched: import("vue").ShallowRef<boolean, boolean>;
11
8
  play: () => void;
12
9
  pause: () => void;
13
10
  togglePlay: () => void;
@@ -16,7 +13,5 @@ export declare function usePlayerVideoApi(args: UsePlayerVideoApiArgs): {
16
13
  unmute: () => void;
17
14
  enterFullscreen: () => void;
18
15
  exitFullscreen: () => void;
19
- onMouseenter: () => void;
20
- onMouseleave: () => void;
21
16
  };
22
17
  export type UsePlayerVideoApiReturn = ReturnType<typeof usePlayerVideoApi>;
@@ -1,15 +1,13 @@
1
- import { ref, shallowRef, watch, toValue } from "vue";
1
+ import { toRefs, watch, toValue } from "vue";
2
2
  import { useFullscreen } from "@vueuse/core";
3
3
  import { isIOS } from "@maas/vue-equipment/utils";
4
- import { usePlayerStateEmitter } from "./usePlayerStateEmitter.mjs";
5
- import { usePlayerMediaApi } from "./usePlayerMediaApi.mjs";
4
+ import { usePlayerState } from "./usePlayerState.mjs";
6
5
  export function usePlayerVideoApi(args) {
7
6
  const { id, playerRef, videoRef } = args;
8
- const fullscreenTarget = ref(null);
9
- const { playing, currentTime, muted } = usePlayerMediaApi({ id });
10
- const touched = shallowRef(false);
11
- const mouseEntered = shallowRef(false);
12
- const { isFullscreen, enter, exit } = useFullscreen(fullscreenTarget);
7
+ const { initializeState } = usePlayerState(toValue(id));
8
+ const state = initializeState();
9
+ const { currentTime, playing, muted, touched, fullscreenTarget } = toRefs(state);
10
+ const { enter, exit } = useFullscreen(fullscreenTarget);
13
11
  function play() {
14
12
  playing.value = true;
15
13
  }
@@ -28,12 +26,6 @@ export function usePlayerVideoApi(args) {
28
26
  function unmute() {
29
27
  muted.value = false;
30
28
  }
31
- function onMouseenter() {
32
- mouseEntered.value = true;
33
- }
34
- function onMouseleave() {
35
- mouseEntered.value = false;
36
- }
37
29
  function enterFullscreen() {
38
30
  if (!fullscreenTarget.value) {
39
31
  console.error("No fullscreen target found");
@@ -78,52 +70,7 @@ export function usePlayerVideoApi(args) {
78
70
  }
79
71
  });
80
72
  }
81
- const emitter = usePlayerStateEmitter();
82
- emitter.on("update", (payload) => {
83
- if (payload.id !== toValue(id)) return;
84
- if (payload.api === "player") {
85
- switch (payload.key) {
86
- case "mouseEntered":
87
- mouseEntered.value = payload.value;
88
- break;
89
- case "fullscreenTarget":
90
- fullscreenTarget.value = payload.value;
91
- break;
92
- case "touched":
93
- touched.value = payload.value;
94
- break;
95
- }
96
- }
97
- });
98
- watch(mouseEntered, (value) => {
99
- emitter.emit("update", {
100
- id: toValue(id),
101
- api: "player",
102
- key: "mouseEntered",
103
- value
104
- });
105
- });
106
- watch(touched, (value) => {
107
- emitter.emit("update", {
108
- id: toValue(id),
109
- api: "player",
110
- key: "touched",
111
- value
112
- });
113
- });
114
- watch(fullscreenTarget, (value) => {
115
- if (!value) return;
116
- emitter.emit("update", {
117
- id: toValue(id),
118
- api: "player",
119
- key: "fullscreenTarget",
120
- value
121
- });
122
- });
123
73
  return {
124
- mouseEntered,
125
- isFullscreen,
126
- touched,
127
74
  play,
128
75
  pause,
129
76
  togglePlay,
@@ -131,8 +78,6 @@ export function usePlayerVideoApi(args) {
131
78
  mute,
132
79
  unmute,
133
80
  enterFullscreen,
134
- exitFullscreen,
135
- onMouseenter,
136
- onMouseleave
81
+ exitFullscreen
137
82
  };
138
83
  }
@@ -1,23 +1,34 @@
1
- import type { MaybeRef } from 'vue';
1
+ import { type MaybeRef } from 'vue';
2
2
  export declare function useMagicPlayer(id: MaybeRef<string>): {
3
- mediaApi: {
4
- currentTime: import("vue").ShallowRef<number, number>;
5
- remainingTime: import("vue").ComputedRef<number>;
6
- duration: import("vue").ShallowRef<number, number>;
7
- seeking: import("vue").ShallowRef<boolean, boolean>;
8
- volume: import("vue").ShallowRef<number, number>;
9
- rate: import("vue").ShallowRef<number, number>;
10
- waiting: import("vue").ShallowRef<boolean, boolean>;
11
- ended: import("vue").ShallowRef<boolean, boolean>;
12
- playing: import("vue").ShallowRef<boolean, boolean>;
13
- stalled: import("vue").ShallowRef<boolean, boolean>;
14
- buffered: import("vue").Ref<[number, number][], import("../types").Buffered | [number, number][]>;
15
- muted: import("vue").ShallowRef<boolean, boolean>;
3
+ duration: import("vue").Ref<number, number>;
4
+ seeking: import("vue").Ref<boolean, boolean>;
5
+ volume: import("vue").Ref<number, number>;
6
+ rate: import("vue").Ref<number, number>;
7
+ loaded: import("vue").Ref<boolean, boolean>;
8
+ waiting: import("vue").Ref<boolean, boolean>;
9
+ ended: import("vue").Ref<boolean, boolean>;
10
+ playing: import("vue").Ref<boolean, boolean>;
11
+ stalled: import("vue").Ref<boolean, boolean>;
12
+ buffered: import("vue").Ref<import("../types").Buffered, import("../types").Buffered>;
13
+ muted: import("vue").Ref<boolean, boolean>;
14
+ touched: import("vue").Ref<boolean, boolean>;
15
+ dragging: import("vue").Ref<boolean, boolean>;
16
+ isFullscreen: import("vue").Ref<boolean, boolean>;
17
+ seekedTime: import("vue").Ref<number, number>;
18
+ seekedPercentage: import("vue").Ref<number, number>;
19
+ scrubbedPercentage: import("vue").Ref<number, number>;
20
+ thumbPercentage: import("vue").Ref<number, number>;
21
+ popoverOffsetX: import("vue").Ref<number, number>;
22
+ audioApi: {
23
+ play: () => void;
24
+ pause: () => void;
25
+ togglePlay: () => void;
26
+ seek: (time: number) => void;
27
+ mute: () => void;
28
+ unmute: () => void;
16
29
  };
30
+ mediaApi: void;
17
31
  videoApi: {
18
- mouseEntered: import("vue").ShallowRef<boolean, boolean>;
19
- isFullscreen: import("vue").Ref<boolean, boolean>;
20
- touched: import("vue").ShallowRef<boolean, boolean>;
21
32
  play: () => void;
22
33
  pause: () => void;
23
34
  togglePlay: () => void;
@@ -26,47 +37,17 @@ export declare function useMagicPlayer(id: MaybeRef<string>): {
26
37
  unmute: () => void;
27
38
  enterFullscreen: () => void;
28
39
  exitFullscreen: () => void;
29
- onMouseenter: () => void;
30
- onMouseleave: () => void;
31
40
  };
32
41
  controlsApi: {
33
- mouseEntered: import("vue").ShallowRef<boolean, boolean>;
34
- dragging: import("vue").ShallowRef<boolean, boolean>;
35
- seekedTime: import("vue").ShallowRef<number, number>;
36
- seekedPercentage: import("vue").ShallowRef<number, number>;
37
- scrubbedPercentage: import("vue").ShallowRef<number, number>;
42
+ initialize: () => void;
43
+ destroy: () => void;
38
44
  bufferedPercentage: import("vue").ComputedRef<number>;
39
- thumbPercentage: import("vue").ShallowRef<number, number>;
40
- popoverOffsetX: import("vue").ShallowRef<number, number>;
41
45
  onMouseenter: () => void;
42
46
  onMouseleave: () => void;
43
- onPointerdown: (e: MouseEvent | TouchEvent) => void;
44
- onPointerup: () => void;
45
- onPointermove: (e: MouseEvent | TouchEvent) => void;
46
- trackRect: import("vue").Ref<{
47
- height: number;
48
- width: number;
49
- x: number;
50
- y: number;
51
- readonly bottom: number;
52
- readonly left: number;
53
- readonly right: number;
54
- readonly top: number;
55
- toJSON: () => any;
56
- } | undefined, DOMRect | {
57
- height: number;
58
- width: number;
59
- x: number;
60
- y: number;
61
- readonly bottom: number;
62
- readonly left: number;
63
- readonly right: number;
64
- readonly top: number;
65
- toJSON: () => any;
66
- } | undefined>;
47
+ onPointerdown: (e: PointerEvent) => void;
48
+ onPointermove: (e: PointerEvent) => void;
67
49
  };
68
50
  playerRuntime: {
69
- loaded: import("vue").ShallowRef<boolean, boolean>;
70
51
  initialize: () => void;
71
52
  destroy: () => void;
72
53
  };
@@ -1,13 +1,60 @@
1
+ import { toRefs } from "vue";
1
2
  import { usePlayerMediaApi } from "./private/usePlayerMediaApi.mjs";
2
3
  import { usePlayerVideoApi } from "./private/usePlayerVideoApi.mjs";
4
+ import { usePlayerAudioApi } from "./private/usePlayerAudioApi.mjs";
3
5
  import { usePlayerRuntime } from "./private/usePlayerRuntime.mjs";
4
6
  import { usePlayerControlsApi } from "./private/usePlayerControlsApi.mjs";
7
+ import { usePlayerState } from "./private/usePlayerState.mjs";
5
8
  export function useMagicPlayer(id) {
9
+ const audioApi = usePlayerAudioApi({ id });
6
10
  const mediaApi = usePlayerMediaApi({ id });
7
11
  const videoApi = usePlayerVideoApi({ id });
8
12
  const controlsApi = usePlayerControlsApi({ id });
9
13
  const playerRuntime = usePlayerRuntime({ id });
14
+ const { initializeState } = usePlayerState(id);
15
+ const state = initializeState();
16
+ const {
17
+ duration,
18
+ seeking,
19
+ volume,
20
+ rate,
21
+ loaded,
22
+ waiting,
23
+ ended,
24
+ playing,
25
+ stalled,
26
+ buffered,
27
+ muted,
28
+ touched,
29
+ dragging,
30
+ isFullscreen,
31
+ seekedTime,
32
+ seekedPercentage,
33
+ scrubbedPercentage,
34
+ thumbPercentage,
35
+ popoverOffsetX
36
+ } = toRefs(state);
10
37
  return {
38
+ duration,
39
+ seeking,
40
+ volume,
41
+ rate,
42
+ loaded,
43
+ waiting,
44
+ ended,
45
+ playing,
46
+ stalled,
47
+ buffered,
48
+ muted,
49
+ touched,
50
+ dragging,
51
+ isFullscreen,
52
+ seekedTime,
53
+ seekedPercentage,
54
+ scrubbedPercentage,
55
+ thumbPercentage,
56
+ popoverOffsetX,
57
+ audioApi,
11
58
  mediaApi,
12
59
  videoApi,
13
60
  controlsApi,
@@ -1,5 +1,8 @@
1
- import type { InjectionKey, MaybeRef } from 'vue';
1
+ import type { InjectionKey, MaybeRef, Ref } from 'vue';
2
2
  import type { MagicPlayerOptions } from '../types/index.js';
3
3
  declare const MagicPlayerInstanceId: InjectionKey<MaybeRef<string>>;
4
4
  declare const MagicPlayerOptionsKey: InjectionKey<MagicPlayerOptions>;
5
- export { MagicPlayerInstanceId, MagicPlayerOptionsKey };
5
+ declare const MagicPlayerTrackRef: InjectionKey<Ref<HTMLDivElement | null>>;
6
+ declare const MagicPlayerBarRef: InjectionKey<Ref<HTMLDivElement | null>>;
7
+ declare const MagicPlayerPopoverRef: InjectionKey<Ref<HTMLDivElement | null>>;
8
+ export { MagicPlayerInstanceId, MagicPlayerOptionsKey, MagicPlayerTrackRef, MagicPlayerBarRef, MagicPlayerPopoverRef, };
@@ -1,3 +1,12 @@
1
1
  const MagicPlayerInstanceId = Symbol();
2
2
  const MagicPlayerOptionsKey = Symbol();
3
- export { MagicPlayerInstanceId, MagicPlayerOptionsKey };
3
+ const MagicPlayerTrackRef = Symbol();
4
+ const MagicPlayerBarRef = Symbol();
5
+ const MagicPlayerPopoverRef = Symbol();
6
+ export {
7
+ MagicPlayerInstanceId,
8
+ MagicPlayerOptionsKey,
9
+ MagicPlayerTrackRef,
10
+ MagicPlayerBarRef,
11
+ MagicPlayerPopoverRef
12
+ };
@@ -19,4 +19,33 @@ export type PlayerPrivateEvents = {
19
19
  value: string | number | boolean | Buffered | DOMRect | HTMLElement;
20
20
  };
21
21
  };
22
+ export interface PlayerState {
23
+ id: string;
24
+ currentTime: number;
25
+ duration: number;
26
+ seeking: boolean;
27
+ volume: number;
28
+ rate: number;
29
+ loaded: boolean;
30
+ waiting: boolean;
31
+ ended: boolean;
32
+ playing: boolean;
33
+ stalled: boolean;
34
+ buffered: Buffered;
35
+ muted: boolean;
36
+ touched: boolean;
37
+ isFullscreen: boolean;
38
+ fullscreenTarget: HTMLElement | null;
39
+ mouseEntered: boolean;
40
+ controlsMouseEntered: boolean;
41
+ dragging: boolean;
42
+ seekedTime: number;
43
+ seekedPercentage: number;
44
+ scrubbedPercentage: number;
45
+ thumbPercentage: number;
46
+ popoverOffsetX: number;
47
+ controlsBarRect: DOMRect | undefined;
48
+ controlsTrackRect: DOMRect | undefined;
49
+ controlsPopoverRect: DOMRect | undefined;
50
+ }
22
51
  export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@maas/vue-equipment",
3
3
  "description": "Our Frontend Toolkit, Free and Open Source",
4
- "version": "1.0.0-beta.12",
4
+ "version": "1.0.0-beta.13",
5
5
  "contributors": [
6
6
  {
7
7
  "name": "Robin Scholz",
@@ -15,12 +15,12 @@
15
15
  "devDependencies": {
16
16
  "@maas/config": "^1.6.0",
17
17
  "@maas/mirror": "catalog:",
18
- "@release-it/bumper": "^7.0.1",
18
+ "@release-it/bumper": "^7.0.2",
19
19
  "@types/node": "catalog:",
20
20
  "prettier-plugin-tailwindcss": "^0.6.11",
21
21
  "release-it": "^18.1.2",
22
22
  "tailwindcss": "catalog:",
23
- "turbo": "^2.4.4",
23
+ "turbo": "^2.5.0",
24
24
  "typescript": "catalog:"
25
25
  },
26
26
  "exports": {
@@ -140,7 +140,7 @@
140
140
  "volta": {
141
141
  "node": "20.18.1"
142
142
  },
143
- "packageManager": "pnpm@10.5.2",
143
+ "packageManager": "pnpm@10.7.1",
144
144
  "pnpm": {
145
145
  "overrides": {
146
146
  "typescript": "catalog:"
@@ -1,15 +0,0 @@
1
- import type { PlayerPrivateEvents } from '../../types/index.js';
2
- export declare function usePlayerStateEmitter(): {
3
- on: {
4
- <Key extends "update">(type: Key, handler: import("mitt").Handler<PlayerPrivateEvents[Key]>): void;
5
- (type: "*", handler: import("mitt").WildcardHandler<PlayerPrivateEvents>): void;
6
- };
7
- off: {
8
- <Key extends "update">(type: Key, handler?: import("mitt").Handler<PlayerPrivateEvents[Key]> | undefined): void;
9
- (type: "*", handler: import("mitt").WildcardHandler<PlayerPrivateEvents>): void;
10
- };
11
- emit: {
12
- <Key extends "update">(type: Key, event: PlayerPrivateEvents[Key]): void;
13
- <Key extends "update">(type: undefined extends PlayerPrivateEvents[Key] ? Key : never): void;
14
- };
15
- };
@@ -1,9 +0,0 @@
1
- import mitt from "mitt";
2
- const emitter = mitt();
3
- export function usePlayerStateEmitter() {
4
- return {
5
- on: emitter.on,
6
- off: emitter.off,
7
- emit: emitter.emit
8
- };
9
- }