From a2c8b0175fce849b73c2f16a7f197344fefa48e6 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Wed, 28 Oct 2026 22:07:50 +0530 Subject: [PATCH] use room creation event for activity sorting if latest event not found --- src/app/features/search/Search.tsx | 18 +++++++++++------- src/app/hooks/useSpaceHierarchy.ts | 20 +++++++++++--------- src/app/pages/client/direct/Direct.tsx | 8 +++++--- src/app/pages/client/home/Home.tsx | 8 +++++--- src/app/utils/sort.ts | 14 ++++++++++++++ 5 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/app/features/search/Search.tsx b/src/app/features/search/Search.tsx index f151c114..696ba062 100644 --- a/src/app/features/search/Search.tsx +++ b/src/app/features/search/Search.tsx @@ -38,7 +38,7 @@ import { import { RoomAvatar, RoomIcon } from '../../components/room-avatar'; import { getAllParents, guessPerfectParent } from '../../utils/room'; import { highlightText, makeHighlightRegex } from '../../plugins/react-custom-html-parser'; -import { factoryRoomIdByActivity } from '../../utils/sort'; +import { activityTsScope, factoryRoomIdByActivity } from '../../utils/sort'; import { nameInitials } from '../../utils/common'; import { useRoomNavigate } from '../../hooks/useRoomNavigate'; import { useListFocusIndex } from '../../hooks/useListFocusIndex'; @@ -85,19 +85,23 @@ const useTopActiveRooms = ( const roomToLatestEvent = useObservableValue(ct.roomToLatestEvent); return useMemo(() => { - const getTimestamp = (rId: string) => roomToLatestEvent.get(rId)?.origin_server_ts; - if (searchRoomType === SearchRoomType.Spaces) { return spaces; } if (searchRoomType === SearchRoomType.Directs) { - return [...directs].sort(factoryRoomIdByActivity(getTimestamp)).slice(0, 20); + return [...directs] + .sort(factoryRoomIdByActivity(activityTsScope(ct, roomToLatestEvent))) + .slice(0, 20); } if (searchRoomType === SearchRoomType.Rooms) { - return [...rooms].sort(factoryRoomIdByActivity(getTimestamp)).slice(0, 20); + return [...rooms] + .sort(factoryRoomIdByActivity(activityTsScope(ct, roomToLatestEvent))) + .slice(0, 20); } - return [...rooms, ...directs].sort(factoryRoomIdByActivity(getTimestamp)).slice(0, 20); - }, [roomToLatestEvent, rooms, directs, spaces, searchRoomType]); + return [...rooms, ...directs] + .sort(factoryRoomIdByActivity(activityTsScope(ct, roomToLatestEvent))) + .slice(0, 20); + }, [ct, roomToLatestEvent, rooms, directs, spaces, searchRoomType]); }; const useSearchTargetRooms = ( diff --git a/src/app/hooks/useSpaceHierarchy.ts b/src/app/hooks/useSpaceHierarchy.ts index c4e3866b..557dc42a 100644 --- a/src/app/hooks/useSpaceHierarchy.ts +++ b/src/app/hooks/useSpaceHierarchy.ts @@ -6,7 +6,13 @@ import { getHierarchy, GetHierarchyOK } from 'neurone/lib/api/matrix/client/v1/r import { parseMatrixResp } from 'neurone/lib/matrix-request'; import { SpaceChildContent } from '../../types/matrix/room'; import { isRoomId } from '../utils/matrix'; -import { SortFunc, byOrderKey, byTsOldToNew, factoryRoomIdByActivity } from '../utils/sort'; +import { + SortFunc, + activityTsScope, + byOrderKey, + byTsOldToNew, + factoryRoomIdByActivity, +} from '../utils/sort'; import { ErrorCode } from '../cs-errorcode'; import { useObservableValue } from './useObservableValue'; import { useClient } from './useClient'; @@ -223,6 +229,7 @@ export const useJoinedHierarchyItems = ( closedCategories: Set, selectedRoomId: string | undefined ) => { + const ct = useClient(); const roomToLatestEvent = useRoomsLatestEvent(rooms); const [sortByActivity] = useSetting('roomListByActivity'); @@ -238,19 +245,13 @@ export const useJoinedHierarchyItems = ( return total.count > 0 || unreadRooms.has(item.roomId); }) .sort((h1, h2) => - factoryRoomIdByActivity((rId) => roomToLatestEvent.get(rId)?.origin_server_ts)( - h1.roomId, - h2.roomId - ) + factoryRoomIdByActivity(activityTsScope(ct, roomToLatestEvent))(h1.roomId, h2.roomId) ); } if (sortByActivity) { items.sort((h1, h2) => - factoryRoomIdByActivity((rId) => roomToLatestEvent.get(rId)?.origin_server_ts)( - h1.roomId, - h2.roomId - ) + factoryRoomIdByActivity(activityTsScope(ct, roomToLatestEvent))(h1.roomId, h2.roomId) ); return items; } @@ -260,6 +261,7 @@ export const useJoinedHierarchyItems = ( return items; }, [ + ct, roomToLatestEvent, closedCategories, spaceId, diff --git a/src/app/pages/client/direct/Direct.tsx b/src/app/pages/client/direct/Direct.tsx index bd9f2df3..06381aa1 100644 --- a/src/app/pages/client/direct/Direct.tsx +++ b/src/app/pages/client/direct/Direct.tsx @@ -18,7 +18,7 @@ import { import { useVirtualizer } from '@tanstack/react-virtual'; import FocusTrap from 'focus-trap-react'; import { useNavigate } from 'react-router-dom'; -import { factoryRoomIdByActivity } from '../../../utils/sort'; +import { activityTsScope, factoryRoomIdByActivity } from '../../../utils/sort'; import { NavButton, NavCategory, @@ -210,12 +210,13 @@ export function Direct() { const total = getRoomTotalNotifications(notification); return total.count > 0 || unreadRooms.has(roomId); }) - .sort(factoryRoomIdByActivity((rId) => roomToLatestEvent.get(rId)?.origin_server_ts)); + .sort(factoryRoomIdByActivity(activityTsScope(ct, roomToLatestEvent))); } return Array.from(directs).sort( - factoryRoomIdByActivity((rId) => roomToLatestEvent.get(rId)?.origin_server_ts) + factoryRoomIdByActivity(activityTsScope(ct, roomToLatestEvent)) ); }, [ + ct, directs, closedCategories, roomToNotifications, @@ -290,6 +291,7 @@ export function Direct() { ref={virtualizer.measureElement} > 0 || unreadRooms.has(roomId); }) - .sort(factoryRoomIdByActivity((rId) => roomToLatestEvent.get(rId)?.origin_server_ts)); + .sort(factoryRoomIdByActivity(activityTsScope(ct, roomToLatestEvent))); } if (sortByActivity) { return Array.from(rooms).sort( - factoryRoomIdByActivity((rId) => roomToLatestEvent.get(rId)?.origin_server_ts) + factoryRoomIdByActivity(activityTsScope(ct, roomToLatestEvent)) ); } return Array.from(rooms).sort(factoryRoomIdByAtoZ(getRoomName)); }, [ + ct, getRoomName, rooms, closedCategories, @@ -376,6 +377,7 @@ export function Home() { ref={virtualizer.measureElement} > = (a: T, b: T) => number; +export const activityTsScope = ( + ct: ClientContext, + roomToLatestEvent: Map +) => { + const getTs = (rId: string) => + roomToLatestEvent.get(rId)?.origin_server_ts ?? + ct.state.join.create.read.find((ev) => ev.roomId === rId)?.event.origin_server_ts; + + return getTs; +}; + export const factoryRoomIdByActivity = (getLatestEventTs: (roomId: string) => number | undefined): SortFunc => (a, b) =>