From 5a32ee0a4c21ddf41c58da1c11187f73ca2be761 Mon Sep 17 00:00:00 2001 From: Mikhail Kilin Date: Thu, 21 May 2026 15:53:26 +0300 Subject: [PATCH] Add iOS reaction picker --- .../Sources/TeleTuiIOSCore/Views.swift | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Views.swift b/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Views.swift index 919b82b..21cb78c 100644 --- a/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Views.swift +++ b/apps/ios/TeleTuiIOS/Sources/TeleTuiIOSCore/Views.swift @@ -329,6 +329,7 @@ public struct ChatDetailView: View { @State private var editedText = "" @State private var deleteCandidate: Message? @State private var forwardCandidate: Message? + @State private var reactionCandidate: Message? @State private var forwardChatIdText = "" private let onChatLeft: () -> Void @@ -397,7 +398,7 @@ public struct ChatDetailView: View { Label("Forward", systemImage: "arrowshape.turn.up.forward") } Button { - Task { await viewModel.react(message: message, reaction: "👍") } + reactionCandidate = message } label: { Label("React", systemImage: "face.smiling") } @@ -483,6 +484,19 @@ public struct ChatDetailView: View { forwardCandidate = nil } } + .confirmationDialog("React", isPresented: reactionDialogBinding, titleVisibility: .visible) { + ForEach(["👍", "❤️", "😂", "😮", "😢", "🙏"], id: \.self) { reaction in + Button(reaction) { + if let reactionCandidate { + Task { await viewModel.react(message: reactionCandidate, reaction: reaction) } + } + reactionCandidate = nil + } + } + Button("Cancel", role: .cancel) { + reactionCandidate = nil + } + } .task { await viewModel.load() } @@ -521,6 +535,17 @@ public struct ChatDetailView: View { ) } + private var reactionDialogBinding: Binding { + Binding( + get: { reactionCandidate != nil }, + set: { isPresented in + if !isPresented { + reactionCandidate = nil + } + } + ) + } + private func shouldShowDateSeparator(at index: Int) -> Bool { guard viewModel.messages.indices.contains(index), viewModel.messages[index].date > 0 else { return false