2023-04-12 12:22:55 +02:00
|
|
|
//
|
|
|
|
|
// SetAppPaswordView.swift
|
|
|
|
|
// SimpleX (iOS)
|
|
|
|
|
//
|
|
|
|
|
// Created by Evgeny on 10/04/2023.
|
|
|
|
|
// Copyright © 2023 SimpleX Chat. All rights reserved.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import SwiftUI
|
|
|
|
|
import SimpleXChat
|
|
|
|
|
|
|
|
|
|
struct SetAppPasscodeView: View {
|
2023-05-09 10:33:30 +02:00
|
|
|
var passcodeKeychain: KeyChainItem = kcAppPassword
|
2024-01-10 04:01:41 +07:00
|
|
|
var prohibitedPasscodeKeychain: KeyChainItem = kcSelfDestructPassword
|
2023-05-09 10:33:30 +02:00
|
|
|
var title: LocalizedStringKey = "New Passcode"
|
|
|
|
|
var reason: String?
|
2023-04-12 12:22:55 +02:00
|
|
|
var submit: () -> Void
|
|
|
|
|
var cancel: () -> Void
|
|
|
|
|
@Environment(\.dismiss) var dismiss: DismissAction
|
|
|
|
|
@State private var showKeychainError = false
|
|
|
|
|
@State private var passcode = ""
|
|
|
|
|
@State private var enteredPassword = ""
|
|
|
|
|
@State private var confirming = false
|
|
|
|
|
|
|
|
|
|
var body: some View {
|
|
|
|
|
ZStack {
|
|
|
|
|
if confirming {
|
|
|
|
|
setPasswordView(
|
|
|
|
|
title: "Confirm Passcode",
|
|
|
|
|
submitLabel: "Confirm",
|
|
|
|
|
submitEnabled: { pwd in pwd == enteredPassword }
|
|
|
|
|
) {
|
|
|
|
|
if passcode == enteredPassword {
|
2023-05-09 10:33:30 +02:00
|
|
|
if passcodeKeychain.set(passcode) {
|
2023-04-12 12:22:55 +02:00
|
|
|
enteredPassword = ""
|
|
|
|
|
passcode = ""
|
|
|
|
|
dismiss()
|
|
|
|
|
submit()
|
|
|
|
|
} else {
|
|
|
|
|
showKeychainError = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2024-01-10 04:01:41 +07:00
|
|
|
setPasswordView(title: title,
|
|
|
|
|
submitLabel: "Save",
|
|
|
|
|
// Do not allow to set app passcode == selfDestruct passcode
|
|
|
|
|
submitEnabled: { pwd in pwd != prohibitedPasscodeKeychain.get() }) {
|
2023-04-12 12:22:55 +02:00
|
|
|
enteredPassword = passcode
|
|
|
|
|
passcode = ""
|
|
|
|
|
confirming = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.alert(isPresented: $showKeychainError) {
|
|
|
|
|
mkAlert(title: "KeyChain error", message: "Error saving passcode")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private func setPasswordView(title: LocalizedStringKey, submitLabel: LocalizedStringKey, submitEnabled: (((String) -> Bool))? = nil, submit: @escaping () -> Void) -> some View {
|
2024-01-10 04:01:41 +07:00
|
|
|
PasscodeView(passcode: $passcode, title: title, reason: reason, submitLabel: submitLabel, submitEnabled: submitEnabled, buttonsEnabled: Binding.constant(true), submit: submit) {
|
2023-04-12 12:22:55 +02:00
|
|
|
dismiss()
|
|
|
|
|
cancel()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct SetAppPasscodeView_Previews: PreviewProvider {
|
|
|
|
|
static var previews: some View {
|
|
|
|
|
SetAppPasscodeView(submit: {}, cancel: {})
|
|
|
|
|
}
|
|
|
|
|
}
|