Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
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.
152 lines
4.5 KiB
152 lines
4.5 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import appNavigationController from '../components/appNavigationController'; |
|
import IS_TOUCH_SUPPORTED from '../environment/touchSupport'; |
|
import {IS_MOBILE_SAFARI} from '../environment/userAgent'; |
|
import cancelEvent from './dom/cancelEvent'; |
|
import {CLICK_EVENT_NAME} from './dom/clickEvent'; |
|
import EventListenerBase from './eventListenerBase'; |
|
import mediaSizes from './mediaSizes'; |
|
|
|
class ContextMenuController extends EventListenerBase<{ |
|
toggle: (open: boolean) => void |
|
}> { |
|
private openedMenu: HTMLElement; |
|
private menuOverlay: HTMLElement; |
|
private openedMenuOnClose: () => void; |
|
|
|
constructor() { |
|
super(); |
|
|
|
mediaSizes.addEventListener('resize', () => { |
|
if(this.openedMenu) { |
|
this.closeBtnMenu(); |
|
} |
|
|
|
/* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) { |
|
const rect = openedMenu.getBoundingClientRect(); |
|
const {innerWidth, innerHeight} = window; |
|
|
|
console.log(innerWidth, innerHeight, rect); |
|
} */ |
|
}) |
|
} |
|
|
|
public isOpened() { |
|
return !!this.openedMenu; |
|
} |
|
|
|
private onMouseMove = (e: MouseEvent) => { |
|
const rect = this.openedMenu.getBoundingClientRect(); |
|
const {clientX, clientY} = e; |
|
|
|
const diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX; |
|
const diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY; |
|
|
|
if(diffX >= 100 || diffY >= 100) { |
|
this.closeBtnMenu(); |
|
// openedMenu.parentElement.click(); |
|
} |
|
// console.log('mousemove', diffX, diffY); |
|
}; |
|
|
|
private onClick = (e: MouseEvent | TouchEvent) => { |
|
// cancelEvent(e); |
|
this.closeBtnMenu(); |
|
}; |
|
|
|
// ! no need in this due to the same handler in appNavigationController |
|
/* const onKeyDown = (e: KeyboardEvent) => { |
|
if(e.key === 'Escape') { |
|
closeBtnMenu(); |
|
cancelEvent(e); |
|
} |
|
}; */ |
|
|
|
public closeBtnMenu = () => { |
|
if(this.openedMenu) { |
|
this.openedMenu.classList.remove('active'); |
|
this.openedMenu.parentElement.classList.remove('menu-open'); |
|
// openedMenu.previousElementSibling.remove(); // remove overlay |
|
if(this.menuOverlay) this.menuOverlay.remove(); |
|
this.openedMenu = undefined; |
|
|
|
this.dispatchEvent('toggle', false); |
|
} |
|
|
|
if(this.openedMenuOnClose) { |
|
this.openedMenuOnClose(); |
|
this.openedMenuOnClose = undefined; |
|
} |
|
|
|
if(!IS_TOUCH_SUPPORTED) { |
|
window.removeEventListener('mousemove', this.onMouseMove); |
|
// window.removeEventListener('keydown', onKeyDown, {capture: true}); |
|
window.removeEventListener('contextmenu', this.onClick); |
|
} |
|
|
|
document.removeEventListener(CLICK_EVENT_NAME, this.onClick); |
|
|
|
if(!IS_MOBILE_SAFARI) { |
|
appNavigationController.removeByType('menu'); |
|
} |
|
}; |
|
|
|
public openBtnMenu(menuElement: HTMLElement, onClose?: () => void) { |
|
this.closeBtnMenu(); |
|
|
|
if(!IS_MOBILE_SAFARI) { |
|
appNavigationController.pushItem({ |
|
type: 'menu', |
|
onPop: (canAnimate) => { |
|
this.closeBtnMenu(); |
|
} |
|
}); |
|
} |
|
|
|
this.openedMenu = menuElement; |
|
this.openedMenu.classList.add('active'); |
|
this.openedMenu.parentElement.classList.add('menu-open'); |
|
|
|
if(!this.menuOverlay) { |
|
this.menuOverlay = document.createElement('div'); |
|
this.menuOverlay.classList.add('btn-menu-overlay'); |
|
|
|
// ! because this event must be canceled, and can't cancel on menu click (below) |
|
this.menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => { |
|
cancelEvent(e); |
|
this.onClick(e); |
|
}); |
|
} |
|
|
|
this.openedMenu.parentElement.insertBefore(this.menuOverlay, this.openedMenu); |
|
|
|
// document.body.classList.add('disable-hover'); |
|
|
|
this.openedMenuOnClose = onClose; |
|
|
|
if(!IS_TOUCH_SUPPORTED) { |
|
window.addEventListener('mousemove', this.onMouseMove); |
|
// window.addEventListener('keydown', onKeyDown, {capture: true}); |
|
window.addEventListener('contextmenu', this.onClick, {once: true}); |
|
} |
|
|
|
/* // ! because this event must be canceled, and can't cancel on menu click (below) |
|
overlay.addEventListener(CLICK_EVENT_NAME, (e) => { |
|
cancelEvent(e); |
|
onClick(e); |
|
}); */ |
|
|
|
// ! safari iOS doesn't handle window click event on overlay, idk why |
|
document.addEventListener(CLICK_EVENT_NAME, this.onClick); |
|
|
|
this.dispatchEvent('toggle', true); |
|
} |
|
} |
|
|
|
const contextMenuController = new ContextMenuController(); |
|
export default contextMenuController;
|
|
|