Merge pull request #328 from etkecc/161-speed-up-large-profiles

Add manual pagination to Rooms tab in User's profile
This commit is contained in:
Aine
2025-02-07 21:11:22 +00:00
committed by GitHub
2 changed files with 27 additions and 6 deletions

View File

@@ -497,7 +497,7 @@ export const UserEdit = (props: EditProps) => {
target="user_id"
label={false}
pagination={<UserPagination />}
perPage={50}
perPage={10}
sort={{ field: "created_ts", order: "DESC" }}
>
<Datagrid sx={{ width: "100%" }} bulkActionButtons={<BulkDeleteButton/>}>
@@ -516,7 +516,7 @@ export const UserEdit = (props: EditProps) => {
</FormTab>
<FormTab label={translate("resources.rooms.name", { smart_count: 2 })} icon={<ViewListIcon />} path="rooms">
<ReferenceManyField reference="joined_rooms" target="user_id" label={false}>
<ReferenceManyField reference="joined_rooms" target="user_id" label={false} perPage={10} pagination={<Pagination />}>
<Datagrid sx={{ width: "100%" }} rowClick={id => "/rooms/" + id + "/show"} bulkActionButtons={false}>
<ReferenceField reference="rooms" source="id" label={false} link={false} sortable={false}>
<AvatarField source="avatar" sx={{ height: "40px", width: "40px" }} />

View File

@@ -16,6 +16,8 @@ import {
import { returnMXID } from "../utils/mxid";
import { MatrixError, displayError } from "../utils/error";
const CACHED_MANY_REF: Record<string, any> = {};
// Adds the access token to all requests
const jsonClient = async (url: string, options: Options = {}) => {
const token = localStorage.getItem("access_token");
@@ -706,18 +708,37 @@ const baseDataProvider: SynapseDataProvider = {
dir: getSearchOrder(order),
};
const homeserver = localStorage.getItem("base_url");
if (!homeserver || !(resource in resourceMap)) throw Error("Homeserver not set");
const res = resourceMap[resource];
const ref = res.reference(params.id);
const endpoint_url = `${homeserver}${ref.endpoint}?${new URLSearchParams(filterUndefined(query)).toString()}`;
const { json } = await jsonClient(endpoint_url);
const endpoint_url = `${homeserver}${ref.endpoint}?${new URLSearchParams(filterUndefined(query)).toString()}`;
let CACHE_KEY = ref.endpoint;
let jsonData = [];
let total = 0;
if (CACHED_MANY_REF[CACHE_KEY]) {
jsonData = CACHED_MANY_REF[CACHE_KEY]["data"].slice(from, from + perPage);
total = CACHED_MANY_REF[CACHE_KEY]["total"];
} else {
const { json } = await jsonClient(endpoint_url);
jsonData = json[res.data]
total = res.total(json, from, perPage);
if (resource === "joined_rooms") {
// cache will be applied only for joined_rooms
CACHED_MANY_REF[CACHE_KEY] = { data: jsonData, total: total };
jsonData = jsonData.slice(from, from + perPage);
}
}
return {
data: json[res.data].map(res.map),
total: res.total(json, from, perPage),
data: jsonData.map(res.map),
total: total,
};
},