1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
//
// ChipViewModelProtocol.swift
// MullvadVPN
//
// Created by Mojgan on 2024-12-05.
// Copyright © 2025 Mullvad VPN AB. All rights reserved.
//
import SwiftUI
protocol ChipViewModelProtocol: ObservableObject {
var chips: [ChipModel] { get }
func onPressed(item: ChipModel)
}
extension ChipViewModelProtocol {
func chipsToAdd(forContainerWidth containerWidth: CGFloat) -> (chips: [ChipModel], isOverflowing: Bool) {
var chipsToAdd = [ChipModel]()
var isOverflowing = false
let moreTextWidth =
String(format: NSLocalizedString("%d more...", comment: ""), chips.count)
.width(using: .preferredFont(forTextStyle: .subheadline)) + 4 // Some extra to be safe.
var totalChipsWidth: CGFloat = 0
for (index, chip) in chips.enumerated() {
let textWidth = chip.name.width(using: .preferredFont(forTextStyle: .subheadline))
let chipWidth =
textWidth
+ UIMetrics.FeatureIndicators.chipViewHorisontalPadding * 2
+ UIMetrics.FeatureIndicators.chipViewTrailingMargin
let isLastChip = index == chips.count - 1
totalChipsWidth += chipWidth
let chipWillFitWithMoreText = (totalChipsWidth + moreTextWidth) <= containerWidth
let chipWillFit = totalChipsWidth <= containerWidth
guard (chipWillFit && isLastChip) || chipWillFitWithMoreText else {
isOverflowing = true
break
}
chipsToAdd.append(chip)
}
return (chipsToAdd, isOverflowing)
}
}
class MockFeatureIndicatorsViewModel: ChipViewModelProtocol {
func onPressed(item: ChipModel) {}
@Published var chips: [ChipModel] = [
ChipModel(id: .daita, name: "DAITA"),
ChipModel(id: .obfuscation, name: "Obfuscation"),
ChipModel(id: .quantumResistance, name: "Quantum resistance"),
ChipModel(id: .multihop, name: "Multihop"),
ChipModel(id: .dns, name: "DNS content blockers"),
ChipModel(id: .dns, name: "Custom DNS"),
ChipModel(id: .ipOverrides, name: "Server IP override"),
]
}
|