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)
|
let insertedInteraction: Interaction = try optimisticData.interaction.inserted(db)
|
||||||
self?.viewModel.associate(optimisticMessageId: optimisticData.id, to: insertedInteraction.id)
|
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 there is a LinkPreview draft then check the state of any existing link previews and
|
||||||
if
|
// insert a new one if needed
|
||||||
let linkPreviewDraft: LinkPreviewDraft = optimisticData.linkPreviewDraft,
|
if let linkPreviewDraft: LinkPreviewDraft = optimisticData.linkPreviewDraft {
|
||||||
(try? insertedInteraction.linkPreview.isEmpty(db)) == true
|
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(
|
try LinkPreview(
|
||||||
url: linkPreviewDraft.urlString,
|
url: linkPreviewDraft.urlString,
|
||||||
title: linkPreviewDraft.title,
|
title: linkPreviewDraft.title,
|
||||||
attachmentId: try optimisticData.linkPreviewAttachment?.inserted(db).id
|
attachmentId: try optimisticData.linkPreviewAttachment?.inserted(db).id
|
||||||
).insert(db)
|
).save(db)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there is a Quote the insert it now
|
// If there is a Quote the insert it now
|
||||||
|
|
|
@ -265,6 +265,24 @@ public class ConversationViewModel: OWSAudioPlayerDelegate {
|
||||||
.allCases
|
.allCases
|
||||||
.filter { $0 != .wasRead }
|
.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(
|
PagedData.ObservedChanges(
|
||||||
table: Contact.self,
|
table: Contact.self,
|
||||||
columns: [.isTrusted],
|
columns: [.isTrusted],
|
||||||
|
|
|
@ -467,7 +467,6 @@ final class VisibleMessageCell: MessageCell, TappableLabelDelegate {
|
||||||
subview.removeFromSuperview()
|
subview.removeFromSuperview()
|
||||||
}
|
}
|
||||||
albumView = nil
|
albumView = nil
|
||||||
albumView = nil
|
|
||||||
bodyTappableLabel = nil
|
bodyTappableLabel = nil
|
||||||
|
|
||||||
// Handle the deleted state first (it's much simpler than the others)
|
// 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
|
// MARK: - Protobuf
|
||||||
|
|
||||||
public extension LinkPreview {
|
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 let previewProto = proto.preview.first else { throw LinkPreviewError.noPreview }
|
||||||
guard URL(string: previewProto.url) != nil else { throw LinkPreviewError.invalidInput }
|
guard URL(string: previewProto.url) != nil else { throw LinkPreviewError.invalidInput }
|
||||||
guard LinkPreview.isValidLinkUrl(previewProto.url) 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 timestamp: TimeInterval = LinkPreview.timestampFor(sentTimestampMs: sentTimestampMs)
|
||||||
let maybeLinkPreview: LinkPreview? = try? LinkPreview
|
let maybeLinkPreview: LinkPreview? = try? LinkPreview
|
||||||
.filter(LinkPreview.Columns.url == previewProto.url)
|
.filter(LinkPreview.Columns.url == previewProto.url)
|
||||||
.filter(LinkPreview.Columns.timestamp == LinkPreview.timestampFor(
|
.filter(LinkPreview.Columns.timestamp == timestamp)
|
||||||
sentTimestampMs: Double(proto.timestamp)
|
|
||||||
))
|
|
||||||
.fetchOne(db)
|
.fetchOne(db)
|
||||||
|
|
||||||
if let linkPreview: LinkPreview = maybeLinkPreview {
|
if let linkPreview: LinkPreview = maybeLinkPreview {
|
||||||
|
|
|
@ -276,7 +276,6 @@ extension MessageReceiver {
|
||||||
let linkPreview: LinkPreview? = try? LinkPreview(
|
let linkPreview: LinkPreview? = try? LinkPreview(
|
||||||
db,
|
db,
|
||||||
proto: dataMessage,
|
proto: dataMessage,
|
||||||
body: message.text,
|
|
||||||
sentTimestampMs: (messageSentTimestamp * 1000)
|
sentTimestampMs: (messageSentTimestamp * 1000)
|
||||||
)?.saved(db)
|
)?.saved(db)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue