diff --git a/routes/_components/Avatar.html b/routes/_components/Avatar.html index 13c44583..14e96475 100644 --- a/routes/_components/Avatar.html +++ b/routes/_components/Avatar.html @@ -4,7 +4,7 @@ {{else}} + src="{{account.avatar}}" on:imgLoadError="set({error: true})" /> {{/if}} \ No newline at end of file diff --git a/routes/_components/Media.html b/routes/_components/Media.html index 45120a60..f71ee35b 100644 --- a/routes/_components/Media.html +++ b/routes/_components/Media.html @@ -30,7 +30,10 @@ playsinline /> {{else}} - {{media.description || ''}} @@ -65,6 +68,9 @@ .no-native-width-height img, .no-native-width-height video { background-color: var(--mask-bg); } + .status-media img.image-loading, .status-media img.image-error { + background: var(--loading-bg); + } .status-media { max-width: calc(100vw - 40px); overflow: hidden; @@ -106,6 +112,7 @@ const DEFAULT_MEDIA_WIDTH = 300 const DEFAULT_MEDIA_HEIGHT = 200 + import { imgLoad, imgLoadError } from '../_utils/events' import { showVideoDialog } from '../_utils/showVideoDialog' export default { @@ -121,6 +128,10 @@ async onClickPlayVideoButton(media, width, height, description) { showVideoDialog(media.preview_url, media.url, width, height, description) } + }, + events: { + imgLoad, + imgLoadError } } \ No newline at end of file diff --git a/routes/_utils/events.js b/routes/_utils/events.js new file mode 100644 index 00000000..c25266ca --- /dev/null +++ b/routes/_utils/events.js @@ -0,0 +1,19 @@ +export function imgLoadError (node, callback) { + node.addEventListener('error', callback) + + return { + teardown () { + node.removeEventListener('error', callback) + } + } +} + +export function imgLoad (node, callback) { + node.addEventListener('load', callback) + + return { + teardown () { + node.removeEventListener('load', callback) + } + } +} \ No newline at end of file diff --git a/scss/themes/_base.scss b/scss/themes/_base.scss index 48578f05..8b9452c0 100644 --- a/scss/themes/_base.scss +++ b/scss/themes/_base.scss @@ -58,6 +58,7 @@ --mask-bg: $toast-bg; --mask-svg-fill: $secondary-text-color; --mask-opaque-bg: rgba($toast-bg, 0.8); + --loading-bg: #ededed; --deemphasized-text-color: #666; --focus-outline: $focus-outline; diff --git a/templates/2xx.html b/templates/2xx.html index 16bc5bbc..aaaff974 100644 --- a/templates/2xx.html +++ b/templates/2xx.html @@ -10,9 +10,9 @@