import * as React from "react"; import { View, ViewStyle, StyleProp, GestureResponderEvent, } from "react-native"; import color from "color"; import TouchableRipple from "../TouchableRipple/TouchableRipple"; import Icon from "../Icon/SvgIcon"; import CrossFadeIcon from "../Icon/CrossFadeIcon"; import type { $RemoveChildren } from "../types"; import { DefaultTheme, ThemeContext } from "styled-components"; type Props = $RemoveChildren & { /** * Icon to display. */ icon: React.ReactElement; /** * Color of the icon. */ color?: string; /** * Size of the icon. */ size?: number; /** * Whether the button is disabled. A disabled button is greyed out and `onPress` is not called on touch. */ disabled?: boolean; /** * Whether an icon change is animated. */ animated?: boolean; /** * Accessibility label for the button. This is read by the screen reader when the user taps the button. */ accessibilityLabel?: string; /** * Function to execute on press. */ onPress?: (e: GestureResponderEvent) => void; style?: StyleProp; // ref?: React.RefObject; ref?: React.RefObject; /** * @optional */ theme?: DefaultTheme; }; /** * An icon button is a button which displays only an icon without a label. * By default button has 150% size of the icon. * *
*
* *
Icon button
*
*
* *
Pressed icon button
*
*
* * ## Usage * ```js * import * as React from 'react'; * import IconButton from 'react-native-simple-elements/components/IconButton'; * import * as Colors from "react-native-simple-elements/components/theme/colors"; * import CameraIcon from "@mdi/svg/svg/camera.svg"; * * const MyComponent = () => ( * console.log('Pressed')} * /> * ); * * export default MyComponent; * ``` * */ const IconButton = ({ icon, color: customColor, size = 24, accessibilityLabel, disabled, onPress, animated = false, style, ...rest }: Props) => { const theme = React.useContext(ThemeContext); const iconColor = typeof customColor !== "undefined" ? customColor : theme.colors.text; const rippleColor = color(iconColor).alpha(0.32).rgb().string(); const IconComponent = animated ? CrossFadeIcon : Icon; const buttonSize = size * 1.5; return ( ); }; export default IconButton;