Various improvements

This commit is contained in:
Isaac
2025-02-25 14:46:07 +00:00
parent 92a6a73f6f
commit 1fb93ab298
29 changed files with 695 additions and 227 deletions

View File

@@ -37,6 +37,9 @@ public final class TextFieldComponent: Component {
public var currentEmojiSuggestion: EmojiSuggestion?
public var dismissedEmojiSuggestionPosition: EmojiSuggestion.Position?
public var currentEmojiSearch: EmojiSearch?
public var dismissedEmojiSearchPosition: EmojiSearch.Position?
public init() {
}
}
@@ -60,6 +63,25 @@ public final class TextFieldComponent: Component {
}
}
public final class EmojiSearch {
public struct Position: Equatable {
public var range: NSRange
public var value: String
}
public var localPosition: CGPoint
public var position: Position
public var disposable: Disposable?
public var value: Any?
init(localPosition: CGPoint, position: Position) {
self.localPosition = localPosition
self.position = position
self.disposable = nil
self.value = nil
}
}
public enum PasteData {
case sticker(image: UIImage, isMemoji: Bool)
case images([UIImage])
@@ -1248,6 +1270,51 @@ public final class TextFieldComponent: Component {
}
}
}
} else {
if let index = selectedSubstring.string.range(of: ":", options: .backwards) {
let queryRange = index.upperBound ..< selectedSubstring.string.endIndex
let query = String(selectedSubstring.string[queryRange])
if !query.isEmpty && !query.contains(where: { c in
for s in c.unicodeScalars {
if CharacterSet.whitespacesAndNewlines.contains(s) {
return true
}
}
return false
}) {
let beginning = self.textView.beginningOfDocument
let characterRange = NSRange(queryRange, in: selectedSubstring.string)
let start = self.textView.position(from: beginning, offset: characterRange.location)
let end = self.textView.position(from: beginning, offset: characterRange.location + characterRange.length)
if let start = start, let end = end, let textRange = self.textView.textRange(from: start, to: end) {
let selectionRects = self.textView.selectionRects(for: textRange)
let emojiSearchPosition = EmojiSearch.Position(range: characterRange, value: query)
hasTracking = true
if let trackingRect = selectionRects.first?.rect {
let trackingPosition = CGPoint(x: trackingRect.midX, y: trackingRect.minY)
if component.externalState.dismissedEmojiSearchPosition == emojiSearchPosition {
} else {
hasTrackingView = true
let emojiSearch: EmojiSearch
if let current = component.externalState.currentEmojiSearch, current.position.value == emojiSearchPosition.value {
emojiSearch = current
} else {
emojiSearch = EmojiSearch(localPosition: trackingPosition, position: emojiSearchPosition)
component.externalState.currentEmojiSearch = emojiSearch
}
emojiSearch.localPosition = trackingPosition
emojiSearch.position = emojiSearchPosition
component.externalState.dismissedEmojiSearchPosition = nil
}
}
}
}
}
}
}
if !hasTracking {