Improve timeline scroll, media layout, avatars, and emoji coverage.
Remember room scroll position across switches, reserve image/video heights from Matrix dimensions, cache authenticated media blobs for avatars, restore jumbo emoji-only messages, and extend emoji font unicode-range for Unicode 15 glyphs.
This commit is contained in:
32
src/app/state/roomScrollCache.ts
Normal file
32
src/app/state/roomScrollCache.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
export type RoomScrollRange = {
|
||||
start: number;
|
||||
end: number;
|
||||
};
|
||||
|
||||
export type RoomScrollState = {
|
||||
top: number;
|
||||
atBottom: boolean;
|
||||
range: RoomScrollRange;
|
||||
};
|
||||
|
||||
const cache = new Map<string, RoomScrollState>();
|
||||
|
||||
const MAX_ENTRIES = 20;
|
||||
|
||||
export const getRoomScrollState = (roomId: string): RoomScrollState | undefined =>
|
||||
cache.get(roomId);
|
||||
|
||||
export const saveRoomScrollState = (roomId: string, state: RoomScrollState): void => {
|
||||
if (cache.has(roomId)) cache.delete(roomId);
|
||||
cache.set(roomId, state);
|
||||
|
||||
while (cache.size > MAX_ENTRIES) {
|
||||
const oldest = cache.keys().next().value as string | undefined;
|
||||
if (!oldest) break;
|
||||
cache.delete(oldest);
|
||||
}
|
||||
};
|
||||
|
||||
export const clearRoomScrollState = (roomId: string): void => {
|
||||
cache.delete(roomId);
|
||||
};
|
||||
Reference in New Issue
Block a user