Merge pull request #904 from RyanRory/fix-link-preview-image
Fix link preview
This commit is contained in:
commit
dbfeaef006
|
@ -532,16 +532,34 @@ extension ConversationVC:
|
|||
let insertedInteraction: Interaction = try optimisticData.interaction.inserted(db)
|
||||
self?.viewModel.associate(optimisticMessageId: optimisticData.id, to: insertedInteraction.id)
|
||||
|
||||
// If there is a LinkPreview and it doesn't match an existing one then add it now
|
||||
if
|
||||
let linkPreviewDraft: LinkPreviewDraft = optimisticData.linkPreviewDraft,
|
||||
(try? insertedInteraction.linkPreview.isEmpty(db)) == true
|
||||
{
|
||||
try LinkPreview(
|
||||
url: linkPreviewDraft.urlString,
|
||||
title: linkPreviewDraft.title,
|
||||
attachmentId: try optimisticData.linkPreviewAttachment?.inserted(db).id
|
||||
).insert(db)
|
||||
// If there is a LinkPreview draft then check the state of any existing link previews and
|
||||
// insert a new one if needed
|
||||
if let linkPreviewDraft: LinkPreviewDraft = optimisticData.linkPreviewDraft {
|
||||
let invalidLinkPreviewAttachmentStates: [Attachment.State] = [
|
||||
.failedDownload, .pendingDownload, .downloading, .failedUpload, .invalid
|
||||
]
|
||||
let linkPreviewAttachmentId: String? = try? insertedInteraction.linkPreview
|
||||
.select(.attachmentId)
|
||||
.asRequest(of: String.self)
|
||||
.fetchOne(db)
|
||||
let linkPreviewAttachmentState: Attachment.State = linkPreviewAttachmentId
|
||||
.map {
|
||||
try? Attachment
|
||||
.filter(id: $0)
|
||||
.select(.state)
|
||||
.asRequest(of: Attachment.State.self)
|
||||
.fetchOne(db)
|
||||
}
|
||||
.defaulting(to: .invalid)
|
||||
|
||||
// If we don't have a "valid" existing link preview then upsert a new one
|
||||
if invalidLinkPreviewAttachmentStates.contains(linkPreviewAttachmentState) {
|
||||
try LinkPreview(
|
||||
url: linkPreviewDraft.urlString,
|
||||
title: linkPreviewDraft.title,
|
||||
attachmentId: try optimisticData.linkPreviewAttachment?.inserted(db).id
|
||||
).save(db)
|
||||
}
|
||||
}
|
||||
|
||||
// If there is a Quote the insert it now
|
||||
|
|
|
@ -265,6 +265,24 @@ public class ConversationViewModel: OWSAudioPlayerDelegate {
|
|||
.allCases
|
||||
.filter { $0 != .wasRead }
|
||||
),
|
||||
PagedData.ObservedChanges(
|
||||
table: Attachment.self,
|
||||
columns: [.state],
|
||||
joinToPagedType: {
|
||||
let interaction: TypedTableAlias<Interaction> = TypedTableAlias()
|
||||
let linkPreview: TypedTableAlias<LinkPreview> = TypedTableAlias()
|
||||
let linkPreviewAttachment: TypedTableAlias<Attachment> = TypedTableAlias()
|
||||
|
||||
return SQL("""
|
||||
LEFT JOIN \(LinkPreview.self) ON (
|
||||
\(linkPreview[.url]) = \(interaction[.linkPreviewUrl]) AND
|
||||
\(Interaction.linkPreviewFilterLiteral())
|
||||
)
|
||||
LEFT JOIN \(linkPreviewAttachment) ON \(linkPreviewAttachment[.id]) = \(linkPreview[.attachmentId])
|
||||
"""
|
||||
)
|
||||
}()
|
||||
),
|
||||
PagedData.ObservedChanges(
|
||||
table: Contact.self,
|
||||
columns: [.isTrusted],
|
||||
|
|
|
@ -467,7 +467,6 @@ final class VisibleMessageCell: MessageCell, TappableLabelDelegate {
|
|||
subview.removeFromSuperview()
|
||||
}
|
||||
albumView = nil
|
||||
albumView = nil
|
||||
bodyTappableLabel = nil
|
||||
|
||||
// Handle the deleted state first (it's much simpler than the others)
|
||||
|
|
|
@ -77,7 +77,7 @@ public struct LinkPreview: Codable, Equatable, Hashable, FetchableRecord, Persis
|
|||
// MARK: - Protobuf
|
||||
|
||||
public extension LinkPreview {
|
||||
init?(_ db: Database, proto: SNProtoDataMessage, body: String?, sentTimestampMs: TimeInterval) throws {
|
||||
init?(_ db: Database, proto: SNProtoDataMessage, sentTimestampMs: TimeInterval) throws {
|
||||
guard let previewProto = proto.preview.first else { throw LinkPreviewError.noPreview }
|
||||
guard URL(string: previewProto.url) != nil else { throw LinkPreviewError.invalidInput }
|
||||
guard LinkPreview.isValidLinkUrl(previewProto.url) else { throw LinkPreviewError.invalidInput }
|
||||
|
@ -86,9 +86,7 @@ public extension LinkPreview {
|
|||
let timestamp: TimeInterval = LinkPreview.timestampFor(sentTimestampMs: sentTimestampMs)
|
||||
let maybeLinkPreview: LinkPreview? = try? LinkPreview
|
||||
.filter(LinkPreview.Columns.url == previewProto.url)
|
||||
.filter(LinkPreview.Columns.timestamp == LinkPreview.timestampFor(
|
||||
sentTimestampMs: Double(proto.timestamp)
|
||||
))
|
||||
.filter(LinkPreview.Columns.timestamp == timestamp)
|
||||
.fetchOne(db)
|
||||
|
||||
if let linkPreview: LinkPreview = maybeLinkPreview {
|
||||
|
|
|
@ -276,7 +276,6 @@ extension MessageReceiver {
|
|||
let linkPreview: LinkPreview? = try? LinkPreview(
|
||||
db,
|
||||
proto: dataMessage,
|
||||
body: message.text,
|
||||
sentTimestampMs: (messageSentTimestamp * 1000)
|
||||
)?.saved(db)
|
||||
|
||||
|
|
Loading…
Reference in New Issue