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} ))} ); };