55 lines
2.4 KiB
Diff
55 lines
2.4 KiB
Diff
# UNDF: UNDF-2026-000001109
|
|
# UNDF: (to be assigned)
|
|
--- a/react/features/visitors/middleware.ts
|
|
+++ b/react/features/visitors/middleware.ts
|
|
@@ -385,22 +385,28 @@ async function _getVisitorsList(store: IStore) {
|
|
initialVisitors => {
|
|
- const visitors = initialVisitors.map(v => ({ id: v.r, name: v.n }));
|
|
-
|
|
- dispatch(updateVisitorsList(visitors));
|
|
+ // Build Map once — O(V) total, then dispatch as array for UI
|
|
+ const visitorsMap = new Map(
|
|
+ initialVisitors.map(v => [ v.r, { id: v.r, name: v.n } ])
|
|
+ );
|
|
+ dispatch(updateVisitorsList(Array.from(visitorsMap.values())));
|
|
},
|
|
// Delta updates callback - apply incremental changes
|
|
updates => {
|
|
- let visitors = [ ...(getState()['features/visitors'].visitors ?? []) ];
|
|
-
|
|
- updates.forEach(u => {
|
|
- if (u.s === 'j') {
|
|
- const index = visitors.findIndex(v => v.id === u.r);
|
|
-
|
|
- if (index === -1) {
|
|
- visitors.push({ id: u.r, name: u.n });
|
|
- } else {
|
|
- visitors[index] = { id: u.r, name: u.n };
|
|
- }
|
|
- } else if (u.s === 'l') {
|
|
- visitors = visitors.filter(v => v.id !== u.r);
|
|
- }
|
|
- });
|
|
-
|
|
- dispatch(updateVisitorsList(visitors));
|
|
+ // Rebuild Map from current array — O(V) once per batch
|
|
+ const visitorsMap = new Map(
|
|
+ (getState()['features/visitors'].visitors ?? []).map(
|
|
+ (v: { id: string; name: string }) => [ v.id, v ]
|
|
+ )
|
|
+ );
|
|
+
|
|
+ // Apply each delta update — O(1) per update via Map
|
|
+ for (const u of updates) {
|
|
+ if (u.s === 'j') {
|
|
+ visitorsMap.set(u.r, { id: u.r, name: u.n }); // O(1)
|
|
+ } else if (u.s === 'l') {
|
|
+ visitorsMap.delete(u.r); // O(1)
|
|
+ }
|
|
+ }
|
|
+
|
|
+ // Convert back to array for Redux state — O(V) once per batch
|
|
+ dispatch(updateVisitorsList(Array.from(visitorsMap.values())));
|
|
},
|
|
getState()['features/base/jwt'].jwt);
|
|
}
|