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
|
@Environment(ConnectionManager.self) private var manager
|
||||||
@Query private var messages: [SavedMessage]
|
@Query private var messages: [SavedMessage]
|
||||||
@State private var messageText = ""
|
@State private var messageText = ""
|
||||||
|
@FocusState private var isInputFocused: Bool
|
||||||
|
|
||||||
init(partnerId: String, partnerName: String) {
|
init(partnerId: String, partnerName: String) {
|
||||||
self.partnerId = partnerId
|
self.partnerId = partnerId
|
||||||
|
|
@ -34,14 +35,33 @@ struct DMConversationView: View {
|
||||||
.padding()
|
.padding()
|
||||||
}
|
}
|
||||||
.onChange(of: messages.count) {
|
.onChange(of: messages.count) {
|
||||||
if let last = messages.last {
|
guard let last = messages.last, last.sessionId == manager.sessionId else { return }
|
||||||
proxy.scrollTo(last.persistentModelID, anchor: .bottom)
|
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) {
|
HStack(spacing: 8) {
|
||||||
TextField("Message \(partnerName)...", text: $messageText, axis: .vertical)
|
TextField("Message \(partnerName)...", text: $messageText, axis: .vertical)
|
||||||
|
.focused($isInputFocused)
|
||||||
.textFieldStyle(.roundedBorder)
|
.textFieldStyle(.roundedBorder)
|
||||||
.lineLimit(1...4)
|
.lineLimit(1...4)
|
||||||
.onSubmit { sendMessage() }
|
.onSubmit { sendMessage() }
|
||||||
|
|
@ -66,5 +86,6 @@ struct DMConversationView: View {
|
||||||
guard !text.isEmpty else { return }
|
guard !text.isEmpty else { return }
|
||||||
manager.sendDirectMessage(recipientId: partnerId, message: text)
|
manager.sendDirectMessage(recipientId: partnerId, message: text)
|
||||||
messageText = ""
|
messageText = ""
|
||||||
|
isInputFocused = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,15 +11,21 @@ struct DMListView: View {
|
||||||
) private var dmMessages: [SavedMessage]
|
) private var dmMessages: [SavedMessage]
|
||||||
|
|
||||||
private var conversations: [(id: String, name: String, lastMessage: 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 {
|
for message in dmMessages {
|
||||||
guard let senderId = message.senderId, !message.senderIsRecipient else { continue }
|
guard let partnerId = message.characterId else { continue }
|
||||||
if latest[senderId] == nil {
|
if let existing = latest[partnerId] {
|
||||||
latest[senderId] = (message.senderName, message)
|
// 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
|
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 }
|
.sorted { $0.lastMessage.timestamp > $1.lastMessage.timestamp }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue