Various tweaks following code review

This commit is contained in:
Stefan Ceriu
2023-03-31 16:44:28 +03:00
committed by Stefan Ceriu
parent c27a56d231
commit 569e4761d9
19 changed files with 82 additions and 74 deletions

View File

@@ -27,7 +27,7 @@ final class AppSettings: ObservableObject {
case enableInAppNotifications
case pusherProfileTag
case shouldCollapseRoomStateEvents
case showStartChatFlow
case startChatFlowEnabled = "showStartChatFlow"
case mediaUploadingFlowEnabled
}
@@ -161,8 +161,8 @@ final class AppSettings: ObservableObject {
// MARK: Start Chat
@UserSetting(key: UserDefaultsKeys.showStartChatFlow.rawValue, defaultValue: false, persistIn: store)
var startChatFlowFeatureFlag
@UserSetting(key: UserDefaultsKeys.startChatFlowEnabled.rawValue, defaultValue: false, persistIn: store)
var startChatFlowEnabled
// MARK: Media Uploading

View File

@@ -328,23 +328,23 @@ class RoomProxyMock: RoomProxyProtocol {
}
//MARK: - sendImage
var sendImageBodyUrlCallsCount = 0
var sendImageBodyUrlCalled: Bool {
return sendImageBodyUrlCallsCount > 0
var sendImageUrlCallsCount = 0
var sendImageUrlCalled: Bool {
return sendImageUrlCallsCount > 0
}
var sendImageBodyUrlReceivedArguments: (body: String, url: URL)?
var sendImageBodyUrlReceivedInvocations: [(body: String, url: URL)] = []
var sendImageBodyUrlReturnValue: Result<Void, RoomProxyError>!
var sendImageBodyUrlClosure: ((String, URL) async -> Result<Void, RoomProxyError>)?
var sendImageUrlReceivedUrl: URL?
var sendImageUrlReceivedInvocations: [URL] = []
var sendImageUrlReturnValue: Result<Void, RoomProxyError>!
var sendImageUrlClosure: ((URL) async -> Result<Void, RoomProxyError>)?
func sendImage(body: String, url: URL) async -> Result<Void, RoomProxyError> {
sendImageBodyUrlCallsCount += 1
sendImageBodyUrlReceivedArguments = (body: body, url: url)
sendImageBodyUrlReceivedInvocations.append((body: body, url: url))
if let sendImageBodyUrlClosure = sendImageBodyUrlClosure {
return await sendImageBodyUrlClosure(body, url)
func sendImage(url: URL) async -> Result<Void, RoomProxyError> {
sendImageUrlCallsCount += 1
sendImageUrlReceivedUrl = url
sendImageUrlReceivedInvocations.append(url)
if let sendImageUrlClosure = sendImageUrlClosure {
return await sendImageUrlClosure(url)
} else {
return sendImageBodyUrlReturnValue
return sendImageUrlReturnValue
}
}
//MARK: - editMessage

View File

@@ -32,7 +32,7 @@ extension FileManager {
try createDirectory(at: url, withIntermediateDirectories: withIntermediateDirectories)
}
func copyFileToTemporaryLocation(url: URL) throws -> URL {
func copyFileToTemporaryDirectory(url: URL) throws -> URL {
let newURL = URL.temporaryDirectory.appendingPathComponent(url.lastPathComponent)
try? removeItem(at: newURL)
@@ -41,7 +41,7 @@ extension FileManager {
return newURL
}
func writeDataToTemporaryLocation(data: Data, fileName: String) throws -> URL {
func writeDataToTemporaryDirectory(data: Data, fileName: String) throws -> URL {
let newURL = URL.temporaryDirectory.appendingPathComponent(fileName)
try data.write(to: newURL)

View File

@@ -24,6 +24,6 @@ final class DeveloperOptionsScreenCoordinator: CoordinatorProtocol {
}
func toPresentable() -> AnyView {
AnyView(DeveloperOptionsScreenScreen(context: viewModel.context))
AnyView(DeveloperOptionsScreen(context: viewModel.context))
}
}

View File

@@ -24,12 +24,12 @@ struct DeveloperOptionsScreenViewState: BindableState {
struct DeveloperOptionsScreenViewStateBindings {
var shouldCollapseRoomStateEvents: Bool
var showStartChatFlow: Bool
var startChatFlowEnabled: Bool
var mediaUploadFlowEnabled: Bool
}
enum DeveloperOptionsScreenViewAction {
case changedShouldCollapseRoomStateEvents
case changedShowStartChatFlow
case changedShowMediaUploadFlow
case changedStartChatFlowEnabled
case changedMediaUploadFlowEnabled
}

View File

@@ -23,7 +23,7 @@ class DeveloperOptionsScreenViewModel: DeveloperOptionsScreenViewModelType, Deve
init() {
let bindings = DeveloperOptionsScreenViewStateBindings(shouldCollapseRoomStateEvents: ServiceLocator.shared.settings.shouldCollapseRoomStateEvents,
showStartChatFlow: ServiceLocator.shared.settings.startChatFlowFeatureFlag,
startChatFlowEnabled: ServiceLocator.shared.settings.startChatFlowEnabled,
mediaUploadFlowEnabled: ServiceLocator.shared.settings.mediaUploadingFlowEnabled)
let state = DeveloperOptionsScreenViewState(bindings: bindings)
@@ -38,9 +38,9 @@ class DeveloperOptionsScreenViewModel: DeveloperOptionsScreenViewModelType, Deve
switch viewAction {
case .changedShouldCollapseRoomStateEvents:
ServiceLocator.shared.settings.shouldCollapseRoomStateEvents = state.bindings.shouldCollapseRoomStateEvents
case .changedShowStartChatFlow:
ServiceLocator.shared.settings.startChatFlowFeatureFlag = state.bindings.showStartChatFlow
case .changedShowMediaUploadFlow:
case .changedStartChatFlowEnabled:
ServiceLocator.shared.settings.startChatFlowEnabled = state.bindings.startChatFlowEnabled
case .changedMediaUploadFlowEnabled:
ServiceLocator.shared.settings.mediaUploadingFlowEnabled = state.bindings.mediaUploadFlowEnabled
}
}

View File

@@ -16,7 +16,7 @@
import SwiftUI
struct DeveloperOptionsScreenScreen: View {
struct DeveloperOptionsScreen: View {
@ObservedObject var context: DeveloperOptionsScreenViewModel.Context
@State private var showConfetti = false
@@ -32,18 +32,18 @@ struct DeveloperOptionsScreenScreen: View {
context.send(viewAction: .changedShouldCollapseRoomStateEvents)
}
Toggle(isOn: $context.showStartChatFlow) {
Toggle(isOn: $context.startChatFlowEnabled) {
Text("Show Start Chat flow")
}
.onChange(of: context.showStartChatFlow) { _ in
context.send(viewAction: .changedShowStartChatFlow)
.onChange(of: context.startChatFlowEnabled) { _ in
context.send(viewAction: .changedStartChatFlowEnabled)
}
Toggle(isOn: $context.mediaUploadFlowEnabled) {
Text("Show Media Uploading flow")
}
.onChange(of: context.mediaUploadFlowEnabled) { _ in
context.send(viewAction: .changedShowMediaUploadFlow)
context.send(viewAction: .changedMediaUploadFlowEnabled)
}
}
@@ -86,6 +86,6 @@ struct DeveloperOptionsScreenScreen: View {
struct DeveloperOptionsScreen_Previews: PreviewProvider {
static var previews: some View {
let viewModel = DeveloperOptionsScreenViewModel()
DeveloperOptionsScreenScreen(context: viewModel.context)
DeveloperOptionsScreen(context: viewModel.context)
}
}

View File

@@ -69,8 +69,8 @@ struct HomeScreenViewState: BindableState {
var roomListMode: HomeScreenRoomListMode = .skeletons
var showStartChatFlowEnabled: Bool {
ServiceLocator.shared.settings.startChatFlowFeatureFlag
var startChatFlowEnabled: Bool {
ServiceLocator.shared.settings.startChatFlowEnabled
}
var visibleRooms: [HomeScreenRoom] {

View File

@@ -103,7 +103,7 @@ struct HomeScreen: View {
ToolbarItem(placement: .navigationBarLeading) {
userMenuButton
}
if context.viewState.showStartChatFlowEnabled {
if context.viewState.startChatFlowEnabled {
ToolbarItemGroup(placement: .bottomBar) {
Spacer()
newRoomButton

View File

@@ -15,12 +15,17 @@
//
import SwiftUI
import UIKit
enum CameraPickerAction {
case selectFile(URL)
case cancel
case error(Error?)
case error(CameraPickerError)
}
enum CameraPickerError: Error {
case invalidJpegData
case invalidOriginalImage
case failedWritingToTemporaryDirectory
}
struct CameraPicker: UIViewControllerRepresentable {
@@ -50,31 +55,31 @@ struct CameraPicker: UIViewControllerRepresentable {
}
final class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
private var parent: CameraPicker
private var cameraPicker: CameraPicker
init(_ parent: CameraPicker) {
self.parent = parent
init(_ cameraPicker: CameraPicker) {
self.cameraPicker = cameraPicker
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
if let videoURL = info[.mediaURL] as? URL {
parent.callback(.selectFile(videoURL))
cameraPicker.callback(.selectFile(videoURL))
} else if let image = info[.originalImage] as? UIImage {
guard let jpegData = image.jpegData(compressionQuality: 1.0) else {
parent.callback(.error(nil))
cameraPicker.callback(.error(.invalidJpegData))
return
}
let fileName = "\(UUID().uuidString).jpg"
let fileName = "\(Date.now.formatted(date: .abbreviated, time: .shortened)).jpg"
do {
let url = try FileManager.default.writeDataToTemporaryLocation(data: jpegData, fileName: fileName)
parent.callback(.selectFile(url))
let url = try FileManager.default.writeDataToTemporaryDirectory(data: jpegData, fileName: fileName)
cameraPicker.callback(.selectFile(url))
} catch {
parent.callback(.error(error))
cameraPicker.callback(.error(.failedWritingToTemporaryDirectory))
}
} else {
parent.callback(.error(nil))
cameraPicker.callback(.error(.invalidOriginalImage))
}
}
}

View File

@@ -15,12 +15,15 @@
//
import SwiftUI
import UIKit
enum DocumentPickerAction {
case selectFile(URL)
case cancel
case error(Error?)
case error(DocumentPickerError)
}
enum DocumentPickerError: Error {
case unknown
}
struct DocumentPicker: UIViewControllerRepresentable {
@@ -45,25 +48,25 @@ struct DocumentPicker: UIViewControllerRepresentable {
}
final class Coordinator: NSObject, UIDocumentPickerDelegate {
private var parent: DocumentPicker
private var documentPicker: DocumentPicker
init(_ parent: DocumentPicker) {
self.parent = parent
init(_ documentPicker: DocumentPicker) {
self.documentPicker = documentPicker
}
// MARK: UIDocumentPickerDelegate
func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
parent.callback(.cancel)
documentPicker.callback(.cancel)
}
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
guard let url = urls.first else {
parent.callback(.error(nil))
documentPicker.callback(.error(.unknown))
return
}
parent.callback(.selectFile(url))
documentPicker.callback(.selectFile(url))
}
}
}

View File

@@ -47,36 +47,36 @@ struct PhotoLibraryPicker: UIViewControllerRepresentable {
}
final class Coordinator: NSObject, PHPickerViewControllerDelegate {
private var parent: PhotoLibraryPicker
private var photoLibraryPicker: PhotoLibraryPicker
init(_ parent: PhotoLibraryPicker) {
self.parent = parent
init(_ photoLibraryPicker: PhotoLibraryPicker) {
self.photoLibraryPicker = photoLibraryPicker
}
// MARK: PHPickerViewControllerDelegate
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
guard let provider = results.first?.itemProvider else {
parent.callback(.cancel)
photoLibraryPicker.callback(.cancel)
return
}
provider.loadFileRepresentation(forTypeIdentifier: "public.item") { @MainActor [weak self] url, error in
provider.loadFileRepresentation(forTypeIdentifier: "public.item") { [weak self] url, error in
guard let url else {
self?.parent.callback(.error(error))
self?.photoLibraryPicker.callback(.error(error))
return
}
do {
let _ = url.startAccessingSecurityScopedResource()
let newURL = try FileManager.default.copyFileToTemporaryLocation(url: url)
let newURL = try FileManager.default.copyFileToTemporaryDirectory(url: url)
url.stopAccessingSecurityScopedResource()
Task { @MainActor in
self?.parent.callback(.selectFile(newURL))
self?.photoLibraryPicker.callback(.selectFile(newURL))
}
} catch {
self?.parent.callback(.error(error))
self?.photoLibraryPicker.callback(.error(error))
}
}
}

View File

@@ -51,6 +51,6 @@ final class MediaPickerPreviewScreenCoordinator: CoordinatorProtocol {
}
func toPresentable() -> AnyView {
AnyView(MediaPickerPreviewScreenScreen(context: viewModel.context))
AnyView(MediaPickerPreviewScreen(context: viewModel.context))
}
}

View File

@@ -17,7 +17,7 @@
import QuickLook
import SwiftUI
struct MediaPickerPreviewScreenScreen: View {
struct MediaPickerPreviewScreen: View {
@ObservedObject var context: MediaPickerPreviewScreenViewModel.Context
var body: some View {
@@ -105,6 +105,6 @@ private class PreviewItem: NSObject, QLPreviewItem {
struct MediaPickerPreviewScreen_Previews: PreviewProvider {
static let viewModel = MediaPickerPreviewScreenViewModel(url: URL.picturesDirectory, title: nil)
static var previews: some View {
MediaPickerPreviewScreenScreen(context: viewModel.context)
MediaPickerPreviewScreen(context: viewModel.context)
}
}

View File

@@ -194,7 +194,7 @@ class RoomProxy: RoomProxyProtocol {
try self.room.sendReply(msg: message, inReplyToEventId: eventID, txnId: transactionId)
} else {
let messageContent = messageEventContentFromMarkdown(md: message)
try self.room.send(msg: messageContent, txnId: transactionId)
self.room.send(msg: messageContent, txnId: transactionId)
}
} catch {
return .failure(.failedSendingMessage)
@@ -219,7 +219,7 @@ class RoomProxy: RoomProxyProtocol {
}
}
func sendImage(body: String, url: URL) async -> Result<Void, RoomProxyError> {
func sendImage(url: URL) async -> Result<Void, RoomProxyError> {
.failure(.failedSendingMedia)
}

View File

@@ -71,7 +71,7 @@ protocol RoomProxyProtocol {
func sendReaction(_ reaction: String, to eventID: String) async -> Result<Void, RoomProxyError>
func sendImage(body: String, url: URL) async -> Result<Void, RoomProxyError>
func sendImage(url: URL) async -> Result<Void, RoomProxyError>
func editMessage(_ newMessage: String, original eventID: String) async -> Result<Void, RoomProxyError>

View File

@@ -17,4 +17,4 @@
import ElementX
import XCTest
class DeveloperOptionsScreenScreenUITests: XCTestCase { }
class DeveloperOptionsScreenUITests: XCTestCase { }

View File

@@ -17,4 +17,4 @@
import ElementX
import XCTest
class MediaPickerPreviewScreenScreenUITests: XCTestCase { }
class MediaPickerPreviewScreenUITests: XCTestCase { }

View File

@@ -19,4 +19,4 @@ import XCTest
@testable import ElementX
@MainActor
class MediaPickerPreviewScreenScreenViewModelTests: XCTestCase { }
class MediaPickerPreviewScreenViewModelTests: XCTestCase { }