element-ios/Riot/Modules/Pills/PillTextAttachmentData.swift
2022-05-10 17:19:52 +02:00

110 lines
3.8 KiB
Swift

//
// Copyright 2022 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Foundation
import UIKit
/// Data associated with a Pill text attachment.
@available (iOS 15.0, *)
struct PillTextAttachmentData: Codable {
// MARK: - Properties
/// Matrix item identifier (user id or room id)
var matrixItemId: String
/// Matrix item display name (user or room display name)
var displayName: String?
/// Matrix item avatar URL (user or room avatar url)
var avatarUrl: String?
/// Wether the pill should be highlighted
var isHighlighted: Bool
/// Alpha for pill display
var alpha: CGFloat
/// Font for the display name
var font: UIFont
/// Helper for preferred text to display.
var displayText: String {
guard let displayName = displayName,
displayName.count > 0 else {
return matrixItemId
}
return displayName
}
// MARK: - Init
/// Init.
///
/// - Parameters:
/// - matrixItemId: Matrix item identifier (user id or room id)
/// - displayName: Matrix item display name (user or room display name)
/// - avatarUrl: Matrix item avatar URL (user or room avatar url)
/// - isHighlighted: Wether the pill should be highlighted
/// - alpha: Alpha for pill display
/// - font: Font for the display name
init(matrixItemId: String,
displayName: String?,
avatarUrl: String?,
isHighlighted: Bool,
alpha: CGFloat,
font: UIFont) {
self.matrixItemId = matrixItemId
self.displayName = displayName
self.avatarUrl = avatarUrl
self.isHighlighted = isHighlighted
self.alpha = alpha
self.font = font
}
// MARK: - Codable
enum CodingKeys: String, CodingKey {
case matrixItemId
case displayName
case avatarUrl
case isHighlighted
case alpha
case font
}
enum PillTextAttachmentDataError: Error {
case noFontData
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
matrixItemId = try container.decode(String.self, forKey: .matrixItemId)
displayName = try? container.decode(String.self, forKey: .displayName)
avatarUrl = try? container.decode(String.self, forKey: .avatarUrl)
isHighlighted = try container.decode(Bool.self, forKey: .isHighlighted)
alpha = try container.decode(CGFloat.self, forKey: .alpha)
let fontData = try container.decode(Data.self, forKey: .font)
if let font = try NSKeyedUnarchiver.unarchivedObject(ofClass: UIFont.self, from: fontData) {
self.font = font
} else {
throw PillTextAttachmentDataError.noFontData
}
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(matrixItemId, forKey: .matrixItemId)
try? container.encode(displayName, forKey: .displayName)
try? container.encode(avatarUrl, forKey: .avatarUrl)
try container.encode(isHighlighted, forKey: .isHighlighted)
try container.encode(alpha, forKey: .alpha)
let fontData = try NSKeyedArchiver.archivedData(withRootObject: font, requiringSecureCoding: false)
try container.encode(fontData, forKey: .font)
}
}