Various fixes

This commit is contained in:
Ilya Laktyushin 2026-04-28 19:16:08 +02:00
parent d83734eb46
commit bde3418ce5
8 changed files with 45 additions and 34 deletions

View file

@ -42,7 +42,7 @@ private let markdownVoidHTMLTags: Set<String> = [
]
private struct MarkdownSafetyLimits {
let maxFileSize = 2_097_152
let maxFileSize = 524_288
let maxLineLength = 32_768
let maxBlockquoteDepth = 64
let maxListIndent = 96

View file

@ -204,7 +204,7 @@ final class ComposeTodoScreenComponent: Component {
for (id, itemView) in self.todoItemsSectionContainer.itemViews {
if let view = itemView.contents.view as? ListComposePollOptionComponent.View, !view.isRevealed && !view.currentText.isEmpty {
let viewFrame = view.convert(view.bounds, to: self.todoItemsSectionContainer)
let iconFrame = CGRect(origin: CGPoint(x: viewFrame.maxX - 40.0, y: viewFrame.minY), size: CGSize(width: viewFrame.height, height: viewFrame.height))
let iconFrame = CGRect(origin: CGPoint(x: viewFrame.minX, y: viewFrame.minY), size: CGSize(width: 50.0, height: viewFrame.height))
if iconFrame.contains(localPoint) {
return (id, itemView.contents)
}

View file

@ -345,6 +345,7 @@ public final class GiftItemComponent: Component {
private var selectionLayer: SimpleShapeLayer?
private var checkLayer: CheckLayer?
private var outlineLayer: SimpleLayer?
private var outlineRenderState: OutlineRenderState?
private var animationFile: TelegramMediaFile?
@ -361,6 +362,14 @@ public final class GiftItemComponent: Component {
private var giftAuctionTimer: SwiftSignalKit.Timer?
private struct OutlineRenderState: Equatable {
let size: CGSize
let cornerRadius: CGFloat
let outline: GiftItemComponent.Outline
let hasRibbon: Bool
let themeId: ObjectIdentifier
}
public var pattern: UIView? {
if let view = self.patternView.view {
return view
@ -1537,6 +1546,14 @@ public final class GiftItemComponent: Component {
if let outline = component.outline {
let lineWidth: CGFloat = 2.0
let outlineFrame = backgroundFrame
let hasRibbon = self.ribbon.layer.superlayer != nil
let outlineRenderState = OutlineRenderState(
size: outlineFrame.size,
cornerRadius: cornerRadius,
outline: outline,
hasRibbon: hasRibbon,
themeId: ObjectIdentifier(component.theme)
)
let outlineLayer: SimpleLayer
if let current = self.outlineLayer {
@ -1544,12 +1561,15 @@ public final class GiftItemComponent: Component {
} else {
outlineLayer = SimpleLayer()
self.outlineLayer = outlineLayer
if self.ribbon.layer.superlayer != nil {
self.layer.insertSublayer(outlineLayer, below: self.ribbon.layer)
} else {
self.layer.addSublayer(outlineLayer)
}
}
if hasRibbon {
self.layer.insertSublayer(outlineLayer, below: self.ribbon.layer)
} else if outlineLayer.superlayer == nil {
self.layer.addSublayer(outlineLayer)
}
if self.outlineRenderState != outlineRenderState {
let image = generateImage(outlineFrame.size, rotatedContext: { size, context in
context.clear(CGRect(origin: .zero, size: size))
@ -1588,11 +1608,13 @@ public final class GiftItemComponent: Component {
}
})
outlineLayer.contents = image?.cgImage
outlineLayer.frame = outlineFrame
self.outlineRenderState = outlineRenderState
}
transition.setFrame(layer: outlineLayer, frame: outlineFrame)
} else if let outlineLayer = self.outlineLayer {
self.outlineLayer = nil
self.outlineRenderState = nil
outlineLayer.removeFromSuperlayer()
}

View file

@ -698,13 +698,13 @@ final class ChatbotSetupScreenComponent: Component {
let iconSize = self.icon.update(
transition: .immediate,
component: AnyComponent(LottieComponent(
content: LottieComponent.AppBundleContent(name: "BotEmoji"),
content: LottieComponent.AppBundleContent(name: "ChatAutomation"),
loop: false
)),
environment: {},
containerSize: CGSize(width: 100.0, height: 100.0)
containerSize: CGSize(width: 140.0, height: 140.0)
)
let iconFrame = CGRect(origin: CGPoint(x: floor((availableSize.width - iconSize.width) * 0.5), y: contentHeight - 30.0), size: iconSize)
let iconFrame = CGRect(origin: CGPoint(x: floor((availableSize.width - iconSize.width) * 0.5), y: contentHeight - 50.0), size: iconSize)
if let iconView = self.icon.view as? LottieComponent.View {
if iconView.superview == nil {
self.scrollView.addSubview(iconView)

View file

@ -46,12 +46,12 @@ func leftNavigationButtonForChatInterfaceState(_ presentationInterfaceState: Cha
}
if canClear {
let buttonItem = UIBarButtonItem(title: "___clear", style: .plain, target: target, action: selector)
let buttonItem = UIBarButtonItem(title: strings.Conversation_ClearAll, style: .plain, target: target, action: selector)
buttonItem.accessibilityLabel = title
return ChatNavigationButton(action: .clearHistory, buttonItem: buttonItem)
} else {
title = strings.Conversation_ClearCache
let buttonItem = UIBarButtonItem(title: "___clear", style: .plain, target: target, action: selector)
let buttonItem = UIBarButtonItem(title: strings.Conversation_ClearCache, style: .plain, target: target, action: selector)
buttonItem.accessibilityLabel = title
return ChatNavigationButton(action: .clearCache, buttonItem: buttonItem)
}

View file

@ -604,20 +604,9 @@ private func refreshTextMentions(text: NSString, initialAttributedText: NSAttrib
}
}
private let textUrlEdgeCharacters: CharacterSet = {
var set: CharacterSet = .alphanumerics
set.formUnion(.symbols)
set.formUnion(.punctuationCharacters)
set.remove("(")
set.remove(")")
return set
}()
private let textUrlCharacters: CharacterSet = {
var set: CharacterSet = textUrlEdgeCharacters
set.formUnion(.whitespacesAndNewlines)
return set
}()
private func isTextUrlInnerCharacter(_ c: UnicodeScalar) -> Bool {
return alphanumericCharacters.contains(c) || c == " " as UnicodeScalar
}
private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributedString, attributedText: NSMutableAttributedString, fullRange: NSRange) {
var textUrlRanges: [(NSRange, ChatTextInputTextUrlAttribute)] = []
@ -635,7 +624,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed
var validLower = range.lowerBound
inner1: for i in range.lowerBound ..< range.upperBound {
if let c = UnicodeScalar(text.character(at: i)) {
if textUrlCharacters.contains(c) {
if isTextUrlInnerCharacter(c) {
validLower = i
break inner1
}
@ -646,7 +635,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed
var validUpper = range.upperBound
inner2: for i in (validLower ..< range.upperBound).reversed() {
if let c = UnicodeScalar(text.character(at: i)) {
if textUrlCharacters.contains(c) {
if isTextUrlInnerCharacter(c) {
validUpper = i + 1
break inner2
}
@ -658,7 +647,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed
let minLower = (i == 0) ? fullRange.lowerBound : textUrlRanges[i - 1].0.upperBound
inner3: for i in (minLower ..< validLower).reversed() {
if let c = UnicodeScalar(text.character(at: i)) {
if textUrlEdgeCharacters.contains(c) {
if alphanumericCharacters.contains(c) {
validLower = i
} else {
break inner3
@ -671,7 +660,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed
let maxUpper = (i == textUrlRanges.count - 1) ? fullRange.upperBound : textUrlRanges[i + 1].0.lowerBound
inner3: for i in validUpper ..< maxUpper {
if let c = UnicodeScalar(text.character(at: i)) {
if textUrlEdgeCharacters.contains(c) {
if alphanumericCharacters.contains(c) {
validUpper = i + 1
} else {
break inner3
@ -693,7 +682,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed
var combine = true
inner: for j in textUrlRanges[i].0.upperBound ..< textUrlRanges[i + 1].0.lowerBound {
if let c = UnicodeScalar(text.character(at: j)) {
if textUrlCharacters.contains(c) {
if isTextUrlInnerCharacter(c) {
} else {
combine = false
break inner