Eduard Kuzmenko
2 years ago
23 changed files with 307 additions and 157 deletions
@ -0,0 +1,103 @@
@@ -0,0 +1,103 @@
|
||||
/* |
||||
* https://github.com/morethanwords/tweb
|
||||
* Copyright (C) 2019-2021 Eduard Kuzmenko |
||||
* https://github.com/morethanwords/tweb/blob/master/LICENSE
|
||||
*/ |
||||
|
||||
import appNavigationController, {NavigationItem} 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 findUpAsChild from './dom/findUpAsChild'; |
||||
import EventListenerBase from './eventListenerBase'; |
||||
|
||||
export default class OverlayClickHandler extends EventListenerBase<{ |
||||
toggle: (open: boolean) => void |
||||
}> { |
||||
protected element: HTMLElement; |
||||
protected overlay: HTMLElement; |
||||
protected listenerOptions: AddEventListenerOptions; |
||||
|
||||
constructor( |
||||
protected navigationType: NavigationItem['type'], |
||||
protected withOverlay?: boolean |
||||
) { |
||||
super(false); |
||||
this.listenerOptions = withOverlay ? undefined : {capture: true}; |
||||
} |
||||
|
||||
protected onClick = (e: MouseEvent | TouchEvent) => { |
||||
if(this.element && findUpAsChild(e.target, this.element)) { |
||||
return; |
||||
} |
||||
|
||||
cancelEvent(e); |
||||
this.close(); |
||||
}; |
||||
|
||||
public close() { |
||||
if(this.element) { |
||||
this.overlay?.remove(); |
||||
this.element = undefined; |
||||
this.dispatchEvent('toggle', false); |
||||
} |
||||
|
||||
if(!IS_TOUCH_SUPPORTED) { |
||||
// window.removeEventListener('keydown', onKeyDown, {capture: true});
|
||||
window.removeEventListener('contextmenu', this.onClick); |
||||
} |
||||
|
||||
document.removeEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions); |
||||
|
||||
if(!IS_MOBILE_SAFARI) { |
||||
appNavigationController.removeByType(this.navigationType); |
||||
} |
||||
} |
||||
|
||||
public open(element: HTMLElement) { |
||||
this.close(); |
||||
|
||||
if(!IS_MOBILE_SAFARI) { |
||||
appNavigationController.pushItem({ |
||||
type: this.navigationType, |
||||
onPop: (canAnimate) => { |
||||
this.close(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
this.element = element; |
||||
|
||||
if(!this.overlay && this.withOverlay) { |
||||
this.overlay = document.createElement('div'); |
||||
this.overlay.classList.add('btn-menu-overlay'); |
||||
|
||||
// ! because this event must be canceled, and can't cancel on menu click (below)
|
||||
this.overlay.addEventListener(CLICK_EVENT_NAME, (e) => { |
||||
cancelEvent(e); |
||||
this.onClick(e); |
||||
}); |
||||
} |
||||
|
||||
this.overlay && this.element.parentElement.insertBefore(this.overlay, this.element); |
||||
|
||||
// document.body.classList.add('disable-hover');
|
||||
|
||||
if(!IS_TOUCH_SUPPORTED) { |
||||
// 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.listenerOptions); |
||||
|
||||
this.dispatchEvent('toggle', true); |
||||
} |
||||
} |
@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
|
||||
import {MyDocument} from '../../appDocsManager'; |
||||
|
||||
export default function getStickerEffectThumb(doc: MyDocument) { |
||||
return doc.video_thumbs?.[0]; |
||||
} |
Loading…
Reference in new issue