diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2017-02-18 17:27:57 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2017-02-18 17:27:57 +0900 |
| commit | b55185f23623a03a8191eed11015fc4c422b85eb (patch) | |
| tree | a3cda0951f37c129a310712e8017679d26cc500a /src/web/app/desktop/scripts/user-preview.js | |
| parent | :v: (diff) | |
| download | misskey-b55185f23623a03a8191eed11015fc4c422b85eb.tar.gz misskey-b55185f23623a03a8191eed11015fc4c422b85eb.tar.bz2 misskey-b55185f23623a03a8191eed11015fc4c422b85eb.zip | |
:v:
Diffstat (limited to 'src/web/app/desktop/scripts/user-preview.js')
| -rw-r--r-- | src/web/app/desktop/scripts/user-preview.js | 70 |
1 files changed, 70 insertions, 0 deletions
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; + } + } +} |