|
|
@@ -23,13 +23,13 @@ export default class RevisionCompareContainer extends Container {
|
|
|
fromRevision: null,
|
|
|
toRevision: null,
|
|
|
|
|
|
- recentRevisions: [],
|
|
|
+ revisions: [],
|
|
|
}
|
|
|
|
|
|
this.readyRevisions = this.readyRevisions.bind(this);
|
|
|
this.fetchPageRevisionBody = this.fetchPageRevisionBody.bind(this);
|
|
|
- this.fetchPageRevisions = this.fetchPageRevisions.bind(this);
|
|
|
- this.fetchPageRevisionIfExists = this.fetchPageRevisionIfExists.bind(this);
|
|
|
+ this.fetchAllPageRevisions = this.fetchAllPageRevisions.bind(this);
|
|
|
+ this.fetchPageRevision = this.fetchPageRevision.bind(this);
|
|
|
this.handleFromRevisionChange = this.handleFromRevisionChange.bind(this);
|
|
|
this.handleToRevisionChange = this.handleToRevisionChange.bind(this);
|
|
|
}
|
|
|
@@ -44,17 +44,13 @@ export default class RevisionCompareContainer extends Container {
|
|
|
async readyRevisions() {
|
|
|
const [fromRevisionIdParam, toRevisionIdParam] = this.pageContainer.state.compareRevisionIds || [];
|
|
|
|
|
|
- await this.fetchPageRevisions();
|
|
|
+ await this.fetchAllPageRevisions();
|
|
|
if (fromRevisionIdParam) {
|
|
|
- await this.fetchPageRevisionIfExists(fromRevisionIdParam);
|
|
|
+ await this.handleFromRevisionChange(fromRevisionIdParam);
|
|
|
}
|
|
|
if (toRevisionIdParam) {
|
|
|
- await this.fetchPageRevisionIfExists(toRevisionIdParam);
|
|
|
+ await this.handleToRevisionChange(toRevisionIdParam);
|
|
|
}
|
|
|
-
|
|
|
- const fromRevision = this.state.recentRevisions.find(rev => rev._id === fromRevisionIdParam);
|
|
|
- const toRevision = this.state.recentRevisions.find(rev => rev._id === toRevisionIdParam);
|
|
|
- this.setState({ fromRevision, toRevision });
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -66,7 +62,7 @@ export default class RevisionCompareContainer extends Container {
|
|
|
try {
|
|
|
const res = await this.appContainer.apiv3Get(`/revisions/${revisionId}`, { pageId, shareLinkId });
|
|
|
if (res == null || res.data == undefined || res.data.revision == undefined) {
|
|
|
- console.log(`cannot get revision: ${res}`);
|
|
|
+ logger.warn(`cannot get revision. revisionId: ${revisionId}`);
|
|
|
return null;
|
|
|
}
|
|
|
return res.data.revision;
|
|
|
@@ -78,38 +74,49 @@ export default class RevisionCompareContainer extends Container {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- async fetchPageRevisions() {
|
|
|
+ async fetchAllPageRevisions() {
|
|
|
const { pageId, shareLinkId } = this.pageContainer.state;
|
|
|
- const page = 1; // The pagination start number is fixed to 1.
|
|
|
- const res = await this.appContainer.apiv3Get('/revisions/list', {
|
|
|
- pageId, shareLinkId, page, limit: 2, // [TODO] Set limit
|
|
|
- });
|
|
|
- const recentRevisions = res.data.docs;
|
|
|
- this.setState({ recentRevisions });
|
|
|
+
|
|
|
+ // fetch all page revisions that are sorted update day time descending
|
|
|
+ let page = 1;
|
|
|
+ let max = 1000; // Maximum number of loops to avoid infinite loops.
|
|
|
+ let newRevisions = [];
|
|
|
+ let res = null;
|
|
|
+ do {
|
|
|
+ res = await this.appContainer.apiv3Get('/revisions/list', {
|
|
|
+ pageId, shareLinkId, page,
|
|
|
+ });
|
|
|
+ newRevisions = newRevisions.concat(res.data.docs.map(rev => {
|
|
|
+ const { _id, createdAt } = rev;
|
|
|
+ return { _id, createdAt, body: null };
|
|
|
+ }));
|
|
|
+ } while(res.hasNextPage && --max > 0);
|
|
|
+
|
|
|
+ this.setState({ revisions: newRevisions });
|
|
|
}
|
|
|
|
|
|
- async fetchPageRevisionIfExists(revisionId) {
|
|
|
+ async fetchPageRevision(revisionId) {
|
|
|
try {
|
|
|
- const revision = await this.fetchPageRevisionBody(revisionId);
|
|
|
- if (revision == null || this.state.recentRevisions.map(rev => rev._id).includes(revision._id)) {
|
|
|
+ const compactRevision = this.state.revisions.find(rev => rev._id === revisionId);
|
|
|
+ if (this.state.revisions.find(rev => rev._id === revisionId) === undefined) {
|
|
|
return null;
|
|
|
}
|
|
|
-
|
|
|
- const newRecentRevisions = this.state.recentRevisions;
|
|
|
- newRecentRevisions.push(revision);
|
|
|
- // Update day time descending
|
|
|
- newRecentRevisions.sort((a, b) => {
|
|
|
- return new Date(b.createdAt) - new Date(a.createdAt);
|
|
|
- });
|
|
|
- this.setState({ recentRevisions: newRecentRevisions });
|
|
|
- return revision;
|
|
|
+ if (compactRevision.body == null) {
|
|
|
+ const fullRevision = await this.fetchPageRevisionBody(revisionId);
|
|
|
+ compactRevision.body = fullRevision.body;
|
|
|
+
|
|
|
+ // cache revision body
|
|
|
+ const newRevisions = this.state.revisions.map(rev => {
|
|
|
+ if (rev._id === revisionId) {
|
|
|
+ return { ...rev, body: fullRevision.body };
|
|
|
+ }
|
|
|
+ return rev;
|
|
|
+ });
|
|
|
+ this.setState( { revisions: newRevisions });
|
|
|
+ }
|
|
|
+ return compactRevision;
|
|
|
}
|
|
|
catch (err) {
|
|
|
- // If the RevisionId being entered is not correct, no special action will be taken.
|
|
|
- // [TODO] ignore default error handling of apiv3ErrorHandler
|
|
|
- if (err.length === 1 && err[0].code === 'validation_failed') {
|
|
|
- return;
|
|
|
- }
|
|
|
toastError(err);
|
|
|
this.setState({ errorMessage: err.message });
|
|
|
logger.error(err);
|
|
|
@@ -117,12 +124,12 @@ export default class RevisionCompareContainer extends Container {
|
|
|
}
|
|
|
|
|
|
async handleFromRevisionChange(revisionId) {
|
|
|
- const fromRevision = await this.fetchPageRevisionBody(revisionId);
|
|
|
+ const fromRevision = await this.fetchPageRevision(revisionId);
|
|
|
this.setState({ fromRevision })
|
|
|
}
|
|
|
|
|
|
async handleToRevisionChange(revisionId) {
|
|
|
- const toRevision = await this.fetchPageRevisionBody(revisionId);
|
|
|
+ const toRevision = await this.fetchPageRevision(revisionId);
|
|
|
this.setState({ toRevision })
|
|
|
}
|
|
|
|