Files
evilspins/app/store/data.ts
valere e2c5693948
All checks were successful
Deploy App / build (push) Successful in 4m19s
Deploy App / deploy (push) Successful in 16s
playlists support v1
2025-10-09 22:47:30 +02:00

98 lines
3.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { Compilation, Artist, Track } from '~/../types/types'
// stores/data.ts
import { defineStore } from 'pinia'
export const useDataStore = defineStore('data', {
state: () => ({
compilations: [] as Compilation[], // Store your compilation data here
artists: [] as Artist[], // Store artist data here
tracks: [] as Track[], // Store track data here
playlistTracks: [] as Track[], // store playslit tracks
isLoaded: false // Remember if data is already loaded
}),
actions: {
async loadData() {
if (this.isLoaded) return
const { data: compilations } = await useFetch<Compilation[]>('/api/compilations')
const { data: artists } = await useFetch<Artist[]>('/api/artists')
const { data: rawTracks } = await useFetch<Track[]>('/api/tracks')
const { data: playlistTracks } = await useFetch<Track[]>('/api/playlists')
// Stocker les données de base
this.compilations = compilations.value ?? []
this.artists = artists.value ?? []
// Mapper les tracks pour remplacer l'artistId par l'objet Artist
const artistMap = new Map(this.artists.map((a) => [a.id, a]))
this.tracks = (rawTracks.value ?? []).map((track) => ({
...track,
artist: artistMap.get(track.artist) ?? {
id: track.artist,
name: 'Unknown',
url: '',
coverId: ''
}
}))
this.playlistTracks = (playlistTracks.value ?? []).map((track) => ({
...track,
artist: artistMap.get(track.artist) ?? {
id: track.artist,
name: track.artist,
url: '',
coverId: ''
}
}))
this.isLoaded = true
}
},
getters: {
// Obtenir tous les compilations
getAllCompilations: (state) => state.compilations,
getCompilationById: (state) => {
return (id: string) => {
return state.compilations.find((compilation) => compilation.id === id)
}
},
// Obtenir toutes les pistes d'une compilation donnée
getTracksByCompilationId: (state) => (id: string) => {
return state.tracks.filter((track) => track.compilationId === id)
},
// Filtrer les artistes selon certains critères
getArtistById: (state) => (id: number) => state.artists.find((artist) => artist.id === id),
// Obtenir toutes les pistes d'un artiste donné
getTracksByArtistId: (state) => (artistId: number) => {
return state.tracks.filter((track) => track.artist.id === artistId)
},
getFirstTrackOfCompilation() {
return (compilationId: string) => {
const tracks = this.getTracksByCompilationId(compilationId)
return tracks.length > 0 ? tracks[0] : null
}
},
getNextTrack: (state) => {
return (track: Track) => {
// Récupérer toutes les tracks de la même compilation et les trier par ordre
const tracksInCompilation = state.tracks
.filter((t) => t.compilationId === track.compilationId)
.sort((a, b) => a.order - b.order)
// Trouver lindex de la track courante
const index = tracksInCompilation.findIndex((t) => t.id === track.id)
// Retourner la track suivante ou null si cest la dernière
return index >= 0 && index < tracksInCompilation.length - 1
? tracksInCompilation[index + 1]
: null
}
},
getPlaylistTracksByCompilationId: (state) => (id: string) => {
return state.playlistTracks.filter((track) => track.compilationId === id)
}
}
})