// // BreadcrumbItem.swift // VDS // // Created by Kanamarlapudi, Vasavi on 05/03/24. // import Foundation import VDSColorTokens import VDSFormControlsTokens import Combine /// A Breadcrumb Item contains href(link) and selected flag. /// Breadcrumb links to its respective page if it is not disabled. /// Breadcrumb contains text with a separator by default, highlights text in bold without a separator if selected. @objc (VDSBreadcrumbItem) open class BreadcrumbItem: ButtonBase { //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- required public init() { super.init(frame: .zero) } public override init(frame: CGRect) { super.init(frame: .zero) } public required init?(coder: NSCoder) { super.init(coder: coder) } //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- /// The Breadcrumb link to links to its respective page. open var link: String? { didSet { setNeedsUpdate() } } /// TextStyle used on the titleLabel. open override var textStyle: TextStyle { isSelected ? TextStyle.boldBodySmall : TextStyle.bodySmall } /// If true, it will be rendered as selected. open var selectable: Bool = false { didSet { //update selected state if selectable{ isSelected = true } else { isSelected = false } setNeedsUpdate() } } /// UIColor used on the titleLabel text. open override var textColor: UIColor { textColorConfiguration.getColor(self) } /// The natural size for the receiving view, considering only properties of the view itself. open override var intrinsicContentSize: CGSize { return titleLabel?.intrinsicContentSize ?? super.intrinsicContentSize } //-------------------------------------------------- // MARK: - Private Properties //-------------------------------------------------- var separator = " /" private var textColorConfiguration = ControlColorConfiguration().with { $0.setSurfaceColors(VDSColor.elementsPrimaryOnlight, VDSColor.elementsPrimaryOndark, forState: .normal) $0.setSurfaceColors(VDSColor.interactiveActiveOnlight, VDSColor.interactiveActiveOndark, forState: .highlighted) $0.setSurfaceColors(VDSColor.elementsPrimaryOnlight, VDSColor.elementsPrimaryOndark, forState: .selected) } //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- /// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations. open override func setup() { super.setup() isAccessibilityElement = true accessibilityTraits = .button accessibilityLabel = "Breadcrumb" } /// Used to make changes to the View based off a change events or from local properties. open override func updateView() { //always call last so the label is rendered if (text != nil) { var newText: String = text ?? "" if isSelected { if newText.contains(separator) { let result = newText.dropLast(2) newText = String(result) } } else { if !newText.contains(separator) { newText = (text ?? "") + separator } } print("newText:\(newText), isSelected: \(isSelected)") text = newText if let titleLabel { titleLabel.text = text } } super.updateView() } /// Resets to default settings. open override func reset() { super.reset() shouldUpdateView = false text = nil link = nil accessibilityCustomActions = [] isAccessibilityElement = true accessibilityTraits = .button shouldUpdateView = true setNeedsUpdate() } }