Spaces:
Runtime error
Runtime error
File size: 1,920 Bytes
cd6f98e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
import clsx from "clsx";
import type { ForwardedRef } from "react";
import React, { forwardRef, useState } from "react";
import Loader from "./loader";
export interface ButtonProps {
type?: "button" | "submit" | "reset";
className?: string;
icon?: React.ReactNode;
children?: React.ReactNode;
loader?: boolean;
disabled?: boolean;
ping?: boolean;
enabledClassName?: string;
onClick?: (e: React.MouseEvent<HTMLButtonElement>) => Promise<void> | void;
}
const Button = forwardRef((props: ButtonProps, ref: ForwardedRef<HTMLButtonElement>) => {
const [loading, setLoading] = useState(false);
const onClick = (e: React.MouseEvent<HTMLButtonElement>) => {
if (props.loader == true) setLoading(true);
try {
void Promise.resolve(props.onClick?.(e)).then();
} catch (e) {
setLoading(false);
}
};
return (
<button
ref={ref}
type={props.type}
disabled={loading || props.disabled}
className={clsx(
"relative rounded-lg border-2 border-black/20 px-4 py-1 font-bold text-white transition-all duration-300 sm:px-10 sm:py-3",
props.disabled && "cursor-not-allowed border-white/10 bg-slate-9 text-white",
props.disabled ||
"cursor-pointer bg-[#1E88E5]/80 text-white hover:bg-[#0084f7] hover:shadow-lg",
props.disabled || props.enabledClassName,
props.className
)}
onClick={onClick}
>
<div className="relative">
{loading && (
<Loader className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 transform" />
)}
<div
className={clsx("flex h-full w-full items-center justify-center", loading && "opacity-0")}
>
{props.icon ? <div className="mr-2">{props.icon}</div> : null}
{props.children}
</div>
</div>
</button>
);
});
Button.displayName = "Button";
export default Button;
|