diff --git a/src/ConferenceCallManagerHooks.js b/src/ConferenceCallManagerHooks.js index e72b04f7..48ee2fec 100644 --- a/src/ConferenceCallManagerHooks.js +++ b/src/ConferenceCallManagerHooks.js @@ -355,12 +355,63 @@ export function useVideoRoom(manager, roomId, timeout = 5000) { }; } +const tsCache = {}; + +function getLastTs(client, r) { + if (tsCache[r.roomId]) { + return tsCache[r.roomId]; + } + + if (!r || !r.timeline) { + const ts = Number.MAX_SAFE_INTEGER; + tsCache[r.roomId] = ts; + return ts; + } + + const myUserId = client.getUserId(); + + if (r.getMyMembership() !== "join") { + const membershipEvent = r.currentState.getStateEvents( + "m.room.member", + myUserId + ); + + if (membershipEvent && !Array.isArray(membershipEvent)) { + const ts = membershipEvent.getTs(); + tsCache[r.roomId] = ts; + return ts; + } + } + + for (let i = r.timeline.length - 1; i >= 0; --i) { + const ev = r.timeline[i]; + const ts = ev.getTs(); + + if (ts) { + tsCache[r.roomId] = ts; + return ts; + } + } + + const ts = Number.MAX_SAFE_INTEGER; + tsCache[r.roomId] = ts; + return ts; +} + +function sortRooms(client, rooms) { + return rooms.sort((a, b) => { + return getLastTs(client, b) - getLastTs(client, a); + }); +} + export function useRooms(manager) { const [rooms, setRooms] = useState([]); useEffect(() => { function updateRooms() { - setRooms(manager.client.getRooms()); + const visibleRooms = manager.client.getVisibleRooms(); + const sortedRooms = sortRooms(manager.client, visibleRooms); + setRooms(sortedRooms); } updateRooms(); diff --git a/src/Home.jsx b/src/Home.jsx index fd5f8b81..93684044 100644 --- a/src/Home.jsx +++ b/src/Home.jsx @@ -69,52 +69,54 @@ export function Home({ manager }) { onLogout={onLogout} /> - - -
Rooms:
-
- {rooms.map((room) => ( - -
- {room.name.slice(0, 1)} -
-
{room.name}
- - ))} -
-
+
-
-

Create New Room

- - - - {createRoomError && ( +
+ +

Create New Room

- {createRoomError.message} + - )} - - - - + {createRoomError && ( + + {createRoomError.message} + + )} + + + + +
+
+

Recent Rooms

+
+ {rooms.map((room) => ( + +
+ {room.name.slice(0, 1)} +
+
{room.name}
+ + ))} +
+
diff --git a/src/Home.module.css b/src/Home.module.css index 3b94ebad..81b696dd 100644 --- a/src/Home.module.css +++ b/src/Home.module.css @@ -1,8 +1,3 @@ -.content { - flex: 1; - overflow: hidden; -} - .roomList { }