/** * 关联描述组件 * * 用于显示股票与事件的关联描述信息 * 固定标题为"关联描述:" * 自动处理多种数据格式(字符串、对象数组) * * @example * ```tsx * // 基础使用 - 传入原始 relation_desc 数据 * * * // 自定义样式 * * ``` */ import React, { useMemo } from 'react'; import { Box, Text, BoxProps } from '@chakra-ui/react'; /** * 关联描述数据类型 * - 字符串格式:直接的描述文本 * - 对象格式:包含多个句子的数组 */ export type RelationDescType = | string | { data: Array<{ query_part?: string; sentences?: string; }>; } | null | undefined; export interface RelationDescriptionProps { /** 原始关联描述数据(支持字符串或对象格式) */ relationDesc: RelationDescType; /** 字体大小,默认 'sm' */ fontSize?: string; /** 标题颜色,默认 'gray.700' */ titleColor?: string; /** 文本颜色,默认 'gray.600' */ textColor?: string; /** 行高,默认 '1.7' */ lineHeight?: string; /** 容器额外属性 */ containerProps?: BoxProps; } export const RelationDescription: React.FC = ({ relationDesc, fontSize = 'sm', titleColor = 'gray.700', textColor = 'gray.600', lineHeight = '1.7', containerProps = {} }) => { // 处理关联描述(兼容对象和字符串格式) const processedDesc = useMemo(() => { if (!relationDesc) return null; // 字符串格式:直接返回 if (typeof relationDesc === 'string') { return relationDesc; } // 对象格式:提取并拼接文本 if (typeof relationDesc === 'object' && relationDesc.data && Array.isArray(relationDesc.data)) { return ( relationDesc.data .map((item) => item.query_part || item.sentences || '') .filter((s) => s) .join(';') || null ); } return null; }, [relationDesc]); // 如果没有有效的描述内容,不渲染组件 if (!processedDesc) { return null; } return ( 关联描述: {processedDesc} ); };