AddDomainNameSystem.jsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import React, { useEffect, useState } from 'react';
  2. import { addActiveElement, removeFocusedElement } from "../../../actions/MainNavigation/mainNavigationActions";
  3. import AddItemLayout from '../../ControlPanel/AddItemLayout/AddItemLayout';
  4. import { getUserNS } from '../../../ControlPanelService/UserNS';
  5. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  6. import Toolbar from '../../MainNav/Toolbar/Toolbar';
  7. import { useHistory } from 'react-router-dom';
  8. import Spinner from '../../Spinner/Spinner';
  9. import { useDispatch, useSelector } from 'react-redux';
  10. import './AddDomainNameSystem.scss';
  11. import AdvancedOptions from './AdvancedOptions/AdvancedOptions';
  12. import { addDomainNameSystem } from '../../../ControlPanelService/Dns';
  13. import { Helmet } from 'react-helmet';
  14. import { refreshCounters } from 'src/actions/MenuCounters/menuCounterActions';
  15. import HtmlParser from 'react-html-parser';
  16. const AddDomainNameSystem = props => {
  17. const { i18n } = useSelector(state => state.session);
  18. const dispatch = useDispatch();
  19. const token = localStorage.getItem("token");
  20. const history = useHistory();
  21. const [state, setState] = useState({
  22. loading: false,
  23. showAdvancedOptions: false,
  24. okMessage: '',
  25. domain: '',
  26. errorMessage: '',
  27. userNS: []
  28. });
  29. useEffect(() => {
  30. dispatch(addActiveElement('/list/dns/'));
  31. dispatch(removeFocusedElement());
  32. setState({ ...state, loading: true });
  33. getUserNS()
  34. .then(result => {
  35. if (result.data.length) {
  36. setState({ ...state, userNS: result.data, loading: false });
  37. }
  38. })
  39. .catch(err => console.error(err));
  40. }, []);
  41. const submitFormHandler = event => {
  42. event.preventDefault();
  43. let domainNameSystem = {};
  44. for (var [name, value] of (new FormData(event.target)).entries()) {
  45. domainNameSystem[name] = value;
  46. }
  47. if (Object.keys(domainNameSystem).length !== 0 && domainNameSystem.constructor === Object) {
  48. setState({ ...state, loading: true });
  49. addDomainNameSystem(domainNameSystem)
  50. .then(result => {
  51. if (result.status === 200) {
  52. const { error_msg: errorMessage, ok_msg: okMessage } = result.data;
  53. if (errorMessage) {
  54. setState({ ...state, errorMessage, okMessage, loading: false });
  55. } else {
  56. dispatch(refreshCounters()).then(() => {
  57. setState({ ...state, okMessage, errorMessage: '', loading: false });
  58. });
  59. }
  60. }
  61. })
  62. .catch(err => console.error(err));
  63. }
  64. }
  65. const renderAdvancedOptions = () => {
  66. if (state.showAdvancedOptions) {
  67. return <AdvancedOptions prefixI18N={state.prefixI18N} userNS={state.userNS} domain={state.domain} webStats={state.webStats} />;
  68. }
  69. }
  70. const showAdvancedOption = () => {
  71. setState({ ...state, showAdvancedOptions: !state.showAdvancedOptions });
  72. }
  73. return (
  74. <div className="edit-template add-dns">
  75. <Helmet>
  76. <title>{`Vesta - ${i18n.DNS}`}</title>
  77. </Helmet>
  78. <Toolbar mobile={false}>
  79. <div></div>
  80. <div className="search-toolbar-name">{i18n['Adding DNS Domain'] ?? 'Adding DNS Domain'}</div>
  81. <div className="error">
  82. <span className="error-message">
  83. {state.errorMessage ? <FontAwesomeIcon icon="long-arrow-alt-right" /> : ''}
  84. {state.errorMessage}</span>
  85. </div>
  86. <div className="success">
  87. <span className="ok-message">
  88. {state.okMessage ? <FontAwesomeIcon icon="long-arrow-alt-right" /> : ''}
  89. <span>{HtmlParser(state.okMessage)}</span>
  90. </span>
  91. </div>
  92. </Toolbar>
  93. <AddItemLayout>
  94. {state.loading ? <Spinner /> : (
  95. <form onSubmit={event => submitFormHandler(event)}>
  96. <input type="hidden" name="ok" value="add" />
  97. <input type="hidden" name="token" value={token} />
  98. <div className="form-group">
  99. <label htmlFor="domain">{i18n.Domain ?? 'Domain'}</label>
  100. <input
  101. type="text"
  102. className="form-control"
  103. id="domain"
  104. required
  105. name="v_domain" />
  106. </div>
  107. <div className="form-group">
  108. <label htmlFor="ip_address">{i18n['IP address'] ?? 'IP address'}</label>
  109. <input
  110. type="text"
  111. className="form-control"
  112. id="ip_address"
  113. required
  114. name="v_ip" />
  115. </div>
  116. <div className="form-group advanced-options-button">
  117. <button type="button" onClick={() => showAdvancedOption()}>
  118. {i18n['Advanced options'] ?? 'Advanced options'}
  119. {state.showAdvancedOptions ? <FontAwesomeIcon icon="caret-down" /> : <FontAwesomeIcon icon="caret-up" />}
  120. </button>
  121. </div>
  122. {renderAdvancedOptions()}
  123. <div className="buttons-wrapper">
  124. <button type="submit" className="add">{i18n.Add ?? 'Add'}</button>
  125. <button type="button" className="back" onClick={() => history.push('/list/dns/')}>{i18n.Back ?? 'Back'}</button>
  126. </div>
  127. </form>
  128. )}
  129. </AddItemLayout>
  130. </div>
  131. );
  132. }
  133. export default AddDomainNameSystem;