feat: supports tooltip show and delay

This commit is contained in:
Jacob Fletcher
2022-12-08 14:11:55 -05:00
parent 39a956cee3
commit 00b3b768eb
4 changed files with 48 additions and 14 deletions

View File

@@ -28,11 +28,12 @@ const ButtonContents = ({ children, icon, tooltip }) => {
<span
className={`${baseClass}__content`}
>
{tooltip && (
<Tooltip className={`${baseClass}__tooltip`}>
{tooltip}
</Tooltip>
)}
<Tooltip
className={`${baseClass}__tooltip`}
show={tooltip}
>
{tooltip}
</Tooltip>
{children && (
<span className={`${baseClass}__label`}>
{children}

View File

@@ -1,6 +1,7 @@
@import '../../../scss/styles.scss';
.tooltip {
opacity: 0;
background-color: var(--theme-elevation-800);
position: absolute;
z-index: 2;
@@ -13,6 +14,7 @@
font-weight: normal;
white-space: nowrap;
border-radius: 2px;
transition: opacity .2s ease-in-out;
span {
position: absolute;
@@ -24,4 +26,8 @@
border: 10px solid transparent;
border-top-color: var(--theme-elevation-800);
}
&--show {
opacity: 1;
}
}

View File

@@ -1,18 +1,43 @@
import React from 'react';
import React, { useEffect } from 'react';
import { Props } from './types';
import './index.scss';
const Tooltip: React.FC<Props> = (props) => {
const { className, children } = props;
const classes = [
'tooltip',
const {
className,
].filter(Boolean).join(' ');
children,
show: showFromProps = true,
delay,
} = props;
const [show, setShow] = React.useState(showFromProps);
useEffect(() => {
let timerId: NodeJS.Timeout;
// do not use the delay on out
if (delay && showFromProps) {
timerId = setTimeout(() => {
setShow(showFromProps);
}, delay);
} else {
setShow(showFromProps);
}
return () => {
if (timerId) clearTimeout(timerId);
};
}, [showFromProps, delay]);
return (
<aside className={classes}>
<aside
className={[
'tooltip',
className,
show && 'tooltip--show',
].filter(Boolean).join(' ')}
>
{children}
<span />
</aside>

View File

@@ -1,4 +1,6 @@
export type Props = {
className?: string,
children: React.ReactNode,
className?: string
children: React.ReactNode
show?: boolean
delay?: number
}