DEV: Asyncify findTopicList() (#17816)

This commit is contained in:
Jarek Radosz 2022-08-08 11:46:09 +02:00 committed by GitHub
parent 6f3be0c25a
commit e6fa05f8c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -5,7 +5,6 @@ import {
} from "discourse/controllers/discovery-sortable"; } from "discourse/controllers/discovery-sortable";
import DiscourseRoute from "discourse/routes/discourse"; import DiscourseRoute from "discourse/routes/discourse";
import I18n from "I18n"; import I18n from "I18n";
import { Promise } from "rsvp";
import Session from "discourse/models/session"; import Session from "discourse/models/session";
import Site from "discourse/models/site"; import Site from "discourse/models/site";
import { deepEqual } from "discourse-common/lib/object"; import { deepEqual } from "discourse-common/lib/object";
@ -28,62 +27,71 @@ function filterQueryParams(params, defaultParams) {
return findOpts; return findOpts;
} }
function findTopicList(store, tracking, filter, filterParams, extras) { async function findTopicList(
extras = extras || {}; store,
return new Promise(function (resolve) { tracking,
const session = Session.current(); filter,
filterParams,
extras = {}
) {
let list;
const session = Session.current();
if (extras.cached) { if (extras.cached) {
const cachedList = session.get("topicList"); const cachedList = session.get("topicList");
// Try to use the cached version if it exists and is greater than the topics per page // Try to use the cached version if it exists and is greater than the topics per page
if ( if (
cachedList && cachedList &&
cachedList.get("filter") === filter && cachedList.get("filter") === filter &&
(cachedList.get("topics.length") || 0) > cachedList.get("per_page") && (cachedList.get("topics.length") || 0) > cachedList.get("per_page") &&
deepEqual(cachedList.get("listParams"), filterParams) deepEqual(cachedList.get("listParams"), filterParams)
) { ) {
cachedList.set("loaded", true); cachedList.set("loaded", true);
if (tracking) { tracking?.updateTopics(cachedList.get("topics"));
tracking.updateTopics(cachedList.get("topics")); list = cachedList;
}
return resolve(cachedList);
}
session.set("topicList", null);
} else {
// Clear the cache
session.setProperties({ topicList: null, topicListScrollPosition: null });
} }
session.set("topicList", null);
} else {
// Clear the cache
session.setProperties({ topicList: null, topicListScrollPosition: null });
}
if (!list) {
// Clean up any string parameters that might slip through // Clean up any string parameters that might slip through
filterParams = filterParams || {}; filterParams ||= {};
Object.keys(filterParams).forEach((k) => { for (const [key, val] of Object.entries(filterParams)) {
const val = filterParams[k];
if (val === "undefined" || val === "null") { if (val === "undefined" || val === "null") {
filterParams[k] = null; filterParams[key] = null;
} }
}); }
return resolve( list = await store.findFiltered("topicList", {
store.findFiltered("topicList", { filter, params: filterParams || {} }) filter,
); params: filterParams,
}).then(function (list) { });
list.set("listParams", filterParams); }
if (tracking) {
tracking.sync(list, list.filter, filterParams); list.set("listParams", filterParams);
tracking.trackIncoming(list.filter);
if (tracking) {
tracking.sync(list, list.filter, filterParams);
tracking.trackIncoming(list.filter);
}
Session.currentProp("topicList", list);
if (list.topic_list?.top_tags) {
if (list.filter.startsWith("c/") || list.filter.startsWith("tags/c/")) {
Site.currentProp("category_top_tags", list.topic_list.top_tags);
} else {
Site.currentProp("top_tags", list.topic_list.top_tags);
} }
Session.currentProp("topicList", list); }
if (list.topic_list && list.topic_list.top_tags) {
if (list.filter.startsWith("c/") || list.filter.startsWith("tags/c/")) { return list;
Site.currentProp("category_top_tags", list.topic_list.top_tags);
} else {
Site.currentProp("top_tags", list.topic_list.top_tags);
}
}
return list;
});
} }
export default function (filter, extras) { export default function (filter, extras) {