import React from 'react';
import {
TouchableOpacity,
TouchableOpacityProps,
Platform,
} from 'react-native';
import styled from 'styled-components/native';
import { border, color, flexbox, layout, position, space } from 'styled-system';
import { useThemeProps } from '../../../hooks';
import { themeTools } from '../../../theme';
import {
customBackground,
customBorder,
customExtra,
customLayout,
customOutline,
customPosition,
customShadow,
} from '../../../utils/customProps';
import Text from '../../primitives/Text';
import { default as Box, IBoxProps } from '../Box';
import Flex from '../Flex';
import Spinner from '../Spinner';
import type { IButtonGroupProps, IButtonProps } from './types';
const StyledButton = styled(TouchableOpacity)<
IButtonProps & TouchableOpacityProps
>(
color,
space,
layout,
flexbox,
border,
position,
customPosition,
customBorder,
customBackground,
customOutline,
customShadow,
customExtra,
customLayout
);
const Button = (
{
style,
children,
highlight,
isLoading,
isLoadingText,
size,
startIcon,
endIcon,
spinner,
...props
}: IButtonProps & IBoxProps,
ref: any
) => {
const { _text, ...newProps } = useThemeProps('Button', {
...props,
size,
});
let [layoutProps, viewProps] = themeTools.extractInObject(newProps, [
'm',
'margin',
'mt',
'marginTop',
'mr',
'marginRight',
'mb',
'marginBottom',
'ml',
'marginLeft',
'mx',
'marginX',
'my',
'marginY',
'left',
'top',
'bottom',
'right',
'position',
'zIndex',
'minH',
'minHeight',
'minWidth',
'minW',
'height',
'width',
'opacity',
]);
const [commonProps] = themeTools.extractInObject(layoutProps, [
'minH',
'minHeight',
'minWidth',
'minW',
'height',
'width',
]);
let [
accessibilityProps,
innerButtonProps,
] = themeTools.extractInObject(viewProps, [
'accessible',
'accessibilityRole',
'accessibilityState',
'accessibilityLabel',
'accessibilityHint',
'isDisabled',
'onPress',
]);
accessibilityProps.isDisabled = accessibilityProps.isDisabled || isLoading;
const innerButton = (
{startIcon ? (
{startIcon}
) : null}
{isLoading ? (
{spinner ? spinner : }
{isLoadingText ? ' ' + isLoadingText : ''}
) : React.Children.count(children) > 1 || typeof children !== 'string' ? (
children
) : (
{children}
)}
{endIcon ? (
{endIcon}
) : null}
);
return (
{innerButton}
);
};
export { ButtonGroup } from './ButtonGroup';
export type { IButtonProps, IButtonGroupProps };
export default React.memo(React.forwardRef(Button));