index.tsx 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /*
  2. * @Author: your name
  3. * @Date: 2021-11-16 09:12:37
  4. * @LastEditTime: 2022-03-09 10:26:06
  5. * @LastEditors: Please set LastEditors
  6. * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  7. * @FilePath: /KC-MiddlePlatform/src/pages/index/components/topBar/index.tsx
  8. */
  9. import React, { useEffect, useState } from 'react';
  10. import styles from './style.less';
  11. import { Tooltip } from 'antd';
  12. import { LogoutOutlined, SettingOutlined } from '@ant-design/icons';
  13. import logo from '../../../public/images/kc-logo.png';
  14. import platFormMenuIcon from '../../../public/images/platformMenu.png';
  15. import tabCloseIcon from '../../../public/images/tabCloseIcon.png';
  16. import { history } from 'umi';
  17. interface TopBarType {
  18. onTabChange?: (data: TopBar.Tab[]) => void; //当tab切换时回调
  19. sysList: TopBar.Tab[]; //可选系统列表
  20. openedTabs: TopBar.Tab[]; //已打开的列表
  21. currentTab?: TopBar.Tab | undefined; //当前tab
  22. userPannelTabClick?: (tag: 'SETTING' | 'LOGOUT' | 'SETUSERINFO') => void;
  23. onCloseTab?: (data: TopBar.Tab) => void;
  24. onTabClick?: (data: TopBar.Tab) => void;
  25. userData?: { name: string; [key: string]: any };
  26. }
  27. const TopBar: React.FC<TopBarType> = (props) => {
  28. const {
  29. onTabChange,
  30. sysList = [],
  31. openedTabs = [],
  32. currentTab,
  33. userPannelTabClick,
  34. onCloseTab,
  35. onTabClick,
  36. userData,
  37. } = props;
  38. const [systemTabs, setSystemTabs] = useState<TopBar.Tab[]>([]); //已打开的tab
  39. const [currentSelectedTab, setCurrentSelectedTab] = useState<TopBar.Tab>();
  40. const [ifOpenPannel, setIfOpenPannel] = useState(false);
  41. const [arrowRotate, setArrowRotate] = useState(false);
  42. // const [opendedTabs,setOpendedTabs] = useState<SystemListItem[]>([]);
  43. const _systemTabClickHandle = (item: TopBar.Tab) => {
  44. //导航栏tab点击
  45. setCurrentSelectedTab(item);
  46. onTabClick && onTabClick(item);
  47. };
  48. const _systemListClickHandle = (data: TopBar.Tab) => {
  49. //导航栏系统菜单列表点击回调
  50. const findIndex = systemTabs.findIndex((t) => t.id == data.id);
  51. if (findIndex != -1) return;
  52. _systemTabClickHandle(data); //触发一次tab点击
  53. setSystemTabs([...systemTabs, data]);
  54. onTabChange && onTabChange([...systemTabs, data]);
  55. };
  56. const _userPannelTabClick = (tag: 'SETTING' | 'LOGOUT') => {
  57. //用户菜单tab点击回调
  58. userPannelTabClick && userPannelTabClick(tag);
  59. };
  60. const closeTabHandle = (item: TopBar.Tab, e: React.MouseEvent) => {
  61. e.stopPropagation();
  62. let _systemTabs = [...systemTabs];
  63. let delIndex = -1;
  64. const filtered = _systemTabs.filter((t, index) => {
  65. if (t.id == item.id) {
  66. delIndex = index;
  67. }
  68. return t.id != item.id;
  69. });
  70. setSystemTabs([...filtered]);
  71. if (delIndex != 0) {
  72. _systemTabClickHandle(_systemTabs[delIndex - 1]); //自动切换为前一个tab
  73. }
  74. onTabChange && onTabChange(filtered);
  75. onCloseTab && onCloseTab(item);
  76. };
  77. const UserPannel = () => {
  78. return (
  79. <div className={styles.userPannel}>
  80. <div className={styles.userPannelTab} onClick={() => _userPannelTabClick('SETTING')}>
  81. <SettingOutlined />
  82. 设置
  83. </div>
  84. <div className={styles.userPannelTab} onClick={() => _userPannelTabClick('LOGOUT')}>
  85. <LogoutOutlined />
  86. 退出
  87. </div>
  88. </div>
  89. );
  90. };
  91. useEffect(() => {
  92. console.log({ openedTabs });
  93. if (openedTabs.length == 1) {
  94. //当有且仅当只有一个的时候,默认激活
  95. // setCurrentSelectedTab(openedTabs[0]);
  96. // history.push(openedTabs[0].path);
  97. }
  98. if (openedTabs.length == 0) {
  99. //当所有tab都关闭时
  100. setCurrentSelectedTab(undefined);
  101. history.replace('/index');
  102. }
  103. }, [openedTabs]);
  104. useEffect(() => {
  105. // console.log('Topbar props',props);
  106. currentSelectedTab && _systemTabClickHandle(currentSelectedTab);
  107. currentSelectedTab && setSystemTabs([...systemTabs, currentSelectedTab]);
  108. }, [currentSelectedTab]);
  109. useEffect(() => {
  110. setSystemTabs(openedTabs);
  111. currentTab && setCurrentSelectedTab(currentTab);
  112. }, [props]);
  113. return (
  114. <div className={styles.topBar}>
  115. <div className={styles.logoWrap}>
  116. <img className={styles.logo} src={logo} />
  117. </div>
  118. <div
  119. className={ifOpenPannel ? `${styles.platformMenu} ${styles.on}` : `${styles.platformMenu}`}
  120. onClick={() => setIfOpenPannel(!ifOpenPannel)}
  121. >
  122. <img src={platFormMenuIcon} />
  123. <div className={styles.systemPannel}>
  124. {sysList.map((item) => (
  125. <div
  126. key={item.id}
  127. className={styles.systemList}
  128. onClick={() => _systemListClickHandle(item)}
  129. >
  130. <img src={item.icon} alt="" />
  131. <div className={styles.systemListName}>{item.name}</div>
  132. </div>
  133. ))}
  134. </div>
  135. </div>
  136. {/**
  137. * 已打开的tab
  138. */}
  139. <div className={styles.tabWrap}>
  140. {systemTabs.map((item) => (
  141. <div
  142. key={item.id}
  143. className={
  144. currentSelectedTab?.id == item.id ? `${styles.tab} ${styles.on}` : `${styles.tab}`
  145. }
  146. onClick={() => _systemTabClickHandle(item)}
  147. >
  148. <div className={styles.tabText}>{item.name} </div>
  149. <div className={styles.closeIconWrap}>
  150. <img src={tabCloseIcon} onClick={(e) => closeTabHandle(item, e)} alt="close" />
  151. </div>
  152. </div>
  153. ))}
  154. </div>
  155. <div className={styles.userRelaInfoWrap}>
  156. <div className={styles.notification}>
  157. <img
  158. className={styles.notificationIcon}
  159. src={require('../../../public/images/notificationIcon.png')}
  160. />
  161. </div>
  162. <Tooltip
  163. title={<UserPannel />}
  164. color="#fff"
  165. onVisibleChange={(visible) => setArrowRotate(visible)}
  166. >
  167. <div className={styles.user}>
  168. <img className={styles.avator} src={require('../../../public/images/Mask.png')} />
  169. <span className={styles.name}>{userData?.name}</span>
  170. <img
  171. className={arrowRotate ? `${styles.arrow} ${styles.on}` : `${styles.arrow}`}
  172. src={require('../../../public/images/arrow_white.png')}
  173. />
  174. </div>
  175. </Tooltip>
  176. </div>
  177. </div>
  178. );
  179. };
  180. export default TopBar;