summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHunternif <hunternif@gmail.com>2022-07-22 03:05:27 +0100
committerHunternif <hunternif@gmail.com>2022-07-22 04:01:11 +0100
commit406492e0bd59be7e04fdb0f8dd669bc3fa452e85 (patch)
tree41f62712219639c28a59b40f3ea9c4bd1f0e9083
parentebb9fa685299c7f6171145fd5384cc3ff7a72a66 (diff)
client: cache post list page data in history
-rw-r--r--client/js/models/abstract_list.js1
-rw-r--r--client/js/views/endless_page_view.js41
2 files changed, 36 insertions, 6 deletions
diff --git a/client/js/models/abstract_list.js b/client/js/models/abstract_list.js
index 7505905..754b8e2 100644
--- a/client/js/models/abstract_list.js
+++ b/client/js/models/abstract_list.js
@@ -10,6 +10,7 @@ class AbstractList extends events.EventTarget {
static fromResponse(response) {
const ret = new this();
+ ret.raw_data = response;
for (let item of response) {
const addedItem = this._itemClass.fromResponse(item);
if (addedItem.addEventListener) {
diff --git a/client/js/views/endless_page_view.js b/client/js/views/endless_page_view.js
index d728edc..aad9ea3 100644
--- a/client/js/views/endless_page_view.js
+++ b/client/js/views/endless_page_view.js
@@ -1,5 +1,6 @@
"use strict";
+const PostList = require("../models/post_list.js");
const router = require("../router.js");
const views = require("../util/views.js");
@@ -38,13 +39,18 @@ class EndlessPageView {
this.defaultLimit = parseInt(ctx.parameters.limit || ctx.defaultLimit);
const initialOffset = parseInt(ctx.parameters.offset || 0);
- this._loadPage(ctx, initialOffset, this.defaultLimit, true).then(
- (pageNode) => {
- if (initialOffset !== 0) {
- pageNode.scrollIntoView();
+ if (ctx.browserState.cachedPageData) {
+ this._loadCachedPages(ctx);
+ } else {
+ ctx.browserState.cachedPageData = {};
+ this._loadPage(ctx, initialOffset, this.defaultLimit, true).then(
+ (pageNode) => {
+ if (initialOffset !== 0) {
+ pageNode.scrollIntoView();
+ }
}
- }
- );
+ );
+ }
this._timeout = window.setInterval(() => {
window.requestAnimationFrame(() => {
@@ -138,6 +144,22 @@ class EndlessPageView {
}
}
+ _loadCachedPages(ctx) {
+ // k-v map of page offset to raw response
+ const pageData = ctx.browserState.cachedPageData;
+ window.requestAnimationFrame(() => {
+ for (const [offset, data] of Object.entries(pageData)) {
+ const response = {
+ offset: data.offset,
+ limit: data.limit,
+ total: data.total,
+ results: PostList.fromResponse(data.raw_data)
+ };
+ this._renderPage(ctx, true, response);
+ }
+ });
+ }
+
_loadPage(ctx, offset, limit, append) {
this._runningRequests++;
return new Promise((resolve, reject) => {
@@ -147,6 +169,13 @@ class EndlessPageView {
this._runningRequests--;
return Promise.reject();
}
+ // Need to extract raw_data, otherwise it can't be stored in history
+ ctx.browserState.cachedPageData[offset] = {
+ offset: response.offset,
+ limit: response.limit,
+ total: response.total,
+ raw_data: response.results.raw_data,
+ };
window.requestAnimationFrame(() => {
let pageNode = this._renderPage(ctx, append, response);
this._runningRequests--;