Skip to content

Commit 69d9c7d

Browse files
authored
Merge pull request #12423 from ethereum/fix-tooltip-mobile
Fix tooltip positioning and closing in mobile
2 parents 9c01a08 + 4c6cb92 commit 69d9c7d

File tree

1 file changed

+36
-3
lines changed

1 file changed

+36
-3
lines changed

src/components/Tooltip/index.tsx

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,57 @@
1-
import React, { ReactNode } from "react"
1+
import React, { ReactNode, useEffect } from "react"
22
import {
33
Popover,
44
PopoverArrow,
55
PopoverBody,
66
PopoverContent,
77
PopoverProps,
88
PopoverTrigger,
9+
useDisclosure,
910
} from "@chakra-ui/react"
1011

12+
import { isMobile } from "@/lib/utils/isMobile"
13+
1114
export interface IProps extends PopoverProps {
1215
content: ReactNode
1316
children?: ReactNode
1417
}
1518

1619
const Tooltip: React.FC<IProps> = ({ content, children, ...rest }) => {
20+
const { isOpen, onOpen, onClose } = useDisclosure()
21+
22+
// Close the popover when the user scrolls.
23+
// This is useful for mobile devices where the popover is open by clicking the
24+
// trigger, not hovering.
25+
useEffect(() => {
26+
let originalPosition = 0
27+
28+
const handleScroll = () => {
29+
const delta = window.scrollY - originalPosition
30+
31+
// Close the popover if the user scrolls more than 80px
32+
if (isOpen && Math.abs(delta) > 80) {
33+
onClose()
34+
}
35+
}
36+
37+
// Add event listener when the popover is open
38+
if (isOpen) {
39+
window.addEventListener("scroll", handleScroll)
40+
originalPosition = window.scrollY
41+
}
42+
43+
return () => {
44+
window.removeEventListener("scroll", handleScroll)
45+
}
46+
}, [isOpen, onClose])
47+
1748
return (
1849
<Popover
50+
isOpen={isOpen}
51+
onOpen={onOpen}
52+
onClose={onClose}
1953
placement="top"
20-
trigger="hover"
21-
strategy="fixed"
54+
trigger={isMobile() ? "click" : "hover"}
2255
gutter={8}
2356
{...rest}
2457
>

0 commit comments

Comments
 (0)