FreeTube/src/renderer/store/modules/profiles.js

196 lines
4.9 KiB
JavaScript

import { MAIN_PROFILE_ID } from '../../../constants'
import { DBProfileHandlers } from '../../../datastores/handlers/index'
const state = {
profileList: [{
_id: MAIN_PROFILE_ID,
name: 'All Channels',
bgColor: '#000000',
textColor: '#FFFFFF',
subscriptions: []
}],
activeProfile: MAIN_PROFILE_ID
}
const getters = {
getProfileList: () => {
return state.profileList
},
getActiveProfile: (state) => {
const activeProfileId = state.activeProfile
return state.profileList.find((profile) => {
return profile._id === activeProfileId
})
},
profileById: (state) => (id) => {
const profile = state.profileList.find(p => p._id === id)
return profile
}
}
function profileSort(a, b) {
if (a._id === MAIN_PROFILE_ID) return -1
if (b._id === MAIN_PROFILE_ID) return 1
if (a.name < b.name) return -1
if (a.name > b.name) return 1
return 0
}
const actions = {
async grabAllProfiles({ rootState, dispatch, commit }, defaultName = null) {
let profiles
try {
profiles = await DBProfileHandlers.find()
} catch (errMessage) {
console.error(errMessage)
return
}
if (!Array.isArray(profiles)) return
if (profiles.length === 0) {
// Create a default profile and persist it
const randomColor = await dispatch('getRandomColor')
const textColor = await dispatch('calculateColorLuminance', randomColor)
const defaultProfile = {
_id: MAIN_PROFILE_ID,
name: defaultName,
bgColor: randomColor,
textColor: textColor,
subscriptions: []
}
try {
await DBProfileHandlers.create(defaultProfile)
commit('setProfileList', [defaultProfile])
} catch (errMessage) {
console.error(errMessage)
}
return
}
// We want the primary profile to always be first
// So sort with that then sort alphabetically by profile name
profiles = profiles.sort(profileSort)
if (state.profileList.length < profiles.length) {
const profile = profiles.find((profile) => {
return profile._id === rootState.settings.defaultProfile
})
if (profile) {
commit('setActiveProfile', profile._id)
}
}
commit('setProfileList', profiles)
},
async updateSubscriptionDetails({ getters, dispatch }, { channelThumbnailUrl, channelName, channelId }) {
const thumbnail = channelThumbnailUrl?.replace(/=s\d*/, '=s176') ?? null // change thumbnail size if different
const profileList = getters.getProfileList
for (const profile of profileList) {
const currentProfileCopy = JSON.parse(JSON.stringify(profile))
const channel = currentProfileCopy.subscriptions.find((channel) => {
return channel.id === channelId
}) ?? null
if (channel === null) { continue }
let updated = false
if (channel.name !== channelName || (channel.thumbnail !== thumbnail && thumbnail !== null)) {
if (thumbnail !== null) {
channel.thumbnail = thumbnail
}
channel.name = channelName
updated = true
}
if (updated) {
await dispatch('updateProfile', currentProfileCopy)
} else { // channel has not been updated, stop iterating through profiles
break
}
}
},
async createProfile({ commit }, profile) {
try {
const newProfile = await DBProfileHandlers.create(profile)
commit('addProfileToList', newProfile)
} catch (errMessage) {
console.error(errMessage)
}
},
async updateProfile({ commit }, profile) {
try {
await DBProfileHandlers.upsert(profile)
commit('upsertProfileToList', profile)
} catch (errMessage) {
console.error(errMessage)
}
},
async removeProfile({ commit }, profileId) {
try {
await DBProfileHandlers.delete(profileId)
commit('removeProfileFromList', profileId)
} catch (errMessage) {
console.error(errMessage)
}
},
compactProfiles(_) {
DBProfileHandlers.persist()
},
updateActiveProfile({ commit }, id) {
commit('setActiveProfile', id)
}
}
const mutations = {
setProfileList(state, profileList) {
state.profileList = profileList
},
setActiveProfile(state, activeProfile) {
state.activeProfile = activeProfile
},
addProfileToList(state, profile) {
state.profileList.push(profile)
state.profileList.sort(profileSort)
},
upsertProfileToList(state, updatedProfile) {
const i = state.profileList.findIndex((p) => {
return p._id === updatedProfile._id
})
if (i === -1) {
state.profileList.push(updatedProfile)
} else {
state.profileList.splice(i, 1, updatedProfile)
}
state.profileList.sort(profileSort)
},
removeProfileFromList(state, profileId) {
const i = state.profileList.findIndex((profile) => {
return profile._id === profileId
})
state.profileList.splice(i, 1)
}
}
export default {
state,
getters,
actions,
mutations
}