Files
negareh-admin/src/components/Button.tsx
T
2025-10-20 12:28:48 +03:30

41 lines
1.3 KiB
TypeScript

import type { ButtonHTMLAttributes, FC, ReactNode } from 'react'
import { memo } from 'react'
import MoonLoader from "react-spinners/MoonLoader"
import { type XOR } from '@/helpers/types'
import { clx } from '@/helpers/utils'
type Props = {
className?: string;
isLoading?: boolean,
percentage?: number,
} & ButtonHTMLAttributes<HTMLButtonElement> &
XOR<{ children: ReactNode }, { label: string }>;
const Button: FC<Props> = memo((props: Props) => {
const buttonClass = clx(
'flex rounded-xl items-center justify-center text-center h-10 text-sm bg-primary w-full',
props.disabled && 'cursor-not-allowed opacity-60',
props.className
);
return (
<button {...props} className={`${buttonClass} ${props.className}`} disabled={props.disabled || props.isLoading}>
{
props.isLoading ?
<div className='flex gap-2 items-center'>
{
!props.percentage ?
<MoonLoader size={20} color='#fff' />
:
<span>{props.percentage}%</span>
}
</div>
:
props.label || props.children
}
</button>
)
})
export default Button