Files
code-snippets/HTML/desktop-clock/background.js
T

88 lines
2.6 KiB
JavaScript
Raw Normal View History

2026-08-03 23:55:21 +08:00
(function () {
"use strict";
var DB_NAME = "desktop-clock-assets";
var STORE_NAME = "images";
var BACKGROUND_KEY = "background";
var activeUrl = "";
function openDatabase() {
return new Promise(function (resolve, reject) {
var request = indexedDB.open(DB_NAME, 1);
request.onupgradeneeded = function () { request.result.createObjectStore(STORE_NAME); };
request.onsuccess = function () { resolve(request.result); };
request.onerror = function () { reject(request.error); };
});
}
async function useStore(mode, action) {
var database = await openDatabase();
return new Promise(function (resolve, reject) {
var transaction = database.transaction(STORE_NAME, mode);
var request = action(transaction.objectStore(STORE_NAME));
request.onsuccess = function () { resolve(request.result); };
request.onerror = function () { reject(request.error); };
transaction.oncomplete = function () { database.close(); };
});
}
function save(file) {
return useStore("readwrite", function (store) { return store.put(file, BACKGROUND_KEY); });
}
function remove() {
clearActiveUrl();
return useStore("readwrite", function (store) { return store.delete(BACKGROUND_KEY); });
}
function getBlob() {
return useStore("readonly", function (store) { return store.get(BACKGROUND_KEY); });
}
function clearActiveUrl() {
if (activeUrl) URL.revokeObjectURL(activeUrl);
activeUrl = "";
}
async function getUrl() {
var blob = await getBlob();
clearActiveUrl();
if (!blob) return "";
activeUrl = URL.createObjectURL(blob);
return activeUrl;
}
function setEffects(target, settings) {
target.style.setProperty("--background-blur", settings.backgroundBlur + "px");
target.style.setProperty("--background-brightness", settings.backgroundBrightness + "%");
}
async function apply(settings) {
var root = document.documentElement;
setEffects(root, settings);
if (!settings.backgroundEnabled) {
root.classList.remove("has-custom-background");
root.style.removeProperty("--background-image");
return false;
}
try {
var url = await getUrl();
root.classList.toggle("has-custom-background", Boolean(url));
if (url) root.style.setProperty("--background-image", 'url("' + url + '")');
return Boolean(url);
} catch (error) {
root.classList.remove("has-custom-background");
return false;
}
}
window.DesktopClockBackground = {
apply: apply,
getUrl: getUrl,
remove: remove,
save: save,
setEffects: setEffects
};
}());