|  |  |  | import SessionUtilitiesKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public extension VisibleMessage { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @objc(SNLinkPreview) | 
					
						
							|  |  |  |     class LinkPreview : NSObject, NSCoding { | 
					
						
							|  |  |  |         public var title: String? | 
					
						
							|  |  |  |         public var url: String? | 
					
						
							|  |  |  |         public var attachmentID: String? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public var isValid: Bool { title != nil && url != nil && attachmentID != nil } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         internal init(title: String?, url: String, attachmentID: String?) { | 
					
						
							|  |  |  |             self.title = title | 
					
						
							|  |  |  |             self.url = url | 
					
						
							|  |  |  |             self.attachmentID = attachmentID | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public required init?(coder: NSCoder) { | 
					
						
							|  |  |  |             if let title = coder.decodeObject(forKey: "title") as! String? { self.title = title } | 
					
						
							|  |  |  |             if let url = coder.decodeObject(forKey: "urlString") as! String? { self.url = url } | 
					
						
							|  |  |  |             if let attachmentID = coder.decodeObject(forKey: "attachmentID") as! String? { self.attachmentID = attachmentID } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public func encode(with coder: NSCoder) { | 
					
						
							|  |  |  |             coder.encode(title, forKey: "title") | 
					
						
							|  |  |  |             coder.encode(url, forKey: "urlString") | 
					
						
							|  |  |  |             coder.encode(attachmentID, forKey: "attachmentID") | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public static func fromProto(_ proto: SNProtoDataMessagePreview) -> LinkPreview? { | 
					
						
							|  |  |  |             let title = proto.title | 
					
						
							|  |  |  |             let url = proto.url | 
					
						
							|  |  |  |             return LinkPreview(title: title, url: url, attachmentID: nil) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public func toProto() -> SNProtoDataMessagePreview? { | 
					
						
							|  |  |  |             preconditionFailure("Use toProto(using:) instead.") | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public func toProto(using transaction: YapDatabaseReadWriteTransaction) -> SNProtoDataMessagePreview? { | 
					
						
							|  |  |  |             guard let url = url else { | 
					
						
							|  |  |  |                 SNLog("Couldn't construct link preview proto from: \(self).") | 
					
						
							|  |  |  |                 return nil | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             let linkPreviewProto = SNProtoDataMessagePreview.builder(url: url) | 
					
						
							|  |  |  |             if let title = title { linkPreviewProto.setTitle(title) } | 
					
						
							|  |  |  |             if let attachmentID = attachmentID, let stream = TSAttachment.fetch(uniqueId: attachmentID, transaction: transaction) as? TSAttachmentStream, | 
					
						
							|  |  |  |                 let attachmentProto = stream.buildProto() { | 
					
						
							|  |  |  |                 linkPreviewProto.setImage(attachmentProto) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             do { | 
					
						
							|  |  |  |                 return try linkPreviewProto.build() | 
					
						
							|  |  |  |             } catch { | 
					
						
							|  |  |  |                 SNLog("Couldn't construct link preview proto from: \(self).") | 
					
						
							|  |  |  |                 return nil | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // MARK: Description | 
					
						
							|  |  |  |         public override var description: String { | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  |             LinkPreview( | 
					
						
							|  |  |  |                 title: \(title ?? "null"), | 
					
						
							|  |  |  |                 url: \(url ?? "null"), | 
					
						
							|  |  |  |                 attachmentID: \(attachmentID ?? "null") | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             """
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |