Don't fetch all tracks at once when migrating
This commit is contained in:
parent
af23b012fd
commit
dfd55b95b3
|
@ -98,12 +98,11 @@ export const currentTrack = computed(() => queue.value[currentIndex.value])
|
||||||
// Use Queue
|
// Use Queue
|
||||||
export const useQueue = createGlobalState(() => {
|
export const useQueue = createGlobalState(() => {
|
||||||
const { currentSound } = useTracks()
|
const { currentSound } = useTracks()
|
||||||
// const { t } = useI18n()
|
|
||||||
|
|
||||||
const createQueueTrack = async (track: Track): Promise<QueueTrack> => {
|
const createQueueTrack = async (track: Track, skipFetch = false): Promise<QueueTrack> => {
|
||||||
const { default: store } = await import('~/store')
|
const { default: store } = await import('~/store')
|
||||||
|
|
||||||
if (track.uploads.length === 0) {
|
if (track.uploads.length === 0 && skipFetch === false) {
|
||||||
// we don't have any information for this track, we need to fetch it
|
// we don't have any information for this track, we need to fetch it
|
||||||
const { uploads } = await axios.get(`tracks/${track.id}/`)
|
const { uploads } = await axios.get(`tracks/${track.id}/`)
|
||||||
.then(response => response.data as Track, () => ({ uploads: [] as Upload[] }))
|
.then(response => response.data as Track, () => ({ uploads: [] as Upload[] }))
|
||||||
|
@ -131,9 +130,19 @@ export const useQueue = createGlobalState(() => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isTrack = (track: Track | boolean): track is Track => typeof track !== 'boolean'
|
||||||
|
|
||||||
// Adding tracks
|
// Adding tracks
|
||||||
const enqueueAt = async (index: number, ...newTracks: Track[]) => {
|
async function enqueueAt (index: number, ...newTracks: Track[]): Promise<void>
|
||||||
const queueTracks = await Promise.all(newTracks.map(createQueueTrack))
|
// NOTE: Only last boolean of newTracks is considered as skipFetch
|
||||||
|
async function enqueueAt (index: number, ...newTracks: (Track | boolean)[]) : Promise<void>
|
||||||
|
async function enqueueAt (index: number, ...newTracks: (Track | boolean)[]) : Promise<void> {
|
||||||
|
let skipFetch = false
|
||||||
|
if (!isTrack(newTracks[newTracks.length - 1])) {
|
||||||
|
skipFetch = newTracks.pop() as boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
const queueTracks = await Promise.all(newTracks.filter(isTrack).map((track) => createQueueTrack(track, skipFetch)))
|
||||||
await setMany(queueTracks.map(track => [track.id, track]))
|
await setMany(queueTracks.map(track => [track.id, track]))
|
||||||
|
|
||||||
const ids = queueTracks.map(track => track.id)
|
const ids = queueTracks.map(track => track.id)
|
||||||
|
@ -152,7 +161,10 @@ export const useQueue = createGlobalState(() => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const enqueue = async (...newTracks: Track[]) => {
|
async function enqueue (...newTracks: Track[]): Promise<void>
|
||||||
|
// NOTE: Only last boolean of newTracks is considered as skipFetch
|
||||||
|
async function enqueue (...newTracks: (Track | boolean)[]): Promise<void>
|
||||||
|
async function enqueue (...newTracks: (Track | boolean)[]): Promise<void> {
|
||||||
return enqueueAt(tracks.value.length, ...newTracks)
|
return enqueueAt(tracks.value.length, ...newTracks)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,7 +332,7 @@ export const useQueue = createGlobalState(() => {
|
||||||
|
|
||||||
if (oldTracks.length !== 0) {
|
if (oldTracks.length !== 0) {
|
||||||
tracks.value.length = 0
|
tracks.value.length = 0
|
||||||
await enqueue(...oldTracks)
|
await enqueue(...oldTracks, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: There is a race condition between clearing queue and adding new tracks that resets the radio.
|
// NOTE: There is a race condition between clearing queue and adding new tracks that resets the radio.
|
||||||
|
|
Loading…
Reference in New Issue