Skip to content

Commit 64e6323

Browse files
committed
refactor: 既存の実装を useEventListner を用いて簡略化する
- refactor: `MouseEvent` と `TouchEvent` を併用している部分を `PointerEvent` に統合する
1 parent a009d4f commit 64e6323

11 files changed

Lines changed: 77 additions & 170 deletions

File tree

src/components/Main/MainView/ChannelView/ChannelHeader/ChannelHeaderRelationButton.vue

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@
2525
</template>
2626

2727
<script setup lang="ts">
28-
import { onMounted, onUnmounted, ref } from 'vue'
28+
import { onMounted, ref } from 'vue'
2929
import AIcon from '/@/components/UI/AIcon.vue'
3030
import ChannelHeaderRelationPopup from './ChannelHeaderRelationPopup.vue'
3131
import { reactive } from 'vue'
3232
import type { Point } from '/@/lib/basic/point'
3333
import { randomString } from '/@/lib/basic/randomString'
34+
import useEventListener from '/@/composables/dom/useEventListener'
3435
3536
const props = defineProps<{
3637
channelId: string
@@ -68,12 +69,10 @@ const updateTriggerPosition = () => {
6869
triggerBottomRightPosition.y = rect.bottom
6970
}
7071
72+
useEventListener(window, 'resize', updateTriggerPosition)
73+
7174
onMounted(() => {
7275
updateTriggerPosition()
73-
window.addEventListener('resize', updateTriggerPosition)
74-
})
75-
onUnmounted(() => {
76-
window.removeEventListener('resize', updateTriggerPosition)
7776
})
7877
7978
const focusPopup = () => {

src/components/Main/MainView/MessagesScroller/MessagesScroller.vue

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,7 @@
3535
<script lang="ts">
3636
import { throttle } from 'throttle-debounce'
3737
import type { Ref } from 'vue'
38-
import {
39-
nextTick,
40-
onMounted,
41-
onUnmounted,
42-
reactive,
43-
shallowRef,
44-
watch
45-
} from 'vue'
38+
import { nextTick, onMounted, reactive, shallowRef, watch } from 'vue'
4639
import { useRoute, useRouter } from 'vue-router'
4740
import useMessageScrollerElementResizeObserver from './composables/useMessageScrollerElementResizeObserver'
4841
import type { LoadingDirection } from './composables/useMessagesFetcher'
@@ -53,6 +46,7 @@ import { isMessageScrollerRoute, RouteName } from '/@/router'
5346
import { useStampsStore } from '/@/store/entities/stamps'
5447
import { useMainViewStore } from '/@/store/ui/mainView'
5548
import type { MessageId } from '/@/types/entity-ids'
49+
import useEventListener from '/@/composables/dom/useEventListener'
5650
5751
const LOAD_MORE_THRESHOLD = 10
5852
@@ -262,12 +256,8 @@ const visibilitychangeListener = () => {
262256
}
263257
emit('resetIsReachedLatest')
264258
}
265-
onMounted(() => {
266-
document.addEventListener('visibilitychange', visibilitychangeListener)
267-
})
268-
onUnmounted(() => {
269-
document.removeEventListener('visibilitychange', visibilitychangeListener)
270-
})
259+
260+
useEventListener(document, 'visibilitychange', visibilitychangeListener)
271261
272262
const { onClick } = useMarkdownInternalHandler()
273263
useScrollRestoration(rootRef, state)

src/components/Main/PopupNavigatior/PopupNavigator.vue

Lines changed: 21 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -25,47 +25,30 @@
2525
</template>
2626

2727
<script lang="ts">
28-
import {
29-
reactive,
30-
shallowRef,
31-
watch,
32-
computed,
33-
onMounted,
34-
onUnmounted,
35-
readonly
36-
} from 'vue'
28+
import { reactive, shallowRef, watch, computed, readonly } from 'vue'
3729
import { useRouter } from 'vue-router'
3830
import useToggle from '/@/composables/utils/useToggle'
31+
import useEventListener from '/@/composables/dom/useEventListener'
3932
4033
const popupNavigatorButtonId = 'popup-navigation-button'
4134
const popupNavigatorId = 'popup-navigator'
4235
const POPUP_MARGIN = 4
4336
const LONG_CLICK_DELAY = 150
4437
45-
type MouseTouchEventHandler = (e: MouseEvent | TouchEvent) => void
38+
type PointerEventHandler = (e: PointerEvent) => void
4639
47-
const useWindowMouseTouch = (
40+
const useWindowPointer = (
4841
{
49-
onMouseTouchStart,
50-
onMouseTouchEnd
42+
onPointerDown,
43+
onPointerUp
5144
}: {
52-
onMouseTouchStart: MouseTouchEventHandler
53-
onMouseTouchEnd: MouseTouchEventHandler
45+
onPointerDown: PointerEventHandler
46+
onPointerUp: PointerEventHandler
5447
},
5548
options?: boolean | AddEventListenerOptions | undefined
5649
) => {
57-
onMounted(() => {
58-
window.addEventListener('mousedown', onMouseTouchStart, options)
59-
window.addEventListener('touchstart', onMouseTouchStart, options)
60-
window.addEventListener('mouseup', onMouseTouchEnd, options)
61-
window.addEventListener('touchend', onMouseTouchEnd, options)
62-
})
63-
onUnmounted(() => {
64-
window.removeEventListener('mousedown', onMouseTouchStart, options)
65-
window.removeEventListener('touchstart', onMouseTouchStart, options)
66-
window.removeEventListener('mouseup', onMouseTouchEnd, options)
67-
window.removeEventListener('touchend', onMouseTouchEnd, options)
68-
})
50+
useEventListener(window, 'pointerdown', onPointerDown, options)
51+
useEventListener(window, 'pointerup', onPointerUp, options)
6952
}
7053
7154
/**
@@ -80,7 +63,7 @@ const useIsLongClicking = (
8063
let timer = 0
8164
let isClickStarted = false
8265
83-
const onMouseTouchStart = (e: MouseEvent | TouchEvent) => {
66+
const onPointerDown = (e: PointerEvent) => {
8467
if (!isTarget(e.target)) return
8568
// スワイプを無効化するため
8669
e.stopPropagation()
@@ -92,17 +75,16 @@ const useIsLongClicking = (
9275
onLongClick()
9376
}, LONG_CLICK_DELAY)
9477
}
95-
const onMouseTouchEnd = (e: MouseEvent | TouchEvent) => {
78+
79+
const onPointerUp = (e: PointerEvent) => {
9680
// document.elementFromPointが起きるとレイアウトの計算がかかるので、
9781
// targetでのmousetouchstartが起きていないなら無視する
9882
if (!isClickStarted) return
9983
10084
isClickStarted = false
10185
window.clearTimeout(timer)
10286
103-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
104-
const point = 'changedTouches' in e ? e.changedTouches[0]! : e
105-
const target = document.elementFromPoint(point.clientX, point.clientY)
87+
const target = document.elementFromPoint(e.clientX, e.clientY)
10688
if (!isTarget(target)) {
10789
return
10890
}
@@ -121,7 +103,7 @@ const useIsLongClicking = (
121103
}
122104
isLongClicking = false
123105
}
124-
return { onMouseTouchStart, onMouseTouchEnd }
106+
return { onPointerDown, onPointerUp }
125107
}
126108
127109
const useNavigator = (emit: (name: 'clickIcon') => void) => {
@@ -155,22 +137,23 @@ const useNavigator = (emit: (name: 'clickIcon') => void) => {
155137
hidePopupNavigator()
156138
}
157139
158-
const { onMouseTouchStart, onMouseTouchEnd } = useIsLongClicking(
140+
const { onPointerDown, onPointerUp } = useIsLongClicking(
159141
isTarget,
160142
showPopupNavigator,
161143
() => {
162144
emit('clickIcon')
163145
}
164146
)
165-
useWindowMouseTouch(
147+
148+
useWindowPointer(
166149
{
167-
onMouseTouchStart: e => {
150+
onPointerDown: e => {
168151
if (!isPopup(e.target)) {
169152
hidePopupNavigator()
170153
}
171-
onMouseTouchStart(e)
154+
onPointerDown(e)
172155
},
173-
onMouseTouchEnd
156+
onPointerUp
174157
},
175158
// capture=trueなのはstopPropergationでスワイプを無効化するため
176159
{ capture: true, passive: true }

src/components/UI/ClickOutside.ts

Lines changed: 10 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@ import type { ComponentPublicInstance, VNode } from 'vue'
22
import {
33
cloneVNode,
44
Comment,
5+
computed,
56
defineComponent,
6-
onBeforeUnmount,
7-
onMounted,
87
ref,
98
shallowRef,
10-
Text,
11-
watch
9+
Text
1210
} from 'vue'
13-
import { isIOS } from '/@/lib/dom/browser'
1411
import { useModalStore } from '/@/store/ui/modal'
12+
import useEventListener from '/@/composables/dom/useEventListener'
1513

1614
/**
1715
* コメントや文字列のVNodeを取り除く
@@ -25,9 +23,6 @@ const filterChildren = <T extends VNode>(vnodes: T[]) =>
2523
return true
2624
})
2725

28-
const startEventName = isIOS() ? 'touchstart' : 'mousedown'
29-
const endEventName = isIOS() ? 'touchend' : 'mouseup'
30-
3126
/**
3227
* そのデフォルトスロットに指定した要素の外でクリックされたときにclickOutsideイベントを発火する
3328
*/
@@ -61,9 +56,8 @@ export default defineComponent({
6156

6257
const { shouldShowModal } = useModalStore()
6358
const isMouseDown = ref(false)
64-
let listening = false
6559

66-
const onMouseDown = (e: MouseEvent | TouchEvent) => {
60+
const onPointerDown = (e: MouseEvent | TouchEvent) => {
6761
if (!element.value) return
6862

6963
if (props.unableWhileModalOpen && shouldShowModal.value) return
@@ -80,7 +74,8 @@ export default defineComponent({
8074
e.stopPropagation()
8175
}
8276
}
83-
const onMouseUp = (e: MouseEvent | TouchEvent) => {
77+
78+
const onPointerUp = (e: MouseEvent | TouchEvent) => {
8479
if (!isMouseDown.value) return
8580
isMouseDown.value = false
8681

@@ -101,33 +96,11 @@ export default defineComponent({
10196
}
10297
}
10398

104-
const addListeners = () => {
105-
if (listening) return
106-
window.addEventListener(startEventName, onMouseDown, { capture: true })
107-
window.addEventListener(endEventName, onMouseUp, { capture: true })
108-
listening = true
109-
}
110-
const removeListeners = () => {
111-
if (!listening) return
112-
window.removeEventListener(startEventName, onMouseDown, { capture: true })
113-
window.removeEventListener(endEventName, onMouseUp, { capture: true })
114-
listening = false
115-
}
99+
const target = computed(() => (props.enabled ? window : null))
100+
const listenerOptions = { capture: true }
116101

117-
onMounted(() => {
118-
if (props.enabled) addListeners()
119-
})
120-
onBeforeUnmount(() => {
121-
removeListeners()
122-
})
123-
124-
watch(
125-
() => props.enabled,
126-
enabled => {
127-
if (enabled) addListeners()
128-
else removeListeners()
129-
}
130-
)
102+
useEventListener(target, 'pointerdown', onPointerDown, listenerOptions)
103+
useEventListener(target, 'pointerup', onPointerUp, listenerOptions)
131104

132105
return () => {
133106
if (!slots['default']) {

src/components/UI/TextareaAutosize.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import autosize from 'autosize'
2222
import { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'
2323
import useOnInput from '/@/composables/useOnInput'
24+
import useEventListener from '/@/composables/dom/useEventListener'
2425
2526
const modelValue = defineModel<string>({
2627
required: true
@@ -58,12 +59,13 @@ const autosizeUpdateTextarea = async () => {
5859
}
5960
}
6061
62+
useEventListener(textareaEle, 'autosize:resized', () => {
63+
emit('autosize-updated')
64+
})
65+
6166
onMounted(() => {
6267
if (textareaEle.value) {
6368
autosize(textareaEle.value)
64-
textareaEle.value.addEventListener('autosize:resized', () => {
65-
emit('autosize-updated')
66-
})
6769
}
6870
})
6971
watch([modelValue], autosizeUpdateTextarea)

0 commit comments

Comments
 (0)