Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions FlowCrypt/Controllers/Inbox/InboxRenderable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ struct InboxRenderable {
}

let title: String
let messageCount: Int
let subtitle: String
let dateString: String
var isRead: Bool
Expand Down Expand Up @@ -43,6 +44,7 @@ extension InboxRenderable {
extension InboxRenderable {
init(message: Message) {
self.title = message.sender ?? "message_unknown_sender".localized
self.messageCount = 1
self.subtitle = message.subject ?? "message_missed_subject".localized
self.dateString = DateFormatter().formatDate(message.date)
self.isRead = message.isMessageRead
Expand All @@ -55,12 +57,9 @@ extension InboxRenderable {
.compactMap { $0.components(separatedBy: "@").first ?? "" }
.unique()
.joined(separator: ",")
let messagesCount = thread.messages.count
let amount = messagesCount == 1
? ""
: " (\(messagesCount))"

self.title = sender + amount
self.title = sender
self.messageCount = thread.messages.count
self.subtitle = thread.subject ?? "message_missed_subject".localized

if let date = thread.messages.first?.date {
Expand Down
1 change: 0 additions & 1 deletion FlowCrypt/Controllers/Inbox/InboxViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import AsyncDisplayKit
import FlowCryptCommon
import FlowCryptUI
import Promises
import Foundation

final class InboxViewController: ASDKViewController<ASDisplayNode> {
Expand Down
5 changes: 5 additions & 0 deletions FlowCrypt/Controllers/Inbox/InboxViewDecorator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ extension InboxCellNode.Input {

self.init(
emailText: NSAttributedString.text(from: email, style: style, color: textColor),
countText: {
guard element.messageCount > 1 else { return nil }
let count = element.messageCount > 99 ? "99+" : String(element.messageCount)
return NSAttributedString.text(from: "(\(count))", style: style, color: textColor)
}(),
dateText: NSAttributedString.text(from: date, style: style, color: dateColor),
messageText: NSAttributedString.text(from: msg, style: style, color: textColor)
)
Expand Down
23 changes: 15 additions & 8 deletions FlowCrypt/Controllers/Threads/ThreadDetailsViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,14 @@ extension ThreadDetailsViewController {
let message = input[indexPath.section].rawMessage
logger.logInfo("Start loading message")

showSpinner("loading_title".localized, isUserInteractionEnabled: true)
handleFetchProgress(state: .fetch)

Task {
do {
let processedMessage = try await messageService.getAndProcessMessage(
with: message,
folder: thread.path
folder: thread.path,
progressHandler: { [weak self] in self?.handleFetchProgress(state: $0) }
)
handleReceived(message: processedMessage, at: indexPath)
} catch {
Expand Down Expand Up @@ -214,18 +215,13 @@ extension ThreadDetailsViewController {
}

private func handlePassPhraseEntry(rawMimeData: Data, with passPhrase: String, at indexPath: IndexPath) {
let message = input[indexPath.section].rawMessage

showSpinner("loading_title".localized, isUserInteractionEnabled: true)

Task {
do {
let matched = try await messageService.checkAndPotentiallySaveEnteredPassPhrase(passPhrase)
if matched {
let processedMessage = try await messageService.getAndProcessMessage(
with: message,
folder: thread.path
)
let processedMessage = try await messageService.decryptAndProcessMessage(mime: rawMimeData)
handleReceived(message: processedMessage, at: indexPath)
} else {
handleWrongPathPhrase(for: rawMimeData, with: passPhrase, at: indexPath)
Expand All @@ -248,6 +244,17 @@ extension ThreadDetailsViewController {
}
}
}

private func handleFetchProgress(state: MessageFetchState) {
switch state {
case .fetch:
showSpinner("loading_title".localized, isUserInteractionEnabled: true)
case .download(let progress):
updateSpinner(label: "downloading_title".localized, progress: progress)
case .decrypt:
updateSpinner(label: "decrypting_title".localized)
}
}
}

extension ThreadDetailsViewController: MessageActionsHandler {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ final class MessageService {
passPhraseService.savePassPhrasesInMemory(passPhrase, for: matchingKeys)
return matchingKeys.isNotEmpty
}

func validateMessage(rawMimeData: Data, with passPhrase: String) async throws -> ProcessedMessage {
let keys = try await keyService.getPrvKeyInfo()
guard keys.isNotEmpty else {
Expand All @@ -121,8 +121,16 @@ final class MessageService {
return try await processMessage(rawMimeData: rawMimeData, with: decrypted, keys: keys)
}

func getAndProcessMessage(with input: Message, folder: String) async throws -> ProcessedMessage {
let rawMimeData = try await messageProvider.fetchMsg(message: input, folder: folder, progressHandler: nil)
func getAndProcessMessage(
with input: Message,
folder: String,
progressHandler: ((MessageFetchState) -> Void)?
) async throws -> ProcessedMessage {
let rawMimeData = try await messageProvider.fetchMsg(
message: input,
folder: folder,
progressHandler: progressHandler
)
return try await decryptAndProcessMessage(mime: rawMimeData)
}

Expand Down
25 changes: 21 additions & 4 deletions FlowCryptUI/Cell Nodes/InboxCellNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,35 @@ import AsyncDisplayKit
public final class InboxCellNode: CellNode {
public struct Input {
public let emailText: NSAttributedString
public let countText: NSAttributedString?
public let dateText: NSAttributedString
public let messageText: NSAttributedString?

public init(
emailText: NSAttributedString,
countText: NSAttributedString?,
dateText: NSAttributedString,
messageText: NSAttributedString?
) {
self.emailText = emailText
self.countText = countText
self.dateText = dateText
self.messageText = messageText
}
}

private let emailNode = ASTextNode2()
private let countNode: ASTextNode2?
private let dateNode = ASTextNode2()
private lazy var messageNode: ASTextNode2? = ASTextNode2()
private let separatorNode = ASDisplayNode()

public init(input: Input) {
countNode = input.countText.map({
let node = ASTextNode2()
node.attributedText = $0
return node
})
super.init()
emailNode.attributedText = input.emailText
dateNode.attributedText = input.dateText
Expand All @@ -48,25 +57,33 @@ public final class InboxCellNode: CellNode {
}

public override func layoutSpecThatFits(_: ASSizeRange) -> ASLayoutSpec {
let emailElement: ASLayoutElement = {
guard let countNode = countNode else { return emailNode }
emailNode.style.flexShrink = 1.0
let spec = ASStackLayoutSpec.horizontal()
spec.children = [emailNode, countNode]
spec.spacing = 5
return spec
}()

let nameLocationStack = ASStackLayoutSpec.vertical()
nameLocationStack.spacing = 6
nameLocationStack.style.flexShrink = 1.0
nameLocationStack.style.flexGrow = 1.0
separatorNode.style.flexGrow = 1.0
separatorNode.style.preferredSize.height = 1.0


if let messageNode = messageNode {
nameLocationStack.children = [emailNode, messageNode]
nameLocationStack.children = [emailElement, messageNode]
} else {
nameLocationStack.children = [emailNode]
nameLocationStack.children = [emailElement]
}

let headerStackSpec = ASStackLayoutSpec(
direction: .horizontal,
spacing: 8,
justifyContent: .start,
alignItems: .baselineFirst,
alignItems: .start,
children: [nameLocationStack, dateNode]
)

Expand Down