From 5a4e8f1a7a6aa7ac4c40371a4c6892485ffe3d40 Mon Sep 17 00:00:00 2001 From: Isaac Date: Sat, 19 Nov 2022 21:38:20 +0000 Subject: [PATCH] fix: use AVIF if supported --- src/components/widgets/background/Background.jsx | 4 +++- src/modules/helpers/background/avif.js | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/modules/helpers/background/avif.js diff --git a/src/components/widgets/background/Background.jsx b/src/components/widgets/background/Background.jsx index fe034980..ed70ef5a 100644 --- a/src/components/widgets/background/Background.jsx +++ b/src/components/widgets/background/Background.jsx @@ -15,6 +15,7 @@ import { import './scss/index.scss'; import { decodeBlurHash } from 'fast-blurhash'; +import { supportsAVIF } from 'modules/helpers/background/avif'; export default class Background extends PureComponent { constructor() { @@ -177,8 +178,9 @@ export default class Background extends PureComponent { break; } + const accept = 'application/json, ' + (await supportsAVIF() ? 'image/avif' : 'image/webp'); try { - data = await (await fetch(requestURL)).json(); + data = await (await fetch(requestURL, { headers: { accept } })).json(); } catch (e) { // if requesting to the API fails, we get an offline image return this.setState(offlineBackground('api')); diff --git a/src/modules/helpers/background/avif.js b/src/modules/helpers/background/avif.js new file mode 100644 index 00000000..a275212b --- /dev/null +++ b/src/modules/helpers/background/avif.js @@ -0,0 +1,10 @@ +const testImage = 'AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAAFCbWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAFBETmF2aWYAAAAADnBpdG0AAAAAAAEAAAAsaWxvYwAAAABEAAACAAEAAAABAAACRgAAABgAAgAAAAEAAAFqAAAA3AAAAEFpaW5mAAAAAAACAAAAGmluZmUCAAAAAAEAAGF2MDFDb2xvcgAAAAAZaW5mZQIAAAEAAgAARXhpZkV4aWYAAAAAGmlyZWYAAAAAAAAADmNkc2MAAgABAAEAAAB5aXBycAAAAFlpcGNvAAAAFGlzcGUAAAAAAAAAAQAAAAEAAAAQcGFzcAAAAAEAAAABAAAADGF2MUOBABwAAAAADnBpeGkAAAAAAQgAAAATY29scm5jbHgAAQANAAGAAAAAGGlwbWEAAAAAAAAAAQABBQECg4SFAAAA/G1kYXQAAAAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAADEBAgARAAAAZgAAAGmHBAABAAAAeAAAAAAAAAABAAAAAQAAAAEAAAABAAAAcGFpbnQubmV0IDQuMy4xMgAABQAAkAcABAAAADAyMzABoAMAAQAAAAEAAAACoAQAAQAAAAEAAAADoAQAAQAAAAEAAAAFoAQAAQAAALoAAAAAAAAAAgABAAIABAAAAFI5OAACAAcABAAAADAxMDAAAAAAEgAKBxgABpgIaA0yCxJABBEAEADG1FkX'; + +export const supportsAVIF = async () => { + return new Promise((resolve, reject) => { + const image = new Image(); + image.src = `data:image/avif;base64,${testImage}`; + image.onload = () => resolve(true); + image.onerror = () => reject(false); + }); +}; \ No newline at end of file