AddMailAccount.jsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import React, { useEffect, useState } from 'react';
  2. import TextInputWithExtraButton from 'src/components/ControlPanel/AddItemLayout/Form/TextInputWithExtraButton/TextInputWithExtraButton';
  3. import { addActiveElement, removeFocusedElement } from "../../../actions/MainNavigation/mainNavigationActions";
  4. import TextInput from 'src/components/ControlPanel/AddItemLayout/Form/TextInput/TextInput';
  5. import Password from 'src/components/ControlPanel/AddItemLayout/Form/Password/Password';
  6. import TextArea from 'src/components/ControlPanel/AddItemLayout/Form/TextArea/TextArea';
  7. import Checkbox from 'src/components/ControlPanel/AddItemLayout/Form/Checkbox/Checkbox';
  8. import AddItemLayout from '../../ControlPanel/AddItemLayout/AddItemLayout';
  9. import { addMailAccount, getMailList } from '../../../ControlPanelService/Mail';
  10. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  11. import MailInfoBlock from '../MailInfoBlock/MailInfoBlock';
  12. import Toolbar from '../../MainNav/Toolbar/Toolbar';
  13. import { useHistory } from 'react-router-dom';
  14. import Spinner from '../../Spinner/Spinner';
  15. import { useDispatch, useSelector } from 'react-redux';
  16. import './AddMailAccount.scss';
  17. import { Helmet } from 'react-helmet';
  18. import { refreshCounters } from 'src/actions/MenuCounters/menuCounterActions';
  19. import HtmlParser from 'react-html-parser';
  20. export default function AddMailAccount(props) {
  21. const { i18n } = useSelector(state => state.session);
  22. const dispatch = useDispatch();
  23. const token = localStorage.getItem("token");
  24. const history = useHistory();
  25. const [state, setState] = useState({
  26. data: {},
  27. advancedOptions: false,
  28. autoreplyChecked: false,
  29. quotaValue: '',
  30. loading: false,
  31. password: '',
  32. okMessage: '',
  33. errorMessage: '',
  34. });
  35. useEffect(() => {
  36. dispatch(addActiveElement(`/list/mail/`));
  37. dispatch(removeFocusedElement());
  38. fetchData();
  39. }, []);
  40. const submitFormHandler = event => {
  41. event.preventDefault();
  42. let newMailDomain = {};
  43. for (var [name, value] of (new FormData(event.target)).entries()) {
  44. newMailDomain[name] = value;
  45. }
  46. newMailDomain['ok_acc'] = 'add';
  47. newMailDomain['token'] = token;
  48. newMailDomain['v_domain'] = props.domain;
  49. newMailDomain['Password'] = newMailDomain['v_password'];
  50. if (Object.keys(newMailDomain).length !== 0 && newMailDomain.constructor === Object) {
  51. setState({ ...state, loading: true });
  52. addMailAccount(newMailDomain, props.domain)
  53. .then(result => {
  54. if (result.status === 200) {
  55. const { error_msg: errorMessage, ok_msg: okMessage } = result.data;
  56. if (errorMessage) {
  57. setState({ ...state, errorMessage, okMessage, loading: false });
  58. } else {
  59. dispatch(refreshCounters()).then(() => {
  60. setState({ ...state, okMessage, errorMessage: '', loading: false });
  61. });
  62. }
  63. }
  64. })
  65. .catch(err => console.error(err));
  66. }
  67. }
  68. const fetchData = () => {
  69. setState({ ...state, loading: true });
  70. getMailList()
  71. .then(response => {
  72. setState({
  73. ...state,
  74. data: response.data,
  75. errorMessage: response.data['error_msg'],
  76. okMessage: response.data['ok_msg'],
  77. loading: false
  78. });
  79. })
  80. .catch(err => console.error(err));
  81. }
  82. const toggleOptions = () => {
  83. setState({ ...state, advancedOptions: !state.advancedOptions });
  84. }
  85. const toggleQuotaValue = () => {
  86. if (state.quotaValue !== 'unlimited') {
  87. setState({ ...state, quotaValue: 'unlimited' });
  88. } else {
  89. setState({ ...state, quotaValue: '' });
  90. }
  91. }
  92. return (
  93. <div className="edit-template add-mail-account">
  94. <Helmet>
  95. <title>{`Vesta - ${i18n.MAIL}`}</title>
  96. </Helmet>
  97. <Toolbar mobile={false}>
  98. <div></div>
  99. <div className="search-toolbar-name">{i18n['Adding Mail Account']}</div>
  100. <div className="error">
  101. <span className="error-message">
  102. {state.errorMessage ? <FontAwesomeIcon icon="long-arrow-alt-right" /> : ''}
  103. {state.errorMessage}</span>
  104. </div>
  105. <div className="success">
  106. <span className="ok-message">
  107. {state.okMessage ? <FontAwesomeIcon icon="long-arrow-alt-right" /> : ''}
  108. <span>{HtmlParser(state.okMessage)}</span>
  109. </span>
  110. </div>
  111. </Toolbar>
  112. <AddItemLayout>
  113. {state.loading ? <Spinner /> : (
  114. <form onSubmit={event => submitFormHandler(event)}>
  115. <div className="r-1">
  116. <div className="c-1">
  117. <TextInput
  118. title={i18n['Domain']}
  119. value={props.domain}
  120. name="v_domain"
  121. id="domain"
  122. disabled />
  123. <TextInput
  124. title={i18n['Account']}
  125. name="v_account"
  126. id="account" />
  127. <Password name="v_password" onChange={password => setState({ ...state, password })} />
  128. </div>
  129. <div className="c-2">
  130. <MailInfoBlock
  131. webMail={state.data.webmail}
  132. hostName={state.data.hostname}
  133. password={state.password}
  134. domain={props.domain} />
  135. </div>
  136. </div>
  137. <div className="r-2">
  138. <button type="button" onClick={toggleOptions}>
  139. {i18n['Advanced options']}
  140. {state.advancedOptions ? <FontAwesomeIcon icon="caret-up" /> : <FontAwesomeIcon icon="caret-down" />}
  141. </button>
  142. {
  143. state.advancedOptions && (
  144. <>
  145. <TextInputWithExtraButton title={i18n['Quota']} optionalTitle={i18n['in megabytes']} id="quota" name="v_quota" value={state.quotaValue}>
  146. <button type="button" onClick={toggleQuotaValue}>
  147. <FontAwesomeIcon icon="infinity" />
  148. </button>
  149. </TextInputWithExtraButton>
  150. <TextArea
  151. optionalTitle={`${i18n['use local-part']}`}
  152. defaultValue={state.data.v_aliases}
  153. title={i18n['Aliases']}
  154. name="v_aliases"
  155. id="aliases" />
  156. <TextArea
  157. optionalTitle={`${i18n['one or more email addresses']}`}
  158. defaultValue={state.data.forward}
  159. title={i18n['Forward to']}
  160. name="v_fwd"
  161. id="fwd" />
  162. <Checkbox
  163. title={i18n['Do not store forwarded mail']}
  164. name="v_fwd_only"
  165. id="fwd_only" />
  166. </>
  167. )
  168. }
  169. <TextInput
  170. title={i18n['Send login credentials to email address']}
  171. name="v_credentials"
  172. id="credentials" />
  173. </div>
  174. <div className="buttons-wrapper">
  175. <button type="submit" className="add">{i18n.Add}</button>
  176. <button type="button" className="back" onClick={() => history.push(`/list/mail/?domain=${props.domain}`)}>{i18n.Back}</button>
  177. </div>
  178. </form>
  179. )}
  180. </AddItemLayout>
  181. </div>
  182. );
  183. }