Skip to content

Commit

Permalink
refactor: useLockScroll
Browse files Browse the repository at this point in the history
  • Loading branch information
hunterliu1003 committed Nov 1, 2021
1 parent b3e1164 commit 2109592
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 23 deletions.
2 changes: 1 addition & 1 deletion packages/lib/dist/VueFinalModal.esm.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/lib/dist/VueFinalModal.esm.js.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/lib/dist/VueFinalModal.umd.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/lib/dist/VueFinalModal.umd.js.map

Large diffs are not rendered by default.

22 changes: 3 additions & 19 deletions packages/lib/src/VueFinalModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
import { ref, reactive, onMounted, onBeforeUnmount, computed, nextTick, watch } from 'vue'
import { useFocusTrap } from './utils/focusTrap.js'
import { useDragResize } from './utils/dragResize.js'
import { disableBodyScroll, enableBodyScroll } from './utils/bodyScrollLock'
import { useLockScroll } from './utils/bodyScrollLock'
import { TransitionState, useTransitionState } from './utils/transitionState'
const noop = () => {}
Expand Down Expand Up @@ -185,6 +185,8 @@ export default {
}
})
const { handleLockScroll } = useLockScroll({ props, vfmContainer, modalTransitionState })
const lastMousedownEl = ref(null)
let resolveToggle = noop
Expand Down Expand Up @@ -252,8 +254,6 @@ export default {
}
)
watch(() => props.lockScroll, handleLockScroll)
watch(
() => props.hideOverlay,
value => {
Expand Down Expand Up @@ -290,7 +290,6 @@ export default {
break
case TransitionState.Leave:
modalStackIndex.value = null
props.lockScroll && enableBodyScroll(vfmContainer.value)
let stopEvent = false
const event = createModalEvent({
Expand All @@ -316,7 +315,6 @@ export default {
onBeforeUnmount(() => {
close()
props.lockScroll && vfmContainer.value && enableBodyScroll(vfmContainer.value)
root?.value?.remove()
let index = props.api.modals.findIndex(vm => vm.uid === uid)
Expand Down Expand Up @@ -414,20 +412,6 @@ export default {
startTransitionLeave()
}
function handleLockScroll() {
if (props.modelValue) {
nextTick(() => {
if (props.lockScroll) {
disableBodyScroll(vfmContainer.value, {
reserveScrollBarGap: true
})
} else {
enableBodyScroll(vfmContainer.value)
}
})
}
}
function getAttachElement() {
let target
if (props.attach === false) {
Expand Down
37 changes: 37 additions & 0 deletions packages/lib/src/utils/bodyScrollLock.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import { watch, nextTick, onBeforeUnmount } from 'vue'
import { TransitionState } from './transitionState'

// stolen from body-scroll-lock

// Older browsers don't support event options, feature detect it.
Expand Down Expand Up @@ -211,3 +214,37 @@ export const enableBodyScroll = targetElement => {
restoreOverflowSetting()
}
}

export function useLockScroll({ props, vfmContainer, modalTransitionState }) {
watch(() => props.lockScroll, handleLockScroll)

watch(modalTransitionState, state => {
if (state === TransitionState.Leave) {
enable()
}
})

onBeforeUnmount(() => {
enable()
})

function handleLockScroll() {
if (!props.modelValue) return
nextTick(() => {
props.lockScroll ? disable() : enable()
})
}

function enable() {
props.lockScroll && vfmContainer.value && enableBodyScroll(vfmContainer.value)
}

function disable() {
vfmContainer.value &&
disableBodyScroll(vfmContainer.value, {
reserveScrollBarGap: true
})
}

return { handleLockScroll }
}

0 comments on commit 2109592

Please sign in to comment.