import React, { useContext } from 'react'; import { AbstractButton, ButtonProps, ButtonSize, LinkButtonProps } from './AbstractButton'; import { ThemeContext } from '../../themes'; const getSizeNameComponentSegment = (size: ButtonSize) => { switch (size) { case ButtonSize.ExtraSmall: return 'ExtraSmall'; case ButtonSize.Small: return 'Small'; case ButtonSize.Large: return 'Large'; case ButtonSize.ExtraLarge: return 'ExtraLarge'; default: return 'Medium'; } }; const buttonFactory: (renderAs: string, size: ButtonSize, displayName: string) => React.ComponentType = ( renderAs, size, displayName ) => { const ButtonComponent: React.FunctionComponent = props => { const theme = useContext(ThemeContext); return ; }; ButtonComponent.displayName = displayName; return ButtonComponent; }; export const Button: React.FunctionComponent = props => { const theme = useContext(ThemeContext); return ; }; Button.displayName = 'Button'; export const LinkButton: React.FunctionComponent = props => { const theme = useContext(ThemeContext); return ; }; LinkButton.displayName = 'LinkButton'; export const ExtraSmallButton = buttonFactory( 'button', ButtonSize.ExtraSmall, `${getSizeNameComponentSegment(ButtonSize.ExtraSmall)}Button` ); export const SmallButton = buttonFactory( 'button', ButtonSize.Small, `${getSizeNameComponentSegment(ButtonSize.Small)}Button` ); export const LargeButton = buttonFactory( 'button', ButtonSize.Large, `${getSizeNameComponentSegment(ButtonSize.Large)}Button` ); export const ExtraLargeButton = buttonFactory( 'button', ButtonSize.ExtraLarge, `${getSizeNameComponentSegment(ButtonSize.ExtraLarge)}Button` ); export const ExtraSmallLinkButton = buttonFactory( 'a', ButtonSize.ExtraSmall, `${getSizeNameComponentSegment(ButtonSize.ExtraSmall)}LinkButton` ); export const SmallLinkButton = buttonFactory( 'a', ButtonSize.Small, `${getSizeNameComponentSegment(ButtonSize.Small)}LinkButton` ); export const LargeLinkButton = buttonFactory( 'a', ButtonSize.Large, `${getSizeNameComponentSegment(ButtonSize.Large)}LinkButton` ); export const ExtraLargeLinkButton = buttonFactory( 'a', ButtonSize.ExtraLarge, `${getSizeNameComponentSegment(ButtonSize.ExtraLarge)}LinkButton` );