add blocked user

This commit is contained in:
cheykrym 2025-10-23 22:08:00 +03:00
parent 1c9f249289
commit 8acacdb8c1
3 changed files with 123 additions and 1 deletions

View File

@ -398,6 +398,15 @@
}, },
"Если не нашли ответ, напишите нам своё предложение или проблему." : { "Если не нашли ответ, напишите нам своё предложение или проблему." : {
"comment" : "FAQ: contact developers footer" "comment" : "FAQ: contact developers footer"
},
"Заблокированные" : {
},
"Заблокированные пользователи" : {
},
"Заблокируйте аккаунт, чтобы скрыть его сообщения и взаимодействия" : {
}, },
"Заглушка: Push-уведомления" : { "Заглушка: Push-уведомления" : {
@ -1814,6 +1823,9 @@
}, },
"Публичная информация" : { "Публичная информация" : {
},
"Разблокировать" : {
}, },
"Разрешить пересылку сообщений" : { "Разрешить пересылку сообщений" : {
"localizations" : { "localizations" : {
@ -2177,6 +2189,9 @@
} }
} }
} }
},
"У вас нет заблокированных пользователей" : {
}, },
"Уведомления" : { "Уведомления" : {
"localizations" : { "localizations" : {

View File

@ -0,0 +1,103 @@
import SwiftUI
struct BlockedUsersView: View {
@State private var blockedUsers: [BlockedUser] = []
var body: some View {
List {
if blockedUsers.isEmpty {
emptyState
} else {
Section(header: Text(NSLocalizedString("Заблокированные", comment: ""))) {
ForEach(blockedUsers) { user in
HStack(spacing: 12) {
Circle()
.fill(Color.accentColor.opacity(0.15))
.frame(width: 44, height: 44)
.overlay(
Text(user.initials)
.font(.headline)
.foregroundColor(.accentColor)
)
VStack(alignment: .leading, spacing: 4) {
Text(user.displayName)
.font(.body)
if let handle = user.handle {
Text(handle)
.font(.caption)
.foregroundColor(.secondary)
}
}
Spacer()
Button(role: .destructive) {
unblock(user)
} label: {
Text(NSLocalizedString("Разблокировать", comment: ""))
}
.buttonStyle(.borderless)
}
.padding(.vertical, 4)
}
}
}
}
.navigationTitle(NSLocalizedString("Заблокированные", comment: ""))
.navigationBarTitleDisplayMode(.inline)
.task {
await loadBlockedUsers()
}
}
private var emptyState: some View {
VStack(spacing: 12) {
Image(systemName: "hand.raised")
.font(.system(size: 48))
.foregroundColor(.secondary)
Text(NSLocalizedString("У вас нет заблокированных пользователей", comment: ""))
.font(.headline)
.multilineTextAlignment(.center)
// Text(NSLocalizedString("Заблокируйте аккаунт, чтобы скрыть его сообщения и взаимодействия", comment: ""))
// .font(.subheadline)
// .foregroundColor(.secondary)
// .multilineTextAlignment(.center)
}
.frame(maxWidth: .infinity, alignment: .center)
.padding(.vertical, 32)
.listRowInsets(EdgeInsets(top: 16, leading: 16, bottom: 16, trailing: 16))
.listRowSeparator(.hidden)
}
private func loadBlockedUsers() async {
// TODO: integrate with real data source once available
}
private func unblock(_ user: BlockedUser) {
// TODO: implement unblock logic when backend is ready
blockedUsers.removeAll { $0.id == user.id }
}
}
private struct BlockedUser: Identifiable, Equatable {
let id: UUID
let displayName: String
let handle: String?
var initials: String {
let components = displayName.split(separator: " ")
let nameInitials = components.prefix(2).compactMap { $0.first }
if !nameInitials.isEmpty {
return nameInitials
.map { String($0).uppercased() }
.joined()
}
if let handle {
let filtered = handle.filter { $0.isLetter }.prefix(2)
if !filtered.isEmpty {
return filtered.uppercased()
}
}
return "??"
}
}

View File

@ -17,10 +17,14 @@ struct SettingsView: View {
// NavigationLink(destination: EditProfileView()) { // NavigationLink(destination: EditProfileView()) {
// Label("Мой профиль", systemImage: "person.crop.circle") // Label("Мой профиль", systemImage: "person.crop.circle")
// } // }
NavigationLink(destination: EditPrivacyView()) { NavigationLink(destination: EditPrivacyView()) {
Label(NSLocalizedString("Конфиденциальность", comment: ""), systemImage: "lock.fill") Label(NSLocalizedString("Конфиденциальность", comment: ""), systemImage: "lock.fill")
} }
NavigationLink(destination: BlockedUsersView()) {
Label(NSLocalizedString("Заблокированные пользователи", comment: ""), systemImage: "hand.raised.fill")
}
} }
// MARK: - Безопасность // MARK: - Безопасность