import React, { ReactNode } from "react"; import "./Button.css"; import { getCN, isDevaice, getClassName } from "../utils"; import ButtonTouch, { IButtonTouch } from "../ButtonTouch/ButtonTouch"; import { IconRightArrow } from "../../svg_icons/IconRightArrow"; import { IconSpinner } from "../../svg_icons/IconSpinner"; export interface IButton extends React.HTMLAttributes { before?: React.ReactNode; after?: React.ReactNode; stretched?: boolean; border?: `default` | `primary` | string; wide?: boolean; size?: `s` | `m` | `l` | `low` | string; mode?: `primary` | `secondary` | `outline` | `tertiary`; disabled?: boolean; appearance?: "warning" | "primary" | "accent" | "positive" | "negative" | "neutral"; align?: "left" | "center" | "right"; selected?: boolean | null; expandable?: boolean; touchMode?: IButtonTouch["mode"]; stopPropagation?: IButtonTouch["stopPropagation"]; preventDefault?: IButtonTouch["preventDefault"]; onClick?: IButtonTouch["onClick"]; href?: IButtonTouch["href"]; target?: IButtonTouch["target"]; loading?: boolean; loadingIcon?: React.ReactNode; rootRef?: React.LegacyRef | undefined; className?: string | undefined } function Button({ children, before, after, stretched = false, border = "auto", wide = false, size = "s", mode = "primary", disabled = false, appearance = `primary`, align = "center", selected = null, expandable = false, touchMode, stopPropagation = true, preventDefault = false, onClick, href, target, loading = false, loadingIcon, rootRef, className, ...props }: IButton) { if (selected) { appearance = `positive`; mode = "secondary"; } if (selected == false) { appearance = `neutral`; mode = "tertiary"; } if (border == `auto`) border = isDevaice(`mobile`) ? `default` : `primary`; const _onClick = (e: any) => { if (loading) return; if (onClick) onClick(e); }; return (
{!loading && before && (
{before}
)} {!loading && children && (
{children}
)} {!loading && after && (
{after}
)} {loading && (
{!loadingIcon ? : loadingIcon}
)}
{expandable && ( )}
); } export default Button;