mirror of
https://github.com/vector-im/element-ios.git
synced 2024-09-29 07:42:40 +00:00
Merge pull request #7281 from vector-im/mauroromito/rte_links_improvements
Rich Text Editor: Link Improvements
This commit is contained in:
commit
52f79934ec
7 changed files with 40 additions and 34 deletions
|
@ -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"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
1
changelog.d/7279.change
Normal 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
1
changelog.d/7280.change
Normal 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.
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue