Add message action sheet for user interactions

- Tap any message to show action sheet with user options
- Actions include: private message, hug, slap, and block
- Only appears for messages from other users (not system or self)
- Integrates with existing chat commands (/hug, /slap, /block)
This commit is contained in:
jack
2025-07-24 11:54:09 +02:00
parent 0beee2fb27
commit b0204afa75
+47
View File
@@ -22,6 +22,9 @@ struct ContentView: View {
@State private var commandSuggestions: [String] = [] @State private var commandSuggestions: [String] = []
@State private var backSwipeOffset: CGFloat = 0 @State private var backSwipeOffset: CGFloat = 0
@State private var showPrivateChat = false @State private var showPrivateChat = false
@State private var showMessageActions = false
@State private var selectedMessageSender: String?
@State private var selectedMessageSenderID: String?
private var backgroundColor: Color { private var backgroundColor: Color {
colorScheme == .dark ? Color.black : Color.white colorScheme == .dark ? Color.black : Color.white
@@ -120,6 +123,41 @@ struct ContentView: View {
FingerprintView(viewModel: viewModel, peerID: peerID) FingerprintView(viewModel: viewModel, peerID: peerID)
} }
} }
.confirmationDialog(
selectedMessageSender.map { "@\($0)" } ?? "Actions",
isPresented: $showMessageActions,
titleVisibility: .visible
) {
Button("private message") {
if let peerID = selectedMessageSenderID {
viewModel.startPrivateChat(with: peerID)
withAnimation(.spring(response: 0.3, dampingFraction: 0.8)) {
showSidebar = false
sidebarDragOffset = 0
}
}
}
Button("hug") {
if let sender = selectedMessageSender {
viewModel.sendMessage("/hug @\(sender)")
}
}
Button("slap") {
if let sender = selectedMessageSender {
viewModel.sendMessage("/slap @\(sender)")
}
}
Button("BLOCK", role: .destructive) {
if let sender = selectedMessageSender {
viewModel.sendMessage("/block \(sender)")
}
}
Button("cancel", role: .cancel) {}
}
} }
private func messagesView(privatePeer: String?) -> some View { private func messagesView(privatePeer: String?) -> some View {
@@ -188,6 +226,15 @@ struct ContentView: View {
.padding(.horizontal, 12) .padding(.horizontal, 12)
.padding(.vertical, 2) .padding(.vertical, 2)
.id(message.id) .id(message.id)
.contentShape(Rectangle())
.onTapGesture {
// Only show actions for messages from other users (not system or self)
if message.sender != "system" && message.sender != viewModel.nickname {
selectedMessageSender = message.sender
selectedMessageSenderID = message.senderPeerID
showMessageActions = true
}
}
} }
} }
.padding(.vertical, 8) .padding(.vertical, 8)