Add iOS pinned messages bar
This commit is contained in:
@@ -341,6 +341,15 @@ public struct ChatDetailView: View {
|
||||
|
||||
public var body: some View {
|
||||
VStack(spacing: 0) {
|
||||
ScrollViewReader { scrollProxy in
|
||||
VStack(spacing: 0) {
|
||||
if !viewModel.pinnedMessages.isEmpty {
|
||||
PinnedMessagesBar(messages: viewModel.pinnedMessages) { message in
|
||||
withAnimation {
|
||||
scrollProxy.scrollTo(message.id, anchor: .center)
|
||||
}
|
||||
}
|
||||
}
|
||||
List {
|
||||
if !viewModel.searchText.isEmpty {
|
||||
Section("Search") {
|
||||
@@ -358,6 +367,7 @@ public struct ChatDetailView: View {
|
||||
Section {
|
||||
ForEach(viewModel.messages) { message in
|
||||
MessageRow(message: message)
|
||||
.id(message.id)
|
||||
.contextMenu {
|
||||
Button {
|
||||
viewModel.beginReply(to: message)
|
||||
@@ -401,6 +411,8 @@ public struct ChatDetailView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ComposeBar(
|
||||
text: $viewModel.composeText,
|
||||
replyTo: viewModel.replyTo,
|
||||
@@ -497,6 +509,49 @@ public struct ChatDetailView: View {
|
||||
}
|
||||
}
|
||||
|
||||
public struct PinnedMessagesBar: View {
|
||||
public var messages: [Message]
|
||||
public var select: (Message) -> Void
|
||||
|
||||
public init(messages: [Message], select: @escaping (Message) -> Void) {
|
||||
self.messages = messages
|
||||
self.select = select
|
||||
}
|
||||
|
||||
public var body: some View {
|
||||
VStack(spacing: 0) {
|
||||
ForEach(messages.prefix(3)) { message in
|
||||
Button {
|
||||
select(message)
|
||||
} label: {
|
||||
HStack(spacing: 8) {
|
||||
Image(systemName: "pin.fill")
|
||||
.font(.caption)
|
||||
.foregroundStyle(.blue)
|
||||
VStack(alignment: .leading, spacing: 2) {
|
||||
Text(message.senderName)
|
||||
.font(.caption2)
|
||||
.foregroundStyle(.secondary)
|
||||
Text(message.text)
|
||||
.font(.subheadline)
|
||||
.lineLimit(1)
|
||||
}
|
||||
Spacer()
|
||||
}
|
||||
.padding(.horizontal, 12)
|
||||
.padding(.vertical, 8)
|
||||
.contentShape(Rectangle())
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
}
|
||||
}
|
||||
.background(Color.blue.opacity(0.08))
|
||||
.overlay(alignment: .bottom) {
|
||||
Divider()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public struct MessageRow: View {
|
||||
public var message: Message
|
||||
|
||||
|
||||
Reference in New Issue
Block a user