Importer.jsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import AppContainer from '../../services/AppContainer';
  5. import PageContainer from '../../services/PageContainer';
  6. import EditorContainer from '../../services/EditorContainer';
  7. import { createSubscribedElement } from '../UnstatedUtils';
  8. import HackmdEditor from '../PageEditorByHackmd/HackmdEditor';
  9. import { toastSuccess, toastError } from '../../util/apiNotification';
  10. class Importer extends React.Component {
  11. constructor(props) {
  12. super(props);
  13. this.state = {
  14. esaTeamName: '',
  15. esaAccessToken: '',
  16. qiitaTeamName: '',
  17. qiitaAccessToken: '',
  18. };
  19. this.esaHandleSubmit = this.esaHandleSubmit.bind(this);
  20. this.esaHandleSubmitTest = this.esaHandleSubmitTest.bind(this);
  21. this.esaHandleSubmitUpdate = this.esaHandleSubmitUpdate.bind(this);
  22. this.handleInputValue = this.handleInputValue.bind(this);
  23. }
  24. handleInputValue(event) {
  25. this.setState({
  26. [event.target.name]: event.target.value,
  27. });
  28. }
  29. esaHandleSubmit() {
  30. try {
  31. const params = {
  32. esaTeamName: this.state.esaTeamName, esaAccessToken: this.state.esaAccessToken,
  33. };
  34. this.props.appContainer.apiPost('/admin/import/esa', params);
  35. toastSuccess('Import posts from esa success.');
  36. }
  37. catch (error) {
  38. toastError('Error occurred in importing pages from esa.io');
  39. }
  40. }
  41. esaHandleSubmitTest() {
  42. try {
  43. const params = {
  44. esaTeamName: this.state.esaTeamName, esaAccessToken: this.state.esaAccessToken,
  45. };
  46. this.props.appContainer.apiPost('/admin/import/testEsaAPI', params);
  47. toastSuccess('Test connection to esa success.');
  48. }
  49. catch (error) {
  50. toastError('Test connection to esa failed.');
  51. }
  52. }
  53. esaHandleSubmitUpdate() {
  54. try {
  55. const params = {
  56. esaTeamName: this.state.esaTeamName, esaAccessToken: this.state.esaAccessToken,
  57. };
  58. this.props.appContainer.apiPost('/admin/settings/importerEsa', params);
  59. toastSuccess('Update');
  60. }
  61. catch (error) {
  62. toastError(err);
  63. }
  64. }
  65. render() {
  66. const { esaTeamName, esaAccessToken } = this.state;
  67. const { t } = this.props;
  68. return (
  69. <Fragment>
  70. <form
  71. action="/_api/admin/settings/importerEsa"
  72. className="form-horizontal"
  73. id="importerSettingFormEsa"
  74. role="form"
  75. >
  76. <fieldset>
  77. <legend>{ t('importer_management.import_from_esa') }</legend>
  78. <table className="table table-bordered table-mapping">
  79. <thead>
  80. <tr>
  81. <th width="45%">esa.io</th>
  82. <th width="10%"></th>
  83. <th>GROWI</th>
  84. </tr>
  85. </thead>
  86. <tbody>
  87. <tr>
  88. <th>{ t('Article') }</th>
  89. <th><i className="icon-arrow-right-circle text-success"></i></th>
  90. <th>{ t('Page') }</th>
  91. </tr>
  92. <tr>
  93. <th>{ t('Category') }</th>
  94. <th><i className="icon-arrow-right-circle text-success"></i></th>
  95. <th>{ t('Page Path') }</th>
  96. </tr>
  97. <tr>
  98. <th>{ t('User') }</th>
  99. <th></th>
  100. <th>(TBD)</th>
  101. </tr>
  102. </tbody>
  103. </table>
  104. <div className="well well-sm mb-0 small">
  105. <ul>
  106. <li>{ t('importer_management.page_skip') }</li>
  107. </ul>
  108. </div>
  109. <div className="form-group">
  110. <input type="password" name="dummypass" style={{ display: 'none', top: '-100px', left: '-100px' }} />
  111. </div>
  112. <div className="form-group">
  113. <label htmlFor="settingForm[importer:esa:team_name]" className="col-xs-3 control-label">
  114. { t('importer_management.esa_settings.team_name') }
  115. </label>
  116. <div className="col-xs-6">
  117. <input className="form-control" type="text" name="esaTeamName" value={esaTeamName} onChange={this.handleInputValue} />
  118. </div>
  119. </div>
  120. <div className="form-group">
  121. <label htmlFor="settingForm[importer:esa:access_token]" className="col-xs-3 control-label">
  122. { t('importer_management.esa_settings.access_token') }
  123. </label>
  124. <div className="col-xs-6">
  125. <input className="form-control" type="password" name="esaAccessToken" value={esaAccessToken} onChange={this.handleInputValue} />
  126. </div>
  127. </div>
  128. <div className="form-group">
  129. <input type="hidden" name="_csrf" value={this.props.csrf} />
  130. <div className="col-xs-offset-3 col-xs-6">
  131. <input id="testConnectionToEsa" type="button" className="btn btn-primary btn-esa" name="Esa" onClick={this.esaHandleSubmit} value={t('importer_management.import')} />
  132. <input name="Esa" type="button" className="btn btn-secondary" onClick={this.esaHandleSubmitUpdate} value={t('Update')} />
  133. <span className="col-xs-offset-1">
  134. <input name="Esa" type="button" id="importFromEsa" className="btn btn-default btn-esa" onClick={this.esaHandleSubmitTest} value={t('importer_management.esa_settings.test_connection')} name="Esa" />
  135. </span>
  136. </div>
  137. </div>
  138. </fieldset>
  139. </form>
  140. </Fragment>
  141. );
  142. }
  143. }
  144. /**
  145. * Wrapper component for using unstated
  146. */
  147. const ImporterWrapper = (props) => {
  148. return createSubscribedElement(Importer, props, [AppContainer, PageContainer, EditorContainer]);
  149. };
  150. Importer.propTypes = {
  151. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  152. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  153. editorContainer: PropTypes.instanceOf(EditorContainer).isRequired,
  154. t: PropTypes.func.isRequired, // i18next
  155. };
  156. export default withTranslation()(ImporterWrapper);