From b348f37f1a7bbbb542c4b0267273474164fb6a46 Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Wed, 31 Jan 2024 07:56:50 +0100 Subject: [PATCH] Add block confirmation --- .../Sources/StatusKit/Row/StatusRowView.swift | 22 +++++++++++++++++-- .../Row/Subviews/StatusRowActionsView.swift | 6 ++++- .../Row/Subviews/StatusRowContextMenu.swift | 10 ++------- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/Packages/StatusKit/Sources/StatusKit/Row/StatusRowView.swift b/Packages/StatusKit/Sources/StatusKit/Row/StatusRowView.swift index 4abec5d5..aac8be72 100644 --- a/Packages/StatusKit/Sources/StatusKit/Row/StatusRowView.swift +++ b/Packages/StatusKit/Sources/StatusKit/Row/StatusRowView.swift @@ -18,9 +18,11 @@ public struct StatusRowView: View { @Environment(QuickLook.self) private var quickLook @Environment(Theme.self) private var theme + @Environment(Client.self) private var client @State private var viewModel: StatusRowViewModel @State private var showSelectableText: Bool = false + @State private var isBlockConfirmationPresented = false public enum Context { case timeline, detail } private let context: Context @@ -31,7 +33,9 @@ public struct StatusRowView: View { } var contextMenu: some View { - StatusRowContextMenu(viewModel: viewModel, showTextForSelection: $showSelectableText) + StatusRowContextMenu(viewModel: viewModel, + showTextForSelection: $showSelectableText, + isBlockConfirmationPresented: $isBlockConfirmationPresented) } public var body: some View { @@ -95,7 +99,8 @@ public struct StatusRowView: View { if !reasons.contains(.placeholder), viewModel.showActions, isFocused || theme.statusActionsDisplay != .none, !isInCaptureMode { - StatusRowActionsView(viewModel: viewModel) + StatusRowActionsView(isBlockConfirmationPresented: $isBlockConfirmationPresented, + viewModel: viewModel) .tint(isFocused ? theme.tintColor : .gray) .contentShape(Rectangle()) } @@ -189,6 +194,19 @@ public struct StatusRowView: View { secondaryButton: .cancel() ) }) + .confirmationDialog("", + isPresented: $isBlockConfirmationPresented) { + Button("account.action.block", role: .destructive) { + Task { + do { + let operationAccount = viewModel.status.reblog?.account ?? viewModel.status.account + viewModel.authorRelationship = try await client.post(endpoint: Accounts.block(id: operationAccount.id)) + } catch { + print("Error while blocking: \(error.localizedDescription)") + } + } + } + } .alignmentGuide(.listRowSeparatorLeading) { _ in -100 } diff --git a/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowActionsView.swift b/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowActionsView.swift index 5d56467f..321049f2 100644 --- a/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowActionsView.swift +++ b/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowActionsView.swift @@ -16,6 +16,8 @@ struct StatusRowActionsView: View { @Environment(\.horizontalSizeClass) var horizontalSizeClass @State private var showTextForSelection: Bool = false + + @Binding var isBlockConfirmationPresented: Bool var viewModel: StatusRowViewModel @@ -186,7 +188,9 @@ struct StatusRowActionsView: View { Spacer() } else if action == .menu { Menu { - StatusRowContextMenu(viewModel: viewModel, showTextForSelection: $showTextForSelection) + StatusRowContextMenu(viewModel: viewModel, + showTextForSelection: $showTextForSelection, + isBlockConfirmationPresented: $isBlockConfirmationPresented) .onAppear { Task { await viewModel.loadAuthorRelationship() diff --git a/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowContextMenu.swift b/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowContextMenu.swift index bca52d48..779dd871 100644 --- a/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowContextMenu.swift +++ b/Packages/StatusKit/Sources/StatusKit/Row/Subviews/StatusRowContextMenu.swift @@ -20,6 +20,7 @@ struct StatusRowContextMenu: View { var viewModel: StatusRowViewModel @Binding var showTextForSelection: Bool + @Binding var isBlockConfirmationPresented: Bool var boostLabel: some View { if viewModel.status.visibility == .priv, viewModel.status.account.id == account.account?.id { @@ -283,14 +284,7 @@ struct StatusRowContextMenu: View { } } else { Button { - Task { - do { - let operationAccount = viewModel.status.reblog?.account ?? viewModel.status.account - viewModel.authorRelationship = try await client.post(endpoint: Accounts.block(id: operationAccount.id)) - } catch { - print("Error while blocking: \(error.localizedDescription)") - } - } + isBlockConfirmationPresented = true } label: { Label("account.action.block", systemImage: "person.crop.circle.badge.xmark") }