diff options
author | Allan Wang <me@allanwang.ca> | 2019-05-01 16:05:19 -0700 |
---|---|---|
committer | Allan Wang <me@allanwang.ca> | 2019-05-01 16:05:19 -0700 |
commit | 58f4f9298b09081b3c937227828824849057a835 (patch) | |
tree | 18d2bf44637b52c9f68817253fc37d4ca699daef /app/src/web/ts/context_a.ts | |
parent | 576cc1a451a16f2d82ee1e41e83c420a85ded47e (diff) | |
parent | da93672c2ed6b54e0e7119a6b55715185112df3e (diff) | |
download | frost-58f4f9298b09081b3c937227828824849057a835.tar.gz frost-58f4f9298b09081b3c937227828824849057a835.tar.bz2 frost-58f4f9298b09081b3c937227828824849057a835.zip |
Merge dev
Diffstat (limited to 'app/src/web/ts/context_a.ts')
-rw-r--r-- | app/src/web/ts/context_a.ts | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/app/src/web/ts/context_a.ts b/app/src/web/ts/context_a.ts new file mode 100644 index 00000000..5eec7611 --- /dev/null +++ b/app/src/web/ts/context_a.ts @@ -0,0 +1,125 @@ +/** + * Context menu for links + * Largely mimics click_a.js + */ + +(function () { + let longClick = false; + + /** + * Given event and target, return true if handled and false otherwise. + */ + type EventHandler = (e: Event, target: HTMLElement) => Boolean + + const _frostCopyComment: EventHandler = (e, target) => { + if (!target.hasAttribute('data-commentid')) { + return false; + } + const text = target.innerText; + console.log(`Copy comment ${text}`); + Frost.contextMenu(null, text); + return true; + }; + + /** + * Posts should click a tag, with two parents up being div.story_body_container + */ + const _frostCopyPost: EventHandler = (e, target) => { + if (target.tagName !== 'A') { + return false; + } + const parent1 = target.parentElement; + if (!parent1 || parent1.tagName !== 'DIV') { + return false; + } + const parent2 = parent1.parentElement; + if (!parent2 || !parent2.classList.contains('story_body_container')) { + return false; + } + const url = target.getAttribute('href'); + const text = parent1.innerText; + console.log(`Copy post ${url} ${text}`); + Frost.contextMenu(url, text); + return true; + }; + + const _getImageStyleUrl = (el: Element): string | null => { + const img = el.querySelector("[style*=\"background-image: url(\"]"); + if (!img) { + return null + } + return (<String>window.getComputedStyle(img, null).backgroundImage).trim().slice(4, -1); + }; + + /** + * Opens image activity for posts with just one image + */ + const _frostImage: EventHandler = (e, target) => { + let element: Element = target; + // Notifications are two layers under + for (let i = 0; i < 2; i++) { + if (element.tagName !== 'A') { + element = <Element>element.parentElement; + } else { + break + } + } + if (element.tagName !== 'A') { + return false; + } + const url = element.getAttribute('href'); + if (!url || url === '#') { + return false; + } + const text = (<HTMLElement>element.parentElement).innerText; + // Check if image item exists, first in children and then in parent + const imageUrl = _getImageStyleUrl(element) || _getImageStyleUrl(<Element>element.parentElement); + if (imageUrl) { + console.log(`Context image: ${imageUrl}`); + Frost.loadImage(imageUrl, text); + return true; + } + // Check if true img exists + const img = element.querySelector("img[src*=scontent]"); + if (img instanceof HTMLMediaElement) { + const imgUrl = img.src; + console.log(`Context img: ${imgUrl}`); + Frost.loadImage(imgUrl, text); + return true; + } + console.log(`Context content ${url} ${text}`); + Frost.contextMenu(url, text); + return true; + }; + + const handlers = [_frostImage, _frostCopyComment, _frostCopyPost]; + + const _frostAContext = (e: Event) => { + Frost.longClick(true); + longClick = true; + + /* + * Commonality; check for valid target + */ + const target = e.target || e.currentTarget || e.srcElement; + if (!(target instanceof HTMLElement)) { + console.log("No element found"); + return + } + for (const h of handlers) { + if (h(e, target)) { + e.stopPropagation(); + e.preventDefault(); + return + } + } + }; + + document.addEventListener('contextmenu', _frostAContext, true); + document.addEventListener('touchend', () => { + if (longClick) { + Frost.longClick(false); + longClick = false + } + }, true); +}).call(undefined); |