Skip to content

Commit

Permalink
[components] Improve Tooltip component
Browse files Browse the repository at this point in the history
  • Loading branch information
mariuslundgard authored and rexxars committed Oct 6, 2020
1 parent 6cc81ab commit 352d6f1
Showing 1 changed file with 30 additions and 6 deletions.
36 changes: 30 additions & 6 deletions packages/@sanity/components/src/tooltip/tooltip.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import classNames from 'classnames'
import {Portal} from 'part:@sanity/components/portal'
import React, {useEffect, useState} from 'react'
import React, {useCallback, useEffect, useRef, useState} from 'react'
import {usePopper} from 'react-popper'
import {TooltipPlacement} from './types'
import {TooltipArrow} from './tooltipArrow'
import {TooltipPlacement} from './types'

import styles from './tooltip.css'

Expand All @@ -30,6 +30,7 @@ export function Tooltip(
tone,
...restProps
} = props
const leaveRafRef = useRef<number | null>(null)
const [referenceElement, setReferenceElement] = useState<HTMLElement | null>(null)
const [popperElement, setPopperElement] = useState<HTMLDivElement | null>(null)
const [arrowElement, setArrowElement] = useState<HTMLDivElement | null>(null)
Expand Down Expand Up @@ -58,11 +59,25 @@ export function Tooltip(
]
})

const {forceUpdate} = popper

const [isOpen, setIsOpen] = useState(false)
const onMouseEnter = () => setIsOpen(() => true)
const onMouseLeave = () => setIsOpen(() => false)

const {forceUpdate} = popper
const handleBlur = useCallback(() => setIsOpen(false), [])

const handleFocus = useCallback(() => setIsOpen(true), [])

const handleMouseEnter = useCallback(() => {
if (leaveRafRef.current !== null) {
cancelAnimationFrame(leaveRafRef.current)
}

setIsOpen(true)
}, [])

const handleMouseLeave = useCallback(() => {
leaveRafRef.current = requestAnimationFrame(() => setIsOpen(false))
}, [])

useEffect(() => {
if (forceUpdate) forceUpdate()
Expand All @@ -77,6 +92,8 @@ export function Tooltip(
{...restProps}
className={classNames(styles.root, className)}
data-tone={tone}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
ref={setPopperElement}
style={popper.styles.popper}
{...popper.attributes.popper}
Expand All @@ -88,7 +105,14 @@ export function Tooltip(

return (
<>
{React.cloneElement(children, {onMouseEnter, onMouseLeave, ref: setReferenceElement})}
{React.cloneElement(children, {
onBlur: handleBlur,
onFocus: handleFocus,
onMouseEnter: handleMouseEnter,
onMouseLeave: handleMouseLeave,
ref: setReferenceElement
})}

{isOpen && (
<>
{portalProp && <Portal>{popperNode}</Portal>}
Expand Down

0 comments on commit 352d6f1

Please sign in to comment.