ADD: Pinia
This commit is contained in:
125
src/store.js
125
src/store.js
@@ -1,16 +1,113 @@
|
||||
import { computed, reactive } from 'vue'
|
||||
// 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)),
|
||||
// })
|
||||
|
||||
export const store = reactive({
|
||||
device: {
|
||||
profiles: [],
|
||||
activeProfileId: null,
|
||||
activeProfile: computed(() => {
|
||||
return store.device.profiles.find(p => p.id === store.device.activeProfileId)
|
||||
}),
|
||||
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,
|
||||
}
|
||||
},
|
||||
currentProfileId: null,
|
||||
currentProfile: computed(() => {
|
||||
return store.device.profiles.find(p => p.id === store.currentProfileId)
|
||||
}),
|
||||
profileIds: computed(() => store.device.profiles.map(p => p.id)),
|
||||
})
|
||||
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()
|
||||
Reference in New Issue
Block a user