Fix DM's tab
* add haptics, sound and keyboard fix from other tabs * fix display of unanswered DM conversations you've started
This commit is contained in:
parent
25b7358559
commit
76ebe0f771
2 changed files with 34 additions and 7 deletions
|
|
@ -7,6 +7,7 @@ struct DMConversationView: View {
|
|||
@Environment(ConnectionManager.self) private var manager
|
||||
@Query private var messages: [SavedMessage]
|
||||
@State private var messageText = ""
|
||||
@FocusState private var isInputFocused: Bool
|
||||
|
||||
init(partnerId: String, partnerName: String) {
|
||||
self.partnerId = partnerId
|
||||
|
|
@ -34,14 +35,33 @@ struct DMConversationView: View {
|
|||
.padding()
|
||||
}
|
||||
.onChange(of: messages.count) {
|
||||
if let last = messages.last {
|
||||
proxy.scrollTo(last.persistentModelID, anchor: .bottom)
|
||||
guard let last = messages.last, last.sessionId == manager.sessionId else { return }
|
||||
proxy.scrollTo(last.persistentModelID, anchor: .bottom)
|
||||
|
||||
// Sound
|
||||
if UserDefaults.standard.bool(forKey: "sounds_enabled", default: true),
|
||||
UserDefaults.standard.bool(forKey: "sounds_dm", default: true) {
|
||||
SoundPlayer.play("direct-message")
|
||||
}
|
||||
|
||||
// VoiceOver announcement
|
||||
if !last.isSystem {
|
||||
AccessibilityNotification.Announcement(
|
||||
"\(last.senderName): \(last.content)"
|
||||
).post()
|
||||
}
|
||||
|
||||
// Haptic
|
||||
if UserDefaults.standard.bool(forKey: "haptics_enabled", default: true),
|
||||
UserDefaults.standard.bool(forKey: "haptics_messages", default: true) {
|
||||
UIImpactFeedbackGenerator(style: .soft).impactOccurred()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HStack(spacing: 8) {
|
||||
TextField("Message \(partnerName)...", text: $messageText, axis: .vertical)
|
||||
.focused($isInputFocused)
|
||||
.textFieldStyle(.roundedBorder)
|
||||
.lineLimit(1...4)
|
||||
.onSubmit { sendMessage() }
|
||||
|
|
@ -66,5 +86,6 @@ struct DMConversationView: View {
|
|||
guard !text.isEmpty else { return }
|
||||
manager.sendDirectMessage(recipientId: partnerId, message: text)
|
||||
messageText = ""
|
||||
isInputFocused = true
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,15 +11,21 @@ struct DMListView: View {
|
|||
) private var dmMessages: [SavedMessage]
|
||||
|
||||
private var conversations: [(id: String, name: String, lastMessage: SavedMessage)] {
|
||||
var latest: [String: (name: String, message: SavedMessage)] = [:]
|
||||
var latest: [String: (name: String?, message: SavedMessage)] = [:]
|
||||
for message in dmMessages {
|
||||
guard let senderId = message.senderId, !message.senderIsRecipient else { continue }
|
||||
if latest[senderId] == nil {
|
||||
latest[senderId] = (message.senderName, message)
|
||||
guard let partnerId = message.characterId else { continue }
|
||||
if let existing = latest[partnerId] {
|
||||
// Prefer the partner's display name over the ID
|
||||
if existing.name == nil, !message.senderIsRecipient {
|
||||
latest[partnerId] = (message.senderName, existing.message)
|
||||
}
|
||||
} else {
|
||||
let name: String? = message.senderIsRecipient ? nil : message.senderName
|
||||
latest[partnerId] = (name, message)
|
||||
}
|
||||
}
|
||||
return latest
|
||||
.map { (id: $0.key, name: $0.value.name, lastMessage: $0.value.message) }
|
||||
.map { (id: $0.key, name: $0.value.name ?? $0.key, lastMessage: $0.value.message) }
|
||||
.sorted { $0.lastMessage.timestamp > $1.lastMessage.timestamp }
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue