passepartout-apple/Passepartout/App/Views/ProfileView.swift

161 lines
4.2 KiB
Swift
Raw Normal View History

2022-04-12 13:09:14 +00:00
//
// ProfileView.swift
// Passepartout
//
// Created by Davide De Rosa on 2/6/22.
2023-03-17 15:56:19 +00:00
// Copyright (c) 2023 Davide De Rosa. All rights reserved.
2022-04-12 13:09:14 +00:00
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
2022-06-23 21:31:01 +00:00
import PassepartoutLibrary
import SwiftUI
2022-04-12 13:09:14 +00:00
struct ProfileView: View {
enum ModalType: Int, Identifiable {
case interactiveAccount
case shortcuts
2023-03-17 20:55:47 +00:00
2022-04-12 13:09:14 +00:00
case rename
2023-03-17 20:55:47 +00:00
case paywallShortcuts
case paywallNetworkSettings
2023-03-17 20:55:47 +00:00
2022-04-12 13:09:14 +00:00
case paywallTrustedNetworks
var id: Int {
2022-09-04 18:09:31 +00:00
rawValue
2022-04-12 13:09:14 +00:00
}
}
@ObservedObject private var currentProfile: ObservableProfile
2023-03-17 20:55:47 +00:00
2022-04-12 13:09:14 +00:00
@State private var modalType: ModalType?
2023-03-17 20:55:47 +00:00
init() {
currentProfile = ProfileManager.shared.currentProfile
2022-04-12 13:09:14 +00:00
}
var body: some View {
debugChanges()
return Group {
if isLoading || isExisting {
mainView
2022-04-12 13:09:14 +00:00
} else {
2022-04-22 18:09:26 +00:00
WelcomeView()
2022-04-12 13:09:14 +00:00
}
}.toolbar {
ToolbarItemGroup(placement: .navigationBarTrailing) {
if themeIdiom != .phone {
SettingsButton()
}
MainMenu(
currentProfile: currentProfile,
modalType: $modalType
).disabled(!isExisting)
}
}.sheet(item: $modalType, content: presentedModal)
.navigationTitle(title)
.themeSecondaryView()
2022-04-12 13:09:14 +00:00
}
}
// MARK: -
private extension ProfileView {
var isLoading: Bool {
currentProfile.isLoading
}
var isExisting: Bool {
!currentProfile.value.isPlaceholder
}
2023-03-17 20:55:47 +00:00
var title: String {
currentProfile.name
2022-04-12 13:09:14 +00:00
}
2023-03-17 20:55:47 +00:00
var mainView: some View {
List {
if !isLoading {
VPNSection(
profile: currentProfile.value,
modalType: $modalType
)
ProviderSection(currentProfile: currentProfile)
ConfigurationSection(
currentProfile: currentProfile,
modalType: $modalType
)
ExtraSection(currentProfile: currentProfile)
Section {
DiagnosticsRow(currentProfile: currentProfile)
}
} else {
ProgressView()
}
}.themeAnimation(on: isLoading)
2022-04-12 13:09:14 +00:00
}
2023-03-17 20:55:47 +00:00
2022-04-12 13:09:14 +00:00
@ViewBuilder
func presentedModal(_ modalType: ModalType) -> some View {
2022-04-12 13:09:14 +00:00
switch modalType {
case .interactiveAccount:
NavigationView {
InteractiveConnectionView(profile: currentProfile.value)
}.themeGlobal()
2023-03-17 20:55:47 +00:00
case .shortcuts:
NavigationView {
ShortcutsView(target: currentProfile.value)
}.themeGlobal()
2023-03-17 20:55:47 +00:00
2022-04-12 13:09:14 +00:00
case .rename:
NavigationView {
RenameView(currentProfile: currentProfile)
2022-04-12 13:09:14 +00:00
}.themeGlobal()
2023-03-17 20:55:47 +00:00
case .paywallShortcuts:
NavigationView {
PaywallView(
modalType: $modalType,
feature: .siriShortcuts
)
}.themeGlobal()
case .paywallNetworkSettings:
NavigationView {
PaywallView(
modalType: $modalType,
feature: .networkSettings
)
}.themeGlobal()
2022-04-12 13:09:14 +00:00
case .paywallTrustedNetworks:
NavigationView {
PaywallView(
modalType: $modalType,
2022-04-12 13:09:14 +00:00
feature: .trustedNetworks
)
}.themeGlobal()
}
}
}