mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Fix vCard external sharing
Fix author name in external messages sharing
This commit is contained in:
parent
a0a63101c8
commit
f2d16a948f
@ -91,13 +91,24 @@ private enum ExternalShareItemsState {
|
|||||||
private struct CollectableExternalShareItem {
|
private struct CollectableExternalShareItem {
|
||||||
let url: String?
|
let url: String?
|
||||||
let text: String
|
let text: String
|
||||||
let author: String?
|
let author: PeerId?
|
||||||
let timestamp: Int32?
|
let timestamp: Int32?
|
||||||
let mediaReference: AnyMediaReference?
|
let mediaReference: AnyMediaReference?
|
||||||
}
|
}
|
||||||
|
|
||||||
private func collectExternalShareItems(strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, postbox: Postbox, collectableItems: [CollectableExternalShareItem], takeOne: Bool = true) -> Signal<ExternalShareItemsState, NoError> {
|
private func collectExternalShareItems(strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, postbox: Postbox, collectableItems: [CollectableExternalShareItem], takeOne: Bool = true) -> Signal<ExternalShareItemsState, NoError> {
|
||||||
var signals: [Signal<ExternalShareItemStatus, NoError>] = []
|
var signals: [Signal<ExternalShareItemStatus, NoError>] = []
|
||||||
|
let authorsPeerIds = collectableItems.compactMap { $0.author }
|
||||||
|
let authorsPromise = Promise<[PeerId: String]>()
|
||||||
|
authorsPromise.set(postbox.transaction { transaction in
|
||||||
|
var result: [PeerId: String] = [:]
|
||||||
|
for peerId in authorsPeerIds {
|
||||||
|
if let title = transaction.getPeer(peerId)?.displayTitle {
|
||||||
|
result[peerId] = title
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
})
|
||||||
for item in collectableItems {
|
for item in collectableItems {
|
||||||
if let mediaReference = item.mediaReference, let file = mediaReference.media as? TelegramMediaFile {
|
if let mediaReference = item.mediaReference, let file = mediaReference.media as? TelegramMediaFile {
|
||||||
signals.append(collectExternalShareResource(postbox: postbox, resourceReference: mediaReference.resourceReference(file.resource), statsCategory: statsCategoryForFileWithAttributes(file.attributes))
|
signals.append(collectExternalShareResource(postbox: postbox, resourceReference: mediaReference.resourceReference(file.resource), statsCategory: statsCategoryForFileWithAttributes(file.attributes))
|
||||||
@ -174,9 +185,17 @@ private func collectExternalShareItems(strings: PresentationStrings, dateTimeFor
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let vCard = contactData.serializedVCard() {
|
if let vCard = contactData.serializedVCard() {
|
||||||
let path = NSTemporaryDirectory() + "\(arc4random64()).lz4v"
|
let fullName = [contact.firstName, contact.lastName].filter { !$0.isEmpty }.joined(separator: " ")
|
||||||
let fullName = [contact.firstName, contact.lastName].filter { $0.isEmpty }.joined(separator: " ")
|
let fileName = "\(fullName).vcf"
|
||||||
signals.append(.single(.done(.file(URL(fileURLWithPath: path), "\(fullName).vcf", "text/x-vcard"))))
|
let randomDirectory = UUID()
|
||||||
|
let safeFileName = fileName.replacingOccurrences(of: "/", with: "_")
|
||||||
|
let fileDirectory = NSTemporaryDirectory() + "\(randomDirectory)"
|
||||||
|
let _ = try? FileManager.default.createDirectory(at: URL(fileURLWithPath: fileDirectory), withIntermediateDirectories: true, attributes: nil)
|
||||||
|
let filePath = fileDirectory + "/\(safeFileName)"
|
||||||
|
let vCardData = vCard.data(using: .utf8)
|
||||||
|
if let _ = try? vCardData?.write(to: URL(fileURLWithPath: filePath)) {
|
||||||
|
signals.append(.single(.done(.file(URL(fileURLWithPath: filePath), fileName, "text/x-vcard"))))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let url = item.url, let parsedUrl = URL(string: url) {
|
if let url = item.url, let parsedUrl = URL(string: url) {
|
||||||
@ -186,18 +205,31 @@ private func collectExternalShareItems(strings: PresentationStrings, dateTimeFor
|
|||||||
}
|
}
|
||||||
if !item.text.isEmpty {
|
if !item.text.isEmpty {
|
||||||
if signals.isEmpty || !takeOne {
|
if signals.isEmpty || !takeOne {
|
||||||
var text: String = item.text
|
let author: Signal<String?, NoError>
|
||||||
var metadata: [String] = []
|
if let peerId = item.author {
|
||||||
if let author = item.author {
|
author = authorsPromise.get()
|
||||||
metadata.append(author)
|
|> take(1)
|
||||||
|
|> map { authors in
|
||||||
|
return authors[peerId]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
author = .single(nil)
|
||||||
}
|
}
|
||||||
if let timestamp = item.timestamp {
|
signals.append(author
|
||||||
metadata.append("[\(stringForFullDate(timestamp: timestamp, strings: strings, dateTimeFormat: dateTimeFormat))]")
|
|> map { author in
|
||||||
}
|
var text: String = item.text
|
||||||
if !metadata.isEmpty {
|
var metadata: [String] = []
|
||||||
text = metadata.joined(separator: ", ") + "\n" + text + "\n"
|
if let author = author {
|
||||||
}
|
metadata.append(author)
|
||||||
signals.append(.single(.done(.text(text))))
|
}
|
||||||
|
if let timestamp = item.timestamp {
|
||||||
|
metadata.append("[\(stringForFullDate(timestamp: timestamp, strings: strings, dateTimeFormat: dateTimeFormat))]")
|
||||||
|
}
|
||||||
|
if !metadata.isEmpty {
|
||||||
|
text = metadata.joined(separator: ", ") + "\n" + text + "\n"
|
||||||
|
}
|
||||||
|
return .done(.text(text))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -586,13 +618,16 @@ public final class ShareController: ViewController {
|
|||||||
url = "https://t.me/\(addressName)/\(message.id.id)"
|
url = "https://t.me/\(addressName)/\(message.id.id)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var peerId: PeerId?
|
let accountPeerId = strongSelf.currentAccount.peerId
|
||||||
if let authorPeerId = message.author?.id {
|
let authorPeerId: PeerId?
|
||||||
peerId = authorPeerId
|
if let author = message.effectiveAuthor {
|
||||||
} else if let mainPeer = messageMainPeer(message) {
|
authorPeerId = author.id
|
||||||
peerId = mainPeer.id
|
} else if message.effectivelyIncoming(accountPeerId) {
|
||||||
|
authorPeerId = message.id.peerId
|
||||||
|
} else {
|
||||||
|
authorPeerId = accountPeerId
|
||||||
}
|
}
|
||||||
collectableItems.append(CollectableExternalShareItem(url: url, text: message.text, author: nil, timestamp: message.timestamp, mediaReference: selectedMedia.flatMap({ AnyMediaReference.message(message: MessageReference(message), media: $0) })))
|
collectableItems.append(CollectableExternalShareItem(url: url, text: message.text, author: authorPeerId, timestamp: message.timestamp, mediaReference: selectedMedia.flatMap({ AnyMediaReference.message(message: MessageReference(message), media: $0) })))
|
||||||
}
|
}
|
||||||
case .fromExternal:
|
case .fromExternal:
|
||||||
break
|
break
|
||||||
|
Loading…
x
Reference in New Issue
Block a user