'use client'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import * as React from 'react'
import ReactDOM from 'react-dom'
import classNames from 'classnames'
import useEventHandler from '~/src/hooks/useEventHandler'
import useMergeRefs from '~/src/hooks/useMergeRefs'
import { isArray, isEmpty, isString } from '~/src/utils/type'
import { Text } from '~/src/components/Text'
import { InvertedThemeProvider } from '~/src/components/ThemeProvider'
import { useRootElement } from '~/src/components/WindowProvider'
import { type LegacyTooltipContentProps } from './LegacyTooltip.types'
import { getReplacement, getTooltipStyle } from './utils'
import styles from './LegacyTooltip.module.scss'
function getNewLineComponent(strContent: string) {
return strContent.split('\n').map((str, index) => {
if (index === 0) {
return (
{str}
)
}
return (
{str}
)
})
}
function getContentComponent(content?: React.ReactNode) {
if (isArray(content)) {
return content.map((item) => {
if (isString(item)) {
return getNewLineComponent(item)
}
return item
})
}
if (isString(content)) {
return getNewLineComponent(content)
}
return content
}
export const LegacyTooltipContent: React.FC = ({
as,
content,
contentStyle,
contentClassName,
contentWrapperClassName,
contentWrapperStyle: givenContentWrapperStyle,
disabled = false,
keepInContainer = false,
placement = 'bottom-center',
tooltipContainer,
offset = 4,
allowHover = false,
forwardedRef,
...rest
}) => {
const rootElement = useRootElement()
const tooltipRef = useRef(null)
const tooltipWrapperRef = useRef(null)
const mergedRef = useMergeRefs(tooltipRef, forwardedRef)
const [replacement, setReplacement] = useState(placement)
const handleClickTooltip = useCallback(
(event: HTMLElementEventMap['click']) => {
event.stopPropagation()
},
[]
)
useEventHandler(tooltipRef.current, 'click', handleClickTooltip)
useEffect(() => {
if (!tooltipRef.current) {
return
}
const newPlacement = getReplacement({
tooltip: tooltipRef.current,
keepInContainer,
placement,
rootElement,
})
setReplacement(newPlacement)
}, [rootElement, keepInContainer, placement])
const ContentComponent = useMemo(
() => getContentComponent(content),
[content]
)
const contentWrapperStyle = useMemo(() => {
if (tooltipContainer) {
return {
...givenContentWrapperStyle,
...getTooltipStyle({
tooltipContainer,
placement: replacement,
offset,
allowHover,
}),
}
}
return {}
}, [
tooltipContainer,
givenContentWrapperStyle,
replacement,
offset,
allowHover,
])
const Comp = as ?? 'div'
return ReactDOM.createPortal(
{ContentComponent}
,
rootElement
)
}