Files
desktop/src/zen/common/modules/ZenUpdates.mjs

96 lines
2.8 KiB
JavaScript

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
import createSidebarNotification from "chrome://browser/content/zen-components/ZenSidebarNotification.mjs";
const ZEN_UPDATE_PREF = "zen.updates.last-version";
const ZEN_BUILD_ID_PREF = "zen.updates.last-build-id";
const ZEN_UPDATE_SHOW = "zen.updates.show-update-notification";
export default function checkForZenUpdates() {
const version = Services.appinfo.version;
const lastVersion = Services.prefs.getStringPref(ZEN_UPDATE_PREF, "");
Services.prefs.setStringPref(ZEN_UPDATE_PREF, version);
if (
version === lastVersion ||
gZenUIManager.testingEnabled ||
!Services.prefs.getBoolPref(ZEN_UPDATE_SHOW, true)
) {
return;
}
const updateUrl = Services.prefs.getStringPref(
"app.releaseNotesURL.prompt",
""
);
createSidebarNotification({
headingL10nId: "zen-sidebar-notification-updated-heading",
links: [
{
url: Services.urlFormatter.formatURL(
updateUrl.replace("%VERSION%", version)
),
l10nId: "zen-sidebar-notification-updated",
special: true,
icon: "chrome://browser/skin/zen-icons/heart-circle-fill.svg",
},
{
action: () => {
Services.obs.notifyObservers(window, "restart-in-safe-mode");
},
l10nId: "zen-sidebar-notification-restart-safe-mode",
icon: "chrome://browser/skin/zen-icons/security-broken.svg",
},
],
});
}
export async function createWindowUpdateAnimation() {
const appID = Services.appinfo.appBuildID;
if (
Services.prefs.getStringPref(ZEN_BUILD_ID_PREF, "") === appID ||
gZenUIManager.testingEnabled
) {
return;
}
Services.prefs.setStringPref(ZEN_BUILD_ID_PREF, appID);
await gZenWorkspaces.promiseInitialized;
const appWrapper = document.getElementById("zen-main-app-wrapper");
const element = document.createElement("div");
element.id = "zen-update-animation";
const elementBorder = document.createElement("div");
elementBorder.id = "zen-update-animation-border";
requestIdleCallback(() => {
if (gReduceMotion) {
return;
}
appWrapper.appendChild(element);
appWrapper.appendChild(elementBorder);
Promise.all([
gZenUIManager.motion.animate(
"#zen-update-animation",
{
top: ["100%", "-50%"],
opacity: [0.5, 1],
},
{
duration: 0.35,
}
),
gZenUIManager.motion.animate(
"#zen-update-animation-border",
{
"--background-top": ["150%", "-50%"],
},
{
duration: 0.35,
delay: 0.08,
}
),
]).then(() => {
element.remove();
elementBorder.remove();
});
});
}