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
|
//
// FeatureIndicatorsViewModel.swift
// MullvadVPN
//
// Created by Mojgan on 2024-12-05.
// Copyright © 2025 Mullvad VPN AB. All rights reserved.
//
import MullvadSettings
import PacketTunnelCore
import SwiftUI
class FeatureIndicatorsViewModel: ChipViewModelProtocol {
@Published var tunnelSettings: LatestTunnelSettings
@Published var ipOverrides: [IPOverride]
@Published var tunnelState: TunnelState
@Published var observedState: ObservedState
var onFeaturePressed: ((FeatureType) -> Void)?
init(
tunnelSettings: LatestTunnelSettings,
ipOverrides: [IPOverride],
tunnelStatus: TunnelStatus
) {
self.tunnelSettings = tunnelSettings
self.ipOverrides = ipOverrides
self.tunnelState = tunnelStatus.state
self.observedState = tunnelStatus.observedState
}
var chips: [ChipModel] {
// Here can be a check if a feature indicator should show in other connection states
// e.g. Access local network in blocked state
switch tunnelState {
case .connecting, .reconnecting, .negotiatingEphemeralPeer,
.connected, .pendingReconnect:
let features: [any ChipFeature] = [
DaitaFeature(state: tunnelState, settings: tunnelSettings),
QuantumResistanceFeature(state: tunnelState),
MultihopFeature(state: tunnelState, settings: tunnelSettings),
ObfuscationFeature(settings: tunnelSettings, state: observedState),
DNSFeature(settings: tunnelSettings),
IPOverrideFeature(state: tunnelState, overrides: ipOverrides),
]
return
features
.filter { $0.isEnabled }
.map { ChipModel(id: $0.id, name: $0.name) }
default:
return []
}
}
func onPressed(item: ChipModel) {
onFeaturePressed?(item.id)
}
}
|