// src/views/Company/components/CompanyOverview/NewsEventsTab.js
// 新闻动态 Tab - 相关新闻事件列表 + 分页
import React from "react";
import {
Box,
VStack,
HStack,
Text,
Badge,
Icon,
Card,
CardBody,
Button,
Input,
InputGroup,
InputLeftElement,
Tag,
Center,
Spinner,
} from "@chakra-ui/react";
import { SearchIcon } from "@chakra-ui/icons";
import {
FaNewspaper,
FaBullhorn,
FaGavel,
FaFlask,
FaDollarSign,
FaShieldAlt,
FaFileAlt,
FaIndustry,
FaEye,
FaFire,
FaChartLine,
FaChevronLeft,
FaChevronRight,
} from "react-icons/fa";
/**
* 新闻动态 Tab 组件
*
* Props:
* - newsEvents: 新闻事件列表数组
* - newsLoading: 加载状态
* - newsPagination: 分页信息 { page, per_page, total, pages, has_next, has_prev }
* - searchQuery: 搜索关键词
* - onSearchChange: 搜索输入回调 (value) => void
* - onSearch: 搜索提交回调 () => void
* - onPageChange: 分页回调 (page) => void
* - cardBg: 卡片背景色
*/
const NewsEventsTab = ({
newsEvents = [],
newsLoading = false,
newsPagination = {
page: 1,
per_page: 10,
total: 0,
pages: 0,
has_next: false,
has_prev: false,
},
searchQuery = "",
onSearchChange,
onSearch,
onPageChange,
cardBg,
}) => {
// 事件类型图标映射
const getEventTypeIcon = (eventType) => {
const iconMap = {
企业公告: FaBullhorn,
政策: FaGavel,
技术突破: FaFlask,
企业融资: FaDollarSign,
政策监管: FaShieldAlt,
政策动态: FaFileAlt,
行业事件: FaIndustry,
};
return iconMap[eventType] || FaNewspaper;
};
// 重要性颜色映射
const getImportanceColor = (importance) => {
const colorMap = {
S: "red",
A: "orange",
B: "yellow",
C: "green",
};
return colorMap[importance] || "gray";
};
// 处理搜索输入
const handleInputChange = (e) => {
onSearchChange?.(e.target.value);
};
// 处理搜索提交
const handleSearchSubmit = () => {
onSearch?.();
};
// 处理键盘事件
const handleKeyPress = (e) => {
if (e.key === "Enter") {
handleSearchSubmit();
}
};
// 处理分页
const handlePageChange = (page) => {
onPageChange?.(page);
// 滚动到列表顶部
document
.getElementById("news-list-top")
?.scrollIntoView({ behavior: "smooth" });
};
// 渲染分页按钮
const renderPaginationButtons = () => {
const { page: currentPage, pages: totalPages } = newsPagination;
const pageButtons = [];
// 显示当前页及前后各2页
let startPage = Math.max(1, currentPage - 2);
let endPage = Math.min(totalPages, currentPage + 2);
// 如果开始页大于1,显示省略号
if (startPage > 1) {
pageButtons.push(
...
);
}
for (let i = startPage; i <= endPage; i++) {
pageButtons.push(
);
}
// 如果结束页小于总页数,显示省略号
if (endPage < totalPages) {
pageButtons.push(
...
);
}
return pageButtons;
};
return (
{/* 搜索框和统计信息 */}
{newsPagination.total > 0 && (
共找到{" "}
{newsPagination.total}
{" "}
条新闻
)}
{/* 新闻列表 */}
{newsLoading ? (
正在加载新闻...
) : newsEvents.length > 0 ? (
<>
{newsEvents.map((event, idx) => {
const importanceColor = getImportanceColor(
event.importance
);
const eventTypeIcon = getEventTypeIcon(event.event_type);
return (
{/* 标题栏 */}
{event.title}
{/* 标签栏 */}
{event.importance && (
{event.importance}级
)}
{event.event_type && (
{event.event_type}
)}
{event.invest_score && (
投资分: {event.invest_score}
)}
{event.keywords && event.keywords.length > 0 && (
<>
{event.keywords
.slice(0, 4)
.map((keyword, kidx) => (
{typeof keyword === "string"
? keyword
: keyword?.concept ||
keyword?.name ||
"未知"}
))}
>
)}
{/* 右侧信息栏 */}
{event.created_at
? new Date(
event.created_at
).toLocaleDateString("zh-CN", {
year: "numeric",
month: "2-digit",
day: "2-digit",
})
: ""}
{event.view_count !== undefined && (
{event.view_count}
)}
{event.hot_score !== undefined && (
{event.hot_score.toFixed(1)}
)}
{event.creator && (
@{event.creator.username}
)}
{/* 描述 */}
{event.description && (
{event.description}
)}
{/* 收益率数据 */}
{(event.related_avg_chg !== null ||
event.related_max_chg !== null ||
event.related_week_chg !== null) && (
相关涨跌:
{event.related_avg_chg !== null &&
event.related_avg_chg !== undefined && (
平均
0
? "red.500"
: "green.500"
}
>
{event.related_avg_chg > 0 ? "+" : ""}
{event.related_avg_chg.toFixed(2)}%
)}
{event.related_max_chg !== null &&
event.related_max_chg !== undefined && (
最大
0
? "red.500"
: "green.500"
}
>
{event.related_max_chg > 0 ? "+" : ""}
{event.related_max_chg.toFixed(2)}%
)}
{event.related_week_chg !== null &&
event.related_week_chg !== undefined && (
周
0
? "red.500"
: "green.500"
}
>
{event.related_week_chg > 0
? "+"
: ""}
{event.related_week_chg.toFixed(2)}%
)}
)}
);
})}
{/* 分页控件 */}
{newsPagination.pages > 1 && (
{/* 分页信息 */}
第 {newsPagination.page} / {newsPagination.pages} 页
{/* 分页按钮 */}
{/* 页码按钮 */}
{renderPaginationButtons()}
)}
>
) : (
暂无相关新闻
{searchQuery ? "尝试修改搜索关键词" : "该公司暂无新闻动态"}
)}
);
};
export default NewsEventsTab;