-
João Magalhães authoredJoão Magalhães authored
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;