Merge pull request #7281 from vector-im/mauroromito/rte_links_improvements

Rich Text Editor: Link Improvements
This commit is contained in:
Velin92 2023-01-18 11:23:23 +01:00 committed by GitHub
commit 52f79934ec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 40 additions and 34 deletions

View file

@ -23,8 +23,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/matrix-org/matrix-wysiwyg-composer-swift",
"state" : {
"revision" : "e63034b57eeec1164e6cfcccf817f3b764b56a83",
"version" : "0.17.0"
"revision" : "6927cb878376136c4a03d919b689af8dfbdad080",
"version" : "0.19.0"
}
},
{

View file

@ -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
}
}

View file

@ -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)
}
}

View file

@ -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)))
}

1
changelog.d/7279.change Normal file
View file

@ -0,0 +1 @@
Rich Text Editor: https:// or mailto: scheme is automatically added when creating a link if no scheme is specified.

1
changelog.d/7280.change Normal file
View file

@ -0,0 +1 @@
Rich Text Editor: Adding a link over a blank selection, prompts the user to create a new link with new text to replace such selection.

View file

@ -53,7 +53,7 @@ packages:
branch: main
WysiwygComposer:
url: https://github.com/matrix-org/matrix-wysiwyg-composer-swift
version: 0.17.0
version: 0.19.0
DeviceKit:
url: https://github.com/devicekit/DeviceKit
majorVersion: 4.7.0