diff --git a/Riot.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Riot.xcworkspace/xcshareddata/swiftpm/Package.resolved index 102f87715..34484b0a7 100644 --- a/Riot.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Riot.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -23,7 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/matrix-org/matrix-wysiwyg-composer-swift", "state" : { - "revision" : "534ee5bae5e8de69ed398937b5edb7b5f21551d2" + "revision" : "6927cb878376136c4a03d919b689af8dfbdad080", + "version" : "0.19.0" } }, { diff --git a/RiotSwiftUI/Modules/Room/Composer/LinkAction/Model/ComposerLinkActionModel.swift b/RiotSwiftUI/Modules/Room/Composer/LinkAction/Model/ComposerLinkActionModel.swift index b47c5bcd5..fdf92cab5 100644 --- a/RiotSwiftUI/Modules/Room/Composer/LinkAction/Model/ComposerLinkActionModel.swift +++ b/RiotSwiftUI/Modules/Room/Composer/LinkAction/Model/ComposerLinkActionModel.swift @@ -59,20 +59,31 @@ extension ComposerLinkActionViewState { } var isSaveButtonDisabled: Bool { - guard isValidLink else { return true } + guard !bindings.linkUrl.isEmpty else { return true } switch linkAction { case .createWithText: return bindings.text.isEmpty - default: return false + case .create: return false + case .edit: return !bindings.hasEditedUrl } } - - private var isValidLink: Bool { - guard let url = URL(string: bindings.linkUrl) else { return false } - return UIApplication.shared.canOpenURL(url) - } } struct ComposerLinkActionBindings { var text: String - var linkUrl: String + + private let initialLinkUrl: String + fileprivate var hasEditedUrl = false + var linkUrl: String { + didSet { + if !hasEditedUrl && linkUrl != initialLinkUrl { + hasEditedUrl = true + } + } + } + + init(text: String, linkUrl: String) { + self.text = text + self.linkUrl = linkUrl + self.initialLinkUrl = linkUrl + } } diff --git a/RiotSwiftUI/Modules/Room/Composer/LinkAction/Test/UI/ComposerLinkActionUITests.swift b/RiotSwiftUI/Modules/Room/Composer/LinkAction/Test/UI/ComposerLinkActionUITests.swift index f30dacf30..c18405951 100644 --- a/RiotSwiftUI/Modules/Room/Composer/LinkAction/Test/UI/ComposerLinkActionUITests.swift +++ b/RiotSwiftUI/Modules/Room/Composer/LinkAction/Test/UI/ComposerLinkActionUITests.swift @@ -29,9 +29,7 @@ final class ComposerLinkActionUITests: MockScreenTestCase { let linkTextField = app.textFields["linkTextField"] XCTAssertTrue(linkTextField.exists) linkTextField.tap() - linkTextField.typeText("invalid url") - XCTAssertFalse(saveButton.isEnabled) - linkTextField.clearAndTypeText("https://element.io") + linkTextField.clearAndTypeText("element.io") XCTAssertTrue(saveButton.isEnabled) } @@ -47,7 +45,7 @@ final class ComposerLinkActionUITests: MockScreenTestCase { let linkTextField = app.textFields["linkTextField"] XCTAssertTrue(linkTextField.exists) linkTextField.tap() - linkTextField.typeText("https://element.io") + linkTextField.typeText("element.io") XCTAssertFalse(saveButton.isEnabled) textTextField.tap() textTextField.typeText("test") @@ -60,13 +58,15 @@ final class ComposerLinkActionUITests: MockScreenTestCase { XCTAssertTrue(app.buttons[VectorL10n.cancel].exists) let saveButton = app.buttons[VectorL10n.save] XCTAssertTrue(saveButton.exists) - XCTAssertTrue(saveButton.isEnabled) + XCTAssertFalse(saveButton.isEnabled) XCTAssertFalse(app.textFields["textTextField"].exists) let linkTextField = app.textFields["linkTextField"] XCTAssertTrue(linkTextField.exists) let value = linkTextField.value as? String XCTAssertEqual(value, "https://element.io") - linkTextField.clearAndTypeText("invalid url") + linkTextField.clearAndTypeText("") XCTAssertFalse(saveButton.isEnabled) + linkTextField.clearAndTypeText("matrix.org") + XCTAssertTrue(saveButton.isEnabled) } } diff --git a/RiotSwiftUI/Modules/Room/Composer/LinkAction/Test/Unit/ComposerLinkActionViewModelTests.swift b/RiotSwiftUI/Modules/Room/Composer/LinkAction/Test/Unit/ComposerLinkActionViewModelTests.swift index 40ad27358..2407eccc4 100644 --- a/RiotSwiftUI/Modules/Room/Composer/LinkAction/Test/Unit/ComposerLinkActionViewModelTests.swift +++ b/RiotSwiftUI/Modules/Room/Composer/LinkAction/Test/Unit/ComposerLinkActionViewModelTests.swift @@ -53,29 +53,20 @@ final class ComposerLinkActionViewModelTests: XCTestCase { } func testEditDefaultState() { - let link = "https://element.io" + let link = "element.io" setUp(with: .edit(link: link)) XCTAssertEqual(context.viewState.bindings.text, "") XCTAssertEqual(context.viewState.bindings.linkUrl, link) - XCTAssertFalse(context.viewState.isSaveButtonDisabled) + XCTAssertTrue(context.viewState.isSaveButtonDisabled) XCTAssertTrue(context.viewState.shouldDisplayRemoveButton) XCTAssertFalse(context.viewState.shouldDisplayTextField) XCTAssertEqual(context.viewState.title, VectorL10n.wysiwygComposerLinkActionEditTitle) } - func testUrlValidityCheck() { - setUp(with: .create) - XCTAssertTrue(context.viewState.isSaveButtonDisabled) - context.linkUrl = "invalid url" - XCTAssertTrue(context.viewState.isSaveButtonDisabled) - context.linkUrl = "https://element.io" - XCTAssertFalse(context.viewState.isSaveButtonDisabled) - } - func testTextNotEmptyCheck() { setUp(with: .createWithText) XCTAssertTrue(context.viewState.isSaveButtonDisabled) - context.linkUrl = "https://element.io" + context.linkUrl = "element.io" XCTAssertTrue(context.viewState.isSaveButtonDisabled) context.text = "text" XCTAssertFalse(context.viewState.isSaveButtonDisabled) @@ -92,7 +83,7 @@ final class ComposerLinkActionViewModelTests: XCTestCase { } func testRemoveAction() { - setUp(with: .edit(link: "https://element.io")) + setUp(with: .edit(link: "element.io")) var result: ComposerLinkActionViewModelResult! viewModel.callback = { value in result = value @@ -107,7 +98,7 @@ final class ComposerLinkActionViewModelTests: XCTestCase { viewModel.callback = { value in result = value } - let link = "https://element.io" + let link = "element.io" context.linkUrl = link context.send(viewAction: .save) XCTAssertEqual(result, .performOperation(.setLink(urlString: link))) @@ -119,7 +110,7 @@ final class ComposerLinkActionViewModelTests: XCTestCase { viewModel.callback = { value in result = value } - let link = "https://element.io" + let link = "element.io" context.linkUrl = link let text = "test" context.text = text @@ -128,13 +119,15 @@ final class ComposerLinkActionViewModelTests: XCTestCase { } func testSaveActionForEdit() { - setUp(with: .edit(link: "https://element.io")) + setUp(with: .edit(link: "element.io")) var result: ComposerLinkActionViewModelResult! viewModel.callback = { value in result = value } - let link = "https://matrix.org" + XCTAssertTrue(context.viewState.isSaveButtonDisabled) + let link = "matrix.org" context.linkUrl = link + XCTAssertFalse(context.viewState.isSaveButtonDisabled) context.send(viewAction: .save) XCTAssertEqual(result, .performOperation(.setLink(urlString: link))) } diff --git a/project.yml b/project.yml index f2c4dbc23..fe9af33a8 100644 --- a/project.yml +++ b/project.yml @@ -53,7 +53,7 @@ packages: branch: main WysiwygComposer: url: https://github.com/matrix-org/matrix-wysiwyg-composer-swift - revision: 534ee5bae5e8de69ed398937b5edb7b5f21551d2 + version: 0.19.0 DeviceKit: url: https://github.com/devicekit/DeviceKit majorVersion: 4.7.0