forgeplus-react/src/forge/Head/Header.js

451 lines
15 KiB
JavaScript
Raw Normal View History

2021-03-23 17:40:23 +08:00
import React, { Component } from 'react';
import AccountProfile from "../../modules/user/AccountProfile";
import { getImageUrl } from 'educoder'
import axios from 'axios';
2021-11-08 13:29:12 +08:00
import cookie from 'react-cookies';
2024-07-18 17:14:55 +08:00
import { notification , Dropdown , Menu , Icon } from 'antd';
2021-07-22 17:44:12 +08:00
import { Link } from 'react-router-dom';
2021-03-23 17:40:23 +08:00
import LoginDialog from '../../modules/login/LoginDialog';
2024-07-18 17:14:55 +08:00
import { getOrzCompanyList } from '../../forge/Information/api';
2021-05-06 17:12:42 +08:00
import AddProjectModal from './AddProjectModal';
2021-03-23 17:40:23 +08:00
import '../../modules/tpm/TPMIndex.css';
2021-09-01 17:46:58 +08:00
import CheckProfile from '../Component/ProfileModal/Profile';
2021-05-06 17:12:42 +08:00
2021-03-23 17:40:23 +08:00
import './header.scss';
// TODO 这部分脚本从公共脚本中直接调用
2024-07-18 17:14:55 +08:00
const { SubMenu } = Menu
2021-03-23 17:40:23 +08:00
window._header_componentHandler = null;
// 非trustie链接则新开页跳转
const str = ['www.trustie.net','forgeplus.trustie.net','forum.trustie.net','testforgeplus.trustie.net']
class NewHeader extends Component {
constructor(props) {
super(props)
this.state = {
Addcoursestypes: false,
tojoinitemtype: false,
tojoinclasstitle: undefined,
rolearr: ["", ""],
Checkboxteacherchecked: false,
Checkboxstudentchecked: false,
Checkboxteachingchecked: false,
Checkboxteachertype: false,
Checkboxteachingtype: false,
code_notice: false,
RadioGroupvalue: undefined,
submitapplications: false,
isRender: false,
showTrial: false,
occupation: 0,
mydisplay: false,
settings: null,
visiblemyss: false,
openSearch:false,
visible:false, //浮动消息框展示控制
2023-06-25 11:00:43 +08:00
showSubMenu: false,
zoneList: [], // 专区列表
2024-07-18 17:14:55 +08:00
companyList:[] //已开通工作台列表
2021-03-23 17:40:23 +08:00
}
}
componentDidMount() {
2022-11-16 11:37:55 +08:00
// 用personal判断是否需要再次请求settings接口解决登录注册之后无设置按钮的情况
let settings = localStorage.chromesetting&&JSON.parse(localStorage.chromesetting);
if(settings){
2022-11-16 11:37:55 +08:00
this.setState({
settings
2022-11-16 11:37:55 +08:00
})
}
2021-03-23 17:40:23 +08:00
window._header_componentHandler = this;
2023-06-25 11:00:43 +08:00
this.getZoneList(settings && settings.common.zone +'/api')
2024-07-18 17:14:55 +08:00
this.getComlist();
2023-06-25 11:00:43 +08:00
2021-03-23 17:40:23 +08:00
try {
window.sessionStorage.setItem("yslgeturls", JSON.stringify(window.location.href))
} catch (e) {}
}
2021-03-23 17:40:23 +08:00
openNotification = (messge) => {
notification.open({
message: "提示",
description:
messge,
});
};
componentWillReceiveProps(newProps, oldProps) {
this.setState({
user: newProps.user
})
2023-06-09 18:49:30 +08:00
// if(!newProps.user ||(newProps.user && !newProps.user.login)){
// cookie.remove("login");
// }
2021-03-23 17:40:23 +08:00
}
educoderlogin = () => {
//登录账号
2021-11-08 13:29:12 +08:00
if(window.location.pathname === "/"){
window.location.href="/login";
}else{
this.setState({
isRender: true
})
}
2021-03-23 17:40:23 +08:00
}
educoderloginysl = () => {
2021-11-08 13:29:12 +08:00
//退出账号时清除登录页面的下次自动登录(用户再次打开登录页面时下次自动登录框不勾选)
cookie.remove("autologin");
cookie.remove("login");
2021-03-23 17:40:23 +08:00
//退出账号
var url = `/accounts/logout.json`;
axios.get((url)).then((result) => {
2023-12-14 10:49:15 +08:00
if (result) {
this.props.history.push("/login");
2021-03-23 17:40:23 +08:00
}
}).catch((error) => {
console.log(error);
})
}
hideAddcoursestypes = () => {
this.setState({
Addcoursestypes: false
})
};
HideAddcoursestypess = (i) => {
this.setState({
Addcoursestypes: false,
mydisplay: true,
occupation: i,
})
};
ModalCancelsy = () => {
this.setState({
mydisplay: false,
})
};
// 关闭
cancelModulationModels = () => {
this.setState({ isRenders: false })
}
//修改登录方法
Modifyloginvalue = () => {
this.setState({
isRender: false,
})
}
hideAccountProfile = () => {
this.setState({
AccountProfiletype: false
})
};
//获取数据为空的时候
gettablogourlnull = () => {
this.setState({
settings: undefined
});
var link = document.createElement('link'),
oldLink = document.getElementById('dynamic-favicon');
link.id = 'dynamic-favicon';
link.rel = 'shortcut icon';
link.href = "/react/build/./favicon.ico";
if (oldLink) {
document.head.removeChild(oldLink);
}
document.head.appendChild(link);
};
//获取数据的时候
gettablogourldata = (response) => {
document.title = response.data.setting.name;
var link = document.createElement('link'),
oldLink = document.getElementById('dynamic-favicon');
link.id = 'dynamic-favicon';
link.rel = 'shortcut icon';
link.href = '/' + response.data.setting.tab_logo_url;
if (oldLink) {
document.head.removeChild(oldLink);
}
document.head.appendChild(link);
}
handleVisibleChanges = (boll) => {
this.setState({
visiblemyss: boll,
})
}
geturlsdata = () => {
let url = "/setting.json";
axios.get(url).then((response) => {
if (response && response.data) {
this.setState({ settings: response.data.setting });
localStorage.setItem('chromesetting', JSON.stringify(response.data.setting));
localStorage.setItem('chromesettingresponse', JSON.stringify(response));
2021-03-23 17:40:23 +08:00
} else {
this.gettablogourlnull();
}
}).catch((error) => {
this.gettablogourlnull();
});
}
2023-06-25 11:00:43 +08:00
getZoneList = (httpUrl) =>{
const url = `${httpUrl}/zone/open/list`
axios.get(url).then((response) => {
if (response && response.data && response.data.data && response.data.data.length > 0) {
let newArray = [];
response.data.data.forEach((e, i) => {
newArray[i] = {
name: e.name,
link: `/zone/${e.key}`
}
});
this.setState({ zoneList: newArray })
} else {
}
}).catch((error) => {
});
}
2021-03-23 17:40:23 +08:00
matchpaths = (url) => {
const { match } = this.props;
2021-12-01 18:04:49 +08:00
const isDev = window.location.port == 3007;
const isdev2= isDev ?'https://testforgeplus.trustie.net':`https://${window.location.hostname}`;
let str = "";
if(url.indexOf("http")>-1){
2022-04-08 16:37:35 +08:00
str = isdev2+match.url;
2021-12-01 18:04:49 +08:00
}else{
str = match.path;
}
2022-05-23 14:36:51 +08:00
if (url && (str === url || (str === url+'/'))) {
2021-12-01 18:04:49 +08:00
return true
}else {
return false
2021-03-23 17:40:23 +08:00
}
}
2023-06-25 11:00:43 +08:00
matchZone = () => {
return window.location.href.includes('/zone/')
}
2021-09-01 11:24:37 +08:00
checkProfile=(url)=>{
const { showCompeleteDialog , completeProfile } = this.props;
2021-09-01 17:46:58 +08:00
if(!completeProfile){
2021-09-01 11:24:37 +08:00
showCompeleteDialog && showCompeleteDialog();
}else{
2021-09-01 17:46:58 +08:00
window.location.href(url);
2021-09-01 11:24:37 +08:00
}
}
2021-03-23 17:40:23 +08:00
addMenu=(list)=>{
return(
list && list.length >0 &&
<div className="dropdownFlex">
<Menu>
{
list.map((item,key)=>{
return(
2021-09-01 10:25:12 +08:00
(item.name !=="加入课堂" && item.name !=="加入开发项目") &&
2021-09-01 17:46:58 +08:00
<Menu.Item key={item.name+key}>
<CheckProfile {...this.props} sureFunc={()=>{window.location.href=item.url}}>{item.name}</CheckProfile>
</Menu.Item>
2021-03-23 17:40:23 +08:00
)
})
}
2021-09-01 17:46:58 +08:00
<Menu.Item>
<AddProjectModal {...this.props} showNotification={this.props.showNotification}/>
</Menu.Item>
2021-03-23 17:40:23 +08:00
</Menu>
</div>
)
}
2021-09-07 09:33:46 +08:00
2021-06-09 11:52:36 +08:00
renderMenu=(personal)=>{
2024-07-18 17:14:55 +08:00
const { mygetHelmetapi } = this.props;
const { companyList } = this.state;
2021-06-09 11:52:36 +08:00
return(
<Menu className="currentMenu">
2023-12-14 10:49:15 +08:00
{/* <Menu.Item>
2021-09-03 14:57:39 +08:00
<span className="currentName" title={current_user && current_user.username}>{current_user && current_user.username}</span>
2023-12-14 10:49:15 +08:00
</Menu.Item> */}
2024-04-03 09:28:44 +08:00
{/* <Menu.Item>
2024-03-28 11:35:31 +08:00
<a href={`/${this.props.current_user && this.props.current_user.login}`}>首页</a>
2024-04-03 09:28:44 +08:00
</Menu.Item> */}
2023-12-14 10:49:15 +08:00
<Menu.Item>
<a href={`/${this.props.current_user && this.props.current_user.login}`}>代码库主页</a>
2021-06-09 11:52:36 +08:00
</Menu.Item>
{
personal && personal.length > 0 && personal.map((item,key)=>{
return(
<li key={key}><a href={item.url} target="_blank">{item.name}</a></li>
)
})
}
2024-07-18 17:14:55 +08:00
<SubMenu title={<span>我的工作台<Icon type="right" /></span>} Icon={null} popupClassName='subMyworkList'>
{
companyList && companyList.length>0 ?
companyList.map((i,k)=>{
return(
<Menu.Item><a href={`${ mygetHelmetapi && mygetHelmetapi.common.zone }/${i.enterpriseIdentifier}`} target='_blank'>{i.enterpriseName}</a></Menu.Item>
)
})
:<Menu.Item>暂无工作台</Menu.Item>
}
</SubMenu>
2023-12-14 10:49:15 +08:00
<Menu.Item><a onClick={() => this.educoderloginysl()}>退出登录</a></Menu.Item>
2021-06-09 11:52:36 +08:00
</Menu>
)
}
2021-03-23 17:40:23 +08:00
handleVisibleChange = visible => {
this.setState({ visible });
};
2024-07-18 17:14:55 +08:00
getComlist=()=>{
getOrzCompanyList().then(res=>{
if(res){
this.setState({
companyList:res.data.rows
})
}
})
}
2021-03-23 17:40:23 +08:00
render() {
const { resetUserInfo ,showNotification,publicNav,mygetHelmetapi} = this.props;
let settings = mygetHelmetapi;
2021-03-23 17:40:23 +08:00
let current_user = this.props.user;
2021-07-22 17:44:12 +08:00
let {
2021-03-23 17:40:23 +08:00
AccountProfiletype,
user,
isRender,
visible,
2023-06-25 11:00:43 +08:00
showSubMenu,
zoneList
2021-03-23 17:40:23 +08:00
} = this.state;
2021-09-03 17:14:45 +08:00
let search_url = settings && settings.common && settings.common.search;
2021-03-23 17:40:23 +08:00
return (
2021-10-29 14:18:30 +08:00
<div className={publicNav ? `newHeaders publicNav`:`newHeaders`} id="nHeader">
2021-03-23 17:40:23 +08:00
<div className="headerContent">
{isRender === true ?
<LoginDialog
{...this.props}
{...this.state}
Modifyloginvalue={() => this.Modifyloginvalue()}
/> : ""}
{AccountProfiletype === true ?
<AccountProfile
hideAccountProfile={() => this.hideAccountProfile()}
{...this.props}
{...this.state}
/> : ""}
{/* {
2021-03-23 17:40:23 +08:00
settings && settings.nav_logo_url ?
2023-06-21 14:18:09 +08:00
<a href={settings && settings.new_course.default_url} className={"fl mr30"}>
2021-11-11 16:35:37 +08:00
<img alt="可控开源社区" className="logoimg" src={getImageUrl(`/${settings.nav_logo_url}`)}></img>
</a>
2021-03-23 17:40:23 +08:00
:
""
} */}
2024-07-18 17:14:55 +08:00
{/*{
2021-03-23 17:40:23 +08:00
settings && settings.navbar && settings.navbar.length > 0 ?
2023-06-25 14:49:27 +08:00
<ul id="header-nav" className="head-nav pr">
2024-07-18 17:14:55 +08:00
{
2021-03-23 17:40:23 +08:00
settings.navbar && settings.navbar.map((item, key) => {
var new_link = item.link;
2022-01-05 11:48:31 +08:00
var is_hidden = item.hidden;
2021-03-23 17:40:23 +08:00
var waiLian = (new_link && str.filter(item=>new_link.indexOf(item)>-1) );
var wl = waiLian && waiLian.length>0;
2023-09-28 14:06:34 +08:00
if (item.name === '特色专区') {
// 特色专区下拉菜单
return zoneList && zoneList.length > 0 ? <li
className={`${this.matchZone() === true ? 'active drop-li' : 'drop-li'}`}
onMouseOver={ () => { this.setState( {showSubMenu: true }) } }
onMouseOut={ () => { this.setState( {showSubMenu: false }) } }
2023-06-21 14:18:09 +08:00
>
2023-09-28 14:06:34 +08:00
<a onClick={ () => { this.setState( {showSubMenu: true }) } }>特色专区</a>
<ul className={ `drop-down ${ showSubMenu ? 'drop-down-show' : '' }` } style={{ height : showSubMenu ? `${ current_user && current_user.login ? ((zoneList.length+1) * 46) : (zoneList.length * 46)}px` : 0 }}>
{
zoneList.map((e, k) => {
return <li className="drop-down-item" key={ k }><a href={ e.link } className="task-hide" title={ e.name } target="_blank">{ e.name }</a></li>
})
}
{current_user && current_user.login && <li className="drop-down-item"><Link to="/zone/apply" target="_blank">+申请创建</Link></li> }
</ul>
</li> : ''
} else {
return (
<li key={key}
className={`${this.matchpaths(new_link) === true ? 'pr active' : 'pr'}`}
style={{display:!is_hidden ? 'flex' : 'none'} }
>
<a href={new_link} target={wl ? "_self":"_blank"}>{item.name}</a>
</li>
)
}
2021-03-23 17:40:23 +08:00
})
2024-07-18 17:14:55 +08:00
}
2021-03-23 17:40:23 +08:00
</ul>
: ""
2024-07-18 17:14:55 +08:00
}*/}
{/*<div className="head-right">
{ search_url && <HeadSearch {...this.props}/>} */}
2024-02-03 17:14:15 +08:00
{/* {
2021-03-23 17:40:23 +08:00
current_user && (current_user.main_site || current_user.login) && (settings && settings.add && settings.add.length>0)?
<Dropdown overlay={this.addMenu(settings && settings.add)} placement="bottomRight">
2021-10-29 17:01:55 +08:00
<img src={require(`./img/add.png`)} alt="" width="16px" className="mr15 ml30"/>
2021-03-23 17:40:23 +08:00
</Dropdown>:""
2024-02-03 17:14:15 +08:00
} */}
2021-03-23 17:40:23 +08:00
2023-12-14 10:49:15 +08:00
{/* { (settings && settings.common && settings.common.notice) && (current_user && current_user.login)?
<Popover
overlayClassName="notice-popover"
placement={`bottomRight`}
2021-09-14 16:33:08 +08:00
content={<NoticeContent visible={visible} current_user={current_user} showNotification={showNotification} resetUserInfo={resetUserInfo}/>}
visible={visible}
onVisibleChange={this.handleVisibleChange}
2021-09-22 10:14:22 +08:00
destroyTooltipOnHide
>
2021-09-27 11:32:05 +08:00
<Link to={"/settings/notice"} className="message-icon">
2021-10-13 13:37:51 +08:00
{current_user && <Badge count={current_user.message_unread_total}>
2021-10-29 17:01:55 +08:00
<img src={require(`./img/ring.png`)} alt="" width="16px" className="ml15 mr15"/>
2021-10-13 13:37:51 +08:00
</Badge>}
2021-09-16 17:16:23 +08:00
</Link>
2021-09-09 09:34:51 +08:00
</Popover>
: ""
2024-07-18 17:14:55 +08:00
}
</div>*/}
2021-03-23 17:40:23 +08:00
{!user || (user && !user.login) ?
<span className="font-15 ml30">
2023-12-14 10:49:15 +08:00
<Link to="/login" className="mr5 color-white">登录</Link>
2021-03-23 17:40:23 +08:00
{
2021-11-11 13:41:55 +08:00
(settings && settings.common && settings.common.register) ?
publicNav ?
2021-11-12 12:33:46 +08:00
<a href='/register' className="regBtn">立即注册</a>
2021-11-11 13:41:55 +08:00
:
2021-11-12 12:33:46 +08:00
<span><em className="vertical-line"></em><a className="ml5 color-white" href='/register'></a></span>
2021-11-11 13:41:55 +08:00
:""
2021-03-23 17:40:23 +08:00
}
</span>
:
2021-06-09 11:52:36 +08:00
<Dropdown placement={`bottomRight`} overlay={this.renderMenu(settings && settings.personal)}>
2023-12-14 10:49:15 +08:00
<img alt="头像" src={getImageUrl(`/${user.image_url}`)} className="currentImg"></img>
2021-06-09 11:52:36 +08:00
</Dropdown>
2021-03-23 17:40:23 +08:00
}
</div>
</div>
);
}
}
export default NewHeader;