import React, { useCallback } from 'react';
import { TouchableOpacity } from 'react-native';
import Animated, { useAnimatedStyle } from 'react-native-reanimated';
import Separator from './Separator';
import styles from './styles';
import { MenuItemProps } from './types';
import { useInternal } from '../../hooks';
import { CONTEXT_MENU_STATE } from '../../constants';
import { BORDER_LIGHT_COLOR, BORDER_DARK_COLOR } from './constants';
import isEqual from 'lodash.isequal';
import { getColor } from './calculations';
import { AnimatedIcon } from '../provider/Provider';
// @ts-ignore
const AnimatedTouchable = Animated.createAnimatedComponent(TouchableOpacity);
type MenuItemComponentProps = {
item: MenuItemProps;
isLast?: boolean;
};
const MenuItemComponent = ({ item, isLast }: MenuItemComponentProps) => {
const { state, theme, menuProps } = useInternal();
const borderStyles = useAnimatedStyle(() => {
const borderBottomColor =
theme.value === 'dark' ? BORDER_DARK_COLOR : BORDER_LIGHT_COLOR;
return {
borderBottomColor,
borderBottomWidth: isLast ? 0 : 1,
};
}, [theme, isLast, item]);
const textColor = useAnimatedStyle(() => {
return { color: getColor(item.isTitle, item.isDestructive, theme.value) };
}, [theme, item]);
const handleOnPress = useCallback(() => {
if (!item.isTitle) {
const params = menuProps.value.actionParams[item.text] || [];
if (item.onPress) item.onPress(...params);
state.value = CONTEXT_MENU_STATE.END;
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [state, item]);
return (
<>
{item.text}
{!item.isTitle &&
item.icon &&
(AnimatedIcon && typeof item.icon === 'string' ? (
) : typeof item.icon === 'function' ? (
item.icon()
) : null)}
{item.withSeparator && }
>
);
};
const MenuItem = React.memo(MenuItemComponent, isEqual);
export default MenuItem;