Spaces:
Runtime error
Runtime error
| 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; | |