Bridge.jsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import React from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import PropTypes from 'prop-types';
  4. import { UncontrolledTooltip } from 'reactstrap';
  5. const ProxyCircle = () => (
  6. <div className="grw-bridge-proxy-circle">
  7. <div className="circle position-absolute bg-primary border-light rounded-circle">
  8. <p className="circle-inner text-light fw-bold d-none d-lg-inline">Proxy Server</p>
  9. <p className="circle-inner grw-proxy-server-name d-block d-lg-none">Proxy Server</p>
  10. </div>
  11. </div>
  12. );
  13. const BridgeCore = (props) => {
  14. const {
  15. description, iconClass, iconName, hrClass, withProxy,
  16. } = props;
  17. return (
  18. <>
  19. <div id="grw-bridge-container" className={`grw-bridge-container ${withProxy ? 'with-proxy' : ''}`}>
  20. <p className={`${withProxy ? 'mt-0' : 'mt-2'}`}>
  21. <span className={iconClass}>{iconName}</span>
  22. <small
  23. className="ms-2 d-none d-lg-inline"
  24. // eslint-disable-next-line react/no-danger
  25. dangerouslySetInnerHTML={{ __html: description }}
  26. />
  27. </p>
  28. <div className="hr-container">
  29. { withProxy && <ProxyCircle /> }
  30. <hr className={`align-self-center ${hrClass}`} />
  31. </div>
  32. </div>
  33. <UncontrolledTooltip placement="top" fade={false} target="grw-bridge-container" className="d-block d-lg-none">
  34. <small
  35. // eslint-disable-next-line react/no-danger
  36. dangerouslySetInnerHTML={{ __html: description }}
  37. />
  38. </UncontrolledTooltip>
  39. </>
  40. );
  41. };
  42. BridgeCore.propTypes = {
  43. description: PropTypes.string.isRequired,
  44. iconClass: PropTypes.string.isRequired,
  45. iconName: PropTypes.string.isRequired,
  46. hrClass: PropTypes.string.isRequired,
  47. withProxy: PropTypes.bool,
  48. };
  49. const Bridge = (props) => {
  50. const { t } = useTranslation();
  51. const { errorCount, totalCount, withProxy } = props;
  52. let description;
  53. let iconClass;
  54. let iconName;
  55. let hrClass;
  56. // empty or all failed
  57. if (totalCount === 0 || errorCount === totalCount) {
  58. description = t('admin:slack_integration.integration_sentence.integration_is_not_complete');
  59. iconClass = 'material-symbols-outlined text-danger';
  60. iconName = 'info';
  61. hrClass = 'border-danger admin-border-failed';
  62. }
  63. // all green
  64. else if (errorCount === 0) {
  65. description = t('admin:slack_integration.integration_sentence.integration_successful');
  66. iconClass = 'material-symbols-outlined text-success';
  67. iconName = 'check';
  68. hrClass = 'border-success admin-border-success';
  69. }
  70. // some of them failed
  71. else {
  72. description = t('admin:slack_integration.integration_sentence.integration_some_ws_is_not_complete');
  73. iconClass = 'material-symbols-outlined text-warning';
  74. iconName = 'check';
  75. hrClass = 'border-warning admin-border-failed';
  76. }
  77. return (
  78. <BridgeCore
  79. description={description}
  80. iconClass={iconClass}
  81. iconName={iconName}
  82. hrClass={hrClass}
  83. withProxy={withProxy}
  84. />
  85. );
  86. };
  87. Bridge.propTypes = {
  88. errorCount: PropTypes.number.isRequired,
  89. totalCount: PropTypes.number.isRequired,
  90. withProxy: PropTypes.bool,
  91. };
  92. export default Bridge;