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

198 lines
5.6 KiB

// TODO: This file was created by bulk-decaffeinate.
// Sanity-check the conversion and remove this comment.
/*
* decaffeinate suggestions:
* DS002: Fix invalid constructor
* DS102: Remove unnecessary code created because of implicit returns
* DS206: Consider reworking classes to avoid initClass
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const Cls = (app.views.Mobile = class Mobile extends app.View {
static initClass() {
this.className = '_mobile';
this.elements = {
body: 'body',
content: '._container',
sidebar: '._sidebar',
docPicker: '._settings ._sidebar'
};
this.shortcuts =
{escape: 'onEscape'};
this.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.indexOf('Android') !== -1) && (navigator.userAgent.indexOf('Mobile') !== -1)) ||
(navigator.userAgent.indexOf('IEMobile') !== -1);
} catch (error) {
return false;
}
}
static detectAndroidWebview() {
try {
return /(Android).*( Version\/.\.. ).*(Chrome)/.test(navigator.userAgent);
} catch (error) {
return false;
}
}
constructor() {
this.showSidebar = this.showSidebar.bind(this);
this.hideSidebar = this.hideSidebar.bind(this);
this.onClickBack = this.onClickBack.bind(this);
this.onClickForward = this.onClickForward.bind(this);
this.onClickToggleSidebar = this.onClickToggleSidebar.bind(this);
this.onClickDocPickerTab = this.onClickDocPickerTab.bind(this);
this.onClickSettingsTab = this.onClickSettingsTab.bind(this);
this.onTapSearch = this.onTapSearch.bind(this);
this.onEscape = this.onEscape.bind(this);
this.afterRoute = this.afterRoute.bind(this);
this.el = document.documentElement;
super(...arguments);
}
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', this.onClickDocPickerTab);
this.settingsTab = $('button[data-tab="settings"]');
this.settingsTab.removeAttribute('hidden');
$.on(this.settingsTab, 'click', this.onClickSettingsTab);
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');
}
}
});
Cls.initClass();