posting: fix issue with username and multiple emojis

Fixes issue where username with multiple emojis would place cursor in
strange position. Now properly moves the cursor to space past the
multiple emoji user name.

Any amount would be great. Not a complex issue to fix!

Tipjar: lnbc1pj0eddtpp5km07jgrfm47nfswqqp33ngv374gzad2hshkra7zm3l0cmpusnp3qdqqcqzzsxqyz5vqsp5rklkzj9upf32z3c3nmc9xg4pdlz5p5mp3s332ygefexf79tq8ucs9qyyssqxfh4kz3sg9zczsnj49w23aw35z87jwyx9m5su8kkyxlspyjk4ajy7vhxuw2rzw4lz8vfutfakm2rggvpzhzs9ehfus4nl683dl99f4sqgm9zkq
Changelog-Fixed: Fixes issue where username with multiple emojis would place cursor in strange position.
Signed-off-by: Jericho Hasselbush <jericho@sal-et-lucem.com>
Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
Jericho Hasselbush
2023-09-09 17:08:27 -04:00
committed by William Casarin
parent e30d38e69f
commit 8dad8e6703
2 changed files with 55 additions and 1 deletions

View File

@@ -47,7 +47,7 @@ struct UserSearch: View {
tagModel.diff = appended.tag.length - wordRange.length
focusWordAttributes = (nil, nil)
newCursorIndex = wordRange.location + appended.tag.string.count
newCursorIndex = wordRange.location + appended.tag.length
}
var body: some View {

View File

@@ -0,0 +1,54 @@
//
// Created by Jericho Hasselbush on 9/9/23.
//
// Test fix for https://github.com/damus-io/damus/issues/1525
// Only change in damus source is in UserSearch.swift
// UserSearch.appendUserTag
import XCTest
@testable import damus
final class UserSearchAppendTests: XCTestCase {
func testCursorShouldBeAtEndOfEmoji() throws {
let simpleTag = NSMutableAttributedString("@JB55")
let emojiTag = NSMutableAttributedString("@BTCapsule 🏴🧡")
let post = NSMutableAttributedString("A Post")
var cursorIndex: Int = 0
appendUserTag(withTag: simpleTag, post: post, word_range: .init(location: 0, length: 0), newCursorIndex: &cursorIndex, spy: simulatedCursor )
XCTAssertEqual(cursorIndex, simpleTag.length + 1) // +1 for past end of tag
cursorIndex = 0
appendUserTag(withTag: emojiTag, post: post, word_range: .init(location: 0, length: 0), newCursorIndex: &cursorIndex, spy: simulatedCursor)
XCTAssertEqual(cursorIndex, emojiTag.length + 1) // +1 for past end of tag
}
}
typealias CursorSpy = (Int, NSMutableAttributedString) -> Void
var simulatedCursor: CursorSpy = { cursorIndex, tag in
let tagWithSimulatedCursor = NSMutableAttributedString(attributedString: tag)
if tagWithSimulatedCursor.length < cursorIndex {
tagWithSimulatedCursor.append(.init(string: "|"))
} else {
tagWithSimulatedCursor.insert(.init(string: "|"), at: cursorIndex)
}
print(tagWithSimulatedCursor.string)
}
func appendUserTag(withTag tag: NSMutableAttributedString,
post: NSMutableAttributedString,
word_range: NSRange,
newCursorIndex: inout Int,
spy: CursorSpy = { _, _ in }) {
let appended = append_user_tag(tag: tag, post: post, word_range: word_range)
// faulty call
// newCursorIndex = word_range.location + appended.tag.string.count
// good call
newCursorIndex = word_range.location + appended.tag.length
spy(newCursorIndex, tag)
}