mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
Add support for replying to events different than room messages
This commit is contained in:
committed by
Stefan Ceriu
parent
423604b18c
commit
61968cb3fb
@@ -88,6 +88,7 @@ extension PollRoomTimelineItem {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
sender: .init(id: "userID"),
|
sender: .init(id: "userID"),
|
||||||
properties: .init())
|
properties: .init())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -539,8 +539,15 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
|
|||||||
|
|
||||||
var actions: [TimelineItemMenuAction] = []
|
var actions: [TimelineItemMenuAction] = []
|
||||||
|
|
||||||
if let messageItem = item as? EventBasedMessageTimelineItemProtocol, messageItem.isRemoteMessage {
|
if item.canBeRepliedTo {
|
||||||
|
if let messageItem = item as? EventBasedMessageTimelineItemProtocol {
|
||||||
actions.append(.reply(isThread: messageItem.isThreaded))
|
actions.append(.reply(isThread: messageItem.isThreaded))
|
||||||
|
} else {
|
||||||
|
actions.append(.reply(isThread: false))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if item.isRemoteMessage {
|
||||||
actions.append(.forward(itemID: itemID))
|
actions.append(.forward(itemID: itemID))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ struct SwipeToReplyView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "",
|
timestamp: "",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: true,
|
isEditable: true,
|
||||||
isThreaded: false, sender: .init(id: ""),
|
canBeRepliedTo: true,
|
||||||
|
isThreaded: false,
|
||||||
|
sender: .init(id: ""),
|
||||||
content: .init(body: ""))
|
content: .init(body: ""))
|
||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
|
|||||||
@@ -421,6 +421,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: "whoever"),
|
sender: .init(id: "whoever"),
|
||||||
content: .init(body: "A long message that should be on multiple lines."),
|
content: .init(body: "A long message that should be on multiple lines."),
|
||||||
@@ -431,6 +432,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: ""),
|
sender: .init(id: ""),
|
||||||
content: .init(body: "audio.ogg",
|
content: .init(body: "audio.ogg",
|
||||||
@@ -445,6 +447,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: ""),
|
sender: .init(id: ""),
|
||||||
content: .init(body: "File",
|
content: .init(body: "File",
|
||||||
@@ -457,6 +460,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: true,
|
isEditable: true,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: ""),
|
sender: .init(id: ""),
|
||||||
content: .init(body: "Some image", source: MediaSourceProxy(url: .picturesDirectory, mimeType: "image/png"), thumbnailSource: nil),
|
content: .init(body: "Some image", source: MediaSourceProxy(url: .picturesDirectory, mimeType: "image/png"), thumbnailSource: nil),
|
||||||
@@ -466,6 +470,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Fallback geo uri description",
|
content: .init(body: "Fallback geo uri description",
|
||||||
@@ -478,6 +483,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Fallback geo uri description",
|
content: .init(body: "Fallback geo uri description",
|
||||||
@@ -489,6 +495,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: ""),
|
sender: .init(id: ""),
|
||||||
content: .init(body: "audio.ogg",
|
content: .init(body: "audio.ogg",
|
||||||
@@ -523,6 +530,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "whoever"),
|
sender: .init(id: "whoever"),
|
||||||
content: .init(body: "A long message that should be on multiple lines."),
|
content: .init(body: "A long message that should be on multiple lines."),
|
||||||
@@ -533,6 +541,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "whoever"),
|
sender: .init(id: "whoever"),
|
||||||
content: .init(body: "Short message"),
|
content: .init(body: "Short message"),
|
||||||
|
|||||||
@@ -150,6 +150,7 @@ struct TimelineItemPlainStylerView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: "whoever"),
|
sender: .init(id: "whoever"),
|
||||||
content: .init(body: "A long message that should be on multiple lines."),
|
content: .init(body: "A long message that should be on multiple lines."),
|
||||||
@@ -160,6 +161,7 @@ struct TimelineItemPlainStylerView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: ""),
|
sender: .init(id: ""),
|
||||||
content: .init(body: "audio.ogg",
|
content: .init(body: "audio.ogg",
|
||||||
@@ -173,6 +175,7 @@ struct TimelineItemPlainStylerView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: ""),
|
sender: .init(id: ""),
|
||||||
content: .init(body: "File",
|
content: .init(body: "File",
|
||||||
@@ -185,6 +188,7 @@ struct TimelineItemPlainStylerView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: true,
|
isEditable: true,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: ""),
|
sender: .init(id: ""),
|
||||||
content: .init(body: "Some image", source: MediaSourceProxy(url: .picturesDirectory, mimeType: "image/png"), thumbnailSource: nil),
|
content: .init(body: "Some image", source: MediaSourceProxy(url: .picturesDirectory, mimeType: "image/png"), thumbnailSource: nil),
|
||||||
@@ -194,6 +198,7 @@ struct TimelineItemPlainStylerView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Fallback geo uri description",
|
content: .init(body: "Fallback geo uri description",
|
||||||
@@ -206,6 +211,7 @@ struct TimelineItemPlainStylerView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Fallback geo uri description",
|
content: .init(body: "Fallback geo uri description",
|
||||||
@@ -216,6 +222,7 @@ struct TimelineItemPlainStylerView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: ""),
|
sender: .init(id: ""),
|
||||||
content: .init(body: "audio.ogg",
|
content: .init(body: "audio.ogg",
|
||||||
|
|||||||
@@ -38,7 +38,14 @@ struct TimelineStyler<Content: View>: View {
|
|||||||
struct TimelineItemStyler_Previews: PreviewProvider, TestablePreview {
|
struct TimelineItemStyler_Previews: PreviewProvider, TestablePreview {
|
||||||
static let viewModel = RoomScreenViewModel.mock
|
static let viewModel = RoomScreenViewModel.mock
|
||||||
|
|
||||||
static let base = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, isThreaded: false, sender: .test, content: .init(body: "Test"))
|
static let base = TextRoomTimelineItem(id: .random,
|
||||||
|
timestamp: "Now",
|
||||||
|
isOutgoing: true,
|
||||||
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
|
isThreaded: false,
|
||||||
|
sender: .test,
|
||||||
|
content: .init(body: "Test"))
|
||||||
|
|
||||||
static let sentNonLast: TextRoomTimelineItem = {
|
static let sentNonLast: TextRoomTimelineItem = {
|
||||||
var result = base
|
var result = base
|
||||||
@@ -54,7 +61,14 @@ struct TimelineItemStyler_Previews: PreviewProvider, TestablePreview {
|
|||||||
|
|
||||||
static let sendingLast: TextRoomTimelineItem = {
|
static let sendingLast: TextRoomTimelineItem = {
|
||||||
let id = viewModel.state.timelineViewState.timelineIDs.last ?? UUID().uuidString
|
let id = viewModel.state.timelineViewState.timelineIDs.last ?? UUID().uuidString
|
||||||
var result = TextRoomTimelineItem(id: .init(timelineID: id), timestamp: "Now", isOutgoing: true, isEditable: false, isThreaded: false, sender: .test, content: .init(body: "Test"))
|
var result = TextRoomTimelineItem(id: .init(timelineID: id),
|
||||||
|
timestamp: "Now",
|
||||||
|
isOutgoing: true,
|
||||||
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
|
isThreaded: false,
|
||||||
|
sender: .test,
|
||||||
|
content: .init(body: "Test"))
|
||||||
result.properties.deliveryStatus = .sending
|
result.properties.deliveryStatus = .sending
|
||||||
return result
|
return result
|
||||||
}()
|
}()
|
||||||
@@ -67,21 +81,68 @@ struct TimelineItemStyler_Previews: PreviewProvider, TestablePreview {
|
|||||||
|
|
||||||
static let sentLast: TextRoomTimelineItem = {
|
static let sentLast: TextRoomTimelineItem = {
|
||||||
let id = viewModel.state.timelineViewState.timelineIDs.last ?? UUID().uuidString
|
let id = viewModel.state.timelineViewState.timelineIDs.last ?? UUID().uuidString
|
||||||
let result = TextRoomTimelineItem(id: .init(timelineID: id), timestamp: "Now", isOutgoing: true, isEditable: false, isThreaded: false, sender: .test, content: .init(body: "Test"))
|
let result = TextRoomTimelineItem(id: .init(timelineID: id),
|
||||||
|
timestamp: "Now",
|
||||||
|
isOutgoing: true,
|
||||||
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
|
isThreaded: false,
|
||||||
|
sender: .test,
|
||||||
|
content: .init(body: "Test"))
|
||||||
return result
|
return result
|
||||||
}()
|
}()
|
||||||
|
|
||||||
static let ltrString = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, isThreaded: false, sender: .test, content: .init(body: "house!"))
|
static let ltrString = TextRoomTimelineItem(id: .random,
|
||||||
|
timestamp: "Now",
|
||||||
|
isOutgoing: true,
|
||||||
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
|
isThreaded: false,
|
||||||
|
sender: .test, content: .init(body: "house!"))
|
||||||
|
|
||||||
static let rtlString = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, isThreaded: false, sender: .test, content: .init(body: "באמת!"))
|
static let rtlString = TextRoomTimelineItem(id: .random,
|
||||||
|
timestamp: "Now",
|
||||||
|
isOutgoing: true,
|
||||||
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
|
isThreaded: false,
|
||||||
|
sender: .test, content: .init(body: "באמת!"))
|
||||||
|
|
||||||
static let ltrStringThatContainsRtl = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, isThreaded: false, sender: .test, content: .init(body: "house! -- באמת! -- house!"))
|
static let ltrStringThatContainsRtl = TextRoomTimelineItem(id: .random,
|
||||||
|
timestamp: "Now",
|
||||||
|
isOutgoing: true,
|
||||||
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
|
isThreaded: false,
|
||||||
|
sender: .test,
|
||||||
|
content: .init(body: "house! -- באמת! -- house!"))
|
||||||
|
|
||||||
static let rtlStringThatContainsLtr = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, isThreaded: false, sender: .test, content: .init(body: "באמת! -- house! -- באמת!"))
|
static let rtlStringThatContainsLtr = TextRoomTimelineItem(id: .random,
|
||||||
|
timestamp: "Now",
|
||||||
|
isOutgoing: true,
|
||||||
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
|
isThreaded: false,
|
||||||
|
sender: .test,
|
||||||
|
content: .init(body: "באמת! -- house! -- באמת!"))
|
||||||
|
|
||||||
static let ltrStringThatFinishesInRtl = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, isThreaded: false, sender: .test, content: .init(body: "house! -- באמת!"))
|
static let ltrStringThatFinishesInRtl = TextRoomTimelineItem(id: .random,
|
||||||
|
timestamp: "Now",
|
||||||
|
isOutgoing: true,
|
||||||
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
|
isThreaded: false,
|
||||||
|
sender: .test,
|
||||||
|
content: .init(body: "house! -- באמת!"))
|
||||||
|
|
||||||
static let rtlStringThatFinishesInLtr = TextRoomTimelineItem(id: .random, timestamp: "Now", isOutgoing: true, isEditable: false, isThreaded: false, sender: .test, content: .init(body: "באמת! -- house!"))
|
static let rtlStringThatFinishesInLtr = TextRoomTimelineItem(id: .random,
|
||||||
|
timestamp: "Now",
|
||||||
|
isOutgoing: true,
|
||||||
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
|
isThreaded: false,
|
||||||
|
sender: .test,
|
||||||
|
content: .init(body: "באמת! -- house!"))
|
||||||
|
|
||||||
static var testView: some View {
|
static var testView: some View {
|
||||||
VStack {
|
VStack {
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ struct TimelineReadReceiptsView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: UUID().uuidString), content: .init(body: "Test"),
|
sender: .init(id: UUID().uuidString), content: .init(body: "Test"),
|
||||||
properties: .init(orderedReadReceipts: receipts))
|
properties: .init(orderedReadReceipts: receipts))
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ struct AudioRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "audio.ogg", duration: 300, waveform: nil, source: nil, contentType: nil)))
|
content: .init(body: "audio.ogg", duration: 300, waveform: nil, source: nil, contentType: nil)))
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ struct EmoteRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: timestamp,
|
timestamp: timestamp,
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: senderId),
|
sender: .init(id: senderId),
|
||||||
content: .init(body: text))
|
content: .init(body: text))
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ struct EncryptedRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: timestamp,
|
timestamp: timestamp,
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: false,
|
||||||
sender: .init(id: senderId))
|
sender: .init(id: senderId))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ struct FileRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "document.pdf", source: nil, thumbnailSource: nil, contentType: nil)))
|
content: .init(body: "document.pdf", source: nil, thumbnailSource: nil, contentType: nil)))
|
||||||
@@ -59,6 +60,7 @@ struct FileRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "document.docx", source: nil, thumbnailSource: nil, contentType: nil)))
|
content: .init(body: "document.docx", source: nil, thumbnailSource: nil, contentType: nil)))
|
||||||
@@ -67,6 +69,7 @@ struct FileRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "document.txt", source: nil, thumbnailSource: nil, contentType: nil)))
|
content: .init(body: "document.txt", source: nil, thumbnailSource: nil, contentType: nil)))
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ struct ImageRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Some image", source: MediaSourceProxy(url: .picturesDirectory, mimeType: "image/png"), thumbnailSource: nil)))
|
content: .init(body: "Some image", source: MediaSourceProxy(url: .picturesDirectory, mimeType: "image/png"), thumbnailSource: nil)))
|
||||||
@@ -80,6 +81,7 @@ struct ImageRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Some other image", source: MediaSourceProxy(url: .picturesDirectory, mimeType: "image/png"), thumbnailSource: nil)))
|
content: .init(body: "Some other image", source: MediaSourceProxy(url: .picturesDirectory, mimeType: "image/png"), thumbnailSource: nil)))
|
||||||
@@ -88,6 +90,7 @@ struct ImageRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Blurhashed image",
|
content: .init(body: "Blurhashed image",
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ struct LocationRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Fallback geo uri description")))
|
content: .init(body: "Fallback geo uri description")))
|
||||||
@@ -120,6 +121,7 @@ struct LocationRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Fallback geo uri description",
|
content: .init(body: "Fallback geo uri description",
|
||||||
@@ -128,6 +130,7 @@ struct LocationRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: true,
|
isThreaded: true,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Fallback geo uri description",
|
content: .init(body: "Fallback geo uri description",
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ struct NoticeRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: timestamp,
|
timestamp: timestamp,
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: senderId),
|
sender: .init(id: senderId),
|
||||||
content: .init(body: text))
|
content: .init(body: text))
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ struct ReadMarkerRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "",
|
timestamp: "",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "1", displayName: "Bob"),
|
sender: .init(id: "1", displayName: "Bob"),
|
||||||
content: .init(body: "This is another message"))), groupStyle: .single))
|
content: .init(body: "This is another message"))), groupStyle: .single))
|
||||||
@@ -58,6 +59,7 @@ struct ReadMarkerRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "",
|
timestamp: "",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "", displayName: "Alice"),
|
sender: .init(id: "", displayName: "Alice"),
|
||||||
content: .init(body: "This is a message"))), groupStyle: .single))
|
content: .init(body: "This is a message"))), groupStyle: .single))
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ struct RedactedRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: timestamp,
|
timestamp: timestamp,
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: false,
|
||||||
sender: .init(id: senderId))
|
sender: .init(id: senderId))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,5 +46,6 @@ struct StateRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
sender: .init(id: ""))
|
sender: .init(id: ""))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ struct StickerRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
imageURL: URL.picturesDirectory))
|
imageURL: URL.picturesDirectory))
|
||||||
|
|
||||||
@@ -72,6 +73,7 @@ struct StickerRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
imageURL: URL.picturesDirectory))
|
imageURL: URL.picturesDirectory))
|
||||||
|
|
||||||
@@ -80,6 +82,7 @@ struct StickerRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
imageURL: URL.picturesDirectory,
|
imageURL: URL.picturesDirectory,
|
||||||
aspectRatio: 0.7,
|
aspectRatio: 0.7,
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ struct TextRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: timestamp,
|
timestamp: timestamp,
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: isOutgoing,
|
isEditable: isOutgoing,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: senderId),
|
sender: .init(id: senderId),
|
||||||
content: .init(body: text))
|
content: .init(body: text))
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ struct UnsupportedRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: timestamp,
|
timestamp: timestamp,
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
sender: .init(id: senderId))
|
sender: .init(id: senderId))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ struct VideoRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Some video", duration: 21, source: nil, thumbnailSource: nil)))
|
content: .init(body: "Some video", duration: 21, source: nil, thumbnailSource: nil)))
|
||||||
@@ -91,6 +92,7 @@ struct VideoRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Some other video", duration: 22, source: nil, thumbnailSource: nil)))
|
content: .init(body: "Some other video", duration: 22, source: nil, thumbnailSource: nil)))
|
||||||
@@ -99,6 +101,7 @@ struct VideoRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "Blurhashed video", duration: 23, source: nil, thumbnailSource: nil, aspectRatio: 0.7, blurhash: "L%KUc%kqS$RP?Ks,WEf8OlrqaekW")))
|
content: .init(body: "Blurhashed video", duration: 23, source: nil, thumbnailSource: nil, aspectRatio: 0.7, blurhash: "L%KUc%kqS$RP?Ks,WEf8OlrqaekW")))
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ enum RoomTimelineItemFixtures {
|
|||||||
timestamp: "10:10 AM",
|
timestamp: "10:10 AM",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "", displayName: "Jacob"),
|
sender: .init(id: "", displayName: "Jacob"),
|
||||||
content: .init(body: "That looks so good!"),
|
content: .init(body: "That looks so good!"),
|
||||||
@@ -32,6 +33,7 @@ enum RoomTimelineItemFixtures {
|
|||||||
timestamp: "10:11 AM",
|
timestamp: "10:11 AM",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "", displayName: "Helena"),
|
sender: .init(id: "", displayName: "Helena"),
|
||||||
content: .init(body: "Let’s get lunch soon! New salad place opened up 🥗. When are y’all free? 🤗"),
|
content: .init(body: "Let’s get lunch soon! New salad place opened up 🥗. When are y’all free? 🤗"),
|
||||||
@@ -42,6 +44,7 @@ enum RoomTimelineItemFixtures {
|
|||||||
timestamp: "10:11 AM",
|
timestamp: "10:11 AM",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "", displayName: "Helena"),
|
sender: .init(id: "", displayName: "Helena"),
|
||||||
content: .init(body: "I can be around on Wednesday. How about some 🌮 instead? Like https://www.tortilla.co.uk/"),
|
content: .init(body: "I can be around on Wednesday. How about some 🌮 instead? Like https://www.tortilla.co.uk/"),
|
||||||
@@ -60,6 +63,7 @@ enum RoomTimelineItemFixtures {
|
|||||||
timestamp: "5 PM",
|
timestamp: "5 PM",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "", displayName: "Helena"),
|
sender: .init(id: "", displayName: "Helena"),
|
||||||
content: .init(body: "Wow, cool. Ok, lets go the usual place tomorrow?! Is that too soon? Here’s the menu, let me know what you want it’s on me!"),
|
content: .init(body: "Wow, cool. Ok, lets go the usual place tomorrow?! Is that too soon? Here’s the menu, let me know what you want it’s on me!"),
|
||||||
@@ -68,6 +72,7 @@ enum RoomTimelineItemFixtures {
|
|||||||
timestamp: "5 PM",
|
timestamp: "5 PM",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: true,
|
isEditable: true,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "", displayName: "Bob"),
|
sender: .init(id: "", displayName: "Bob"),
|
||||||
content: .init(body: "And John's speech was amazing!")),
|
content: .init(body: "And John's speech was amazing!")),
|
||||||
@@ -75,6 +80,7 @@ enum RoomTimelineItemFixtures {
|
|||||||
timestamp: "5 PM",
|
timestamp: "5 PM",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
isEditable: true,
|
isEditable: true,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "", displayName: "Bob"),
|
sender: .init(id: "", displayName: "Bob"),
|
||||||
content: .init(body: "New home office set up!"),
|
content: .init(body: "New home office set up!"),
|
||||||
@@ -87,6 +93,7 @@ enum RoomTimelineItemFixtures {
|
|||||||
timestamp: "5 PM",
|
timestamp: "5 PM",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "", displayName: "Helena"),
|
sender: .init(id: "", displayName: "Helena"),
|
||||||
content: .init(body: "",
|
content: .init(body: "",
|
||||||
@@ -241,6 +248,7 @@ private extension TextRoomTimelineItem {
|
|||||||
timestamp: "10:47 am",
|
timestamp: "10:47 am",
|
||||||
isOutgoing: senderDisplayName == "Alice",
|
isOutgoing: senderDisplayName == "Alice",
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "", displayName: senderDisplayName),
|
sender: .init(id: "", displayName: senderDisplayName),
|
||||||
content: .init(body: text))
|
content: .init(body: text))
|
||||||
|
|||||||
@@ -88,6 +88,8 @@ class EventTimelineItemProxy {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
lazy var canBeRepliedTo = item.canBeRepliedTo()
|
||||||
|
|
||||||
lazy var isRoomState = content.kind().isRoomState
|
lazy var isRoomState = content.kind().isRoomState
|
||||||
|
|
||||||
lazy var content = item.content()
|
lazy var content = item.content()
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ protocol EventBasedTimelineItemProtocol: RoomTimelineItemProtocol, CustomStringC
|
|||||||
var timestamp: String { get }
|
var timestamp: String { get }
|
||||||
var isOutgoing: Bool { get }
|
var isOutgoing: Bool { get }
|
||||||
var isEditable: Bool { get }
|
var isEditable: Bool { get }
|
||||||
|
var canBeRepliedTo: Bool { get }
|
||||||
|
|
||||||
var sender: TimelineItemSender { get }
|
var sender: TimelineItemSender { get }
|
||||||
|
|
||||||
|
|||||||
+1
@@ -21,6 +21,7 @@ struct AudioRoomTimelineItem: EventBasedMessageTimelineItemProtocol, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
let isThreaded: Bool
|
let isThreaded: Bool
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|
||||||
|
|||||||
+1
@@ -21,6 +21,7 @@ struct EmoteRoomTimelineItem: TextBasedRoomTimelineItem, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
let isThreaded: Bool
|
let isThreaded: Bool
|
||||||
|
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|||||||
+1
@@ -22,6 +22,7 @@ struct FileRoomTimelineItem: EventBasedMessageTimelineItemProtocol, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
|
|
||||||
let isThreaded: Bool
|
let isThreaded: Bool
|
||||||
|
|
||||||
|
|||||||
+1
@@ -22,6 +22,7 @@ struct ImageRoomTimelineItem: EventBasedMessageTimelineItemProtocol, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
let isThreaded: Bool
|
let isThreaded: Bool
|
||||||
|
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|||||||
+1
@@ -20,6 +20,7 @@ struct LocationRoomTimelineItem: EventBasedMessageTimelineItemProtocol, Equatabl
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
let isThreaded: Bool
|
let isThreaded: Bool
|
||||||
|
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|||||||
+1
@@ -21,6 +21,7 @@ struct NoticeRoomTimelineItem: TextBasedRoomTimelineItem, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
let isThreaded: Bool
|
let isThreaded: Bool
|
||||||
|
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|||||||
+1
@@ -22,6 +22,7 @@ struct TextRoomTimelineItem: TextBasedRoomTimelineItem, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
|
|
||||||
let isThreaded: Bool
|
let isThreaded: Bool
|
||||||
|
|
||||||
|
|||||||
+1
@@ -22,6 +22,7 @@ struct VideoRoomTimelineItem: EventBasedMessageTimelineItemProtocol, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
let isThreaded: Bool
|
let isThreaded: Bool
|
||||||
|
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|||||||
+1
@@ -64,6 +64,7 @@ struct VoiceRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
timestamp: "Now",
|
timestamp: "Now",
|
||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: true,
|
||||||
isThreaded: false,
|
isThreaded: false,
|
||||||
sender: .init(id: "Bob"),
|
sender: .init(id: "Bob"),
|
||||||
content: .init(body: "audio.ogg",
|
content: .init(body: "audio.ogg",
|
||||||
|
|||||||
+1
@@ -21,6 +21,7 @@ struct VoiceRoomTimelineItem: EventBasedMessageTimelineItemProtocol, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
let isThreaded: Bool
|
let isThreaded: Bool
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|
||||||
|
|||||||
+1
@@ -29,6 +29,7 @@ struct EncryptedRoomTimelineItem: EventBasedTimelineItemProtocol, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
|
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|
||||||
|
|||||||
+1
@@ -23,6 +23,7 @@ struct PollRoomTimelineItem: Equatable, EventBasedTimelineItemProtocol {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
var properties: RoomTimelineItemProperties
|
var properties: RoomTimelineItemProperties
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -23,6 +23,7 @@ struct RedactedRoomTimelineItem: EventBasedTimelineItemProtocol, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
|
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|
||||||
|
|||||||
+1
@@ -22,6 +22,7 @@ struct StateRoomTimelineItem: EventBasedTimelineItemProtocol, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
|
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|
||||||
|
|||||||
+1
@@ -22,6 +22,7 @@ struct StickerRoomTimelineItem: EventBasedTimelineItemProtocol, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
|
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|
||||||
|
|||||||
+1
@@ -26,6 +26,7 @@ struct UnsupportedRoomTimelineItem: EventBasedTimelineItemProtocol, Equatable {
|
|||||||
let timestamp: String
|
let timestamp: String
|
||||||
let isOutgoing: Bool
|
let isOutgoing: Bool
|
||||||
let isEditable: Bool
|
let isEditable: Bool
|
||||||
|
let canBeRepliedTo: Bool
|
||||||
|
|
||||||
let sender: TimelineItemSender
|
let sender: TimelineItemSender
|
||||||
|
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
properties: RoomTimelineItemProperties())
|
properties: RoomTimelineItemProperties())
|
||||||
}
|
}
|
||||||
@@ -142,6 +143,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
imageURL: imageURL,
|
imageURL: imageURL,
|
||||||
width: width,
|
width: width,
|
||||||
@@ -172,6 +174,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
properties: RoomTimelineItemProperties())
|
properties: RoomTimelineItemProperties())
|
||||||
}
|
}
|
||||||
@@ -183,6 +186,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
properties: RoomTimelineItemProperties())
|
properties: RoomTimelineItemProperties())
|
||||||
}
|
}
|
||||||
@@ -196,6 +200,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
isThreaded: isThreaded,
|
isThreaded: isThreaded,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
content: buildTextTimelineItemContent(messageContent),
|
content: buildTextTimelineItemContent(messageContent),
|
||||||
@@ -215,6 +220,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
isThreaded: isThreaded,
|
isThreaded: isThreaded,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
content: buildImageTimelineItemContent(messageContent),
|
content: buildImageTimelineItemContent(messageContent),
|
||||||
@@ -234,6 +240,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
isThreaded: isThreaded,
|
isThreaded: isThreaded,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
content: buildVideoTimelineItemContent(messageContent),
|
content: buildVideoTimelineItemContent(messageContent),
|
||||||
@@ -253,6 +260,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
isThreaded: isThreaded,
|
isThreaded: isThreaded,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
content: buildAudioTimelineItemContent(messageContent),
|
content: buildAudioTimelineItemContent(messageContent),
|
||||||
@@ -272,6 +280,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
isThreaded: isThreaded,
|
isThreaded: isThreaded,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
content: buildAudioTimelineItemContent(messageContent),
|
content: buildAudioTimelineItemContent(messageContent),
|
||||||
@@ -291,6 +300,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
isThreaded: isThreaded,
|
isThreaded: isThreaded,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
content: buildFileTimelineItemContent(messageContent),
|
content: buildFileTimelineItemContent(messageContent),
|
||||||
@@ -310,6 +320,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
isThreaded: isThreaded,
|
isThreaded: isThreaded,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
content: buildNoticeTimelineItemContent(messageContent),
|
content: buildNoticeTimelineItemContent(messageContent),
|
||||||
@@ -329,6 +340,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
isThreaded: isThreaded,
|
isThreaded: isThreaded,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
content: buildEmoteTimelineItemContent(senderDisplayName: eventItemProxy.sender.displayName, senderID: eventItemProxy.sender.id, messageContent: messageContent),
|
content: buildEmoteTimelineItemContent(senderDisplayName: eventItemProxy.sender.displayName, senderID: eventItemProxy.sender.id, messageContent: messageContent),
|
||||||
@@ -348,6 +360,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
isThreaded: isThreaded,
|
isThreaded: isThreaded,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
content: buildLocationTimelineItemContent(messageContent),
|
content: buildLocationTimelineItemContent(messageContent),
|
||||||
@@ -398,6 +411,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: eventItemProxy.isEditable,
|
isEditable: eventItemProxy.isEditable,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
sender: eventItemProxy.sender,
|
sender: eventItemProxy.sender,
|
||||||
properties: RoomTimelineItemProperties(isEdited: false,
|
properties: RoomTimelineItemProperties(isEdited: false,
|
||||||
reactions: aggregateReactions(eventItemProxy.reactions),
|
reactions: aggregateReactions(eventItemProxy.reactions),
|
||||||
@@ -587,6 +601,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
timestamp: eventItemProxy.timestamp.formatted(date: .omitted, time: .shortened),
|
||||||
isOutgoing: isOutgoing,
|
isOutgoing: isOutgoing,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
|
canBeRepliedTo: eventItemProxy.canBeRepliedTo,
|
||||||
sender: eventItemProxy.sender)
|
sender: eventItemProxy.sender)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -614,6 +629,9 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let replyContent: EventBasedMessageTimelineItemContentType
|
let replyContent: EventBasedMessageTimelineItemContentType
|
||||||
|
|
||||||
|
switch timelineItem.kind() {
|
||||||
|
case .message:
|
||||||
switch timelineItem.asMessage()?.msgtype() {
|
switch timelineItem.asMessage()?.msgtype() {
|
||||||
case .audio(let content):
|
case .audio(let content):
|
||||||
if appSettings.voiceMessageEnabled, content.voice != nil {
|
if appSettings.voiceMessageEnabled, content.voice != nil {
|
||||||
@@ -636,7 +654,14 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
|||||||
case .location(let content):
|
case .location(let content):
|
||||||
replyContent = .location(buildLocationTimelineItemContent(content))
|
replyContent = .location(buildLocationTimelineItemContent(content))
|
||||||
case .none:
|
case .none:
|
||||||
return nil
|
replyContent = .text(.init(body: L10n.commonUnsupportedEvent))
|
||||||
|
}
|
||||||
|
case .poll(let question, _, _, _, _, _):
|
||||||
|
replyContent = .text(.init(body: question))
|
||||||
|
case .sticker(let body, _, _):
|
||||||
|
replyContent = .text(.init(body: body))
|
||||||
|
default:
|
||||||
|
replyContent = .text(.init(body: L10n.commonUnsupportedEvent))
|
||||||
}
|
}
|
||||||
|
|
||||||
return .loaded(sender: sender, contentType: replyContent)
|
return .loaded(sender: sender, contentType: replyContent)
|
||||||
|
|||||||
Reference in New Issue
Block a user