|
@@ -7,6 +7,7 @@ import MenuItem from 'react-bootstrap/es/MenuItem';
|
|
|
import * as toastr from 'toastr';
|
|
import * as toastr from 'toastr';
|
|
|
|
|
|
|
|
import AppContainer from '../services/AppContainer';
|
|
import AppContainer from '../services/AppContainer';
|
|
|
|
|
+import PageContainer from '../services/PageContainer';
|
|
|
|
|
|
|
|
import { createSubscribedElement } from './UnstatedUtils';
|
|
import { createSubscribedElement } from './UnstatedUtils';
|
|
|
import HackmdEditor from './PageEditorByHackmd/HackmdEditor';
|
|
import HackmdEditor from './PageEditorByHackmd/HackmdEditor';
|
|
@@ -17,12 +18,9 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
super(props);
|
|
super(props);
|
|
|
|
|
|
|
|
this.state = {
|
|
this.state = {
|
|
|
- markdown: this.props.markdown,
|
|
|
|
|
|
|
+ markdown: this.props.pageContainer.state.markdown,
|
|
|
isInitialized: false,
|
|
isInitialized: false,
|
|
|
isInitializing: false,
|
|
isInitializing: false,
|
|
|
- revisionIdHackmdSynced: this.props.revisionIdHackmdSynced,
|
|
|
|
|
- pageIdOnHackmd: this.props.pageIdOnHackmd,
|
|
|
|
|
- hasDraftOnHackmd: this.props.hasDraftOnHackmd,
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
this.getHackmdUri = this.getHackmdUri.bind(this);
|
|
this.getHackmdUri = this.getHackmdUri.bind(this);
|
|
@@ -60,29 +58,8 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
this.setState({ isInitialized: false });
|
|
this.setState({ isInitialized: false });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * update revisionId of state
|
|
|
|
|
- * @param {string} revisionId
|
|
|
|
|
- * @param {string} revisionIdHackmdSynced
|
|
|
|
|
- */
|
|
|
|
|
- setRevisionId(revisionId, revisionIdHackmdSynced) {
|
|
|
|
|
- this.setState({ revisionId, revisionIdHackmdSynced });
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- getRevisionIdHackmdSynced() {
|
|
|
|
|
- return this.state.revisionIdHackmdSynced;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * update hasDraftOnHackmd of state
|
|
|
|
|
- * @param {bool} hasDraftOnHackmd
|
|
|
|
|
- */
|
|
|
|
|
- setHasDraftOnHackmd(hasDraftOnHackmd) {
|
|
|
|
|
- this.setState({ hasDraftOnHackmd });
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
getHackmdUri() {
|
|
getHackmdUri() {
|
|
|
- const envVars = this.props.crowi.config.env;
|
|
|
|
|
|
|
+ const envVars = this.props.appContainer.getConfig().env;
|
|
|
return envVars.HACKMD_URI;
|
|
return envVars.HACKMD_URI;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -90,6 +67,7 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
* Start integration with HackMD
|
|
* Start integration with HackMD
|
|
|
*/
|
|
*/
|
|
|
startToEdit() {
|
|
startToEdit() {
|
|
|
|
|
+ const { pageContainer } = this.props;
|
|
|
const hackmdUri = this.getHackmdUri();
|
|
const hackmdUri = this.getHackmdUri();
|
|
|
|
|
|
|
|
if (hackmdUri == null) {
|
|
if (hackmdUri == null) {
|
|
@@ -103,9 +81,9 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
const params = {
|
|
const params = {
|
|
|
- pageId: this.props.pageId,
|
|
|
|
|
|
|
+ pageId: pageContainer.state.pageId,
|
|
|
};
|
|
};
|
|
|
- this.props.crowi.apiPost('/hackmd.integrate', params)
|
|
|
|
|
|
|
+ this.props.appContainer.apiPost('/hackmd.integrate', params)
|
|
|
.then((res) => {
|
|
.then((res) => {
|
|
|
if (!res.ok) {
|
|
if (!res.ok) {
|
|
|
throw new Error(res.error);
|
|
throw new Error(res.error);
|
|
@@ -113,6 +91,8 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
|
|
|
|
|
this.setState({
|
|
this.setState({
|
|
|
isInitialized: true,
|
|
isInitialized: true,
|
|
|
|
|
+ });
|
|
|
|
|
+ pageContainer.setState({
|
|
|
pageIdOnHackmd: res.pageIdOnHackmd,
|
|
pageIdOnHackmd: res.pageIdOnHackmd,
|
|
|
revisionIdHackmdSynced: res.revisionIdHackmdSynced,
|
|
revisionIdHackmdSynced: res.revisionIdHackmdSynced,
|
|
|
});
|
|
});
|
|
@@ -134,7 +114,7 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
* Reset draft
|
|
* Reset draft
|
|
|
*/
|
|
*/
|
|
|
discardChanges() {
|
|
discardChanges() {
|
|
|
- this.setState({ hasDraftOnHackmd: false });
|
|
|
|
|
|
|
+ this.props.pageContainer.setState({ hasDraftOnHackmd: false });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -142,6 +122,7 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
*/
|
|
*/
|
|
|
hackmdEditorChangeHandler(body) {
|
|
hackmdEditorChangeHandler(body) {
|
|
|
const hackmdUri = this.getHackmdUri();
|
|
const hackmdUri = this.getHackmdUri();
|
|
|
|
|
+ const { pageContainer } = this.props;
|
|
|
|
|
|
|
|
if (hackmdUri == null) {
|
|
if (hackmdUri == null) {
|
|
|
// do nothing
|
|
// do nothing
|
|
@@ -149,14 +130,14 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// do nothing if contents are same
|
|
// do nothing if contents are same
|
|
|
- if (this.props.markdown === body) {
|
|
|
|
|
|
|
+ if (pageContainer.state.markdown === body) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const params = {
|
|
const params = {
|
|
|
- pageId: this.props.pageId,
|
|
|
|
|
|
|
+ pageId: pageContainer.state.pageId,
|
|
|
};
|
|
};
|
|
|
- this.props.crowi.apiPost('/hackmd.saveOnHackmd', params)
|
|
|
|
|
|
|
+ this.props.appContainer.apiPost('/hackmd.saveOnHackmd', params)
|
|
|
.then((res) => {
|
|
.then((res) => {
|
|
|
// do nothing
|
|
// do nothing
|
|
|
})
|
|
})
|
|
@@ -178,16 +159,20 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
|
|
|
|
|
render() {
|
|
render() {
|
|
|
const hackmdUri = this.getHackmdUri();
|
|
const hackmdUri = this.getHackmdUri();
|
|
|
|
|
+ const { pageContainer } = this.props;
|
|
|
|
|
+ const {
|
|
|
|
|
+ pageIdOnHackmd, revisionId, revisionIdHackmdSynced, remoteRevisionId, hasDraftOnHackmd,
|
|
|
|
|
+ } = pageContainer.state;
|
|
|
|
|
|
|
|
- const isPageExistsOnHackmd = (this.state.pageIdOnHackmd != null);
|
|
|
|
|
- const isResume = isPageExistsOnHackmd && this.state.hasDraftOnHackmd;
|
|
|
|
|
|
|
+ const isPageExistsOnHackmd = (pageIdOnHackmd != null);
|
|
|
|
|
+ const isResume = isPageExistsOnHackmd && hasDraftOnHackmd;
|
|
|
|
|
|
|
|
if (this.state.isInitialized) {
|
|
if (this.state.isInitialized) {
|
|
|
return (
|
|
return (
|
|
|
<HackmdEditor
|
|
<HackmdEditor
|
|
|
ref={(c) => { this.hackmdEditor = c }}
|
|
ref={(c) => { this.hackmdEditor = c }}
|
|
|
hackmdUri={hackmdUri}
|
|
hackmdUri={hackmdUri}
|
|
|
- pageIdOnHackmd={this.state.pageIdOnHackmd}
|
|
|
|
|
|
|
+ pageIdOnHackmd={pageIdOnHackmd}
|
|
|
initializationMarkdown={isResume ? null : this.state.markdown}
|
|
initializationMarkdown={isResume ? null : this.state.markdown}
|
|
|
onChange={this.hackmdEditorChangeHandler}
|
|
onChange={this.hackmdEditorChangeHandler}
|
|
|
onSaveWithShortcut={(document) => {
|
|
onSaveWithShortcut={(document) => {
|
|
@@ -198,8 +183,8 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const isRevisionOutdated = this.state.initialRevisionId !== this.state.revisionId;
|
|
|
|
|
- const isHackmdDocumentOutdated = this.state.revisionId !== this.state.revisionIdHackmdSynced;
|
|
|
|
|
|
|
+ const isRevisionOutdated = revisionId !== remoteRevisionId;
|
|
|
|
|
+ const isHackmdDocumentOutdated = revisionIdHackmdSynced !== remoteRevisionId;
|
|
|
|
|
|
|
|
let content;
|
|
let content;
|
|
|
/*
|
|
/*
|
|
@@ -216,7 +201,6 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
* Resume to edit or discard changes
|
|
* Resume to edit or discard changes
|
|
|
*/
|
|
*/
|
|
|
else if (isResume) {
|
|
else if (isResume) {
|
|
|
- const revisionIdHackmdSynced = this.state.revisionIdHackmdSynced;
|
|
|
|
|
const title = (
|
|
const title = (
|
|
|
<React.Fragment>
|
|
<React.Fragment>
|
|
|
<span className="btn-label"><i className="icon-control-end"></i></span>
|
|
<span className="btn-label"><i className="icon-control-end"></i></span>
|
|
@@ -308,20 +292,14 @@ class PageEditorByHackmd extends React.PureComponent {
|
|
|
* Wrapper component for using unstated
|
|
* Wrapper component for using unstated
|
|
|
*/
|
|
*/
|
|
|
const PageEditorByHackmdWrapper = (props) => {
|
|
const PageEditorByHackmdWrapper = (props) => {
|
|
|
- return createSubscribedElement(PageEditorByHackmd, props, [AppContainer]);
|
|
|
|
|
|
|
+ return createSubscribedElement(PageEditorByHackmd, props, [AppContainer, PageContainer]);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
PageEditorByHackmd.propTypes = {
|
|
PageEditorByHackmd.propTypes = {
|
|
|
appContainer: PropTypes.instanceOf(AppContainer).isRequired,
|
|
appContainer: PropTypes.instanceOf(AppContainer).isRequired,
|
|
|
|
|
+ pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
|
|
|
|
|
|
|
|
- crowi: PropTypes.object.isRequired,
|
|
|
|
|
- markdown: PropTypes.string.isRequired,
|
|
|
|
|
onSaveWithShortcut: PropTypes.func.isRequired,
|
|
onSaveWithShortcut: PropTypes.func.isRequired,
|
|
|
- pageId: PropTypes.string,
|
|
|
|
|
- revisionId: PropTypes.string,
|
|
|
|
|
- pageIdOnHackmd: PropTypes.string,
|
|
|
|
|
- revisionIdHackmdSynced: PropTypes.string,
|
|
|
|
|
- hasDraftOnHackmd: PropTypes.bool,
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
export default PageEditorByHackmdWrapper;
|
|
export default PageEditorByHackmdWrapper;
|