Files
bee-dashboard/src/components/SwarmButton.tsx
T
Vojtech Simetka caea5ae309 feat: info page redesign (#390)
* feat: info page redesign

* feat: add chequebook card
2022-06-18 17:09:13 +02:00

96 lines
2.0 KiB
TypeScript

import { Button, ButtonProps, CircularProgress, createStyles, makeStyles } from '@material-ui/core'
import React, { ReactElement } from 'react'
import { IconProps } from 'react-feather'
export interface SwarmButtonProps extends ButtonProps {
iconType: React.ComponentType<IconProps>
loading?: boolean
cancel?: boolean
variant?: 'text' | 'contained' | 'outlined'
}
const useStyles = makeStyles(() =>
createStyles({
button: {
height: '42px',
position: 'relative',
whiteSpace: 'nowrap',
color: '#242424',
'&:hover, &:focus': {
'& svg': {
stroke: '#fff',
transition: '0.1s',
},
},
},
cancelButton: {
background: '#f7f7f7',
color: '#606060',
},
spinnerWrapper: {
position: 'absolute',
left: '50%',
top: '50%',
width: '40px',
height: '40px',
transform: 'translate(-50%, -50%)',
},
}),
)
export function SwarmButton({
children,
onClick,
iconType,
className,
disabled,
loading,
cancel,
variant = 'contained',
style,
...other
}: SwarmButtonProps): ReactElement {
const classes = useStyles()
function getIconColor() {
if (loading || disabled) {
return 'rgba(0, 0, 0, 0.26)'
}
return cancel ? '#606060' : '#dd7700'
}
function getButtonClassName() {
return [className, classes.button, cancel && classes.cancelButton].filter(x => x).join(' ')
}
const icon = React.createElement(iconType, {
size: '1.25rem',
color: getIconColor(),
})
return (
<Button
style={style}
className={getButtonClassName()}
onClick={(event: React.MouseEvent<HTMLButtonElement>) => {
if (onClick) {
onClick(event)
event.currentTarget.blur()
}
}}
variant={variant}
startIcon={icon}
disabled={disabled}
{...other}
>
{children}
{loading && (
<div className={classes.spinnerWrapper}>
<CircularProgress />
</div>
)}
</Button>
)
}