89 lines
2.3 KiB
TypeScript
89 lines
2.3 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import type { Track } from '~~/types/types'
|
|
export const useCardStore = defineStore('card', {
|
|
state: () => ({
|
|
// Stocke les IDs des cartes déjà révélées
|
|
revealedCards: new Set<number>()
|
|
}),
|
|
|
|
actions: {
|
|
// Marquer une carte comme révélée
|
|
revealCard(trackId: number) {
|
|
this.revealedCards.add(trackId)
|
|
this.saveToLocalStorage()
|
|
},
|
|
|
|
hideCard(trackId: number) {
|
|
this.revealedCards.delete(trackId)
|
|
this.saveToLocalStorage()
|
|
},
|
|
|
|
// Vérifier si une carte est révélée
|
|
isCardRevealed(trackId: number): boolean {
|
|
return this.revealedCards.has(trackId)
|
|
},
|
|
|
|
// Basculer l'état de révélation de toutes les cartes
|
|
revealAllCards(tracks: Track[]) {
|
|
tracks.forEach((track) => {
|
|
this.revealCard(track.id)
|
|
})
|
|
this.saveToLocalStorage()
|
|
},
|
|
|
|
hideAllCards(tracks: Track[]) {
|
|
tracks.forEach((track) => {
|
|
this.hideCard(track.id)
|
|
})
|
|
this.saveToLocalStorage()
|
|
},
|
|
|
|
// Sauvegarder l'état dans le localStorage
|
|
saveToLocalStorage() {
|
|
if (typeof window !== 'undefined') {
|
|
try {
|
|
localStorage.setItem(
|
|
'cardStore',
|
|
JSON.stringify({
|
|
revealedCards: Array.from(this.revealedCards)
|
|
})
|
|
)
|
|
} catch (e) {
|
|
console.error('Failed to save card store to localStorage', e)
|
|
}
|
|
}
|
|
},
|
|
|
|
// Charger l'état depuis le localStorage
|
|
loadFromLocalStorage() {
|
|
if (typeof window !== 'undefined') {
|
|
try {
|
|
const saved = localStorage.getItem('cardStore')
|
|
if (saved) {
|
|
const { revealedCards } = JSON.parse(saved)
|
|
if (Array.isArray(revealedCards)) {
|
|
this.revealedCards = new Set(
|
|
revealedCards.filter((id): id is number => typeof id === 'number')
|
|
)
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.error('Failed to load card store from localStorage', e)
|
|
}
|
|
}
|
|
},
|
|
|
|
// Initialiser le store
|
|
initialize() {
|
|
this.loadFromLocalStorage()
|
|
}
|
|
},
|
|
|
|
getters: {
|
|
// Getter pour la réactivité dans les templates
|
|
isRevealed: (state) => (trackId: number) => {
|
|
return state.revealedCards.has(trackId)
|
|
}
|
|
}
|
|
})
|