53 lines
1.3 KiB
TypeScript
53 lines
1.3 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import type { Track } from '~/../types/types'
|
|
|
|
export const FAVORITES_BOX_ID = 'FAV'
|
|
const STORAGE_KEY = 'evilspins:favorites:v1'
|
|
|
|
export const useFavoritesStore = defineStore('favorites', {
|
|
state: () => ({
|
|
trackIds: [] as number[]
|
|
}),
|
|
actions: {
|
|
load() {
|
|
if (!process.client) return
|
|
try {
|
|
const raw = localStorage.getItem(STORAGE_KEY)
|
|
if (raw) {
|
|
const arr = JSON.parse(raw)
|
|
if (Array.isArray(arr)) this.trackIds = arr.filter((x) => typeof x === 'number')
|
|
}
|
|
} catch {}
|
|
},
|
|
save() {
|
|
if (!process.client) return
|
|
try {
|
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(this.trackIds))
|
|
} catch {}
|
|
},
|
|
toggle(track: Track) {
|
|
const id = track.id
|
|
const idx = this.trackIds.indexOf(id)
|
|
if (idx >= 0) this.trackIds.splice(idx, 1)
|
|
else this.trackIds.unshift(id)
|
|
this.save()
|
|
},
|
|
add(track: Track) {
|
|
if (!this.trackIds.includes(track.id)) {
|
|
this.trackIds.unshift(track.id)
|
|
this.save()
|
|
}
|
|
},
|
|
remove(trackId: number) {
|
|
const idx = this.trackIds.indexOf(trackId)
|
|
if (idx >= 0) {
|
|
this.trackIds.splice(idx, 1)
|
|
this.save()
|
|
}
|
|
},
|
|
isFavorite(trackId: number) {
|
|
return this.trackIds.includes(trackId)
|
|
}
|
|
}
|
|
})
|