feat: 为岗位面试状态添加可点击下拉栏功能

- 创建InterviewStatusDropdown组件,显示面试状态动画
- 集成Lottie动画播放器,加载对应状态的动画文件
- 点击面试状态按钮后弹出下拉栏,展示动画和状态说明
- 添加11种不同面试状态的动画映射和描述文字
- 下拉栏支持点击遮罩层关闭

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
KQL
2025-09-08 05:24:00 +08:00
parent 14c33d0ffd
commit 321da26eb2
14 changed files with 236 additions and 0 deletions

View File

@@ -6,6 +6,7 @@ import { Spin, Empty } from "@arco-design/web-react";
import InfiniteScroll from "@/components/InfiniteScroll";
import toast from "@/components/Toast";
import JobList from "./components/JobList";
import InterviewStatusDropdown from "./components/InterviewStatusDropdown";
import {
getCompanyJobsPageData,
getJobsList,
@@ -25,6 +26,9 @@ const CompanyJobsPage = () => {
const [interviewsHasMore, setInterviewsHasMore] = useState(true);
const [initialDataLoaded, setInitialDataLoaded] = useState(false);
const [loading, setLoading] = useState(true);
const [dropdownOpen, setDropdownOpen] = useState(false);
const [selectedInterview, setSelectedInterview] = useState(null);
const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0 });
const navigate = useNavigate();
// 初始化页面数据 - 使用聚合接口
@@ -120,6 +124,24 @@ const CompanyJobsPage = () => {
}
};
// 处理面试状态点击
const handleStatusClick = (e, item) => {
e.stopPropagation();
const rect = e.currentTarget.getBoundingClientRect();
setDropdownPosition({
top: rect.bottom + 5,
left: rect.left
});
setSelectedInterview(item);
setDropdownOpen(true);
};
// 关闭下拉栏
const handleCloseDropdown = () => {
setDropdownOpen(false);
setSelectedInterview(null);
};
// 获取企业内推岗位 - 用于分页加载更多
const fetchJobsList = async () => {
// 如果初始数据还没加载完成,或者是第一页且已有初始数据,则跳过
@@ -262,6 +284,8 @@ const CompanyJobsPage = () => {
item.status !== "COMPLETED" &&
"company-jobs-page-interview-item-btn-active"
}`}
onClick={(e) => handleStatusClick(e, item)}
style={{ cursor: 'pointer' }}
>
{item.statusText}
</div>
@@ -274,6 +298,14 @@ const CompanyJobsPage = () => {
</>
)}
</div>
{/* 面试状态下拉栏 */}
<InterviewStatusDropdown
status={selectedInterview?.status}
statusText={selectedInterview?.statusText}
isOpen={dropdownOpen}
onClose={handleCloseDropdown}
position={dropdownPosition}
/>
</div>
);
};