Files
zeroone/src/store.js
Robert Kossessa 0f5e0df58b ADD: Pinia
2024-01-31 00:11:55 +01:00

113 lines
3.4 KiB
JavaScript

// import { computed, reactive } from 'vue'
//
// export const store = reactive({
// device: {
// profiles: [],
// activeProfileId: null,
// activeProfile: computed(() => {
// return store.device.profiles.find(p => p.id === store.device.activeProfileId)
// }),
// },
// currentProfileId: null,
// currentProfile: computed(() => {
// return store.device.profiles.find(p => p.id === store.currentProfileId)
// }),
// profileIds: computed(() => store.device.profiles.map(p => p.id)),
// })
import { createPinia, defineStore } from 'pinia'
import Axios from 'axios'
import schema from '@/data/profileSchema.json'
import Ajv from 'ajv'
const ajv = new Ajv()
export const useStore = defineStore('main', {
// arrow function recommended for full type inference
state: () => {
return {
profiles: [],
selectedProfileId: null,
connected: false,
}
},
getters: {
profileIds: (state) => state.profiles.map(p => p.id),
selectedProfile: (state) => state.profiles.find(p => p.id === state.selectedProfileId),
},
actions: {
selectProfile(id) {
if (!this.profileIds.includes(id)) return false
this.selectedProfileId = id
return true
},
duplicateProfile(id) {
const originalProfile = this.profiles.find(p => p.id === id)
const newProfile = JSON.parse(JSON.stringify(originalProfile))
newProfile.id = this.newProfileId(originalProfile.id)
newProfile.name = this.newProfileName(originalProfile.name)
this.profiles.push(newProfile)
this.selectedProfileId = newProfile.id
return newProfile.id
},
deleteProfile(id) {
const index = this.profiles.findIndex(p => p.id === id)
if (index >= 0) {
this.profiles.splice(index, 1)
if (this.selectedProfileId === id) {
this.selectedProfileId = this.profiles[0]?.id || null
}
return true
}
return false
},
fetchProfiles() {
Axios.get('http://localhost:3001/profiles').then((res) => {
const profiles = res.data
console.log(profiles)
const ids = new Set()
const validate = ajv.compile(schema)
this.$patch({
profiles: profiles.filter((profile) => {
if (!validate(profile)) {
console.error('Failed to validate profile: ' + profile.name, validate.errors)
return false
}
if (ids.has(profile.id)) {
console.error('Duplicate profile id: ' + profile.id + ' for profile: ' + profile.name)
return false
}
ids.add(profile.id)
return true
}),
selectedProfileId: profiles[0]?.id || null,
})
}).catch((err) => {
console.error(err)
})
},
newProfileName(originalName = '') {
let name = originalName
let i = 1
while (this.profiles.find(p => p.name === name)) {
name = `${originalName} (${i++})`
}
return name
},
newProfileId(originalId = '') {
let id = originalId
if (originalId) {
do {
id = Math.floor((parseInt(id) + 1) % 9999).toString().padStart(4, '0')
} while (this.profileIds.includes(id))
} else {
do {
id = Math.floor(Math.random() * 9999).toString().padStart(4, '0')
} while (this.profileIds.includes(id))
}
return id
},
},
})
export const pinia = createPinia()