217 lines
6.2 KiB
JavaScript
217 lines
6.2 KiB
JavaScript
import Vue from 'vue'
|
|
import { mapActions } from 'vuex'
|
|
|
|
import FtCard from '../../components/ft-card/ft-card.vue'
|
|
import FtFlexBox from '../../components/ft-flex-box/ft-flex-box.vue'
|
|
import FtChannelBubble from '../../components/ft-channel-bubble/ft-channel-bubble.vue'
|
|
import FtButton from '../../components/ft-button/ft-button.vue'
|
|
import FtPrompt from '../../components/ft-prompt/ft-prompt.vue'
|
|
|
|
export default Vue.extend({
|
|
name: 'FtProfileChannelList',
|
|
components: {
|
|
'ft-card': FtCard,
|
|
'ft-flex-box': FtFlexBox,
|
|
'ft-channel-bubble': FtChannelBubble,
|
|
'ft-button': FtButton,
|
|
'ft-prompt': FtPrompt
|
|
},
|
|
props: {
|
|
profile: {
|
|
type: Object,
|
|
required: true
|
|
},
|
|
isMainProfile: {
|
|
type: Boolean,
|
|
required: true
|
|
}
|
|
},
|
|
data: function () {
|
|
return {
|
|
showDeletePrompt: false,
|
|
subscriptions: [],
|
|
selectedLength: 0,
|
|
componentKey: 0,
|
|
deletePromptValues: [
|
|
'yes',
|
|
'no'
|
|
]
|
|
}
|
|
},
|
|
computed: {
|
|
backendPreference: function () {
|
|
return this.$store.getters.getBackendPreference
|
|
},
|
|
currentInvidiousInstance: function () {
|
|
return this.$store.getters.getCurrentInvidiousInstance
|
|
},
|
|
profileList: function () {
|
|
return this.$store.getters.getProfileList
|
|
},
|
|
selectedText: function () {
|
|
const localeText = this.$t('Profile.$ selected')
|
|
return localeText.replace('$', this.selectedLength)
|
|
},
|
|
deletePromptMessage: function () {
|
|
if (this.isMainProfile) {
|
|
return this.$t('Profile["This is your primary profile. Are you sure you want to delete the selected channels? The same channels will be deleted in any profile they are found in."]')
|
|
} else {
|
|
return this.$t('Profile["Are you sure you want to delete the selected channels? This will not delete the channel from any other profile."]')
|
|
}
|
|
},
|
|
deletePromptNames: function () {
|
|
return [
|
|
this.$t('Yes'),
|
|
this.$t('No')
|
|
]
|
|
}
|
|
},
|
|
watch: {
|
|
profile: function () {
|
|
this.subscriptions = JSON.parse(JSON.stringify(this.profile.subscriptions)).sort((a, b) => {
|
|
const nameA = a.name.toLowerCase()
|
|
const nameB = b.name.toLowerCase()
|
|
if (nameA < nameB) {
|
|
return -1
|
|
}
|
|
if (nameA > nameB) {
|
|
return 1
|
|
}
|
|
return 0
|
|
}).map((channel) => {
|
|
if (this.backendPreference === 'invidious') {
|
|
channel.thumbnail = channel.thumbnail.replace('https://yt3.ggpht.com', `${this.currentInvidiousInstance}/ggpht/`)
|
|
}
|
|
channel.selected = false
|
|
return channel
|
|
})
|
|
}
|
|
},
|
|
mounted: function () {
|
|
if (typeof this.profile.subscriptions !== 'undefined') {
|
|
this.subscriptions = JSON.parse(JSON.stringify(this.profile.subscriptions)).sort((a, b) => {
|
|
const nameA = a.name.toLowerCase()
|
|
const nameB = b.name.toLowerCase()
|
|
if (nameA < nameB) {
|
|
return -1
|
|
}
|
|
if (nameA > nameB) {
|
|
return 1
|
|
}
|
|
return 0
|
|
}).map((channel) => {
|
|
if (this.backendPreference === 'invidious') {
|
|
channel.thumbnail = channel.thumbnail.replace('https://yt3.ggpht.com', `${this.currentInvidiousInstance}/ggpht/`)
|
|
}
|
|
channel.selected = false
|
|
return channel
|
|
})
|
|
}
|
|
},
|
|
methods: {
|
|
displayDeletePrompt: function () {
|
|
if (this.selectedLength === 0) {
|
|
this.showToast({
|
|
message: this.$t('Profile.No channel(s) have been selected')
|
|
})
|
|
} else {
|
|
this.showDeletePrompt = true
|
|
}
|
|
},
|
|
|
|
handleDeletePromptClick: function (value) {
|
|
if (value !== 'no' && value !== null) {
|
|
if (this.isMainProfile) {
|
|
const channelsToRemove = this.subscriptions.filter((channel) => {
|
|
return channel.selected
|
|
})
|
|
|
|
this.subscriptions = this.subscriptions.filter((channel) => {
|
|
return !channel.selected
|
|
})
|
|
|
|
this.profileList.forEach((x) => {
|
|
const profile = JSON.parse(JSON.stringify(x))
|
|
profile.subscriptions = profile.subscriptions.filter((channel) => {
|
|
const index = channelsToRemove.findIndex((y) => {
|
|
return y.id === channel.id
|
|
})
|
|
|
|
return index === -1
|
|
})
|
|
this.updateProfile(profile)
|
|
})
|
|
|
|
this.showToast({
|
|
message: this.$t('Profile.Profile has been updated')
|
|
})
|
|
this.selectNone()
|
|
} else {
|
|
const profile = JSON.parse(JSON.stringify(this.profile))
|
|
|
|
this.subscriptions = this.subscriptions.filter((channel) => {
|
|
return !channel.selected
|
|
})
|
|
|
|
profile.subscriptions = this.subscriptions
|
|
this.selectedLength = 0
|
|
|
|
this.updateProfile(profile)
|
|
|
|
this.showToast({
|
|
message: this.$t('Profile.Profile has been updated')
|
|
})
|
|
this.selectNone()
|
|
}
|
|
}
|
|
this.showDeletePrompt = false
|
|
},
|
|
|
|
handleChannelClick: function (index) {
|
|
this.subscriptions[index].selected = !this.subscriptions[index].selected
|
|
this.selectedLength = this.subscriptions.filter((channel) => {
|
|
return channel.selected
|
|
}).length
|
|
},
|
|
|
|
selectAll: function () {
|
|
Object.keys(this.$refs).forEach((ref) => {
|
|
if (typeof this.$refs[ref][0] !== 'undefined') {
|
|
this.$refs[ref][0].selected = true
|
|
}
|
|
})
|
|
|
|
this.subscriptions = this.subscriptions.map((channel) => {
|
|
channel.selected = true
|
|
return channel
|
|
})
|
|
|
|
this.selectedLength = this.subscriptions.filter((channel) => {
|
|
return channel.selected
|
|
}).length
|
|
},
|
|
|
|
selectNone: function () {
|
|
Object.keys(this.$refs).forEach((ref) => {
|
|
if (typeof this.$refs[ref][0] !== 'undefined') {
|
|
this.$refs[ref][0].selected = false
|
|
}
|
|
})
|
|
|
|
this.subscriptions = this.subscriptions.map((channel) => {
|
|
channel.selected = false
|
|
return channel
|
|
})
|
|
|
|
this.selectedLength = this.subscriptions.filter((channel) => {
|
|
return channel.selected
|
|
}).length
|
|
},
|
|
|
|
...mapActions([
|
|
'showToast',
|
|
'updateProfile'
|
|
])
|
|
}
|
|
})
|