improvements on fature/better-nsfw-image-loading
- loading indicator - avoid hitting the cache if we already know the image was loaded - more responsive toggle
This commit is contained in:
parent
049c74f8e8
commit
502757da28
2 changed files with 29 additions and 13 deletions
|
@ -11,7 +11,9 @@ const Attachment = {
|
||||||
return {
|
return {
|
||||||
nsfwImage,
|
nsfwImage,
|
||||||
hideNsfwLocal: this.$store.state.config.hideNsfw,
|
hideNsfwLocal: this.$store.state.config.hideNsfw,
|
||||||
showHidden: false
|
showHidden: false,
|
||||||
|
loading: false,
|
||||||
|
img: document.createElement('img')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -20,6 +22,13 @@ const Attachment = {
|
||||||
},
|
},
|
||||||
hidden () {
|
hidden () {
|
||||||
return this.nsfw && this.hideNsfwLocal && !this.showHidden
|
return this.nsfw && this.hideNsfwLocal && !this.showHidden
|
||||||
|
},
|
||||||
|
autoHeight () {
|
||||||
|
if (this.type === 'image' && this.nsfw) {
|
||||||
|
return {
|
||||||
|
'min-height': '311px'
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -29,10 +38,15 @@ const Attachment = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
toggleHidden () {
|
toggleHidden () {
|
||||||
let img = document.createElement('img')
|
if (this.img.onload) {
|
||||||
img.src = this.attachment.url
|
this.img.onload()
|
||||||
img.onload = () => {
|
} else {
|
||||||
this.showHidden = !this.showHidden
|
this.loading = true
|
||||||
|
this.img.src = this.attachment.url
|
||||||
|
this.img.onload = () => {
|
||||||
|
this.loading = false
|
||||||
|
this.showHidden = !this.showHidden
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="attachment" :class="type">
|
<div class="attachment" :class="{[type]: true, loading}" :style="autoHeight">
|
||||||
<a class="image-attachment" v-if="hidden" v-on:click.prevent="toggleHidden()">
|
<a class="image-attachment" v-if="hidden" @click.prevent="toggleHidden()">
|
||||||
<img :key="nsfwImage" :src="nsfwImage"></img>
|
<img :key="nsfwImage" :src="nsfwImage"/>
|
||||||
</a>
|
</a>
|
||||||
<div class="hider" v-if="nsfw && hideNsfwLocal && !hidden">
|
<div class="hider" v-if="nsfw && hideNsfwLocal && !hidden">
|
||||||
<a href="#" @click.prevent="toggleHidden()">Hide</a>
|
<a href="#" @click.prevent="toggleHidden()">Hide</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a class="image-attachment" v-if="type === 'image' && !hidden"
|
<a v-if="type === 'image' && !hidden" class="image-attachment" :href="attachment.url" target="_blank">
|
||||||
:href="attachment.url" target="_blank">
|
<img class="base05-border" referrerpolicy="no-referrer" :src="attachment.large_thumb_url || attachment.url"/>
|
||||||
<img class="base05-border" referrerpolicy="no-referrer" :src="attachment.large_thumb_url || attachment.url"></img>
|
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<video v-if="type === 'video' && !hidden" :src="attachment.url" controls></video>
|
<video v-if="type === 'video' && !hidden" :src="attachment.url" controls></video>
|
||||||
|
@ -18,7 +17,7 @@
|
||||||
|
|
||||||
<div @click.prevent="linkClicked" v-if="type === 'html' && attachment.oembed" class="oembed">
|
<div @click.prevent="linkClicked" v-if="type === 'html' && attachment.oembed" class="oembed">
|
||||||
<div v-if="attachment.thumb_url" class="image">
|
<div v-if="attachment.thumb_url" class="image">
|
||||||
<img :src="attachment.thumb_url"></img>
|
<img :src="attachment.thumb_url"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<h1><a :href="attachment.url">{{attachment.oembed.title}}</a></h1>
|
<h1><a :href="attachment.url">{{attachment.oembed.title}}</a></h1>
|
||||||
|
@ -45,6 +44,10 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.loading {
|
||||||
|
cursor: progress;
|
||||||
|
}
|
||||||
|
|
||||||
.hider {
|
.hider {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
|
@ -111,7 +114,6 @@
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
|
||||||
img {
|
img {
|
||||||
width: 100%;
|
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
|
Loading…
Reference in a new issue