2022-04-12 13:09:14 +00:00
|
|
|
//
|
|
|
|
// AddProfileView.swift
|
|
|
|
// Passepartout
|
|
|
|
//
|
|
|
|
// Created by Davide De Rosa on 3/19/22.
|
2024-01-14 13:34:21 +00:00
|
|
|
// Copyright (c) 2024 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
|
2023-04-04 07:50:45 +00:00
|
|
|
import SwiftUI
|
2022-04-12 13:09:14 +00:00
|
|
|
|
|
|
|
enum AddProfileView {
|
2023-07-23 11:28:47 +00:00
|
|
|
enum Field {
|
|
|
|
case name
|
|
|
|
|
|
|
|
case passphrase
|
|
|
|
}
|
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
struct Bindings {
|
|
|
|
@Binding var isPresented: Bool
|
|
|
|
}
|
2023-03-17 20:55:47 +00:00
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
struct ProfileNameSection: View {
|
|
|
|
@Binding var profileName: String
|
2023-03-17 20:55:47 +00:00
|
|
|
|
2023-07-23 11:28:47 +00:00
|
|
|
@FocusState.Binding var focusedField: Field?
|
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
let errorMessage: String?
|
2023-03-17 20:55:47 +00:00
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
let onCommit: () -> Void
|
2023-03-17 20:55:47 +00:00
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
var body: some View {
|
2022-05-01 17:43:33 +00:00
|
|
|
Section {
|
2022-04-12 13:09:14 +00:00
|
|
|
TextField(L10n.Global.Placeholders.profileName, text: $profileName, onCommit: onCommit)
|
2023-07-23 11:28:47 +00:00
|
|
|
.focused($focusedField, equals: .name)
|
2022-04-25 20:44:24 +00:00
|
|
|
.themeValidProfileName()
|
2022-05-01 17:43:33 +00:00
|
|
|
} header: {
|
|
|
|
Text(L10n.Global.Strings.name)
|
|
|
|
} footer: {
|
|
|
|
themeErrorMessage(errorMessage)
|
2023-07-23 11:28:47 +00:00
|
|
|
}.onAppear {
|
|
|
|
focusedField = .name
|
2022-04-12 13:09:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-03-17 20:55:47 +00:00
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
struct ExistingProfilesSection: View {
|
|
|
|
let headers: [Profile.Header]
|
2023-03-17 20:55:47 +00:00
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
@Binding var profileName: String
|
2023-03-17 20:55:47 +00:00
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
var body: some View {
|
2022-05-01 17:43:33 +00:00
|
|
|
Section {
|
2022-04-12 13:09:14 +00:00
|
|
|
ForEach(headers, content: existingProfileButton)
|
2022-05-01 17:43:33 +00:00
|
|
|
} header: {
|
|
|
|
Text(L10n.AddProfile.Shared.Views.Existing.header)
|
2022-04-12 13:09:14 +00:00
|
|
|
}
|
|
|
|
}
|
2023-03-17 20:55:47 +00:00
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
private func existingProfileButton(_ header: Profile.Header) -> some View {
|
|
|
|
Button(header.name) {
|
|
|
|
profileName = header.name
|
2022-04-23 09:42:26 +00:00
|
|
|
}.themeLongTextStyle()
|
2022-04-12 13:09:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct AccountWrapperView: View {
|
2022-08-28 07:19:15 +00:00
|
|
|
@ObservedObject private var profileManager: ProfileManager
|
2022-04-12 13:09:14 +00:00
|
|
|
|
|
|
|
@Binding private var profile: Profile
|
2023-03-17 20:55:47 +00:00
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
private let bindings: AddProfileView.Bindings
|
|
|
|
|
|
|
|
@State private var account = Profile.Account()
|
2023-03-17 20:55:47 +00:00
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
init(
|
|
|
|
profile: Binding<Profile>,
|
|
|
|
bindings: AddProfileView.Bindings
|
|
|
|
) {
|
|
|
|
profileManager = .shared
|
|
|
|
_profile = profile
|
|
|
|
self.bindings = bindings
|
|
|
|
}
|
2023-03-17 20:55:47 +00:00
|
|
|
|
2022-04-12 13:09:14 +00:00
|
|
|
var body: some View {
|
|
|
|
AccountView(
|
|
|
|
providerName: profile.header.providerName,
|
|
|
|
vpnProtocol: profile.currentVPNProtocol,
|
|
|
|
account: $account,
|
|
|
|
saveAnyway: true,
|
|
|
|
onSave: {
|
|
|
|
bindings.isPresented = false
|
|
|
|
}
|
|
|
|
).navigationBarBackButtonHidden(true)
|
|
|
|
.onDisappear(perform: saveAccount)
|
|
|
|
}
|
|
|
|
|
|
|
|
private func saveAccount() {
|
|
|
|
profile.account = account
|
|
|
|
profileManager.saveProfile(profile, isActive: nil)
|
|
|
|
profileManager.didCreateProfile.send(profile)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|