diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 5dd62b0e4..ca0dbb827 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 182BC47727C4CD6D00A30C33 /* ActivityDismissal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 182BC46E27C4CD6D00A30C33 /* ActivityDismissal.swift */; }; 182BC47927C4CE2200A30C33 /* LabelledActivityIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 182BC47827C4CE2200A30C33 /* LabelledActivityIndicatorView.swift */; }; 182BC47B27C4D05200A30C33 /* FullscreenLoadingActivityPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 182BC47A27C4D05200A30C33 /* FullscreenLoadingActivityPresenter.swift */; }; + 182BC48127C4EBBB00A30C33 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 182BC48027C4EBBB00A30C33 /* Kingfisher */; }; 1850253F27B6918D002E6B18 /* ElementXTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1850253E27B6918D002E6B18 /* ElementXTests.swift */; }; 1850254927B6918D002E6B18 /* ElementXUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1850254827B6918D002E6B18 /* ElementXUITests.swift */; }; 1850254B27B6918D002E6B18 /* ElementXUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1850254A27B6918D002E6B18 /* ElementXUITestsLaunchTests.swift */; }; @@ -154,6 +155,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 182BC48127C4EBBB00A30C33 /* Kingfisher in Frameworks */, 1863A3FC27BA5A9100B52E4D /* KeychainAccess in Frameworks */, 1850255927B69388002E6B18 /* MatrixRustSDK in Frameworks */, 1863A40627BA6DFC00B52E4D /* SwiftyBeaver in Frameworks */, @@ -489,6 +491,7 @@ 1850255827B69388002E6B18 /* MatrixRustSDK */, 1863A3FB27BA5A9100B52E4D /* KeychainAccess */, 1863A40527BA6DFC00B52E4D /* SwiftyBeaver */, + 182BC48027C4EBBB00A30C33 /* Kingfisher */, ); productName = ElementX; productReference = 1850252427B6918C002E6B18 /* ElementX.app */; @@ -566,6 +569,7 @@ 1850255727B69388002E6B18 /* XCRemoteSwiftPackageReference "matrix-rust-components-swift" */, 1863A3FA27BA5A9100B52E4D /* XCRemoteSwiftPackageReference "KeychainAccess" */, 1863A40427BA6DFC00B52E4D /* XCRemoteSwiftPackageReference "SwiftyBeaver" */, + 182BC47F27C4EBBB00A30C33 /* XCRemoteSwiftPackageReference "Kingfisher" */, ); productRefGroup = 1850252527B6918C002E6B18 /* Products */; projectDirPath = ""; @@ -1021,6 +1025,14 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + 182BC47F27C4EBBB00A30C33 /* XCRemoteSwiftPackageReference "Kingfisher" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/onevcat/Kingfisher"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 7.0.0; + }; + }; 1850255727B69388002E6B18 /* XCRemoteSwiftPackageReference "matrix-rust-components-swift" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/matrix-org/matrix-rust-components-swift.git"; @@ -1048,6 +1060,11 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + 182BC48027C4EBBB00A30C33 /* Kingfisher */ = { + isa = XCSwiftPackageProductDependency; + package = 182BC47F27C4EBBB00A30C33 /* XCRemoteSwiftPackageReference "Kingfisher" */; + productName = Kingfisher; + }; 1850255827B69388002E6B18 /* MatrixRustSDK */ = { isa = XCSwiftPackageProductDependency; package = 1850255727B69388002E6B18 /* XCRemoteSwiftPackageReference "matrix-rust-components-swift" */; diff --git a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index e35f95b49..87eda342b 100644 --- a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -11,12 +11,12 @@ } }, { - "package": "MatrixRustSDK", - "repositoryURL": "https://github.com/matrix-org/matrix-rust-components-swift.git", + "package": "Kingfisher", + "repositoryURL": "https://github.com/onevcat/Kingfisher", "state": { - "branch": "main", - "revision": "cb680b1783849ecabd0bdf61f65faff767ce32c8", - "version": null + "branch": null, + "revision": "0c02c46cfdc0656ce74fd0963a75e5000a0b7f23", + "version": "7.1.2" } }, { diff --git a/ElementX/Sources/AppCoordinator.swift b/ElementX/Sources/AppCoordinator.swift index bc55d380d..93ad752ec 100644 --- a/ElementX/Sources/AppCoordinator.swift +++ b/ElementX/Sources/AppCoordinator.swift @@ -6,6 +6,7 @@ // import UIKit +import Kingfisher class AppCoordinator: AuthenticationCoordinatorDelegate, Coordinator { private let window: UIWindow @@ -76,7 +77,7 @@ class AppCoordinator: AuthenticationCoordinatorDelegate, Coordinator { } let parameters = HomeScreenCoordinatorParameters(userSession: userSession) - let coordinator = HomeScreenCoordinator(parameters: parameters) + let coordinator = HomeScreenCoordinator(parameters: parameters, imageCache: ImageCache.default) coordinator.completion = { [weak self] result in switch result { diff --git a/ElementX/Sources/Modules/Authentication/UserSession.swift b/ElementX/Sources/Modules/Authentication/UserSession.swift index 0a742e86a..70e2c5727 100644 --- a/ElementX/Sources/Modules/Authentication/UserSession.swift +++ b/ElementX/Sources/Modules/Authentication/UserSession.swift @@ -50,7 +50,7 @@ class UserSession: ClientDelegate { } } - func getUserAvatar(_ completion: @escaping (Result) -> Void) { + func loadUserAvatar(_ completion: @escaping (Result) -> Void) { DispatchQueue.global(qos: .background).async { do { let avatarData = try self.client.avatar() diff --git a/ElementX/Sources/Modules/HomeScreen/HomeScreenCoordinator.swift b/ElementX/Sources/Modules/HomeScreen/HomeScreenCoordinator.swift index e714b9eec..ac47ba31e 100644 --- a/ElementX/Sources/Modules/HomeScreen/HomeScreenCoordinator.swift +++ b/ElementX/Sources/Modules/HomeScreen/HomeScreenCoordinator.swift @@ -16,6 +16,7 @@ import SwiftUI import Combine +import Kingfisher struct HomeScreenCoordinatorParameters { let userSession: UserSession @@ -45,11 +46,11 @@ final class HomeScreenCoordinator: Coordinator, Presentable { // MARK: - Setup - init(parameters: HomeScreenCoordinatorParameters) { + init(parameters: HomeScreenCoordinatorParameters, imageCache: Kingfisher.ImageCache) { self.parameters = parameters let userDisplayName = self.parameters.userSession.userDisplayName ?? self.parameters.userSession.userIdentifier - viewModel = HomeScreenViewModel(userDisplayName: userDisplayName) + viewModel = HomeScreenViewModel(userDisplayName: userDisplayName, imageCache: imageCache) let view = HomeScreen(context: viewModel.context) hostingController = UIHostingController(rootView: view) @@ -61,7 +62,7 @@ final class HomeScreenCoordinator: Coordinator, Presentable { case .logout: self.completion?(.logout) case .loadUserAvatar: - self.parameters.userSession.getUserAvatar({ result in + self.parameters.userSession.loadUserAvatar({ result in switch result { case .success(let avatar): self.viewModel.updateWithUserAvatar(avatar) diff --git a/ElementX/Sources/Modules/HomeScreen/HomeScreenModels.swift b/ElementX/Sources/Modules/HomeScreen/HomeScreenModels.swift index a483d96d5..687906ede 100644 --- a/ElementX/Sources/Modules/HomeScreen/HomeScreenModels.swift +++ b/ElementX/Sources/Modules/HomeScreen/HomeScreenModels.swift @@ -33,6 +33,7 @@ struct HomeScreenViewState: BindableState { var userAvatar: UIImage? var rooms: [HomeScreenRoom] = [] + var isLoadingRooms: Bool = false var directRooms: [HomeScreenRoom] { rooms.filter { $0.isDirect } diff --git a/ElementX/Sources/Modules/HomeScreen/HomeScreenViewModel.swift b/ElementX/Sources/Modules/HomeScreen/HomeScreenViewModel.swift index 56c0858bd..78c2a518b 100644 --- a/ElementX/Sources/Modules/HomeScreen/HomeScreenViewModel.swift +++ b/ElementX/Sources/Modules/HomeScreen/HomeScreenViewModel.swift @@ -15,6 +15,7 @@ // import SwiftUI +import Kingfisher @available(iOS 14, *) typealias HomeScreenViewModelType = StateStoreViewModel) -> Void) { + func loadAvatar(_ completion: (Result) -> Void) { completion(.success(UIImage(systemName: "wand.and.stars"))) } } diff --git a/ElementX/Sources/Modules/Models/RoomModel.swift b/ElementX/Sources/Modules/Models/RoomModel.swift index dc61fa86e..74eb96714 100644 --- a/ElementX/Sources/Modules/Models/RoomModel.swift +++ b/ElementX/Sources/Modules/Models/RoomModel.swift @@ -74,7 +74,7 @@ struct RoomModel: RoomModelProtocol { return URL(string: urlString) } - func getAvatar(_ completion: @escaping (Result) -> Void) { + func loadAvatar(_ completion: @escaping (Result) -> Void) { DispatchQueue.global(qos: .background).async { do { let avatarData = try room.avatar() diff --git a/ElementX/Sources/Modules/Models/RoomModelProtocol.swift b/ElementX/Sources/Modules/Models/RoomModelProtocol.swift index 4bb5b8318..35466b8d7 100644 --- a/ElementX/Sources/Modules/Models/RoomModelProtocol.swift +++ b/ElementX/Sources/Modules/Models/RoomModelProtocol.swift @@ -22,5 +22,5 @@ protocol RoomModelProtocol { var avatarURL: URL? { get } - func getAvatar(_ completion: @escaping (Result) -> Void) + func loadAvatar(_ completion: @escaping (Result) -> Void) }