hensei-web/components/Button/index.tsx

161 lines
3.2 KiB
TypeScript

import React, { useEffect, useState } from 'react'
import classNames from 'classnames'
import Link from 'next/link'
import AddIcon from '~public/icons/Add.svg'
import CheckIcon from '~public/icons/LargeCheck.svg'
import CrossIcon from '~public/icons/Cross.svg'
import EditIcon from '~public/icons/Edit.svg'
import LinkIcon from '~public/icons/Link.svg'
import MenuIcon from '~public/icons/Menu.svg'
import SaveIcon from '~public/icons/Save.svg'
import SettingsIcon from '~public/icons/Settings.svg'
import './index.scss'
import { ButtonType } from '~utils/enums'
interface Props {
active?: boolean
disabled?: boolean
classes?: string[]
icon?: string
type?: ButtonType
children?: React.ReactNode
onClick?: (event: React.MouseEvent<HTMLElement>) => void
}
const Button = (props: Props) => {
// States
const [active, setActive] = useState(false)
const [disabled, setDisabled] = useState(false)
const [pressed, setPressed] = useState(false)
const [buttonType, setButtonType] = useState(ButtonType.Base)
const classes = classNames(
{
Button: true,
Active: active,
'btn-pressed': pressed,
'btn-disabled': disabled,
save: props.icon === 'save',
destructive: props.type == ButtonType.Destructive,
},
props.classes
)
useEffect(() => {
if (props.active) setActive(props.active)
if (props.disabled) setDisabled(props.disabled)
if (props.type) setButtonType(props.type)
}, [props.active, props.disabled, props.type])
const addIcon = (
<span className="icon">
<AddIcon />
</span>
)
const menuIcon = (
<span className="icon">
<MenuIcon />
</span>
)
const linkIcon = (
<span className="icon stroke">
<LinkIcon />
</span>
)
const checkIcon = (
<span className="icon check">
<CheckIcon />
</span>
)
const crossIcon = (
<span className="icon">
<CrossIcon />
</span>
)
const editIcon = (
<span className="icon">
<EditIcon />
</span>
)
const saveIcon = (
<span className="icon stroke">
<SaveIcon />
</span>
)
const settingsIcon = (
<span className="icon settings">
<SettingsIcon />
</span>
)
function getIcon() {
let icon: React.ReactNode
switch (props.icon) {
case 'new':
icon = addIcon
break
case 'menu':
icon = menuIcon
break
case 'link':
icon = linkIcon
break
case 'check':
icon = checkIcon
break
case 'cross':
icon = crossIcon
break
case 'edit':
icon = editIcon
break
case 'save':
icon = saveIcon
break
case 'settings':
icon = settingsIcon
break
}
return icon
}
function handleMouseDown() {
setPressed(true)
}
function handleMouseUp() {
setPressed(false)
}
return (
<button
className={classes}
disabled={disabled}
onMouseDown={handleMouseDown}
onMouseUp={handleMouseUp}
onClick={props.onClick}
>
{getIcon()}
{props.type != ButtonType.IconOnly ? (
<span className="text">{props.children}</span>
) : (
''
)}
</button>
)
}
export default Button