Skip to content

Commit b3f6ce6

Browse files
authored
fix: closing not trigger animation (#40)
* fix: closing not trigger animation * fix: other cases failing * chore: update playground * chore: revert rendered value * chore: add changeset
1 parent e3291c1 commit b3f6ce6

File tree

8 files changed

+48
-18
lines changed

8 files changed

+48
-18
lines changed

.changeset/sharp-apricots-exercise.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"vaul-vue": patch
3+
---
4+
5+
fix manual closing doesn't trigger animation

packages/vaul-vue/src/DrawerContent.vue

+9-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { DialogContent } from 'radix-vue'
44
import { injectDrawerRootContext } from './context'
55
66
const {
7+
open,
78
isOpen,
89
isVisible,
910
snapPointsOffset,
@@ -34,7 +35,10 @@ function handlePointerDownOutside(event: Event) {
3435
keyboardIsOpen.value = false
3536
3637
event.preventDefault()
37-
if (!dismissible.value)
38+
39+
if (dismissible.value)
40+
emitOpenChange(false)
41+
if (!dismissible.value || open.value !== undefined)
3842
return
3943
4044
closeDrawer()
@@ -63,6 +67,10 @@ watch(
6367
@pointermove="onDrag"
6468
@pointerup="onRelease"
6569
@pointer-down-outside="handlePointerDownOutside"
70+
@escape-key-down="(event) => {
71+
if (!dismissible)
72+
event.preventDefault()
73+
}"
6674
>
6775
<slot />
6876
</DialogContent>

packages/vaul-vue/src/DrawerRoot.vue

+9-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
1414
const props = withDefaults(defineProps<DrawerRootProps>(), {
1515
open: undefined,
16+
defaultOpen: undefined,
1617
fixed: undefined,
1718
dismissible: true,
1819
activeSnapPoint: undefined,
@@ -43,11 +44,11 @@ const emitHandlers = {
4344
emitRelease: (open: boolean) => emit('release', open),
4445
emitClose: () => emit('close'),
4546
emitOpenChange: (o: boolean) => {
46-
open.value = o
47+
emit('update:open', o)
4748
},
4849
}
4950
50-
const { closeDrawer, hasBeenOpened, modal } = provideDrawerRootContext(
51+
const { closeDrawer, hasBeenOpened, modal, isOpen } = provideDrawerRootContext(
5152
useDrawer({
5253
...emitHandlers,
5354
...toRefs(props),
@@ -58,19 +59,23 @@ const { closeDrawer, hasBeenOpened, modal } = provideDrawerRootContext(
5859
)
5960
6061
function handleOpenChange(o: boolean) {
62+
if (open.value !== undefined) {
63+
emitHandlers.emitOpenChange(o)
64+
return
65+
}
6166
if (!o) {
6267
closeDrawer()
6368
}
6469
else {
6570
hasBeenOpened.value = true
66-
open.value = o
71+
isOpen.value = o
6772
}
6873
}
6974
</script>
7075

7176
<template>
7277
<DialogRoot
73-
:open="open"
78+
:open="isOpen"
7479
:modal="modal"
7580
@update:open="handleOpenChange"
7681
>

packages/vaul-vue/src/context.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { ComponentPublicInstance, Ref } from 'vue'
22
import { createContext } from 'radix-vue'
33

44
export interface DrawerRootContext {
5+
open: Ref<boolean>
56
isOpen: Ref<boolean>
67
modal: Ref<boolean>
78
hasBeenOpened: Ref<boolean>

packages/vaul-vue/src/controls.ts

+20-9
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ export function useDrawer(props: UseDrawerProps & DialogEmitHandlers): DrawerRoo
101101
emitRelease,
102102
emitClose,
103103
emitOpenChange,
104-
open: isOpen,
104+
open,
105105
dismissible,
106106
nested,
107107
fixed,
@@ -113,6 +113,7 @@ export function useDrawer(props: UseDrawerProps & DialogEmitHandlers): DrawerRoo
113113
fadeFromIndex,
114114
} = props
115115

116+
const isOpen = ref(open.value ?? false)
116117
const hasBeenOpened = ref(false)
117118
const isVisible = ref(false)
118119
const isDragging = ref(false)
@@ -372,7 +373,7 @@ export function useDrawer(props: UseDrawerProps & DialogEmitHandlers): DrawerRoo
372373
})
373374

374375
// Don't reset background if swiped upwards
375-
if (shouldScaleBackground.value && currentSwipeAmount && currentSwipeAmount > 0 && isOpen) {
376+
if (shouldScaleBackground.value && currentSwipeAmount && currentSwipeAmount > 0 && isOpen.value) {
376377
set(
377378
wrapper,
378379
{
@@ -407,10 +408,9 @@ export function useDrawer(props: UseDrawerProps & DialogEmitHandlers): DrawerRoo
407408
scaleBackground(false)
408409
restorePositionSetting()
409410

410-
isVisible.value = false
411411
window.setTimeout(() => {
412-
emitOpenChange(false)
413-
// isOpen.value = false
412+
isVisible.value = false
413+
isOpen.value = false
414414
}, 300)
415415

416416
window.setTimeout(() => {
@@ -491,13 +491,23 @@ export function useDrawer(props: UseDrawerProps & DialogEmitHandlers): DrawerRoo
491491
resetDrawer()
492492
}
493493

494-
watch(isOpen, (open) => {
495-
if (open) {
494+
watch(isOpen, (o) => {
495+
if (o) {
496496
openTime.value = new Date()
497497
scaleBackground(true)
498498
}
499-
emitOpenChange(open)
500-
})
499+
emitOpenChange(o)
500+
}, { immediate: true })
501+
502+
watch(open, (o) => {
503+
if (o) {
504+
isOpen.value = o
505+
hasBeenOpened.value = true
506+
}
507+
else {
508+
closeDrawer()
509+
}
510+
}, { immediate: true })
501511

502512
function scaleBackground(open: boolean) {
503513
const wrapper = document.querySelector('[vaul-drawer-wrapper]')
@@ -587,6 +597,7 @@ export function useDrawer(props: UseDrawerProps & DialogEmitHandlers): DrawerRoo
587597
}
588598

589599
return {
600+
open,
590601
isOpen,
591602
modal,
592603
keyboardIsOpen,

playground/src/views/tests/ControlledView.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import {
1010
} from 'vaul-vue'
1111
import { ref } from 'vue'
1212
13-
const open = ref < boolean > (false)
14-
const fullyControlled = ref < boolean > (false)
13+
const open = ref<boolean>(false)
14+
const fullyControlled = ref<boolean>(false)
1515
</script>
1616

1717
<template>

playground/src/views/tests/NonDismissibleView.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
} from 'vaul-vue'
1010
import { ref } from 'vue'
1111
12-
const open = ref < boolean > (false)
12+
const open = ref<boolean>(false)
1313
</script>
1414

1515
<template>

playground/src/views/tests/WithoutScaledBackgroundView.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
} from 'vaul-vue'
1111
import { ref } from 'vue'
1212
13-
const open = ref < boolean > (false)
13+
const open = ref<boolean>(false)
1414
</script>
1515

1616
<template>

0 commit comments

Comments
 (0)