This repository has been archived by the owner on Feb 22, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 63
/
Copy pathactive-media.ts
86 lines (76 loc) · 2 KB
/
active-media.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import { defineStore } from 'pinia'
import { reactive, readonly, toRefs } from '@nuxtjs/composition-api'
import type { SupportedMediaType } from '~/constants/media'
import type { Media } from '~/models/media'
type MediaStatus = 'ejected' | 'playing' | 'paused' // 'ejected' means player is closed
export interface ActiveMediaState {
type: SupportedMediaType | null
id: Media['id'] | null
status: MediaStatus
message: string | null
}
const ACTIVE_MEDIA = 'active-media'
/**
* Store information about the active media item.
*/
export const useActiveMediaStore = defineStore(ACTIVE_MEDIA, () => {
/* State */
const state: ActiveMediaState = reactive({
type: null,
id: null,
status: 'ejected',
message: null,
})
/**
* Only the properties used by components are exported as refs.
* `status` is not used anywhere in the components.
*/
const { type, id, message } = toRefs(state)
/* Actions */
/**
* Sets a new media item as the active one.
*
* @param type - the type of the active media
* @param id - the unique identifier of the active media
* @param status - the current status of the active media
*/
function setActiveMediaItem({
type,
id,
status = 'playing',
}: {
type: SupportedMediaType
id: Media['id']
status: MediaStatus
}) {
state.type = type
state.id = id
state.status = status
}
function pauseActiveMediaItem() {
state.status = 'paused'
}
function ejectActiveMediaItem() {
state.status = 'ejected'
state.id = null
state.type = null
}
/**
* Set the message associated with rendering/playback of the active media.
*
* @param message - the message to display to the user
*/
function setMessage({ message }: { message: string }) {
state.message = message
}
return {
type: readonly(type),
id: readonly(id),
message: readonly(message),
state: readonly(state),
setActiveMediaItem,
pauseActiveMediaItem,
ejectActiveMediaItem,
setMessage,
}
})