Commit 2: CollapsibleSection 支持精简/详细双模式

This commit is contained in:
zdl
2025-11-07 19:32:10 +08:00
parent 63fb8a3aa8
commit 11789b5ec7

View File

@@ -1,7 +1,7 @@
// src/views/Community/components/DynamicNewsDetail/CollapsibleSection.js // src/views/Community/components/DynamicNewsDetail/CollapsibleSection.js
// 通用可折叠区块组件 // 通用可折叠区块组件
import React from 'react'; import React, { useState } from 'react';
import { import {
Box, Box,
Collapse, Collapse,
@@ -19,7 +19,10 @@ import CollapsibleHeader from './CollapsibleHeader';
* @param {React.ReactNode} props.subscriptionBadge - 可选的会员标签组件 * @param {React.ReactNode} props.subscriptionBadge - 可选的会员标签组件
* @param {boolean} props.isLocked - 是否锁定(不可展开) * @param {boolean} props.isLocked - 是否锁定(不可展开)
* @param {Function} props.onLockedClick - 锁定时点击的回调 * @param {Function} props.onLockedClick - 锁定时点击的回调
* @param {React.ReactNode} props.children - 内容 * @param {React.ReactNode} props.children - 详细内容
* @param {React.ReactNode} props.simpleContent - 精简模式的内容(可选)
* @param {boolean} props.showModeToggle - 是否显示模式切换按钮(默认 false
* @param {string} props.defaultMode - 默认模式:'detailed' | 'simple'(默认 'detailed'
*/ */
const CollapsibleSection = ({ const CollapsibleSection = ({
title, title,
@@ -29,10 +32,16 @@ const CollapsibleSection = ({
subscriptionBadge = null, subscriptionBadge = null,
isLocked = false, isLocked = false,
onLockedClick = null, onLockedClick = null,
children children,
simpleContent = null,
showModeToggle = false,
defaultMode = 'detailed'
}) => { }) => {
const sectionBg = useColorModeValue('gray.50', 'gray.750'); const sectionBg = useColorModeValue('gray.50', 'gray.750');
// 模式状态:'detailed' | 'simple'
const [displayMode, setDisplayMode] = useState(defaultMode);
// 处理点击:如果锁定则触发锁定回调,否则触发正常切换 // 处理点击:如果锁定则触发锁定回调,否则触发正常切换
const handleToggle = () => { const handleToggle = () => {
if (isLocked && onLockedClick) { if (isLocked && onLockedClick) {
@@ -42,15 +51,43 @@ const CollapsibleSection = ({
} }
}; };
return ( // 处理模式切换
<Box> const handleModeToggle = (e) => {
<CollapsibleHeader e.stopPropagation(); // 阻止冒泡到标题栏的 onToggle
title={title}
isOpen={isOpen} if (isLocked && onLockedClick) {
onToggle={handleToggle} // 如果被锁定,触发付费弹窗
count={count} onLockedClick();
subscriptionBadge={subscriptionBadge} return;
/> }
if (displayMode === 'detailed') {
// 从详细模式切换到精简模式
setDisplayMode('simple');
} else {
// 从精简模式切换回详细模式
setDisplayMode('detailed');
// 切换回详细模式时,如果未展开则自动展开
if (!isOpen && onToggle) {
onToggle();
}
}
};
// 渲染精简模式
const renderSimpleMode = () => {
if (!simpleContent) return null;
return (
<Box mt={2} bg={sectionBg} p={3} borderRadius="md">
{simpleContent}
</Box>
);
};
// 渲染详细模式
const renderDetailedMode = () => {
return (
<Collapse <Collapse
in={isOpen && !isLocked} in={isOpen && !isLocked}
animateOpacity animateOpacity
@@ -61,6 +98,25 @@ const CollapsibleSection = ({
{children} {children}
</Box> </Box>
</Collapse> </Collapse>
);
};
return (
<Box>
<CollapsibleHeader
title={title}
isOpen={isOpen}
onToggle={handleToggle}
count={count}
subscriptionBadge={subscriptionBadge}
showModeToggle={showModeToggle}
currentMode={displayMode}
onModeToggle={handleModeToggle}
isLocked={isLocked}
/>
{/* 根据当前模式渲染对应内容 */}
{displayMode === 'simple' ? renderSimpleMode() : renderDetailedMode()}
</Box> </Box>
); );
}; };