diff --git a/ios/RocketChat Watch App/Client/Responses/AttachmentResponse.swift b/ios/RocketChat Watch App/Client/Responses/AttachmentResponse.swift index 5a9865f3d..d68701d0f 100644 --- a/ios/RocketChat Watch App/Client/Responses/AttachmentResponse.swift +++ b/ios/RocketChat Watch App/Client/Responses/AttachmentResponse.swift @@ -1,12 +1,16 @@ import Foundation struct AttachmentResponse: Codable, Hashable { + let title: String? let imageURL: URL? + let audioURL: URL? let description: String? let dimensions: Dimensions? enum CodingKeys: String, CodingKey { case imageURL = "image_url" + case audioURL = "audio_url" + case title case description case dimensions = "image_dimensions" } diff --git a/ios/RocketChat Watch App/Client/Responses/MessageResponse.swift b/ios/RocketChat Watch App/Client/Responses/MessageResponse.swift index fa8351f34..8a10cee6f 100644 --- a/ios/RocketChat Watch App/Client/Responses/MessageResponse.swift +++ b/ios/RocketChat Watch App/Client/Responses/MessageResponse.swift @@ -9,4 +9,5 @@ struct MessageResponse: Codable, Hashable { let attachments: [AttachmentResponse]? let t: String? let groupable: Bool? + let editedAt: Date? } diff --git a/ios/RocketChat Watch App/Database/RocketChat.xcdatamodeld/RocketChat.xcdatamodel/contents b/ios/RocketChat Watch App/Database/RocketChat.xcdatamodeld/RocketChat.xcdatamodel/contents index 2b1d98675..4fcd47ca0 100644 --- a/ios/RocketChat Watch App/Database/RocketChat.xcdatamodeld/RocketChat.xcdatamodel/contents +++ b/ios/RocketChat Watch App/Database/RocketChat.xcdatamodeld/RocketChat.xcdatamodel/contents @@ -2,12 +2,14 @@ + + diff --git a/ios/RocketChat Watch App/Database/RocketChatDatabase.swift b/ios/RocketChat Watch App/Database/RocketChatDatabase.swift index bf8b2e67e..d79a135f7 100644 --- a/ios/RocketChat Watch App/Database/RocketChatDatabase.swift +++ b/ios/RocketChat Watch App/Database/RocketChatDatabase.swift @@ -80,9 +80,9 @@ final class RocketChatDatabase: Database { return message } - func createAttachment(url: String) -> Attachment { + func createAttachment(identifier: String) -> Attachment { let attachment = Attachment(context: viewContext) - attachment.imageURL = URL(string: url) + attachment.id = identifier return attachment } @@ -140,9 +140,9 @@ final class RocketChatDatabase: Database { return try? viewContext.fetch(request).first } - func attachment(url: String) -> Attachment? { + func attachment(identifier: String) -> Attachment? { let request = Attachment.fetchRequest() - request.predicate = NSPredicate(format: "imageURL == %@", url) + request.predicate = NSPredicate(format: "id == %@", identifier) return try? viewContext.fetch(request).first } @@ -169,6 +169,7 @@ final class RocketChatDatabase: Database { message.user = user message.t = updatedMessage.t message.groupable = updatedMessage.groupable ?? true + message.editedAt = updatedMessage.editedAt updatedMessage.attachments?.forEach { attachment in process(updatedAttachment: attachment, in: message) @@ -178,11 +179,13 @@ final class RocketChatDatabase: Database { } func process(updatedAttachment: AttachmentResponse, in message: Message) { - guard let url = updatedAttachment.imageURL?.absoluteString else { + let identifier = updatedAttachment.imageURL ?? updatedAttachment.audioURL + + guard let identifier = identifier?.absoluteString ?? updatedAttachment.title else { return } - let attachment = attachment(url: url) ?? createAttachment(url: url) + let attachment = attachment(identifier: identifier) ?? createAttachment(identifier: identifier) attachment.msg = updatedAttachment.description attachment.message = message diff --git a/ios/RocketChat Watch App/Localizable.xcstrings b/ios/RocketChat Watch App/Localizable.xcstrings index b26d8836e..d5d3cb705 100644 --- a/ios/RocketChat Watch App/Localizable.xcstrings +++ b/ios/RocketChat Watch App/Localizable.xcstrings @@ -1,6 +1,9 @@ { "sourceLanguage" : "en", "strings" : { + "Attachment not supported." : { + + }, "Delete" : { }, diff --git a/ios/RocketChat Watch App/Views/AttachmentView.swift b/ios/RocketChat Watch App/Views/AttachmentView.swift index 572db3957..2deb89f83 100644 --- a/ios/RocketChat Watch App/Views/AttachmentView.swift +++ b/ios/RocketChat Watch App/Views/AttachmentView.swift @@ -1,36 +1,38 @@ import SwiftUI struct AttachmentView: View { - private let attachment: Attachment - private let client: RocketChatClientProtocol + @Dependency private var client: RocketChatClientProtocol - init(attachment: Attachment, client: RocketChatClientProtocol) { + private let attachment: Attachment + + init(attachment: Attachment) { self.attachment = attachment - self.client = client } var body: some View { - if let rawURL = attachment.imageURL { - VStack(alignment: .leading) { - if let msg = attachment.msg { - Text(msg) - .font(.caption) - .foregroundStyle(.white) - } - AsyncImage(url: client.authorizedURL(url: rawURL)) { image in - image - .resizable() - .scaledToFit() - } placeholder: { - Rectangle() - .foregroundStyle(.secondary) - .aspectRatio(attachment.aspectRatio, contentMode: .fit) - .overlay(ProgressView()) - } - .cornerRadius(4) + VStack(alignment: .leading) { + if let msg = attachment.msg { + Text(msg) + .font(.caption) + .foregroundStyle(.white) + } + if let rawURL = attachment.imageURL { + AsyncImage(url: client.authorizedURL(url: rawURL)) { image in + image + .resizable() + .scaledToFit() + } placeholder: { + Rectangle() + .foregroundStyle(.secondary) + .aspectRatio(attachment.aspectRatio, contentMode: .fit) + .overlay(ProgressView()) + } + .cornerRadius(4) + } else { + Text("Attachment not supported.") + .font(.caption.italic()) + .foregroundStyle(.primary) } - } else { - EmptyView() } } } diff --git a/ios/RocketChat Watch App/Views/MessageView.swift b/ios/RocketChat Watch App/Views/MessageView.swift index 04a460e92..e97ada46a 100644 --- a/ios/RocketChat Watch App/Views/MessageView.swift +++ b/ios/RocketChat Watch App/Views/MessageView.swift @@ -70,6 +70,11 @@ struct MessageView: View { .lineLimit(1) .font(.footnote) .foregroundStyle(.secondary) + if viewModel.message.editedAt != nil { + Image(systemName: "pencil") + .font(.caption) + .foregroundStyle(.secondary) + } } } if let text = viewModel.info { @@ -77,7 +82,7 @@ struct MessageView: View { .font(.caption.italic()) .foregroundStyle(.primary) } else if let text = viewModel.message.msg { - HStack { + HStack(alignment: .top) { Text(text) .font(.caption) .foregroundStyle(viewModel.message.status == "temp" ? .secondary : .primary) @@ -95,11 +100,17 @@ struct MessageView: View { ) .buttonStyle(PlainButtonStyle()) } + + if viewModel.message.editedAt != nil && !viewModel.isHeader { + Image(systemName: "pencil") + .font(.caption) + .foregroundStyle(.secondary) + } } } if let attachments = viewModel.message.attachments?.allObjects as? Array { ForEach(attachments) { attachment in - AttachmentView(attachment: attachment, client: client) + AttachmentView(attachment: attachment) } } }