Make Updater slightly more future proof
- Removes the option to disable update notifications. Users really should not be outdated, so this option was never good. To disable notifications, turn on auto update - Enables auto update by default. Users keep complaining about issues while being outdated, so this should help - Update Notification now opens Updater in a modal to remove dependency on Settings patch. This makes it slightly more failsafe, it's unlikely that both modals and our settings patch break
This commit is contained in:
parent
0bebc85b0d
commit
8f73b9fd5f
|
@ -27,6 +27,7 @@ export { PlainSettings, Settings };
|
||||||
import "./utils/quickCss";
|
import "./utils/quickCss";
|
||||||
import "./webpack/patchWebpack";
|
import "./webpack/patchWebpack";
|
||||||
|
|
||||||
|
import { openUpdaterModal } from "@components/VencordSettings/UpdaterTab";
|
||||||
import { StartAt } from "@utils/types";
|
import { StartAt } from "@utils/types";
|
||||||
|
|
||||||
import { get as dsGet } from "./api/DataStore";
|
import { get as dsGet } from "./api/DataStore";
|
||||||
|
@ -85,7 +86,7 @@ async function init() {
|
||||||
|
|
||||||
syncSettings();
|
syncSettings();
|
||||||
|
|
||||||
if (!IS_WEB) {
|
if (!IS_WEB && !IS_UPDATER_DISABLED) {
|
||||||
try {
|
try {
|
||||||
const isOutdated = await checkForUpdates();
|
const isOutdated = await checkForUpdates();
|
||||||
if (!isOutdated) return;
|
if (!isOutdated) return;
|
||||||
|
@ -103,15 +104,12 @@ async function init() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Settings.notifyAboutUpdates)
|
|
||||||
setTimeout(() => showNotification({
|
setTimeout(() => showNotification({
|
||||||
title: "A Vencord update is available!",
|
title: "A Vencord update is available!",
|
||||||
body: "Click here to view the update",
|
body: "Click here to view the update",
|
||||||
permanent: true,
|
permanent: true,
|
||||||
noPersist: true,
|
noPersist: true,
|
||||||
onClick() {
|
onClick: openUpdaterModal!
|
||||||
SettingsRouter.open("VencordUpdater");
|
|
||||||
}
|
|
||||||
}), 10_000);
|
}), 10_000);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
UpdateLogger.error("Failed to check for updates", err);
|
UpdateLogger.error("Failed to check for updates", err);
|
||||||
|
|
|
@ -29,7 +29,6 @@ import plugins from "~plugins";
|
||||||
|
|
||||||
const logger = new Logger("Settings");
|
const logger = new Logger("Settings");
|
||||||
export interface Settings {
|
export interface Settings {
|
||||||
notifyAboutUpdates: boolean;
|
|
||||||
autoUpdate: boolean;
|
autoUpdate: boolean;
|
||||||
autoUpdateNotification: boolean,
|
autoUpdateNotification: boolean,
|
||||||
useQuickCss: boolean;
|
useQuickCss: boolean;
|
||||||
|
@ -78,8 +77,7 @@ export interface Settings {
|
||||||
}
|
}
|
||||||
|
|
||||||
const DefaultSettings: Settings = {
|
const DefaultSettings: Settings = {
|
||||||
notifyAboutUpdates: true,
|
autoUpdate: true,
|
||||||
autoUpdate: false,
|
|
||||||
autoUpdateNotification: true,
|
autoUpdateNotification: true,
|
||||||
useQuickCss: true,
|
useQuickCss: true,
|
||||||
themeLinks: [],
|
themeLinks: [],
|
||||||
|
|
|
@ -22,6 +22,7 @@ import { Flex } from "@components/Flex";
|
||||||
import { Link } from "@components/Link";
|
import { Link } from "@components/Link";
|
||||||
import { Margins } from "@utils/margins";
|
import { Margins } from "@utils/margins";
|
||||||
import { classes } from "@utils/misc";
|
import { classes } from "@utils/misc";
|
||||||
|
import { ModalCloseButton, ModalContent, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal";
|
||||||
import { relaunch } from "@utils/native";
|
import { relaunch } from "@utils/native";
|
||||||
import { useAwaiter } from "@utils/react";
|
import { useAwaiter } from "@utils/react";
|
||||||
import { changes, checkForUpdates, getRepo, isNewer, update, updateError, UpdateLogger } from "@utils/updater";
|
import { changes, checkForUpdates, getRepo, isNewer, update, updateError, UpdateLogger } from "@utils/updater";
|
||||||
|
@ -29,7 +30,7 @@ import { Alerts, Button, Card, Forms, Parser, React, Switch, Toasts } from "@web
|
||||||
|
|
||||||
import gitHash from "~git-hash";
|
import gitHash from "~git-hash";
|
||||||
|
|
||||||
import { SettingsTab, wrapTab } from "./shared";
|
import { handleSettingsTabError, SettingsTab, wrapTab } from "./shared";
|
||||||
|
|
||||||
function withDispatcher(dispatcher: React.Dispatch<React.SetStateAction<boolean>>, action: () => any) {
|
function withDispatcher(dispatcher: React.Dispatch<React.SetStateAction<boolean>>, action: () => any) {
|
||||||
return async () => {
|
return async () => {
|
||||||
|
@ -38,21 +39,24 @@ function withDispatcher(dispatcher: React.Dispatch<React.SetStateAction<boolean>
|
||||||
await action();
|
await action();
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
UpdateLogger.error("Failed to update", e);
|
UpdateLogger.error("Failed to update", e);
|
||||||
|
|
||||||
|
let err: string;
|
||||||
if (!e) {
|
if (!e) {
|
||||||
var err = "An unknown error occurred (error is undefined).\nPlease try again.";
|
err = "An unknown error occurred (error is undefined).\nPlease try again.";
|
||||||
} else if (e.code && e.cmd) {
|
} else if (e.code && e.cmd) {
|
||||||
const { code, path, cmd, stderr } = e;
|
const { code, path, cmd, stderr } = e;
|
||||||
|
|
||||||
if (code === "ENOENT")
|
if (code === "ENOENT")
|
||||||
var err = `Command \`${path}\` not found.\nPlease install it and try again`;
|
err = `Command \`${path}\` not found.\nPlease install it and try again`;
|
||||||
else {
|
else {
|
||||||
var err = `An error occurred while running \`${cmd}\`:\n`;
|
err = `An error occurred while running \`${cmd}\`:\n`;
|
||||||
err += stderr || `Code \`${code}\`. See the console for more info`;
|
err += stderr || `Code \`${code}\`. See the console for more info`;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
var err = "An unknown error occurred. See the console for more info.";
|
err = "An unknown error occurred. See the console for more info.";
|
||||||
}
|
}
|
||||||
|
|
||||||
Alerts.show({
|
Alerts.show({
|
||||||
title: "Oops!",
|
title: "Oops!",
|
||||||
body: (
|
body: (
|
||||||
|
@ -186,7 +190,7 @@ function Newer(props: CommonProps) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function Updater() {
|
function Updater() {
|
||||||
const settings = useSettings(["notifyAboutUpdates", "autoUpdate", "autoUpdateNotification"]);
|
const settings = useSettings(["autoUpdate", "autoUpdateNotification"]);
|
||||||
|
|
||||||
const [repo, err, repoPending] = useAwaiter(getRepo, { fallbackValue: "Loading..." });
|
const [repo, err, repoPending] = useAwaiter(getRepo, { fallbackValue: "Loading..." });
|
||||||
|
|
||||||
|
@ -203,14 +207,6 @@ function Updater() {
|
||||||
return (
|
return (
|
||||||
<SettingsTab title="Vencord Updater">
|
<SettingsTab title="Vencord Updater">
|
||||||
<Forms.FormTitle tag="h5">Updater Settings</Forms.FormTitle>
|
<Forms.FormTitle tag="h5">Updater Settings</Forms.FormTitle>
|
||||||
<Switch
|
|
||||||
value={settings.notifyAboutUpdates}
|
|
||||||
onChange={(v: boolean) => settings.notifyAboutUpdates = v}
|
|
||||||
note="Shows a notification on startup"
|
|
||||||
disabled={settings.autoUpdate}
|
|
||||||
>
|
|
||||||
Get notified about new updates
|
|
||||||
</Switch>
|
|
||||||
<Switch
|
<Switch
|
||||||
value={settings.autoUpdate}
|
value={settings.autoUpdate}
|
||||||
onChange={(v: boolean) => settings.autoUpdate = v}
|
onChange={(v: boolean) => settings.autoUpdate = v}
|
||||||
|
@ -253,3 +249,20 @@ function Updater() {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default IS_UPDATER_DISABLED ? null : wrapTab(Updater, "Updater");
|
export default IS_UPDATER_DISABLED ? null : wrapTab(Updater, "Updater");
|
||||||
|
|
||||||
|
export const openUpdaterModal = IS_UPDATER_DISABLED ? null : function () {
|
||||||
|
const UpdaterTab = wrapTab(Updater, "Updater");
|
||||||
|
|
||||||
|
try {
|
||||||
|
openModal(wrapTab((modalProps: ModalProps) => (
|
||||||
|
<ModalRoot {...modalProps} size={ModalSize.MEDIUM}>
|
||||||
|
<ModalContent className="vc-updater-modal">
|
||||||
|
<ModalCloseButton onClick={modalProps.onClose} className="vc-updater-modal-close-button" />
|
||||||
|
<UpdaterTab />
|
||||||
|
</ModalContent>
|
||||||
|
</ModalRoot>
|
||||||
|
), "UpdaterModal"));
|
||||||
|
} catch {
|
||||||
|
handleSettingsTabError();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -65,3 +65,11 @@
|
||||||
/* discord also sets cursor: default which prevents the cursor from showing as text */
|
/* discord also sets cursor: default which prevents the cursor from showing as text */
|
||||||
cursor: initial;
|
cursor: initial;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.vc-updater-modal {
|
||||||
|
padding: 1.5em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vc-updater-modal-close-button {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
|
@ -42,11 +42,11 @@ export function SettingsTab({ title, children }: PropsWithChildren<{ title: stri
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const onError = onlyOnce(handleComponentFailed);
|
export const handleSettingsTabError = onlyOnce(handleComponentFailed);
|
||||||
|
|
||||||
export function wrapTab(component: ComponentType, tab: string) {
|
export function wrapTab(component: ComponentType<any>, tab: string) {
|
||||||
return ErrorBoundary.wrap(component, {
|
return ErrorBoundary.wrap(component, {
|
||||||
message: `Failed to render the ${tab} tab. If this issue persists, try using the installer to reinstall!`,
|
message: `Failed to render the ${tab} tab. If this issue persists, try using the installer to reinstall!`,
|
||||||
onError,
|
onError: handleSettingsTabError,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue