import { Button, type ButtonProps, CircularProgress, type CircularProgressProps, SxProps, Theme, Typography, } from '@mui/material'; export interface LoadingButtonProps extends ButtonProps { loading?: boolean; loadingIndicator?: React.ReactNode; loadingPosition?: 'start' | 'center' | 'end'; loadingProps?: Partial; loadingOnly?: boolean; } export default function LoadingButton({ ref = undefined, children, loading = false, loadingPosition = 'start', loadingIndicator = undefined, loadingProps = {}, loadingOnly = false, onClick, sx, ...props }: LoadingButtonProps & { ref?: React.RefObject; }) { const handleClick = (e: React.MouseEvent) => { if (loading) { return; } onClick?.(e); }; const getPositionStyles = (position: string) => { return { color: 'inherit', ...(position === 'start' && { mr: 1 }), ...(position === 'end' && { ml: 1 }), ...(position === 'center' && { position: 'absolute', left: '50%', transform: 'translateY(-50%) translateX(-50%)', top: '50%', }), display: 'inline-flex', alignItems: 'center', } as const; }; const defaultIndicator = ( ); const indicator = ( }> {loadingIndicator || defaultIndicator} ); return ( ); } LoadingButton.displayName = 'LoadingButton';