import React, { forwardRef, useState } from "react"; import clsx from "clsx"; import "./FilledButton.scss"; import { AbortError } from "../errors"; import Spinner from "./Spinner"; import { isPromiseLike } from "../utils"; export type ButtonVariant = "filled" | "outlined" | "icon"; export type ButtonColor = "primary" | "danger" | "warning" | "muted"; export type ButtonSize = "medium" | "large"; export type FilledButtonProps = { label: string; children?: React.ReactNode; onClick?: (event: React.MouseEvent) => void; variant?: ButtonVariant; color?: ButtonColor; size?: ButtonSize; className?: string; fullWidth?: boolean; icon?: React.ReactNode; }; export const FilledButton = forwardRef( ( { children, icon, onClick, label, variant = "filled", color = "primary", size = "medium", fullWidth, className, }, ref, ) => { const [isLoading, setIsLoading] = useState(false); const _onClick = async (event: React.MouseEvent) => { const ret = onClick?.(event); if (isPromiseLike(ret)) { try { setIsLoading(true); await ret; } catch (error: any) { if (!(error instanceof AbortError)) { throw error; } else { console.warn(error); } } finally { setIsLoading(false); } } }; return ( ); }, );