feat: 🎸 安装了全局骨架屏
This commit is contained in:
@@ -4,6 +4,13 @@
|
|||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background-color: #f2f3f5;
|
background-color: #f2f3f5;
|
||||||
|
|
||||||
|
.app-layout-skeleton {
|
||||||
|
flex: 1;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 100px;
|
||||||
|
background-color: aqua;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* 主内容区域 */
|
/* 主内容区域 */
|
||||||
.main-content {
|
.main-content {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useState, useEffect } from "react";
|
import { useState, useEffect } from "react";
|
||||||
|
import { Skeleton } from "@arco-design/web-react";
|
||||||
import Sidebar from "../Sidebar";
|
import Sidebar from "../Sidebar";
|
||||||
import "./index.css";
|
import "./index.css";
|
||||||
|
|
||||||
@@ -8,7 +9,9 @@ const Layout = ({ children }) => {
|
|||||||
return (
|
return (
|
||||||
<div className="app-layout">
|
<div className="app-layout">
|
||||||
<Sidebar isCollapsed={isCollapsed} setIsCollapsed={setIsCollapsed} />
|
<Sidebar isCollapsed={isCollapsed} setIsCollapsed={setIsCollapsed} />
|
||||||
<main className="main-content">{children}</main>
|
<Skeleton loading={false} animation className="app-layout-skeleton">
|
||||||
|
<main className="main-content">{children}</main>
|
||||||
|
</Skeleton>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -21,39 +21,41 @@ const CompanyJobsPage = () => {
|
|||||||
const fetchData = async () => {
|
const fetchData = async () => {
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
|
||||||
// Get current user's student ID from API
|
// Get current user's student ID from API
|
||||||
let studentId = null;
|
let studentId = null;
|
||||||
try {
|
try {
|
||||||
const currentStudent = await studentAPI.getCurrentStudent();
|
const currentStudent = await studentAPI.getCurrentStudent();
|
||||||
studentId = currentStudent?.id;
|
studentId = currentStudent?.id;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log('Could not get current student:', err);
|
console.log("Could not get current student:", err);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch jobs (and interviews if we have a student ID)
|
// Fetch jobs (and interviews if we have a student ID)
|
||||||
const jobsData = await jobAPI.getList({
|
const jobsData = await jobAPI.getList({
|
||||||
page: 1,
|
page: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
isActive: true
|
isActive: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
let interviewsData = { data: [] };
|
let interviewsData = { data: [] };
|
||||||
if (studentId) {
|
if (studentId) {
|
||||||
try {
|
try {
|
||||||
interviewsData = await interviewAPI.getList({
|
interviewsData = await interviewAPI.getList({
|
||||||
studentId: studentId,
|
studentId: studentId,
|
||||||
status: 'SCHEDULED'
|
status: "SCHEDULED",
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log('No interviews found or API error');
|
console.log("No interviews found or API error");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map data to frontend format
|
// Map data to frontend format
|
||||||
const mappedJobs = mapJobList(jobsData.data || jobsData);
|
const mappedJobs = mapJobList(jobsData.data || jobsData);
|
||||||
const mappedInterviews = mapInterviewList(interviewsData.data || interviewsData);
|
const mappedInterviews = mapInterviewList(
|
||||||
|
interviewsData.data || interviewsData
|
||||||
|
);
|
||||||
|
|
||||||
setJobs(mappedJobs);
|
setJobs(mappedJobs);
|
||||||
setInterviews(mappedInterviews);
|
setInterviews(mappedInterviews);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -73,7 +75,10 @@ const CompanyJobsPage = () => {
|
|||||||
if (loading) {
|
if (loading) {
|
||||||
return (
|
return (
|
||||||
<div className="company-jobs-page-wrapper">
|
<div className="company-jobs-page-wrapper">
|
||||||
<div className="company-jobs-page" style={{ justifyContent: 'center', alignItems: 'center' }}>
|
<div
|
||||||
|
className="company-jobs-page"
|
||||||
|
style={{ justifyContent: "center", alignItems: "center" }}
|
||||||
|
>
|
||||||
<p>加载中...</p>
|
<p>加载中...</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -86,10 +91,7 @@ const CompanyJobsPage = () => {
|
|||||||
<div className="company-jobs-page-left" onClick={handleJobWrapperClick}>
|
<div className="company-jobs-page-left" onClick={handleJobWrapperClick}>
|
||||||
<p className="company-jobs-page-title">企业内推岗位库</p>
|
<p className="company-jobs-page-title">企业内推岗位库</p>
|
||||||
<div className="company-jobs-page-left-list-wrapper">
|
<div className="company-jobs-page-left-list-wrapper">
|
||||||
<JobList
|
<JobList data={jobs} backgroundColor="#F7F8FA" />
|
||||||
data={jobs}
|
|
||||||
backgroundColor="#F7F8FA"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="company-jobs-page-interview-wrapper">
|
<div className="company-jobs-page-interview-wrapper">
|
||||||
@@ -102,43 +104,54 @@ const CompanyJobsPage = () => {
|
|||||||
>
|
>
|
||||||
<p className="company-jobs-page-title">内推岗位面试</p>
|
<p className="company-jobs-page-title">内推岗位面试</p>
|
||||||
<ul className="company-jobs-page-interview-list">
|
<ul className="company-jobs-page-interview-list">
|
||||||
{interviews.length > 0 ? interviews.map((item) => (
|
{interviews.length > 0 ? (
|
||||||
<li className="company-jobs-page-interview-item" key={item.id}>
|
interviews.map((item) => (
|
||||||
<div className="company-jobs-page-interview-item-info">
|
<li
|
||||||
<p className="company-jobs-page-interview-item-info-position">
|
className="company-jobs-page-interview-item"
|
||||||
{item.position}
|
key={item.id}
|
||||||
</p>
|
>
|
||||||
{item.job?.tags?.length > 0 ? (
|
<div className="company-jobs-page-interview-item-info">
|
||||||
<ul className="company-jobs-page-interview-item-info-tags">
|
<p className="company-jobs-page-interview-item-info-position">
|
||||||
{item.job.tags.map((tag) => (
|
{item.position}
|
||||||
<li
|
</p>
|
||||||
className="company-jobs-page-interview-item-info-tag"
|
{item.job?.tags?.length > 0 ? (
|
||||||
key={tag}
|
<ul className="company-jobs-page-interview-item-info-tags">
|
||||||
>
|
{item.job.tags.map((tag) => (
|
||||||
{tag}
|
<li
|
||||||
</li>
|
className="company-jobs-page-interview-item-info-tag"
|
||||||
))}
|
key={tag}
|
||||||
</ul>
|
>
|
||||||
) : null}
|
{tag}
|
||||||
<span className="company-jobs-page-interview-item-info-salary">
|
</li>
|
||||||
{item.job?.salary || '面议'}
|
))}
|
||||||
</span>
|
</ul>
|
||||||
</div>
|
) : null}
|
||||||
<div className="company-jobs-page-interview-item-btn-wrapper">
|
<span className="company-jobs-page-interview-item-info-salary">
|
||||||
<span>{item.interviewTime}</span>
|
{item.job?.salary || "面议"}
|
||||||
<div
|
</span>
|
||||||
className={`company-jobs-page-interview-item-btn ${
|
|
||||||
item.status !== "COMPLETED" &&
|
|
||||||
"company-jobs-page-interview-item-btn-active"
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{item.statusText}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div className="company-jobs-page-interview-item-btn-wrapper">
|
||||||
</li>
|
<span>{item.interviewTime}</span>
|
||||||
)) : (
|
<div
|
||||||
|
className={`company-jobs-page-interview-item-btn ${
|
||||||
|
item.status !== "COMPLETED" &&
|
||||||
|
"company-jobs-page-interview-item-btn-active"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{item.statusText}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
))
|
||||||
|
) : (
|
||||||
<li className="company-jobs-page-interview-item">
|
<li className="company-jobs-page-interview-item">
|
||||||
<p style={{ color: '#999', textAlign: 'center', width: '100%' }}>
|
<p
|
||||||
|
style={{
|
||||||
|
color: "#999",
|
||||||
|
textAlign: "center",
|
||||||
|
width: "100%",
|
||||||
|
}}
|
||||||
|
>
|
||||||
暂无面试安排
|
暂无面试安排
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
Reference in New Issue
Block a user