Skip to content
54 changes: 44 additions & 10 deletions FlowCrypt/App/AppContext.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class AppContext {
let passPhraseService: PassPhraseServiceType
let clientConfigurationService: ClientConfigurationServiceType

private init(
init(
encryptedStorage: EncryptedStorageType,
session: SessionType?,
userAccountService: SessionServiceType,
Expand Down Expand Up @@ -78,16 +78,18 @@ class AppContext {
)
}

func withSession(_ session: SessionType?) -> AppContext {
return AppContext(
encryptedStorage: self.encryptedStorage,
func withSession(session: SessionType?, authType: AuthType, user: User) -> AppContextWithUser {
return AppContextWithUser(
encryptedStorage: encryptedStorage,
session: session,
userAccountService: self.userAccountService,
dataService: self.dataService,
keyService: self.keyService,
passPhraseService: self.passPhraseService,
clientConfigurationService: self.clientConfigurationService,
globalRouter: globalRouter
userAccountService: userAccountService,
dataService: dataService,
keyService: keyService,
passPhraseService: passPhraseService,
clientConfigurationService: clientConfigurationService,
globalRouter: globalRouter,
authType: authType,
user: user
)
}

Expand Down Expand Up @@ -131,3 +133,35 @@ class AppContext {
)
}
}

class AppContextWithUser: AppContext {
let authType: AuthType
let user: User

init(
encryptedStorage: EncryptedStorageType,
session: SessionType?,
userAccountService: SessionServiceType,
dataService: DataServiceType,
keyService: KeyServiceType,
passPhraseService: PassPhraseServiceType,
clientConfigurationService: ClientConfigurationServiceType,
globalRouter: GlobalRouterType,
authType: AuthType,
user: User
) {
self.authType = authType
self.user = user

super.init(
encryptedStorage: encryptedStorage,
session: session,
userAccountService: userAccountService,
dataService: dataService,
keyService: keyService,
passPhraseService: passPhraseService,
clientConfigurationService: clientConfigurationService,
globalRouter: globalRouter
)
}
}
15 changes: 6 additions & 9 deletions FlowCrypt/Controllers/Compose/ComposeViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ final class ComposeViewController: TableNodeViewController {
case topDivider, subject, subjectDivider, text
}

private let appContext: AppContext
private let appContext: AppContextWithUser
private let composeMessageService: ComposeMessageService
private let notificationCenter: NotificationCenter
private let decorator: ComposeViewDecorator
Expand Down Expand Up @@ -88,7 +88,7 @@ final class ComposeViewController: TableNodeViewController {
}

init(
appContext: AppContext,
appContext: AppContextWithUser,
notificationCenter: NotificationCenter = .default,
decorator: ComposeViewDecorator = ComposeViewDecorator(),
input: ComposeMessageInput = .empty,
Expand All @@ -100,14 +100,11 @@ final class ComposeViewController: TableNodeViewController {
keyMethods: KeyMethodsType = KeyMethods()
) {
self.appContext = appContext
guard let email = appContext.dataService.email else {
fatalError("missing current user email") // todo - need a more elegant solution
}
self.email = email
self.email = appContext.user.email
self.notificationCenter = notificationCenter
self.input = input
self.decorator = decorator
let clientConfiguration = appContext.clientConfigurationService.getSaved(for: email)
let clientConfiguration = appContext.clientConfigurationService.getSaved(for: appContext.user.email)
self.contactsService = contactsService ?? ContactsService(
localContactsProvider: LocalContactsProvider(
encryptedStorage: appContext.encryptedStorage
Expand All @@ -116,7 +113,7 @@ final class ComposeViewController: TableNodeViewController {
)
let cloudContactProvider = cloudContactProvider ?? UserContactsProvider(
userService: GoogleUserService(
currentUserEmail: email,
currentUserEmail: appContext.user.email,
appDelegateGoogleSessionContainer: UIApplication.shared.delegate as? AppDelegate
)
)
Expand All @@ -126,7 +123,7 @@ final class ComposeViewController: TableNodeViewController {
encryptedStorage: appContext.encryptedStorage,
messageGateway: appContext.getRequiredMailProvider().messageSender,
passPhraseService: appContext.passPhraseService,
sender: email
sender: appContext.user.email
)
self.filesManager = filesManager
self.photosManager = photosManager
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,24 +29,19 @@ final class InboxViewContainerController: TableNodeViewController {
case loadedFolders([FolderViewModel])
}

let appContext: AppContext
let appContext: AppContextWithUser
let foldersService: FoldersServiceType
let decorator: InboxViewControllerContainerDecorator
let currentUser: User

private var state: State = .loading {
didSet { handleNewState() }
}

init(
appContext: AppContext,
appContext: AppContextWithUser,
foldersService: FoldersServiceType? = nil,
decorator: InboxViewControllerContainerDecorator = InboxViewControllerContainerDecorator()
) {
guard let currentUser = appContext.dataService.currentUser else {
fatalError("missing current user") // todo - use DI
}
self.currentUser = currentUser
self.appContext = appContext
self.foldersService = foldersService ?? appContext.getFoldersService()
self.decorator = decorator
Expand All @@ -68,7 +63,7 @@ final class InboxViewContainerController: TableNodeViewController {
private func fetchInboxFolder() {
Task {
do {
let folders = try await foldersService.fetchFolders(isForceReload: true, for: self.currentUser)
let folders = try await foldersService.fetchFolders(isForceReload: true, for: appContext.user)
self.handleFetched(folders: folders)
} catch {
self.state = .error(error)
Expand Down Expand Up @@ -107,7 +102,10 @@ final class InboxViewContainerController: TableNodeViewController {
return
}
let input = InboxViewModel(inbox)
let inboxViewController = InboxViewControllerFactory.make(appContext: appContext, with: input)
let inboxViewController = InboxViewControllerFactory.make(
appContext: appContext,
viewModel: input
)
navigationController?.setViewControllers([inboxViewController], animated: false)
}
}
Expand Down
12 changes: 4 additions & 8 deletions FlowCrypt/Controllers/Inbox/InboxViewController+Factory.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,8 @@ import UIKit

class InboxViewControllerFactory {
@MainActor
static func make(appContext: AppContext, with viewModel: InboxViewModel) -> InboxViewController {
guard let currentAuthType = appContext.dataService.currentAuthType else {
fatalError("Internal inconsistency")
}

switch currentAuthType {
static func make(appContext: AppContextWithUser, viewModel: InboxViewModel) -> InboxViewController {
switch appContext.authType {
case .oAuthGmail:
// Inject threads provider - Gmail API
guard let threadsProvider = appContext.getRequiredMailProvider().messagesThreadProvider else {
Expand All @@ -25,7 +21,7 @@ class InboxViewControllerFactory {

return InboxViewController(
appContext: appContext,
viewModel,
viewModel: viewModel,
numberOfInboxItemsToLoad: 20, // else timeouts happen
provider: InboxMessageThreadsProvider(provider: threadsProvider)
)
Expand All @@ -35,7 +31,7 @@ class InboxViewControllerFactory {

return InboxViewController(
appContext: appContext,
viewModel,
viewModel: viewModel,
numberOfInboxItemsToLoad: 50, // safe to load 50, single call on IMAP
provider: provider
)
Expand Down
15 changes: 5 additions & 10 deletions FlowCrypt/Controllers/Inbox/InboxViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ final class InboxViewController: ViewController {

private let numberOfInboxItemsToLoad: Int

private let appContext: AppContext
private let user: User
private let appContext: AppContextWithUser
private let service: ServiceActor
private let decorator: InboxViewDecorator
private let draftsListProvider: DraftsListProvider?
Expand All @@ -34,17 +33,13 @@ final class InboxViewController: ViewController {
var path: String { viewModel.path }

init(
appContext: AppContext,
_ viewModel: InboxViewModel,
appContext: AppContextWithUser,
viewModel: InboxViewModel,
numberOfInboxItemsToLoad: Int = 50,
provider: InboxDataProvider,
draftsListProvider: DraftsListProvider? = nil,
decorator: InboxViewDecorator = InboxViewDecorator()
) {
guard let user = appContext.dataService.currentUser else {
fatalError("missing current user") // todo - DI user
}
self.user = user
self.appContext = appContext
self.viewModel = viewModel
self.numberOfInboxItemsToLoad = numberOfInboxItemsToLoad
Expand Down Expand Up @@ -186,7 +181,7 @@ extension InboxViewController {
folderPath: viewModel.path,
count: numberOfInboxItemsToLoad,
pagination: currentMessagesListPagination()
), userEmail: user.email
), userEmail: appContext.user.email
)
handleEndFetching(with: context, context: batchContext)
} catch {
Expand All @@ -208,7 +203,7 @@ extension InboxViewController {
folderPath: viewModel.path,
count: messagesToLoad(),
pagination: pagination
), userEmail: user.email
), userEmail: appContext.user.email
)
state = .fetched(context.pagination)
handleEndFetching(with: context, context: batchContext)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import UIKit

@MainActor
protocol MsgListViewController {
func open(with message: InboxRenderable, path: String, appContext: AppContext)
func open(with message: InboxRenderable, path: String, appContext: AppContextWithUser)

func getUpdatedIndex(for message: InboxRenderable) -> Int?
func updateMessage(isRead: Bool, at index: Int)
Expand All @@ -20,7 +20,7 @@ protocol MsgListViewController {
extension MsgListViewController where Self: UIViewController {

// todo - tom - don't know how to add AppContext into init of protocol/extension
func open(with message: InboxRenderable, path: String, appContext: AppContext) {
func open(with message: InboxRenderable, path: String, appContext: AppContextWithUser) {
switch message.wrappedType {
case .message(let message):
openMsg(appContext: appContext, with: message, path: path)
Expand All @@ -30,13 +30,13 @@ extension MsgListViewController where Self: UIViewController {
}

// TODO: uncomment in "sent message from draft" feature
private func openDraft(appContext: AppContext, with message: Message) {
private func openDraft(appContext: AppContextWithUser, with message: Message) {
let controller = ComposeViewController(appContext: appContext)
controller.update(with: message)
navigationController?.pushViewController(controller, animated: true)
}

private func openMsg(appContext: AppContext, with message: Message, path: String) {
private func openMsg(appContext: AppContextWithUser, with message: Message, path: String) {
let thread = MessageThread(
identifier: message.threadId,
snippet: nil,
Expand All @@ -46,7 +46,7 @@ extension MsgListViewController where Self: UIViewController {
openThread(with: thread, appContext: appContext)
}

private func openThread(with thread: MessageThread, appContext: AppContext) {
private func openThread(with thread: MessageThread, appContext: AppContextWithUser) {
let viewController = ThreadDetailsViewController(
appContext: appContext,
thread: thread
Expand Down
9 changes: 2 additions & 7 deletions FlowCrypt/Controllers/Search/SearchViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,21 +41,16 @@ final class SearchViewController: TableNodeViewController {
// TODO: - https://github.com/FlowCrypt/flowcrypt-ios/issues/669 Adopt to gmail threads
private let service: ServiceActor
private var searchTask: DispatchWorkItem?
private let appContext: AppContext
private let appContext: AppContextWithUser
private let searchController = UISearchController(searchResultsController: nil)
private let folderPath: String
private var searchedExpression: String = ""
private let currentUser: User

init(
appContext: AppContext,
appContext: AppContextWithUser,
searchProvider: MessageSearchProvider? = nil,
folderPath: String
) {
guard let currentUser = appContext.dataService.currentUser else {
fatalError("no current user") // todo - use DI
}
self.currentUser = currentUser
self.appContext = appContext
self.service = ServiceActor(
searchProvider: searchProvider ?? appContext.getRequiredMailProvider().messageSearchProvider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,18 @@ import FlowCryptUI
*/
final class KeySettingsViewController: TableNodeViewController {

private let appContext: AppContext
private let appContext: AppContextWithUser
private var keys: [KeyDetails] = []
private let decorator: KeySettingsViewDecorator
private let isUsingKeyManager: Bool

init(
appContext: AppContext,
appContext: AppContextWithUser,
decorator: KeySettingsViewDecorator = KeySettingsViewDecorator()
) {
self.appContext = appContext
self.decorator = decorator
guard let currentUser = appContext.dataService.currentUser else {
fatalError("missing current user") // todo - need more elegant solution
}
self.isUsingKeyManager = appContext.clientConfigurationService.getSaved(for: currentUser.email).isUsingKeyManager
self.isUsingKeyManager = appContext.clientConfigurationService.getSaved(for: appContext.user.email).isUsingKeyManager
super.init(node: TableNode())
}

Expand Down
Loading