import { TouchableOpacity, Text, View, StyleSheet } from 'react-native' import React, { useState } from 'react' import { ButtonProps, ListItemProps } from './types' import { renderIcon } from './listItem' const getIcon = ( type: string, icon: string | undefined, inactiveToggle: string | undefined, activeToggle: string | undefined, toggleCondition: boolean | undefined ): string | undefined => { if (type === 'icon') { return icon } return toggleCondition ? activeToggle : inactiveToggle } const getIconColor = ( type: string, color: string, inactiveToggleColor: string, activeToggleColor: string, toggleCondition: boolean | undefined ): string => { if (type === 'icon') { return color } return toggleCondition ? activeToggleColor : inactiveToggleColor } export const getIconButton = (props: ButtonProps): JSX.Element | null => { const { type, icon, inactiveIcon, activeIcon, color, inactiveColor, activeColor, label, propValue, state, setState, iconButtonAction, textStyles, } = props const rendered = getIcon(type, icon, inactiveIcon, activeIcon, state) const renderedColor = getIconColor( type, color, inactiveColor, activeColor, state ) const leftButton1Action = () => iconButtonAction(type, !state, setState, propValue) if (!rendered) return null return ( {renderIcon(rendered, 24, renderedColor)} {label && ( {label} )} ) } export const BottomButtons = ( props: ListItemProps & { iconButtonAction: ( type: 'icon' | 'toggle', state: boolean, setState: (state: boolean) => void, propValue: 'leftIcon1' | 'leftIcon2' | 'rightIcon' ) => void bottomButtonAction: () => void } ): JSX.Element => { const { buttons, iconButtonAction, bottomButtonAction, background } = props const { padding } = background const { leftIcon1Type, leftIcon1Input, leftIcon1, leftIcon1Color, leftIcon1ActiveIcon, leftIcon1ActiveColor, leftIcon1InactiveIcon, leftIcon1InactiveColor, leftIcon1Label, enableLeftIcon2, leftIcon2Type, leftIcon2Input, leftIcon2ActiveIcon, leftIcon2ActiveColor, leftIcon2InactiveIcon, leftIcon2Color, leftIcon2InactiveColor, leftIcon2, leftIcon2Label, enableRightIcon, rightIconType, rightIconInput, rightIconActiveIcon, rightIconActiveColor, rightIconInactiveIcon, rightIconColor, rightIconInactiveColor, rightIcon, enableBottomButton, bottomButtonColor, bottomButtonText, styles: buttonStyles, } = buttons const { leftIcon1Label: leftIcon1TextStyles, leftIcon2Label: leftIcon2TextStyles, bottomButtonText: bottomButtonTextStyles, } = buttonStyles const [leftIcon1State, setLeftIcon1State] = useState(leftIcon1Input) const [leftIcon2State, setLeftIcon2State] = useState(leftIcon2Input) const [rightIconState, setRightIconState] = useState(rightIconInput) const buttonContainerStyles = { paddingHorizontal: 4 + padding, marginTop: 9 + padding, } return ( {getIconButton({ type: leftIcon1Type, icon: leftIcon1, inactiveIcon: leftIcon1InactiveIcon, activeIcon: leftIcon1ActiveIcon, color: leftIcon1Color, inactiveColor: leftIcon1InactiveColor, activeColor: leftIcon1ActiveColor, label: leftIcon1Label, propValue: 'leftIcon1', state: leftIcon1State, setState: setLeftIcon1State, iconButtonAction, textStyles: leftIcon1TextStyles, })} {enableLeftIcon2 && getIconButton({ type: leftIcon2Type, icon: leftIcon2, inactiveIcon: leftIcon2InactiveIcon, activeIcon: leftIcon2ActiveIcon, color: leftIcon2Color, inactiveColor: leftIcon2InactiveColor, activeColor: leftIcon2ActiveColor, label: leftIcon2Label, propValue: 'leftIcon2', state: leftIcon2State, setState: setLeftIcon2State, iconButtonAction, textStyles: leftIcon2TextStyles, })} {enableRightIcon && getIconButton({ type: rightIconType, icon: rightIcon, inactiveIcon: rightIconInactiveIcon, activeIcon: rightIconActiveIcon, color: rightIconColor, inactiveColor: rightIconInactiveColor, activeColor: rightIconActiveColor, propValue: 'rightIcon', state: rightIconState, setState: setRightIconState, iconButtonAction, })} {enableBottomButton && ( {bottomButtonText} )} ) } const styles = StyleSheet.create({ buttonsContainer: { flexDirection: 'row', justifyContent: 'space-between', }, button: { flexDirection: 'row', alignItems: 'center', marginRight: 10, justifyContent: 'flex-start', }, textStyle: { marginLeft: 5, }, bottomButton: { justifyContent: 'center', alignItems: 'center', padding: 5, height: 35, borderRadius: 18, marginTop: 10, width: '60%', alignSelf: 'center', }, })