mirror of https://github.com/freeCodeCamp/devdocs
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
3.6 KiB
144 lines
3.6 KiB
app.views.SettingsPage = class SettingsPage extends app.View {
|
|
static className = "_static";
|
|
|
|
static events = {
|
|
click: "onClick",
|
|
change: "onChange",
|
|
};
|
|
|
|
render() {
|
|
this.html(this.tmpl("settingsPage", this.currentSettings()));
|
|
}
|
|
|
|
currentSettings() {
|
|
const settings = {};
|
|
settings.theme = app.settings.get("theme");
|
|
settings.smoothScroll = !app.settings.get("fastScroll");
|
|
settings.arrowScroll = app.settings.get("arrowScroll");
|
|
settings.noAutofocus = app.settings.get("noAutofocus");
|
|
settings.autoInstall = app.settings.get("autoInstall");
|
|
settings.analyticsConsent = app.settings.get("analyticsConsent");
|
|
settings.spaceScroll = app.settings.get("spaceScroll");
|
|
settings.spaceTimeout = app.settings.get("spaceTimeout");
|
|
settings.autoSupported = app.settings.autoSupported;
|
|
for (var layout of app.Settings.LAYOUTS) {
|
|
settings[layout] = app.settings.hasLayout(layout);
|
|
}
|
|
return settings;
|
|
}
|
|
|
|
getTitle() {
|
|
return "Preferences";
|
|
}
|
|
|
|
setTheme(value) {
|
|
app.settings.set("theme", value);
|
|
}
|
|
|
|
toggleLayout(layout, enable) {
|
|
app.settings.setLayout(layout, enable);
|
|
}
|
|
|
|
toggleSmoothScroll(enable) {
|
|
app.settings.set("fastScroll", !enable);
|
|
}
|
|
|
|
toggleAnalyticsConsent(enable) {
|
|
app.settings.set("analyticsConsent", enable ? "1" : "0");
|
|
if (!enable) {
|
|
resetAnalytics();
|
|
}
|
|
}
|
|
|
|
toggleSpaceScroll(enable) {
|
|
app.settings.set("spaceScroll", enable ? 1 : 0);
|
|
}
|
|
|
|
setScrollTimeout(value) {
|
|
return app.settings.set("spaceTimeout", value);
|
|
}
|
|
|
|
toggle(name, enable) {
|
|
app.settings.set(name, enable);
|
|
}
|
|
|
|
export() {
|
|
const data = new Blob([JSON.stringify(app.settings.export())], {
|
|
type: "application/json",
|
|
});
|
|
const link = document.createElement("a");
|
|
link.href = URL.createObjectURL(data);
|
|
link.download = "devdocs.json";
|
|
link.style.display = "none";
|
|
document.body.appendChild(link);
|
|
link.click();
|
|
document.body.removeChild(link);
|
|
}
|
|
|
|
import(file, input) {
|
|
if (!file || file.type !== "application/json") {
|
|
new app.views.Notif("ImportInvalid", { autoHide: false });
|
|
return;
|
|
}
|
|
|
|
const reader = new FileReader();
|
|
reader.onloadend = function () {
|
|
const data = (() => {
|
|
try {
|
|
return JSON.parse(reader.result);
|
|
} catch (error) {}
|
|
})();
|
|
if (!data || data.constructor !== Object) {
|
|
new app.views.Notif("ImportInvalid", { autoHide: false });
|
|
return;
|
|
}
|
|
app.settings.import(data);
|
|
$.trigger(input.form, "import");
|
|
};
|
|
reader.readAsText(file);
|
|
}
|
|
|
|
onChange(event) {
|
|
const input = event.target;
|
|
switch (input.name) {
|
|
case "theme":
|
|
this.setTheme(input.value);
|
|
break;
|
|
case "layout":
|
|
this.toggleLayout(input.value, input.checked);
|
|
break;
|
|
case "smoothScroll":
|
|
this.toggleSmoothScroll(input.checked);
|
|
break;
|
|
case "import":
|
|
this.import(input.files[0], input);
|
|
break;
|
|
case "analyticsConsent":
|
|
this.toggleAnalyticsConsent(input.checked);
|
|
break;
|
|
case "spaceScroll":
|
|
this.toggleSpaceScroll(input.checked);
|
|
break;
|
|
case "spaceTimeout":
|
|
this.setScrollTimeout(input.value);
|
|
break;
|
|
default:
|
|
this.toggle(input.name, input.checked);
|
|
}
|
|
}
|
|
|
|
onClick(event) {
|
|
const target = $.eventTarget(event);
|
|
switch (target.getAttribute("data-action")) {
|
|
case "export":
|
|
$.stopEvent(event);
|
|
this.export();
|
|
break;
|
|
}
|
|
}
|
|
|
|
onRoute(context) {
|
|
this.render();
|
|
}
|
|
};
|