import { useLocale } from '../Locale/locale';
import React, {
ForwardRefRenderFunction,
Fragment,
isValidElement,
useEffect,
useRef,
} from 'react';
import {
View,
Animated,
TouchableOpacity,
UIManager,
Platform,
} from 'react-native';
import { renderTextLikeJSX } from '../../core/helpers';
import { RNCollapseItemProps } from './interface';
import createStyle from './style';
import { IconXLowersmall1, IconXCopy1 } from '../../icons';
import ShouldRender from '../ShouldRender';
import { useTheme } from '../Theme/Theme';
if (
Platform.OS === 'android' &&
UIManager.setLayoutAnimationEnabledExperimental
) {
UIManager.setLayoutAnimationEnabledExperimental(true);
}
export const CollapseItem: ForwardRefRenderFunction<
unknown,
RNCollapseItemProps
> = (props) => {
const {
style,
headerStyle,
contentStyle,
expanded,
onExpand,
arrow,
name,
onClick,
icon = false,
iconStyle,
title,
titleStyle,
description,
children,
arrowStyle,
disabled,
arrowPlaceDown,
hideArrowTip,
expandArrowTip,
collapseArrowTip,
arrowTipStyle,
hideArrow,
noBorder,
permanentNode,
} = props;
const locale = useLocale().Collapse;
const token = useTheme();
const collapseItemStyle = createStyle(token);
const arrowAnim = useRef(new Animated.Value(0)).current;
const onItemExpand = () => {
Animated.parallel([
Animated.timing(arrowAnim, {
toValue: 1,
duration: 300,
useNativeDriver: true,
}),
]).start();
};
const onItemClose = () => {
Animated.parallel([
Animated.timing(arrowAnim, {
toValue: 0,
duration: 300,
useNativeDriver: true,
}),
]).start();
};
const onPress = () => {
if (disabled) {
return;
}
onExpand && onExpand();
if (expanded) {
return onItemClose();
}
return onItemExpand();
};
const borderStyle = arrowPlaceDown
? collapseItemStyle.collapseItemHeaderBorderTop
: collapseItemStyle.collapseItemHeaderBorderBottom;
const headerBorder = noBorder ? null : borderStyle;
const renderTitle = () => {
return (
{icon === true ? (
) : (
icon
)}
{renderTextLikeJSX(
title,
[
collapseItemStyle.collapseTitle,
disabled && collapseItemStyle.collapseItemDisabled,
],
{
numberOfLines: 2,
onPress: onClick,
}
)}
{renderTextLikeJSX(
description,
[
collapseItemStyle.collapseDescription,
disabled && collapseItemStyle.collapseItemDisabled,
],
{
numberOfLines: 2,
}
)}
{renderTextLikeJSX(
expanded
? collapseArrowTip || locale.collapse
: expandArrowTip || locale.expand,
[
collapseArrowTip || expandArrowTip
? { color: token['--color-primary-6'] }
: { color: token['--color-text-4'] },
disabled
? collapseItemStyle.collapseItemDisabled
: collapseItemStyle.collapseItemHeaderArrowText,
arrowTipStyle,
]
)}
{isValidElement(arrow) ? (
arrow
) : (
)}
);
};
const renderContent = () => {
return (
{children}
);
};
useEffect(() => {
// 修复初始展开时箭头方向不对的问题
if (expanded) {
onItemExpand();
} else {
onItemClose();
}
}, [expanded]);
const header = renderTitle();
const content = expanded ? renderContent() : null;
const renderList = arrowPlaceDown
? [permanentNode, content, header]
: [header, permanentNode, content];
return (
{renderList.map((node, key) => (
{node}
))}
);
};