Skip to content

Commit 8c8fa84

Browse files
committed
fix(BottomSheet): improve bottom sheet handle
1 parent 49f8b9b commit 8c8fa84

File tree

1 file changed

+28
-21
lines changed

1 file changed

+28
-21
lines changed

packages/bottom-sheets/src/BottomSheetHandle.vue

+28-21
Original file line numberDiff line numberDiff line change
@@ -4,69 +4,76 @@ import {BottomSheetInjectionKey} from './api';
44
import type {BottomSheetApi} from './types';
55
66
const api = inject<BottomSheetApi>(BottomSheetInjectionKey);
7-
const draggableArea = ref();
7+
const draggableArea = ref<HTMLElement | null>(null);
8+
const sheetHeight = ref<number>(0);
89
9-
let sheetHeight: number | string;
10-
11-
const setSheetHeight = (value: number | string) => {
12-
sheetHeight = Math.max(0, Math.min(100, +value));
13-
api?.setHeight(`${sheetHeight}vh`);
10+
const setSheetHeight = (value: number) => {
11+
sheetHeight.value = Math.max(0, Math.min(100, value));
12+
api?.setHeight(`${sheetHeight.value}vh`);
1413
};
1514
16-
const touchPosition = (event: any) =>
17-
event.touches ? event.touches[0] : event;
15+
const touchPosition = (event: TouchEvent | MouseEvent) =>
16+
'touches' in event ? event.touches[0] : (event as MouseEvent);
1817
1918
let dragPosition: number | undefined;
2019
21-
const onDragStart = (event: Event) => {
20+
const onDragStart = (event: TouchEvent | MouseEvent) => {
2221
dragPosition = touchPosition(event).pageY;
23-
draggableArea.value.style.cursor = document.body.style.cursor = 'grabbing';
24-
api?.el?.value?.classList?.add('v-bottom-sheet--dragging');
22+
if (draggableArea.value) {
23+
draggableArea.value.style.cursor = 'grabbing';
24+
}
25+
document.body.style.cursor = 'grabbing';
26+
api?.el?.value?.classList.add('v-bottom-sheet--dragging');
2527
};
2628
27-
const onDragMove = (event: Event) => {
29+
const onDragMove = (event: TouchEvent | MouseEvent) => {
2830
if (dragPosition === undefined) return;
2931
3032
const y = touchPosition(event).pageY;
3133
const deltaY = dragPosition - y;
3234
const deltaHeight = (deltaY / window.innerHeight) * 100;
3335
34-
setSheetHeight(+sheetHeight + deltaHeight);
36+
setSheetHeight(sheetHeight.value + deltaHeight);
3537
dragPosition = y;
3638
};
3739
3840
const onDragEnd = () => {
3941
dragPosition = undefined;
40-
draggableArea.value.style.cursor = document.body.style.cursor = '';
42+
if (draggableArea.value) {
43+
draggableArea.value.style.cursor = '';
44+
}
45+
document.body.style.cursor = '';
4146
42-
if (+sheetHeight < 25) {
47+
if (sheetHeight.value < 25) {
4348
api?.close();
44-
} else if (+sheetHeight > 75) {
49+
} else if (sheetHeight.value > 75) {
4550
setSheetHeight(100);
4651
} else {
47-
setSheetHeight(sheetHeight);
52+
setSheetHeight(sheetHeight.value);
4853
}
4954
50-
api?.el?.value?.classList?.remove('v-bottom-sheet--dragging');
55+
api?.el?.value?.classList.remove('v-bottom-sheet--dragging');
5156
};
5257
5358
onMounted(() => {
54-
sheetHeight = api?.getHeight() as number;
59+
sheetHeight.value = api?.getHeight() as number;
5560
56-
draggableArea.value.addEventListener('mousedown', onDragStart);
57-
draggableArea.value.addEventListener('touchstart', onDragStart);
61+
draggableArea.value?.addEventListener('mousedown', onDragStart);
62+
draggableArea.value?.addEventListener('touchstart', onDragStart);
5863
5964
window.addEventListener('mousemove', onDragMove);
6065
window.addEventListener('touchmove', onDragMove);
6166
6267
window.addEventListener('mouseup', onDragEnd);
68+
window.addEventListener('touchend', onDragEnd);
6369
});
6470
6571
onUnmounted(() => {
6672
window.removeEventListener('mousemove', onDragMove);
6773
window.removeEventListener('touchmove', onDragMove);
6874
6975
window.removeEventListener('mouseup', onDragEnd);
76+
window.removeEventListener('touchend', onDragEnd);
7077
});
7178
7279
defineSlots<{

0 commit comments

Comments
 (0)