- 限制班级排名详情页只展示前10名学员 - 替换面试状态数据为文旅产业15个岗位数据 - 将面试状态展开动画从静态图片改为Lottie动画 - 添加5个面试状态的Lottie动画文件 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
122 lines
4.4 KiB
JavaScript
122 lines
4.4 KiB
JavaScript
import React, { useState, useEffect, useRef } from 'react';
|
||
import lottie from 'lottie-web';
|
||
import './index.css';
|
||
|
||
// 状态到lottie动画文件的映射
|
||
const statusLottieMap = {
|
||
'Offer已拒绝,岗位内推结束': '/lottie/interview-status/4-off_拒绝Offer.json',
|
||
'Offer已接收,岗位内推结束': '/lottie/interview-status/4-on_收到Offer.json',
|
||
'Offer已接受,岗位内推结束': '/lottie/interview-status/4-on_收到Offer.json',
|
||
'已收到Offer,请于2天内答复': '/lottie/interview-status/4-on_收到Offer.json',
|
||
'面试日期已确定,等待面试': '/lottie/interview-status/4-on_收到Offer.json',
|
||
'简历未通过,岗位内推结束': '/lottie/interview-status/1-off_初筛未通过.json',
|
||
'未参与面试,岗位内推结束': '/lottie/interview-status/3-off_未参与面试.json',
|
||
'面试未通过,岗位内推结束': '/lottie/interview-status/2-off_面试未通过.json',
|
||
// 兼容其他可能的状态文本
|
||
'岗位内推结束': '/lottie/interview-status/1-off_初筛未通过.json', // 默认动画
|
||
};
|
||
|
||
export default ({ statusText, isOpen, stageDate }) => {
|
||
const [isVisible, setIsVisible] = useState(false);
|
||
const [animationClass, setAnimationClass] = useState('');
|
||
const lottieContainer = useRef(null);
|
||
const lottieInstance = useRef(null);
|
||
|
||
useEffect(() => {
|
||
if (isOpen) {
|
||
setIsVisible(true);
|
||
setAnimationClass('expanding');
|
||
} else if (isVisible) {
|
||
setAnimationClass('collapsing');
|
||
const timer = setTimeout(() => {
|
||
setIsVisible(false);
|
||
setAnimationClass('');
|
||
}, 300); // 等待收起动画完成
|
||
return () => clearTimeout(timer);
|
||
}
|
||
}, [isOpen, isVisible]);
|
||
|
||
// 获取对应的lottie动画路径
|
||
const getLottiePath = (status, stageDate) => {
|
||
// 首先尝试精确匹配
|
||
if (statusLottieMap[status]) {
|
||
return statusLottieMap[status];
|
||
}
|
||
|
||
// 如果精确匹配失败,尝试模糊匹配
|
||
if (status && status.includes('简历未通过')) {
|
||
return statusLottieMap['简历未通过,岗位内推结束'];
|
||
}
|
||
if (status && status.includes('未参与面试')) {
|
||
return statusLottieMap['未参与面试,岗位内推结束'];
|
||
}
|
||
if (status && status.includes('面试未通过')) {
|
||
return statusLottieMap['面试未通过,岗位内推结束'];
|
||
}
|
||
if (status && status.includes('Offer已拒绝')) {
|
||
return statusLottieMap['Offer已拒绝,岗位内推结束'];
|
||
}
|
||
if (status && (status.includes('Offer已接受') || status.includes('Offer已接收'))) {
|
||
return statusLottieMap['Offer已接收,岗位内推结束'];
|
||
}
|
||
if (status && status.includes('面试日期已确定')) {
|
||
return statusLottieMap['面试日期已确定,等待面试'];
|
||
}
|
||
if (status && status.includes('已收到Offer')) {
|
||
return statusLottieMap['已收到Offer,请于2天内答复'];
|
||
}
|
||
|
||
// 对于通用的"岗位内推结束"状态,根据阶段日期判断具体原因
|
||
if (status === '岗位内推结束' && stageDate) {
|
||
if (stageDate.includes('简历未通过')) {
|
||
return statusLottieMap['简历未通过,岗位内推结束'];
|
||
}
|
||
if (stageDate.includes('未参与面试')) {
|
||
return statusLottieMap['未参与面试,岗位内推结束'];
|
||
}
|
||
if (stageDate.includes('面试未通过')) {
|
||
return statusLottieMap['面试未通过,岗位内推结束'];
|
||
}
|
||
}
|
||
|
||
// 默认返回通用动画
|
||
return statusLottieMap['岗位内推结束'];
|
||
};
|
||
|
||
// 加载lottie动画
|
||
useEffect(() => {
|
||
if (isVisible && lottieContainer.current) {
|
||
// 清理之前的动画实例
|
||
if (lottieInstance.current) {
|
||
lottieInstance.current.destroy();
|
||
}
|
||
|
||
const lottiePath = getLottiePath(statusText, stageDate);
|
||
|
||
// 加载新的lottie动画
|
||
lottieInstance.current = lottie.loadAnimation({
|
||
container: lottieContainer.current,
|
||
renderer: 'svg',
|
||
loop: true,
|
||
autoplay: true,
|
||
path: lottiePath
|
||
});
|
||
}
|
||
|
||
// 清理函数
|
||
return () => {
|
||
if (lottieInstance.current) {
|
||
lottieInstance.current.destroy();
|
||
lottieInstance.current = null;
|
||
}
|
||
};
|
||
}, [isVisible, statusText, stageDate]);
|
||
|
||
if (!isVisible) return null;
|
||
|
||
return (
|
||
<div className={`interview-status-animation-wrapper ${animationClass}`}>
|
||
<div className="lottie-container" ref={lottieContainer} />
|
||
</div>
|
||
);
|
||
}; |