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.
112 lines
3.7 KiB
112 lines
3.7 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import { IS_TOUCH_SUPPORTED } from "../../environment/touchSupport"; |
|
import { IS_MOBILE, IS_SAFARI } from "../../environment/userAgent"; |
|
import findUpClassName from "./findUpClassName"; |
|
import fixSafariStickyInput from "./fixSafariStickyInput"; |
|
|
|
export const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED; |
|
|
|
if(IS_STICKY_INPUT_BUGGED) { |
|
let key: 'clientY' | 'pageY' = 'clientY'; |
|
let startY = 0; |
|
const o = {capture: true, passive: false}; |
|
const onTouchMove = (e: TouchEvent) => { |
|
const touch = e.touches[0]; |
|
|
|
//console.log('touchmove y', touch[key], startY); |
|
|
|
const scrollable = findUpClassName(touch.target, 'scrollable-y'); |
|
if(scrollable) { |
|
const y = touch[key]; |
|
const scrolled = startY - y; |
|
|
|
/* if(y < startY) { |
|
startY = y; |
|
} */ |
|
|
|
const scrollTop = scrollable.scrollTop; |
|
const scrollHeight = scrollable.scrollHeight; |
|
const clientHeight = scrollable.clientHeight; |
|
const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled; |
|
//const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true; |
|
const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0; |
|
if(needCancel) { |
|
e.preventDefault(); |
|
} |
|
|
|
//console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable); |
|
} else { |
|
e.preventDefault(); |
|
|
|
//console.log('touchmove no scrollable', e, touch); |
|
} |
|
|
|
//if(e.target === document.documentElement || e.target === document.body) e.preventDefault(); |
|
}; |
|
|
|
// let el = document.createElement('div'); |
|
// document.body.prepend(el); |
|
// let a = 0; |
|
|
|
// let hasFocus = false; |
|
let lastFocusOutTimeStamp = 0; |
|
document.addEventListener('focusin', (e) => { |
|
if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) { |
|
return; |
|
} |
|
|
|
// console.log('focusin', e, e.timeStamp); |
|
|
|
// hasFocus = true; |
|
// document.body.classList.add('is-keyboard-opened'); |
|
|
|
// el.innerText = 'focusin ' + ++a; |
|
|
|
/* a < 2 && */fixSafariStickyInput(e.target as HTMLElement); |
|
|
|
document.addEventListener('touchmove', onTouchMove, o); |
|
document.addEventListener('touchstart', (e) => { |
|
if(e.touches.length > 1) return; |
|
const touchStart = e.touches[0]; |
|
|
|
startY = touchStart[key]; |
|
}); |
|
}, {passive: true}); |
|
|
|
document.addEventListener('focusout', (e) => { |
|
// console.log('focusout', e, e.timeStamp); |
|
document.removeEventListener('touchmove', onTouchMove, o); |
|
|
|
lastFocusOutTimeStamp = e.timeStamp; |
|
|
|
// el.innerText = 'focusout ' + ++a; |
|
|
|
// if(hasFocus) { |
|
// hasFocus = false; |
|
// document.body.classList.remove('is-keyboard-opened'); |
|
// } |
|
}, {passive: true}); |
|
|
|
document.addEventListener('visibilitychange', () => { |
|
// console.log('window visibilitychange'); |
|
if(document.activeElement && |
|
document.activeElement.classList.contains('is-sticky-input-bugged') && |
|
(document.activeElement as HTMLElement).blur) { |
|
fixSafariStickyInput(document.activeElement as HTMLElement); |
|
} |
|
|
|
/* blurActiveElement(); |
|
window.scrollTo(0, 0); |
|
setVH(); */ |
|
}, {passive: true}); |
|
} |
|
|
|
export default function fixSafariStickyInputFocusing(input: HTMLElement) { |
|
if(!IS_STICKY_INPUT_BUGGED) return; |
|
input.classList.add('is-sticky-input-bugged'); |
|
}
|
|
|