fix(SW-1043): prevent scrolling while bottom sheet is open
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import { PropsWithChildren } from "react"
|
import { PropsWithChildren, useEffect, useRef } from "react"
|
||||||
import { useIntl } from "react-intl"
|
import { useIntl } from "react-intl"
|
||||||
|
|
||||||
import { useEnterDetailsStore } from "@/stores/enter-details"
|
import { useEnterDetailsStore } from "@/stores/enter-details"
|
||||||
@@ -14,6 +14,7 @@ import styles from "./bottomSheet.module.css"
|
|||||||
|
|
||||||
export default function SummaryBottomSheet({ children }: PropsWithChildren) {
|
export default function SummaryBottomSheet({ children }: PropsWithChildren) {
|
||||||
const intl = useIntl()
|
const intl = useIntl()
|
||||||
|
const scrollY = useRef(0)
|
||||||
|
|
||||||
const { isSummaryOpen, toggleSummaryOpen, totalPrice, isSubmittingDisabled } =
|
const { isSummaryOpen, toggleSummaryOpen, totalPrice, isSubmittingDisabled } =
|
||||||
useEnterDetailsStore((state) => ({
|
useEnterDetailsStore((state) => ({
|
||||||
@@ -23,6 +24,27 @@ export default function SummaryBottomSheet({ children }: PropsWithChildren) {
|
|||||||
isSubmittingDisabled: state.isSubmittingDisabled,
|
isSubmittingDisabled: state.isSubmittingDisabled,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (isSummaryOpen) {
|
||||||
|
scrollY.current = window.scrollY
|
||||||
|
document.body.style.position = "fixed"
|
||||||
|
document.body.style.top = `-${scrollY.current}px`
|
||||||
|
} else {
|
||||||
|
document.body.style.position = ""
|
||||||
|
document.body.style.top = ""
|
||||||
|
window.scrollTo({
|
||||||
|
top: scrollY.current,
|
||||||
|
left: 0,
|
||||||
|
behavior: "instant",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
document.body.style.position = ""
|
||||||
|
document.body.style.top = ""
|
||||||
|
}
|
||||||
|
}, [isSummaryOpen])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.wrapper} data-open={isSummaryOpen}>
|
<div className={styles.wrapper} data-open={isSummaryOpen}>
|
||||||
<div className={styles.content}>{children}</div>
|
<div className={styles.content}>{children}</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user