index.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import { IconArrowsCross, IconBolt, IconBoltOff, IconDisc } from "@tabler/icons-react";
  2. import { useNavigate } from "react-router-dom";
  3. import { HasPermission } from "src/components";
  4. import { useHostReport } from "src/hooks";
  5. import { T } from "src/locale";
  6. const Dashboard = () => {
  7. const { data: hostReport } = useHostReport();
  8. const navigate = useNavigate();
  9. return (
  10. <div>
  11. <h2>
  12. <T id="dashboard" />
  13. </h2>
  14. <div className="row row-deck row-cards">
  15. <div className="col-12 my-4">
  16. <div className="row row-cards">
  17. <HasPermission permission="proxyHosts" type="view" hideError>
  18. <div className="col-sm-6 col-lg-3">
  19. <a
  20. href="/nginx/proxy"
  21. className="card card-sm card-link card-link-pop"
  22. onClick={(e) => {
  23. e.preventDefault();
  24. navigate("/nginx/proxy");
  25. }}
  26. >
  27. <div className="card-body">
  28. <div className="row align-items-center">
  29. <div className="col-auto">
  30. <span className="bg-green text-white avatar">
  31. <IconBolt />
  32. </span>
  33. </div>
  34. <div className="col">
  35. <div className="font-weight-medium">
  36. <T id="proxy-hosts.count" data={{ count: hostReport?.proxy }} />
  37. </div>
  38. </div>
  39. </div>
  40. </div>
  41. </a>
  42. </div>
  43. </HasPermission>
  44. <HasPermission permission="redirectionHosts" type="view" hideError>
  45. <div className="col-sm-6 col-lg-3">
  46. <a
  47. href="/nginx/redirection"
  48. className="card card-sm card-link card-link-pop"
  49. onClick={(e) => {
  50. e.preventDefault();
  51. navigate("/nginx/redirection");
  52. }}
  53. >
  54. <div className="card-body">
  55. <div className="row align-items-center">
  56. <div className="col-auto">
  57. <span className="bg-yellow text-white avatar">
  58. <IconArrowsCross />
  59. </span>
  60. </div>
  61. <div className="col">
  62. <T
  63. id="redirection-hosts.count"
  64. data={{ count: hostReport?.redirection }}
  65. />
  66. </div>
  67. </div>
  68. </div>
  69. </a>
  70. </div>
  71. </HasPermission>
  72. <HasPermission permission="streams" type="view" hideError>
  73. <div className="col-sm-6 col-lg-3">
  74. <a
  75. href="/nginx/stream"
  76. className="card card-sm card-link card-link-pop"
  77. onClick={(e) => {
  78. e.preventDefault();
  79. navigate("/nginx/stream");
  80. }}
  81. >
  82. <div className="card-body">
  83. <div className="row align-items-center">
  84. <div className="col-auto">
  85. <span className="bg-blue text-white avatar">
  86. <IconDisc />
  87. </span>
  88. </div>
  89. <div className="col">
  90. <T id="streams.count" data={{ count: hostReport?.stream }} />
  91. </div>
  92. </div>
  93. </div>
  94. </a>
  95. </div>
  96. </HasPermission>
  97. <HasPermission permission="deadHosts" type="view" hideError>
  98. <div className="col-sm-6 col-lg-3">
  99. <a
  100. href="/nginx/404"
  101. className="card card-sm card-link card-link-pop"
  102. onClick={(e) => {
  103. e.preventDefault();
  104. navigate("/nginx/404");
  105. }}
  106. >
  107. <div className="card-body">
  108. <div className="row align-items-center">
  109. <div className="col-auto">
  110. <span className="bg-red text-white avatar">
  111. <IconBoltOff />
  112. </span>
  113. </div>
  114. <div className="col">
  115. <T id="dead-hosts.count" data={{ count: hostReport?.dead }} />
  116. </div>
  117. </div>
  118. </div>
  119. </a>
  120. </div>
  121. </HasPermission>
  122. </div>
  123. </div>
  124. </div>
  125. <pre>
  126. <code>{`Todo:
  127. - check mobile
  128. - REDO SCREENSHOTS in docs folder
  129. - check permissions in all places
  130. More for api, then implement here:
  131. - Add error message_18n for all backend errors
  132. - properly wrap all logger.debug called in isDebug check
  133. - add new api endpoint changes to swagger docs
  134. `}</code>
  135. </pre>
  136. </div>
  137. );
  138. };
  139. export default Dashboard;