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.
devdocs/assets/javascripts/views/layout/mobile.js

190 lines
4.7 KiB

app.views.Mobile = class Mobile extends app.View {
static className = "_mobile";
static elements = {
body: "body",
content: "._container",
sidebar: "._sidebar",
docPicker: "._settings ._sidebar",
};
static shortcuts = { escape: "onEscape" };
static routes = { after: "afterRoute" };
static detect() {
if (Cookies.get("override-mobile-detect") != null) {
return JSON.parse(Cookies.get("override-mobile-detect"));
}
try {
return (
window.matchMedia("(max-width: 480px)").matches ||
window.matchMedia("(max-width: 767px)").matches ||
window.matchMedia("(max-height: 767px) and (max-width: 1024px)")
.matches ||
// Need to sniff the user agent because some Android and Windows Phone devices don't take
// resolution (dpi) into account when reporting device width/height.
(navigator.userAgent.includes("Android") &&
navigator.userAgent.includes("Mobile")) ||
navigator.userAgent.includes("IEMobile")
);
} catch (error) {
return false;
}
}
static detectAndroidWebview() {
try {
return /(Android).*( Version\/.\.. ).*(Chrome)/.test(navigator.userAgent);
} catch (error) {
return false;
}
}
constructor() {
super(document.documentElement);
}
init() {
$.on($("._search"), "touchend", () => this.onTapSearch());
this.toggleSidebar = $("button[data-toggle-sidebar]");
this.toggleSidebar.removeAttribute("hidden");
$.on(this.toggleSidebar, "click", () => this.onClickToggleSidebar());
this.back = $("button[data-back]");
this.back.removeAttribute("hidden");
$.on(this.back, "click", () => this.onClickBack());
this.forward = $("button[data-forward]");
this.forward.removeAttribute("hidden");
$.on(this.forward, "click", () => this.onClickForward());
this.docPickerTab = $('button[data-tab="doc-picker"]');
this.docPickerTab.removeAttribute("hidden");
$.on(this.docPickerTab, "click", (event) =>
this.onClickDocPickerTab(event),
);
this.settingsTab = $('button[data-tab="settings"]');
this.settingsTab.removeAttribute("hidden");
$.on(this.settingsTab, "click", (event) => this.onClickSettingsTab(event));
app.document.sidebar.search.on("searching", () => this.showSidebar());
this.activate();
}
showSidebar() {
let selection;
if (this.isSidebarShown()) {
window.scrollTo(0, 0);
return;
}
this.contentTop = window.scrollY;
this.content.style.display = "none";
this.sidebar.style.display = "block";
if ((selection = this.findByClass(app.views.ListSelect.activeClass))) {
const scrollContainer =
window.scrollY === this.body.scrollTop
? this.body
: document.documentElement;
$.scrollTo(selection, scrollContainer, "center");
} else {
window.scrollTo(
0,
(this.findByClass(app.views.ListFold.activeClass) && this.sidebarTop) ||
0,
);
}
}
hideSidebar() {
if (!this.isSidebarShown()) {
return;
}
this.sidebarTop = window.scrollY;
this.sidebar.style.display = "none";
this.content.style.display = "block";
window.scrollTo(0, this.contentTop || 0);
}
isSidebarShown() {
return this.sidebar.style.display !== "none";
}
onClickBack() {
return history.back();
}
onClickForward() {
return history.forward();
}
onClickToggleSidebar() {
if (this.isSidebarShown()) {
this.hideSidebar();
} else {
this.showSidebar();
}
}
onClickDocPickerTab(event) {
$.stopEvent(event);
this.showDocPicker();
}
onClickSettingsTab(event) {
$.stopEvent(event);
this.showSettings();
}
showDocPicker() {
window.scrollTo(0, 0);
this.docPickerTab.classList.add("active");
this.settingsTab.classList.remove("active");
this.docPicker.style.display = "block";
this.content.style.display = "none";
}
showSettings() {
window.scrollTo(0, 0);
this.docPickerTab.classList.remove("active");
this.settingsTab.classList.add("active");
this.docPicker.style.display = "none";
this.content.style.display = "block";
}
onTapSearch() {
return window.scrollTo(0, 0);
}
onEscape() {
return this.hideSidebar();
}
afterRoute(route) {
this.hideSidebar();
if (route === "settings") {
this.showDocPicker();
} else {
this.content.style.display = "block";
}
if (page.canGoBack()) {
this.back.removeAttribute("disabled");
} else {
this.back.setAttribute("disabled", "disabled");
}
if (page.canGoForward()) {
this.forward.removeAttribute("disabled");
} else {
this.forward.setAttribute("disabled", "disabled");
}
}
};