@@ -4,69 +4,76 @@ import {BottomSheetInjectionKey} from './api';
4
4
import type {BottomSheetApi } from ' ./types' ;
5
5
6
6
const api = inject <BottomSheetApi >(BottomSheetInjectionKey );
7
- const draggableArea = ref ();
7
+ const draggableArea = ref <HTMLElement | null >(null );
8
+ const sheetHeight = ref <number >(0 );
8
9
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 ` );
14
13
};
15
14
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 ) ;
18
17
19
18
let dragPosition: number | undefined ;
20
19
21
- const onDragStart = (event : Event ) => {
20
+ const onDragStart = (event : TouchEvent | MouseEvent ) => {
22
21
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' );
25
27
};
26
28
27
- const onDragMove = (event : Event ) => {
29
+ const onDragMove = (event : TouchEvent | MouseEvent ) => {
28
30
if (dragPosition === undefined ) return ;
29
31
30
32
const y = touchPosition (event ).pageY ;
31
33
const deltaY = dragPosition - y ;
32
34
const deltaHeight = (deltaY / window .innerHeight ) * 100 ;
33
35
34
- setSheetHeight (+ sheetHeight + deltaHeight );
36
+ setSheetHeight (sheetHeight . value + deltaHeight );
35
37
dragPosition = y ;
36
38
};
37
39
38
40
const onDragEnd = () => {
39
41
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 = ' ' ;
41
46
42
- if (+ sheetHeight < 25 ) {
47
+ if (sheetHeight . value < 25 ) {
43
48
api ?.close ();
44
- } else if (+ sheetHeight > 75 ) {
49
+ } else if (sheetHeight . value > 75 ) {
45
50
setSheetHeight (100 );
46
51
} else {
47
- setSheetHeight (sheetHeight );
52
+ setSheetHeight (sheetHeight . value );
48
53
}
49
54
50
- api ?.el ?.value ?.classList ? .remove (' v-bottom-sheet--dragging' );
55
+ api ?.el ?.value ?.classList .remove (' v-bottom-sheet--dragging' );
51
56
};
52
57
53
58
onMounted (() => {
54
- sheetHeight = api ?.getHeight () as number ;
59
+ sheetHeight . value = api ?.getHeight () as number ;
55
60
56
- draggableArea .value .addEventListener (' mousedown' , onDragStart );
57
- draggableArea .value .addEventListener (' touchstart' , onDragStart );
61
+ draggableArea .value ? .addEventListener (' mousedown' , onDragStart );
62
+ draggableArea .value ? .addEventListener (' touchstart' , onDragStart );
58
63
59
64
window .addEventListener (' mousemove' , onDragMove );
60
65
window .addEventListener (' touchmove' , onDragMove );
61
66
62
67
window .addEventListener (' mouseup' , onDragEnd );
68
+ window .addEventListener (' touchend' , onDragEnd );
63
69
});
64
70
65
71
onUnmounted (() => {
66
72
window .removeEventListener (' mousemove' , onDragMove );
67
73
window .removeEventListener (' touchmove' , onDragMove );
68
74
69
75
window .removeEventListener (' mouseup' , onDragEnd );
76
+ window .removeEventListener (' touchend' , onDragEnd );
70
77
});
71
78
72
79
defineSlots <{
0 commit comments