summaryrefslogtreecommitdiff
path: root/packages/client/src/scripts/use-tooltip.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-12-27 14:36:33 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2022-12-27 14:36:33 +0900
commit9384f5399da39e53855beb8e7f8ded1aa56bf72e (patch)
treece5959571a981b9c4047da3c7b3fd080aa44222c /packages/client/src/scripts/use-tooltip.ts
parentwip: retention for dashboard (diff)
downloadsharkey-9384f5399da39e53855beb8e7f8ded1aa56bf72e.tar.gz
sharkey-9384f5399da39e53855beb8e7f8ded1aa56bf72e.tar.bz2
sharkey-9384f5399da39e53855beb8e7f8ded1aa56bf72e.zip
rename: client -> frontend
Diffstat (limited to 'packages/client/src/scripts/use-tooltip.ts')
-rw-r--r--packages/client/src/scripts/use-tooltip.ts86
1 files changed, 0 insertions, 86 deletions
diff --git a/packages/client/src/scripts/use-tooltip.ts b/packages/client/src/scripts/use-tooltip.ts
deleted file mode 100644
index 1f6e0fb6ce..0000000000
--- a/packages/client/src/scripts/use-tooltip.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-import { Ref, ref, watch, onUnmounted } from 'vue';
-
-export function useTooltip(
- elRef: Ref<HTMLElement | { $el: HTMLElement } | null | undefined>,
- onShow: (showing: Ref<boolean>) => void,
- delay = 300,
-): void {
- let isHovering = false;
-
- // iOS(Androidも?)では、要素をタップした直後に(おせっかいで)mouseoverイベントを発火させたりするため、それを無視するためのフラグ
- // 無視しないと、画面に触れてないのにツールチップが出たりし、ユーザビリティが損なわれる
- // TODO: 一度でもタップすると二度とマウスでツールチップ出せなくなるのをどうにかする 定期的にfalseに戻すとか...?
- let shouldIgnoreMouseover = false;
-
- let timeoutId: number;
-
- let changeShowingState: (() => void) | null;
-
- const open = () => {
- close();
- if (!isHovering) return;
- if (elRef.value == null) return;
- const el = elRef.value instanceof Element ? elRef.value : elRef.value.$el;
- if (!document.body.contains(el)) return; // openしようとしたときに既に元要素がDOMから消えている場合があるため
-
- const showing = ref(true);
- onShow(showing);
- changeShowingState = () => {
- showing.value = false;
- };
- };
-
- const close = () => {
- if (changeShowingState != null) {
- changeShowingState();
- changeShowingState = null;
- }
- };
-
- const onMouseover = () => {
- if (isHovering) return;
- if (shouldIgnoreMouseover) return;
- isHovering = true;
- timeoutId = window.setTimeout(open, delay);
- };
-
- const onMouseleave = () => {
- if (!isHovering) return;
- isHovering = false;
- window.clearTimeout(timeoutId);
- close();
- };
-
- const onTouchstart = () => {
- shouldIgnoreMouseover = true;
- if (isHovering) return;
- isHovering = true;
- timeoutId = window.setTimeout(open, delay);
- };
-
- const onTouchend = () => {
- if (!isHovering) return;
- isHovering = false;
- window.clearTimeout(timeoutId);
- close();
- };
-
- const stop = watch(elRef, () => {
- if (elRef.value) {
- stop();
- const el = elRef.value instanceof Element ? elRef.value : elRef.value.$el;
- el.addEventListener('mouseover', onMouseover, { passive: true });
- el.addEventListener('mouseleave', onMouseleave, { passive: true });
- el.addEventListener('touchstart', onTouchstart, { passive: true });
- el.addEventListener('touchend', onTouchend, { passive: true });
- el.addEventListener('click', close, { passive: true });
- }
- }, {
- immediate: true,
- flush: 'post',
- });
-
- onUnmounted(() => {
- close();
- });
-}