Skip to content
Snippets Groups Projects
button.tsx 1.45 KiB
import React, { ChangeEvent, FC } from "react";

import "./button.css";

type ButtonProps = {
    text: string;
    image?: string;
    imageAlt?: string;
    file?: boolean;
    accept?: string;
    size?: string;
    style?: string[];
    onClick?: () => void;
    onFile?: (file: File) => void;
};

export const Button: FC<ButtonProps> = ({
    text,
    image,
    imageAlt,
    file = false,
    accept = ".txt",
    size = "small",
    style = ["simple", "border"],
    onClick,
    onFile
}) => {
    const classes = () =>
        ["button", size, file ? "file" : "", ...style].join(" ");
    const onFileChange = (event: ChangeEvent<HTMLInputElement>) => {
        if (!event.target.files || event.target.files.length === 0) {
            return;
        }
        const file = event.target.files[0];
        onFile && onFile(file);
        event.target.value = "";
    };
    const renderSimple = () => (
        <span className={classes()} onClick={onClick}>
            {text}
        </span>
    );
    const renderComplex = () => (
        <span className={classes()} onClick={onClick}>
            {image && <img src={image} alt={imageAlt || text || "button"} />}
            {file && (
                <input type="file" accept={accept} onChange={onFileChange} />
            )}
            <span>{text}</span>
        </span>
    );
    return image ? renderComplex() : renderSimple();
};

export default Button;