Add the gallery timeline item rendered as a placeholder

Introduces the GalleryRoomTimelineItem and its typed GalleryItem model (reusing the existing per-message content types), builds it in the RoomTimelineItemFactory and routes it through RoomTimelineItemView. For now it renders as a placeholder; the grid/list media views and the full-screen preview land in follow-up PRs.

Co-authored-by: svetoslav.mitov <svetoslav.mitov@sportinno.com>
This commit is contained in:
Mauro Romito
2026-07-24 11:10:17 +02:00
committed by Mauro
parent 3796fdc966
commit 4a9cd02fbc
12 changed files with 289 additions and 22 deletions
@@ -53,6 +53,7 @@ enum RoomTimelineItemType: Equatable {
case video(VideoRoomTimelineItem)
case audio(AudioRoomTimelineItem)
case file(FileRoomTimelineItem)
case gallery(GalleryRoomTimelineItem)
case emote(EmoteRoomTimelineItem)
case notice(NoticeRoomTimelineItem)
case redacted(RedactedRoomTimelineItem)
@@ -83,6 +84,8 @@ enum RoomTimelineItemType: Equatable {
self = .audio(item)
case let item as FileRoomTimelineItem:
self = .file(item)
case let item as GalleryRoomTimelineItem:
self = .gallery(item)
case let item as SeparatorRoomTimelineItem:
self = .separator(item)
case let item as NoticeRoomTimelineItem:
@@ -132,6 +135,7 @@ enum RoomTimelineItemType: Equatable {
.video(let item as RoomTimelineItemProtocol),
.audio(let item as RoomTimelineItemProtocol),
.file(let item as RoomTimelineItemProtocol),
.gallery(let item as RoomTimelineItemProtocol),
.emote(let item as RoomTimelineItemProtocol),
.notice(let item as RoomTimelineItemProtocol),
.redacted(let item as RoomTimelineItemProtocol),
@@ -171,6 +175,8 @@ enum RoomTimelineItemType: Equatable {
return item.timestamp
case .file(let item):
return item.timestamp
case .gallery(let item):
return item.timestamp
case .emote(let item):
return item.timestamp
case .notice(let item):