Various tweaks following code review
This commit is contained in:
committed by
Stefan Ceriu
parent
c27a56d231
commit
569e4761d9
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -24,6 +24,6 @@ final class DeveloperOptionsScreenCoordinator: CoordinatorProtocol {
|
||||
}
|
||||
|
||||
func toPresentable() -> AnyView {
|
||||
AnyView(DeveloperOptionsScreenScreen(context: viewModel.context))
|
||||
AnyView(DeveloperOptionsScreen(context: viewModel.context))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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] {
|
||||
|
||||
@@ -103,7 +103,7 @@ struct HomeScreen: View {
|
||||
ToolbarItem(placement: .navigationBarLeading) {
|
||||
userMenuButton
|
||||
}
|
||||
if context.viewState.showStartChatFlowEnabled {
|
||||
if context.viewState.startChatFlowEnabled {
|
||||
ToolbarItemGroup(placement: .bottomBar) {
|
||||
Spacer()
|
||||
newRoomButton
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +51,6 @@ final class MediaPickerPreviewScreenCoordinator: CoordinatorProtocol {
|
||||
}
|
||||
|
||||
func toPresentable() -> AnyView {
|
||||
AnyView(MediaPickerPreviewScreenScreen(context: viewModel.context))
|
||||
AnyView(MediaPickerPreviewScreen(context: viewModel.context))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -17,4 +17,4 @@
|
||||
import ElementX
|
||||
import XCTest
|
||||
|
||||
class DeveloperOptionsScreenScreenUITests: XCTestCase { }
|
||||
class DeveloperOptionsScreenUITests: XCTestCase { }
|
||||
@@ -17,4 +17,4 @@
|
||||
import ElementX
|
||||
import XCTest
|
||||
|
||||
class MediaPickerPreviewScreenScreenUITests: XCTestCase { }
|
||||
class MediaPickerPreviewScreenUITests: XCTestCase { }
|
||||
@@ -19,4 +19,4 @@ import XCTest
|
||||
@testable import ElementX
|
||||
|
||||
@MainActor
|
||||
class MediaPickerPreviewScreenScreenViewModelTests: XCTestCase { }
|
||||
class MediaPickerPreviewScreenViewModelTests: XCTestCase { }
|
||||
|
||||
Reference in New Issue
Block a user