From b55185f23623a03a8191eed11015fc4c422b85eb Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 18 Feb 2017 17:27:57 +0900 Subject: :v: --- src/web/app/desktop/scripts/user-preview.js | 70 +++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/web/app/desktop/scripts/user-preview.js (limited to 'src/web/app/desktop/scripts/user-preview.js') diff --git a/src/web/app/desktop/scripts/user-preview.js b/src/web/app/desktop/scripts/user-preview.js new file mode 100644 index 0000000000..8816eb41b3 --- /dev/null +++ b/src/web/app/desktop/scripts/user-preview.js @@ -0,0 +1,70 @@ +const riot = require('riot'); + +riot.mixin('user-preview', { + init: () => { + this.on('mount', () => { + scan.call(this); + }); + this.on('updated', () => { + scan.call(this); + }); + function scan(){ + this.root.querySelectorAll('[data-user-preview]:not([data-user-preview-attached])') + .forEach(attach.bind(this)); + } + } +}); + +function attach(el) { + el.setAttribute('data-user-preview-attached', true); + + const user = el.getAttribute('data-user-preview'); + let tag = null; + let showTimer = null; + let hideTimer = null; + + el.addEventListener('mouseover', () => { + clearTimeout(showTimer); + clearTimeout(hideTimer); + showTimer = setTimeout(show, 500); + }); + + el.addEventListener('mouseleave', () => { + clearTimeout(showTimer); + clearTimeout(hideTimer); + hideTimer = setTimeout(close, 500); + }); + + this.on('unmount', () => { + clearTimeout(showTimer); + clearTimeout(hideTimer); + close(); + }); + + const show = () => { + if (tag) return; + const preview = document.createElement('mk-user-preview'); + const rect = el.getBoundingClientRect(); + const x = rect.left + el.offsetWidth + window.pageXOffset; + const y = rect.top + window.pageYOffset; + preview.style.top = y + 'px'; + preview.style.left = x + 'px'; + preview.addEventListener('mouseover', () => { + clearTimeout(hideTimer); + }); + preview.addEventListener('mouseleave', () => { + clearTimeout(showTimer); + hideTimer = setTimeout(close, 500); + }); + tag = riot.mount(document.body.appendChild(preview), { + user: user + })[0]; + } + + const close = () => { + if (tag) { + tag.close(); + tag = null; + } + } +} -- cgit v1.3.1-freya