mirror of
https://github.com/oxen-io/session-ios.git
synced 2023-12-13 21:30:14 +01:00
Updated the HomeVC, SettingsVC and GlobalSearch UI to use theming Removed the "fade view" gradients from the various screens Added a simple log to the PagedDatabaseObserver to make debugging easier Updated the FullConversationCell to also show the "read" state for messages Updated the read receipt icons to use SFSymbols directly Updated the PlaceholderIcon to use the PrimaryColour's as it's colour options
114 lines
4.7 KiB
Swift
114 lines
4.7 KiB
Swift
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
|
|
|
|
import Foundation
|
|
import GRDB
|
|
import SessionUIKit
|
|
import SessionMessagingKit
|
|
|
|
public enum MentionUtilities {
|
|
public static func highlightMentionsNoAttributes(
|
|
in string: String,
|
|
threadVariant: SessionThread.Variant,
|
|
currentUserPublicKey: String,
|
|
currentUserBlindedPublicKey: String?
|
|
) -> String {
|
|
/// **Note:** We are returning the string here so the 'textColor' and 'primaryColor' values are irrelevant
|
|
return highlightMentions(
|
|
in: string,
|
|
threadVariant: threadVariant,
|
|
currentUserPublicKey: currentUserPublicKey,
|
|
currentUserBlindedPublicKey: currentUserBlindedPublicKey,
|
|
isOutgoingMessage: false,
|
|
textColor: .black,
|
|
primaryColor: Theme.PrimaryColor.green,
|
|
attributes: [:]
|
|
).string
|
|
}
|
|
|
|
public static func highlightMentions(
|
|
in string: String,
|
|
threadVariant: SessionThread.Variant,
|
|
currentUserPublicKey: String?,
|
|
currentUserBlindedPublicKey: String?,
|
|
isOutgoingMessage: Bool,
|
|
textColor: UIColor,
|
|
primaryColor: Theme.PrimaryColor,
|
|
attributes: [NSAttributedString.Key: Any]
|
|
) -> NSAttributedString {
|
|
guard
|
|
let regex: NSRegularExpression = try? NSRegularExpression(pattern: "@[0-9a-fA-F]{66}", options: [])
|
|
else {
|
|
return NSAttributedString(string: string)
|
|
}
|
|
|
|
var string = string
|
|
var lastMatchEnd: Int = 0
|
|
var mentions: [(range: NSRange, isCurrentUser: Bool)] = []
|
|
let currentUserPublicKeys: Set<String> = [
|
|
currentUserPublicKey,
|
|
currentUserBlindedPublicKey
|
|
]
|
|
.compactMap { $0 }
|
|
.asSet()
|
|
|
|
while let match: NSTextCheckingResult = regex.firstMatch(
|
|
in: string,
|
|
options: .withoutAnchoringBounds,
|
|
range: NSRange(location: lastMatchEnd, length: string.utf16.count - lastMatchEnd)
|
|
) {
|
|
guard let range: Range = Range(match.range, in: string) else { break }
|
|
|
|
let publicKey: String = String(string[range].dropFirst()) // Drop the @
|
|
let isCurrentUser: Bool = currentUserPublicKeys.contains(publicKey)
|
|
|
|
guard let targetString: String = {
|
|
guard !isCurrentUser else { return "MEDIA_GALLERY_SENDER_NAME_YOU".localized() }
|
|
guard let displayName: String = Profile.displayNameNoFallback(id: publicKey, threadVariant: threadVariant) else {
|
|
lastMatchEnd = (match.range.location + match.range.length)
|
|
return nil
|
|
}
|
|
|
|
return displayName
|
|
}()
|
|
else { continue }
|
|
|
|
string = string.replacingCharacters(in: range, with: "@\(targetString)")
|
|
lastMatchEnd = (match.range.location + targetString.utf16.count)
|
|
|
|
mentions.append((
|
|
// + 1 to include the @
|
|
range: NSRange(location: match.range.location, length: targetString.utf16.count + 1),
|
|
isCurrentUser: isCurrentUser
|
|
))
|
|
}
|
|
|
|
let sizeDiff: CGFloat = (Values.smallFontSize / Values.mediumFontSize)
|
|
let result: NSMutableAttributedString = NSMutableAttributedString(string: string, attributes: attributes)
|
|
mentions.forEach { mention in
|
|
result.addAttribute(.font, value: UIFont.boldSystemFont(ofSize: Values.smallFontSize), range: mention.range)
|
|
|
|
if mention.isCurrentUser {
|
|
// Note: The designs don't match with the dynamic sizing so these values need to be calculated
|
|
// to maintain a "rounded rect" effect rather than a "pill" effect
|
|
result.addAttribute(.currentUserMentionBackgroundCornerRadius, value: (8 * sizeDiff), range: mention.range)
|
|
result.addAttribute(.currentUserMentionBackgroundPadding, value: (3 * sizeDiff), range: mention.range)
|
|
result.addAttribute(.currentUserMentionBackgroundColor, value: primaryColor.color, range: mention.range)
|
|
result.addAttribute(
|
|
.foregroundColor,
|
|
value: UIColor.black, // Note: This text should always be black
|
|
range: mention.range
|
|
)
|
|
}
|
|
else {
|
|
result.addAttribute(
|
|
.foregroundColor,
|
|
value: (isOutgoingMessage ? primaryColor.color : textColor),
|
|
range: mention.range
|
|
)
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|
|
}
|