Menu.jsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import React, { useEffect } from 'react';
  2. import { addActiveElement } from '../../../actions/MainNavigation/mainNavigationActions';
  3. import { useSelector, useDispatch } from "react-redux";
  4. import { Link } from "react-router-dom";
  5. import './Menu.scss';
  6. const className = height => {
  7. if (height === 35) {
  8. return "menu-stat shadow";
  9. } else {
  10. return "menu-stat";
  11. }
  12. }
  13. const style = ({ menuHeight, mobile }) => {
  14. if (mobile) {
  15. return;
  16. }
  17. if (document.documentElement.clientWidth > 900) {
  18. return menuHeight
  19. } else {
  20. return 45;
  21. }
  22. }
  23. const Menu = props => {
  24. const { activeElement, focusedElement } = useSelector(state => state.mainNavigation);
  25. const { i18n, panel, userName } = useSelector(state => state.session);
  26. const { session } = useSelector(state => state.userSession);
  27. const { user } = useSelector(state => state.menuCounters);
  28. const dispatch = useDispatch();
  29. useEffect(() => {
  30. if (user.LANGUAGE) {
  31. localStorage.setItem("language", user.LANGUAGE);
  32. }
  33. }, [user]);
  34. const handleState = (tab, event) => {
  35. if (`${window.location.pathname}${window.location.search}` === tab) {
  36. return event.preventDefault();
  37. }
  38. dispatch(addActiveElement(tab));
  39. }
  40. const statClassName = activeName => {
  41. return `stat ${activeName === activeElement && 'l-active'} ${activeName === focusedElement && 'focus'}`;
  42. }
  43. const sizeFormatter = (bytes, decimals) => {
  44. if (!bytes) return null;
  45. if (bytes === "0") {
  46. return <span className="value">0 <span className="unit">b</span></span>;
  47. }
  48. let k = 1024,
  49. dm = decimals <= 0 ? 0 : decimals || 2,
  50. sizes = ['b', 'kb', 'Mb', 'GB'],
  51. i = Math.floor(Math.log(bytes) / Math.log(k));
  52. return (<span className="value">{parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} <span className="unit">{sizes[i]}</span></span>);
  53. }
  54. return (
  55. <div className="menu-wrapper">
  56. <div className={className(props.menuHeight)} style={{ height: style(props) }}>
  57. <div className={statClassName("/list/user/")}>
  58. <Link to="/list/user/" onClick={event => handleState("/list/user/", event)} onKeyPress={event => event.preventDefault()}>
  59. <h3>{i18n.USER}</h3>
  60. <div className="stats">
  61. {
  62. session.look && panel[session.look]
  63. ? (<>
  64. <div>
  65. <span>{i18n.Disk}:</span>
  66. <span><span className="value">{user.U_DISK} <span className="unit">{panel[session.look]['U_DISK_MEASURE']}</span></span></span>
  67. </div>
  68. <div>
  69. <span>{i18n.Bandwidth}:</span>
  70. <span><span className="value">{user.U_BANDWIDTH} <span className="unit">{panel[session.look]['U_BANDWIDTH_MEASURE']}</span></span></span>
  71. </div>
  72. </>)
  73. : (<>
  74. <div><span>{i18n.users}:</span> <span>{user.U_USERS}</span></div>
  75. <div><span>{i18n.spnd}:</span> <span>{user.SUSPENDED_USERS}</span></div>
  76. </>)
  77. }
  78. </div>
  79. </Link>
  80. </div>
  81. {
  82. panel[userName]['WEB_DOMAINS'] !== '0' && (<div className={statClassName("/list/web/")}>
  83. <Link to="/list/web/" onClick={event => handleState("/list/web/", event)} onKeyPress={event => event.preventDefault()}>
  84. <h3>{i18n.WEB}</h3>
  85. <div className="stats">
  86. <div><span>{i18n.domains}:</span> <span>{user.U_WEB_DOMAINS}</span></div>
  87. <div><span>{i18n.aliases}:</span> <span>{user.U_WEB_ALIASES}</span></div>
  88. <div><span>{i18n.spnd}:</span> <span>{user.SUSPENDED_WEB}</span></div>
  89. </div>
  90. </Link>
  91. </div>)
  92. }
  93. {
  94. panel[userName]['DNS_DOMAINS'] !== '0' && (<div className={statClassName("/list/dns/")}>
  95. <Link to="/list/dns/" onClick={event => handleState("/list/dns/", event)} onKeyPress={event => event.preventDefault()}>
  96. <h3>{i18n.DNS}</h3>
  97. <div className="stats">
  98. <div><span>{i18n.domains}:</span> <span>{user.U_DNS_DOMAINS}</span></div>
  99. <div><span>{i18n.records}:</span> <span>{user.U_DNS_RECORDS}</span></div>
  100. <div><span>{i18n.spnd}:</span> <span>{user.SUSPENDED_DNS}</span></div>
  101. </div>
  102. </Link>
  103. </div>)
  104. }
  105. {
  106. panel[userName]['MAIL_DOMAINS'] !== '0' && (<div className={statClassName("/list/mail/")}>
  107. <Link to="/list/mail/" onClick={event => handleState("/list/mail/", event)} onKeyPress={event => event.preventDefault()}>
  108. <h3>{i18n.MAIL}</h3>
  109. <div className="stats">
  110. <div><span>{i18n.domains}:</span> <span>{user.U_MAIL_DOMAINS}</span></div>
  111. <div><span>{i18n.accounts}:</span> <span>{user.U_MAIL_ACCOUNTS}</span></div>
  112. <div><span>{i18n.spnd}:</span> <span>{user.SUSPENDED_MAIL}</span></div>
  113. </div>
  114. </Link>
  115. </div>)
  116. }
  117. {
  118. panel[userName]['DATABASES'] !== '0' && (<div className={statClassName("/list/db/")}>
  119. <Link to="/list/db/" onClick={event => handleState("/list/db/", event)} onKeyPress={event => event.preventDefault()}>
  120. <h3>{i18n.DB}</h3>
  121. <div className="stats">
  122. <div><span>{i18n.databases}:</span> <span>{user.U_DATABASES}</span></div>
  123. <div><span>{i18n.spnd}:</span> <span>{user.SUSPENDED_DB}</span></div>
  124. </div>
  125. </Link>
  126. </div>)
  127. }
  128. {
  129. panel[userName]['CRON_JOBS'] !== '0' && (<div className={statClassName("/list/cron/")}>
  130. <Link to="/list/cron/" onClick={event => handleState("/list/cron/", event)} onKeyPress={event => event.preventDefault()}>
  131. <h3>{i18n.CRON}</h3>
  132. <div className="stats">
  133. <div><span>{i18n.jobs}:</span> <span>{user.U_CRON_JOBS}</span></div>
  134. <div><span>{i18n.spnd}:</span> <span>{user.SUSPENDED_CRON}</span></div>
  135. </div>
  136. </Link>
  137. </div>)
  138. }
  139. {
  140. panel[userName]['BACKUPS'] !== '0' && (<div className={statClassName("/list/backup/") + ' last'}>
  141. <Link to="/list/backup/" onClick={event => handleState("/list/backup/", event)} onKeyPress={event => event.preventDefault()}>
  142. <h3>{i18n.BACKUP}</h3>
  143. <div className="stats">
  144. <div><span>{i18n.backups}:</span> <span>{user.U_BACKUPS}</span></div>
  145. </div>
  146. </Link>
  147. </div>)
  148. }
  149. </div>
  150. </div>
  151. );
  152. }
  153. export default Menu;