Files
simplex-chat/apps/ios/Shared/Views/UserSettings/HiddenProfileView.swift
Evgeny Poberezkin 06a0dbd0f2 core, iOS: hidden and muted user profiles (#2025)
* core, ios: profile privacy design

* migration

* core: user profile privacy

* update nix dependencies

* update simplexmq

* import stateTVar

* update core library

* update UI

* update hide/show user profile

* update API, UI, fix test

* update api, UI, test

* update api call

* fix api

* update UI for hidden profiles

* filter notifications on hidden/muted profiles when inactive, alerts

* updates

* update schema, test, icon
2023-03-22 15:58:01 +00:00

85 lines
3.0 KiB
Swift

//
// ProfilePrivacyView.swift
// SimpleX (iOS)
//
// Created by Evgeny on 17/03/2023.
// Copyright © 2023 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
struct HiddenProfileView: View {
@State var user: User
@Binding var profileHidden: Bool
@EnvironmentObject private var m: ChatModel
@Environment(\.dismiss) var dismiss: DismissAction
@State private var hidePassword = ""
@State private var confirmHidePassword = ""
@State private var saveErrorAlert = false
@State private var savePasswordError: String?
var body: some View {
List {
Text("Hide profile")
.font(.title)
.bold()
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
.listRowBackground(Color.clear)
Section() {
ProfilePreview(profileOf: user)
.padding(.leading, -8)
}
Section {
PassphraseField(key: $hidePassword, placeholder: "Password to show", valid: true, showStrength: true)
PassphraseField(key: $confirmHidePassword, placeholder: "Confirm password", valid: confirmValid)
settingsRow("lock") {
Button("Save profile password") {
Task {
do {
let u = try await apiHideUser(user.userId, viewPwd: hidePassword)
await MainActor.run {
m.updateUser(u)
dismiss()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
withAnimation { profileHidden = true }
}
}
} catch let error {
saveErrorAlert = true
savePasswordError = responseError(error)
}
}
}
}
.disabled(saveDisabled)
} header: {
Text("Hidden profile password")
} footer: {
Text("To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page.")
.font(.body)
.padding(.top, 8)
}
}
.alert(isPresented: $saveErrorAlert) {
Alert(
title: Text("Error saving user password"),
message: Text(savePasswordError ?? "")
)
}
}
var confirmValid: Bool { confirmHidePassword == "" || hidePassword == confirmHidePassword }
var saveDisabled: Bool { hidePassword == "" || confirmHidePassword == "" || !confirmValid }
}
struct ProfilePrivacyView_Previews: PreviewProvider {
static var previews: some View {
HiddenProfileView(user: User.sampleData, profileHidden: Binding.constant(false))
}
}