Panel.jsx 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import React, { useState } from 'react';
  2. import { addActiveElement } from '../../../actions/MainNavigation/mainNavigationActions';
  3. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  4. import { logout } from 'src/actions/Session/sessionActions';
  5. import Notifications from './Notifications/Notifications';
  6. import { useSelector, useDispatch } from "react-redux";
  7. import Spinner from 'src/components/Spinner/Spinner';
  8. import { Link, useHistory } from "react-router-dom";
  9. import './Panel.scss';
  10. const Panel = props => {
  11. const { i18n, userName, session: { look, user } } = useSelector(state => state.session);
  12. const session = useSelector(state => state.session);
  13. const { activeElement, focusedElement } = useSelector(state => state.mainNavigation);
  14. const dispatch = useDispatch();
  15. const history = useHistory();
  16. const [loading, setLoading] = useState(false);
  17. const [state, setState] = useState({
  18. smallNavigationClass: 'small-navigation hidden'
  19. });
  20. const toggleNavigation = event => {
  21. props.showTopNav();
  22. if (state.smallNavigationClass === 'small-navigation hidden') {
  23. setState({ ...state, smallNavigationClass: 'small-navigation show' });
  24. } else {
  25. setState({ ...state, smallNavigationClass: 'small-navigation hidden' });
  26. }
  27. }
  28. const className = (activeName, extraClass = '') => {
  29. let className = 'top-link';
  30. if (activeName === activeElement) {
  31. className += ' active';
  32. }
  33. if (activeName === focusedElement) {
  34. className += ' focus';
  35. }
  36. return className + ` ${extraClass}`;
  37. }
  38. const handleState = (tab, event) => {
  39. if (`${window.location.pathname}${window.location.search}` === tab) {
  40. return event.preventDefault();
  41. }
  42. dispatch(addActiveElement(tab));
  43. }
  44. const signOut = () => {
  45. setLoading(true);
  46. dispatch(logout())
  47. .then(() => {
  48. setLoading(false);
  49. },
  50. error => {
  51. setLoading(false);
  52. console.error(error);
  53. });
  54. }
  55. return (
  56. <div className="panel-wrapper">
  57. {loading && <Spinner />}
  58. <div className={`top-panel ${look ? 'long-profile' : ''}`}>
  59. <div className="container left-menu">
  60. <div className="logo">
  61. <Link to="/list/user/" onClick={() => dispatch(addActiveElement('/list/user/'))}>
  62. <div>
  63. <img src="/images/white_logo.png" alt="Logo" />
  64. </div>
  65. </Link>
  66. </div>
  67. {userName === 'admin' && (<>
  68. <div className={className("/list/package/")}>
  69. <Link to="/list/package/" onClick={event => handleState("/list/package/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Packages}</Link>
  70. </div>
  71. <div className={className("/list/ip/")}>
  72. <Link to="/list/ip/" onClick={event => handleState("/list/ip/", event)} onKeyPress={event => event.preventDefault()}>{i18n.IP}</Link>
  73. </div>
  74. <div className={className("/list/rrd/")}>
  75. <Link to="/list/rrd/" onClick={event => handleState("/list/rrd/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Graphs}</Link>
  76. </div>
  77. </>)}
  78. <div className={className("/list/stats/")}>
  79. <Link to="/list/stats/" onClick={event => handleState("/list/stats/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Statistics}</Link>
  80. </div>
  81. <div className={className("/list/log/")}>
  82. <Link to="/list/log/" onClick={event => handleState("/list/log/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Log}</Link>
  83. </div>
  84. {userName === 'admin' && (<>
  85. <div className={className("/list/updates/")}>
  86. <Link to="/list/updates/" onClick={event => handleState("/list/updates/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Updates}</Link>
  87. </div>
  88. {session.session.FIREWALL_SYSTEM && <div className={className("/list/firewall/")}>
  89. <Link to="/list/firewall/" onClick={event => handleState("/list/firewall/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Firewall}</Link>
  90. </div>}
  91. </>)}
  92. {session.session.FILEMANAGER_KEY && <div className={className("/list/directory/")}>
  93. <Link to="/list/directory/">{i18n['File Manager']}</Link>
  94. </div>}
  95. {session.session.SOFTACULOUS === "yes" && <div className={className("/softaculous/")}><a href="/softaculous/">{i18n.Apps ?? 'Apps'}</a>
  96. </div>}
  97. {userName === 'admin' && (
  98. <div className={className("/list/server/")}>
  99. <Link to="/list/server/" onClick={event => handleState("/list/server/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Server}</Link>
  100. </div>
  101. )}
  102. </div>
  103. <div className="container profile-menu">
  104. <Notifications />
  105. <div>
  106. <Link to={`/edit/user?user=${session.userName}`}>
  107. {look
  108. ? <div className="long-username">
  109. <span>{user}</span>
  110. <FontAwesomeIcon icon="long-arrow-alt-right" />
  111. <span>{look}</span>
  112. </div>
  113. : session.userName
  114. }
  115. </Link>
  116. </div>
  117. <div><button onClick={signOut}>{i18n['Log out']}</button></div>
  118. </div>
  119. </div>
  120. <div className="top-panel small-device">
  121. <div className="container left-menu">
  122. <div className="logo">LOGO</div>
  123. </div>
  124. <div className="container hamburger" onClick={toggleNavigation}>
  125. <span className="bar"></span>
  126. <span className="bar"></span>
  127. <span className="bar"></span>
  128. </div>
  129. <div className="container profile-menu">
  130. <div className="bell">
  131. <FontAwesomeIcon icon="bell" />
  132. </div>
  133. <div><Link to={`/edit/user?user=${session.userName}`}>{session.userName}</Link></div>
  134. <div><button onClick={signOut}>{i18n['Log out']}</button></div>
  135. </div>
  136. </div>
  137. </div>
  138. );
  139. }
  140. export default Panel;