| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| import GradientBorder from '@/common/components/button/GradientBorder'; |
| import useScreenSize from '@/common/screen/useScreenSize'; |
| import {BLUE_PINK_FILL_BR} from '@/theme/gradientStyle'; |
| import type {CarbonIconType} from '@carbon/icons-react'; |
| import {Loading} from 'react-daisyui'; |
|
|
| type Props = { |
| variant?: 'default' | 'flat' | 'gradient'; |
| title: string | React.ReactNode; |
| Icon: CarbonIconType; |
| isActive?: boolean; |
| isDisabled?: boolean; |
| loadingProps?: { |
| loading: boolean; |
| label?: string; |
| }; |
| onClick: () => void; |
| }; |
|
|
| export default function OptionButton({ |
| variant = 'default', |
| title, |
| Icon, |
| isActive = false, |
| isDisabled = false, |
| loadingProps, |
| onClick, |
| }: Props) { |
| const {isMobile} = useScreenSize(); |
| const isLoading = loadingProps?.loading === true; |
|
|
| function handleClick() { |
| if (isDisabled) { |
| return; |
| } |
| onClick(); |
| } |
|
|
| const ButtonBase = ( |
| <div |
| onClick={handleClick} |
| className={`relative rounded-lg h-full flex items-center justify-center |
| ${variant === 'default' ? 'bg-graydark-700' : ''} |
| ${!isDisabled && 'cursor-pointer'} |
| ${isDisabled ? 'text-gray-300' : ''} |
| ${isActive && BLUE_PINK_FILL_BR}`}> |
| <div className="flex gap-2 items-center py-4 md:py-6"> |
| {isLoading ? ( |
| <Loading size="md" className="mx-auto mt-1" /> |
| ) : ( |
| <Icon |
| size={isMobile ? 24 : 28} |
| className={`mx-auto ${isDisabled ? 'text-gray-300' : 'text-white'}`} |
| /> |
| )} |
| <div className="text-base font-medium text-white"> |
| {isLoading && loadingProps?.label != null |
| ? loadingProps.label |
| : title} |
| </div> |
| </div> |
| </div> |
| ); |
|
|
| return variant === 'gradient' ? ( |
| <GradientBorder rounded={false} className={'rounded-lg md:rounded-full'}> |
| {ButtonBase} |
| </GradientBorder> |
| ) : ( |
| ButtonBase |
| ); |
| } |
|
|