yandere_fe/src/components/gallery/gallery.js

101 lines
2.8 KiB
JavaScript
Raw Normal View History

2019-01-26 07:45:03 -08:00
import Attachment from '../attachment/attachment.vue'
import { sumBy } from 'lodash'
2019-01-26 07:45:03 -08:00
const Gallery = {
props: [
'attachments',
2021-06-17 16:04:01 -07:00
'limitRows',
'descriptions',
'limit',
2019-01-26 07:45:03 -08:00
'nsfw',
'setMedia',
2021-06-17 16:04:01 -07:00
'size',
'editable',
'removeAttachment',
'editAttachment',
'maxPerRow'
2019-01-26 07:45:03 -08:00
],
data () {
return {
sizes: {},
hidingLong: true
}
2019-01-26 07:45:03 -08:00
},
components: { Attachment },
computed: {
rows () {
if (!this.attachments) {
return []
}
console.log(this.limit)
const attachments = this.limit > 0
? this.attachments.slice(0, this.limit)
: this.attachments
if (this.size === 'hide') {
return attachments.map(item => ({ minimal: true, items: [item] }))
2019-01-26 07:45:03 -08:00
}
const rows = attachments.reduce((acc, attachment, i) => {
if (attachment.mimetype.includes('audio')) {
return [...acc, { audio: true, items: [attachment] }, { items: [] }]
}
2021-06-17 16:04:01 -07:00
const maxPerRow = this.maxPerRow || 3
const attachmentsRemaining = this.attachments.length - i + 1
const currentRow = acc[acc.length - 1].items
2021-06-17 16:04:01 -07:00
currentRow.push(attachment)
if (currentRow.length >= maxPerRow && attachmentsRemaining > maxPerRow) {
return [...acc, { items: [] }]
} else {
return acc
}
}, [{ items: [] }]).filter(_ => _.items.length > 0)
2019-01-26 07:45:03 -08:00
return rows
},
attachmentsDimensionalScore () {
return this.rows.reduce((acc, row) => {
return acc + (row.audio ? 0.25 : (1 / (row.items.length + 0.6)))
}, 0)
},
tooManyAttachments () {
2021-06-17 16:04:01 -07:00
if (this.editable || this.size === 'small') {
return false
} else if (this.size === 'hide') {
return this.attachments.length > 8
} else {
return this.attachmentsDimensionalScore > 1
}
2019-01-26 07:45:03 -08:00
}
},
methods: {
2021-06-17 16:04:01 -07:00
onNaturalSizeLoad ({ id, width, height }) {
this.$set(this.sizes, id, { width, height })
},
rowStyle (row) {
if (row.audio) {
return { 'padding-bottom': '25%' } // fixed reduced height for audio
} else if (!row.minimal) {
return { 'padding-bottom': `${(100 / (row.items.length + 0.6))}%` }
}
},
2019-10-21 12:13:11 -07:00
itemStyle (id, row) {
const total = sumBy(row, item => this.getAspectRatio(item.id))
return { flex: `${this.getAspectRatio(id) / total} 1 0%` }
2019-10-21 12:13:11 -07:00
},
getAspectRatio (id) {
const size = this.sizes[id]
2019-10-21 12:13:11 -07:00
return size ? size.width / size.height : 1
},
toggleHidingLong (event) {
this.hidingLong = event
},
openGallery () {
2021-06-17 16:04:01 -07:00
this.$store.dispatch('setMedia', this.attachments)
this.$store.dispatch('setCurrentMedia', this.attachments[0])
},
onMedia () {
this.$store.dispatch('setMedia', this.attachments)
2019-01-26 07:45:03 -08:00
}
}
}
export default Gallery