Files
teach_sys_Demo/src/pages/CompanyJobsPage/index.jsx

187 lines
6.7 KiB
React
Raw Normal View History

2025-08-20 18:05:50 +08:00
import { useState } from "react";
import { useSelector } from "react-redux";
2025-08-15 16:16:41 +08:00
import { useNavigate } from "react-router-dom";
2025-08-19 22:35:01 +08:00
import { mapJobList, mapInterviewList } from "@/utils/dataMapper";
2025-08-15 16:16:41 +08:00
import JobList from "./components/JobList";
import { getJobsList, getInterviewsList } from "@/services";
2025-08-20 18:05:50 +08:00
import InfiniteScroll from "@/components/InfiniteScroll";
2025-08-15 16:16:41 +08:00
import "./index.css";
2025-08-20 18:05:50 +08:00
const PAGE_SIZE = 10;
2025-08-15 16:16:41 +08:00
const CompanyJobsPage = () => {
const studentInfo = useSelector((state) => state.student.studentInfo);
2025-08-20 18:05:50 +08:00
const [isExpand, setIsExpand] = useState(false); // 是否展开
2025-08-19 22:35:01 +08:00
const [jobs, setJobs] = useState([]);
2025-08-20 18:05:50 +08:00
const [jobsListPage, setJobsListPage] = useState(1);
const [joblistHasMore, setJobsListHasMore] = useState(true);
2025-08-19 22:35:01 +08:00
const [interviews, setInterviews] = useState([]);
2025-08-20 18:05:50 +08:00
const [interviewsPage, setInterviewsPage] = useState(1);
const [interviewsHasMore, setInterviewsHasMore] = useState(true);
2025-08-15 16:16:41 +08:00
const navigate = useNavigate();
2025-08-20 18:05:50 +08:00
// 获取面试信息
const fetchInterviewsData = async () => {
2025-08-19 22:35:01 +08:00
try {
if (studentInfo?.id) {
2025-08-20 18:05:50 +08:00
const res = await getInterviewsList({
page: interviewsPage,
pageSize: PAGE_SIZE,
studentId: studentInfo?.id,
2025-08-20 18:05:50 +08:00
status: "SCHEDULED",
});
if (res.success) {
const mappedInterviews = mapInterviewList(res.data || []);
setInterviews((prevList) => {
const newList = [...prevList, ...mappedInterviews];
if (res.total === newList?.length) {
setInterviewsHasMore(false);
} else {
setInterviewsPage((prevPage) => prevPage + 1);
}
return newList;
2025-08-19 22:35:01 +08:00
});
}
}
} catch (error) {
2025-08-20 18:05:50 +08:00
console.error("Failed to fetch data:", error);
setInterviews([]);
}
};
2025-08-20 18:05:50 +08:00
// 获取企业内推岗位
const fetchJobsList = async () => {
try {
const res = await getJobsList({
page: jobsListPage,
pageSize: PAGE_SIZE,
isActive: true,
});
if (res?.success) {
2025-08-20 18:05:50 +08:00
const mappedJobs = mapJobList(res.data);
setJobs((prevList) => {
const newList = [...prevList, ...mappedJobs];
if (res.total === newList?.length) {
setJobsListHasMore(false);
} else {
setJobsListPage((prevPage) => prevPage + 1);
}
return newList;
});
}
} catch (error) {
2025-08-19 22:35:01 +08:00
console.error("Failed to fetch data:", error);
setJobs([]);
}
};
2025-08-15 16:16:41 +08:00
const handleJobWrapperClick = () => {
navigate("/company-jobs-list");
};
return (
<div className="company-jobs-page-wrapper">
<div className="company-jobs-page">
<div className="company-jobs-page-left" onClick={handleJobWrapperClick}>
<p className="company-jobs-page-title">企业内推岗位库</p>
2025-08-20 18:05:50 +08:00
<InfiniteScroll
loadMore={fetchJobsList}
hasMore={joblistHasMore}
className="company-jobs-page-left-list-wrapper"
>
2025-08-20 10:40:22 +08:00
<JobList data={jobs} backgroundColor="#F7F8FA" />
2025-08-20 18:05:50 +08:00
</InfiniteScroll>
2025-08-15 16:16:41 +08:00
</div>
<div className="company-jobs-page-interview-wrapper">
<div
className={`${
isExpand
? "company-jobs-page-interview"
: "company-jobs-page-interview company-jobs-page-interview-expand"
}`}
>
<p className="company-jobs-page-title">内推岗位面试</p>
2025-08-20 18:05:50 +08:00
<InfiniteScroll
loadMore={fetchInterviewsData}
hasMore={interviewsHasMore}
className="company-jobs-page-interview-list"
>
{interviews.map((item) => (
<li className="company-jobs-page-interview-item" key={item.id}>
<div className="company-jobs-page-interview-item-info">
<p className="company-jobs-page-interview-item-info-position">
{item.position}
</p>
{item.job?.tags?.length > 0 ? (
<ul className="company-jobs-page-interview-item-info-tags">
{item.job.tags.map((tag) => (
<li
className="company-jobs-page-interview-item-info-tag"
key={tag}
>
{tag}
</li>
))}
</ul>
) : null}
<span className="company-jobs-page-interview-item-info-salary">
{item.job?.salary || "面议"}
</span>
</div>
<div className="company-jobs-page-interview-item-btn-wrapper">
<span>{item.interviewTime}</span>
<div
className={`company-jobs-page-interview-item-btn ${
item.status !== "COMPLETED" &&
"company-jobs-page-interview-item-btn-active"
}`}
>
{item.statusText}
2025-08-20 10:40:22 +08:00
</div>
2025-08-20 18:05:50 +08:00
</div>
2025-08-19 22:35:01 +08:00
</li>
2025-08-20 18:05:50 +08:00
))}
</InfiniteScroll>
2025-08-15 16:16:41 +08:00
</div>
</div>
<div
className={
isExpand
? "company-jobs-page-process-wrapper-expand"
: "company-jobs-page-process-wrapper-close"
}
>
<div
className="company-jobs-page-process-wrapper-title"
onClick={() => setIsExpand(!isExpand)}
>
岗位陪跑流程
</div>
<div className="company-jobs-page-process-content">
<div className="company-jobs-page-process-item-icon icon1">
<p>内推岗位简历投递</p>
</div>
<div className="company-jobs-page-process-item-round-dot icon2" />
<div className="company-jobs-page-process-item-icon icon3">
<p>岗位简历接收</p>
</div>
<div className="company-jobs-page-process-item-icon icon4">
<p>面试时间地点确定</p>
</div>
<div className="company-jobs-page-process-item-icon icon5">
<p>参与企业面试</p>
</div>
<div className="company-jobs-page-process-item-round-dot icon6" />
<div className="company-jobs-page-process-item-icon icon7">
<p>企业offer发送</p>
</div>
</div>
</div>
</div>
</div>
);
};
export default CompanyJobsPage;