diff --git a/yobble/Resources/Localizable.xcstrings b/yobble/Resources/Localizable.xcstrings index 5da580b..38083a6 100644 --- a/yobble/Resources/Localizable.xcstrings +++ b/yobble/Resources/Localizable.xcstrings @@ -398,6 +398,15 @@ }, "Если не нашли ответ, напишите нам своё предложение или проблему." : { "comment" : "FAQ: contact developers footer" + }, + "Заблокированные" : { + + }, + "Заблокированные пользователи" : { + + }, + "Заблокируйте аккаунт, чтобы скрыть его сообщения и взаимодействия" : { + }, "Заглушка: Push-уведомления" : { @@ -1814,6 +1823,9 @@ }, "Публичная информация" : { + }, + "Разблокировать" : { + }, "Разрешить пересылку сообщений" : { "localizations" : { @@ -2177,6 +2189,9 @@ } } } + }, + "У вас нет заблокированных пользователей" : { + }, "Уведомления" : { "localizations" : { diff --git a/yobble/Views/Tab/Settings/BlockedUsersView.swift b/yobble/Views/Tab/Settings/BlockedUsersView.swift new file mode 100644 index 0000000..52c294e --- /dev/null +++ b/yobble/Views/Tab/Settings/BlockedUsersView.swift @@ -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 "??" + } +} diff --git a/yobble/Views/Tab/Settings/SettingsView.swift b/yobble/Views/Tab/Settings/SettingsView.swift index 3f86430..feacf72 100644 --- a/yobble/Views/Tab/Settings/SettingsView.swift +++ b/yobble/Views/Tab/Settings/SettingsView.swift @@ -17,10 +17,14 @@ struct SettingsView: View { // NavigationLink(destination: EditProfileView()) { // Label("Мой профиль", systemImage: "person.crop.circle") // } - + NavigationLink(destination: EditPrivacyView()) { Label(NSLocalizedString("Конфиденциальность", comment: ""), systemImage: "lock.fill") } + + NavigationLink(destination: BlockedUsersView()) { + Label(NSLocalizedString("Заблокированные пользователи", comment: ""), systemImage: "hand.raised.fill") + } } // MARK: - Безопасность