summaryrefslogtreecommitdiff
path: root/src/web/app/desktop/scripts/user-preview.js
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2017-02-18 17:27:57 +0900
committersyuilo <syuilotan@yahoo.co.jp>2017-02-18 17:27:57 +0900
commitb55185f23623a03a8191eed11015fc4c422b85eb (patch)
treea3cda0951f37c129a310712e8017679d26cc500a /src/web/app/desktop/scripts/user-preview.js
parent:v: (diff)
downloadmisskey-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.js70
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;
+ }
+ }
+}