1- import React , { isValidElement } from 'react' ;
1+ import React , { Fragment , isValidElement } from 'react' ;
22import { Link } from 'react-router-dom' ;
33import { Props } from './types' ;
44
@@ -21,30 +21,31 @@ const icons = {
2121
2222const baseClass = 'btn' ;
2323
24- const ButtonContents = ( { children, icon, tooltip } ) => {
24+ const ButtonContents = ( { children, icon, tooltip, showTooltip } ) => {
2525 const BuiltInIcon = icons [ icon ] ;
2626
2727 return (
28- < span
29- className = { `${ baseClass } __content` }
30- >
31- { tooltip && (
32- < Tooltip className = { `${ baseClass } __tooltip` } >
33- { tooltip }
34- </ Tooltip >
35- ) }
36- { children && (
37- < span className = { `${ baseClass } __label` } >
38- { children }
39- </ span >
40- ) }
41- { icon && (
42- < span className = { `${ baseClass } __icon` } >
43- { isValidElement ( icon ) && icon }
44- { BuiltInIcon && < BuiltInIcon /> }
45- </ span >
46- ) }
47- </ span >
28+ < Fragment >
29+ < Tooltip
30+ className = { `${ baseClass } __tooltip` }
31+ show = { showTooltip }
32+ >
33+ { tooltip }
34+ </ Tooltip >
35+ < span className = { `${ baseClass } __content` } >
36+ { children && (
37+ < span className = { `${ baseClass } __label` } >
38+ { children }
39+ </ span >
40+ ) }
41+ { icon && (
42+ < span className = { `${ baseClass } __icon` } >
43+ { isValidElement ( icon ) && icon }
44+ { BuiltInIcon && < BuiltInIcon /> }
45+ </ span >
46+ ) }
47+ </ span >
48+ </ Fragment >
4849 ) ;
4950} ;
5051
@@ -53,7 +54,7 @@ const Button: React.FC<Props> = (props) => {
5354 className,
5455 id,
5556 type = 'button' ,
56- el,
57+ el = 'button' ,
5758 to,
5859 url,
5960 children,
@@ -69,6 +70,8 @@ const Button: React.FC<Props> = (props) => {
6970 tooltip,
7071 } = props ;
7172
73+ const [ showTooltip , setShowTooltip ] = React . useState ( false ) ;
74+
7275 const classes = [
7376 baseClass ,
7477 className && className ,
@@ -84,6 +87,7 @@ const Button: React.FC<Props> = (props) => {
8487 ] . filter ( Boolean ) . join ( ' ' ) ;
8588
8689 function handleClick ( event ) {
90+ setShowTooltip ( false ) ;
8791 if ( type !== 'submit' && onClick ) event . preventDefault ( ) ;
8892 if ( onClick ) onClick ( event ) ;
8993 }
@@ -93,6 +97,8 @@ const Button: React.FC<Props> = (props) => {
9397 type,
9498 className : classes ,
9599 disabled,
100+ onMouseEnter : tooltip ? ( ) => setShowTooltip ( true ) : undefined ,
101+ onMouseLeave : tooltip ? ( ) => setShowTooltip ( false ) : undefined ,
96102 onClick : ! disabled ? handleClick : undefined ,
97103 rel : newTab ? 'noopener noreferrer' : undefined ,
98104 target : newTab ? '_blank' : undefined ,
@@ -108,6 +114,7 @@ const Button: React.FC<Props> = (props) => {
108114 < ButtonContents
109115 icon = { icon }
110116 tooltip = { tooltip }
117+ showTooltip = { showTooltip }
111118 >
112119 { children }
113120 </ ButtonContents >
@@ -123,25 +130,29 @@ const Button: React.FC<Props> = (props) => {
123130 < ButtonContents
124131 icon = { icon }
125132 tooltip = { tooltip }
133+ showTooltip = { showTooltip }
126134 >
127135 { children }
128136 </ ButtonContents >
129137 </ a >
130138 ) ;
131139
132140 default :
141+ const Tag = el ; // eslint-disable-line no-case-declarations
142+
133143 return (
134- < button
144+ < Tag
135145 type = "submit"
136146 { ...buttonProps }
137147 >
138148 < ButtonContents
139149 icon = { icon }
140150 tooltip = { tooltip }
151+ showTooltip = { showTooltip }
141152 >
142153 { children }
143154 </ ButtonContents >
144- </ button >
155+ </ Tag >
145156 ) ;
146157 }
147158} ;
0 commit comments