diff --git a/Swiftcord/ButtonStyles/DiscordChannelButton.swift b/Swiftcord/ButtonStyles/DiscordChannelButton.swift index 5c52917d..40db7981 100644 --- a/Swiftcord/ButtonStyles/DiscordChannelButton.swift +++ b/Swiftcord/ButtonStyles/DiscordChannelButton.swift @@ -9,6 +9,7 @@ import SwiftUI struct DiscordChannelButton: ButtonStyle { let isSelected: Bool + let unread: Bool @State var isHovered: Bool = false @Environment(\.controlSize) var size: ControlSize @@ -19,8 +20,8 @@ struct DiscordChannelButton: ButtonStyle { .frame(height: size == .large ? 42 : 32) .padding(.horizontal, 2) .font(.system(size: 15)) - .foregroundColor(isSelected ? Color(nsColor: .labelColor) : .gray) - .accentColor(isSelected ? Color(nsColor: .labelColor) : .gray) + .foregroundColor(isSelected ? Color(nsColor: .labelColor) : unread ? Color(nsColor: .labelColor) : .gray) + .accentColor(isSelected ? Color(nsColor: .labelColor) : unread ? Color(nsColor: .labelColor) : .gray) .background { RoundedRectangle(cornerRadius: 5) .fill(isSelected ? .gray.opacity(0.3) : (isHovered ? .gray.opacity(0.2) : .clear)) diff --git a/Swiftcord/Views/Message/MessagesView.swift b/Swiftcord/Views/Message/MessagesView.swift index 3f7c464f..3baee9f3 100644 --- a/Swiftcord/Views/Message/MessagesView.swift +++ b/Swiftcord/Views/Message/MessagesView.swift @@ -361,6 +361,11 @@ struct MessagesView: View { guard msg.webhook_id == nil else { break } // Remove typing status after user sent a message ctx.typingStarted[msg.channel_id]?.removeAll { $0.user_id == msg.author.id } + + // If user sends message, reset last message. + if gateway.cache.user?.id == msg.author.id { + gateway.readState[msg.channel_id] = gateway.readState[msg.channel_id]?.updatingLastMessage(id: msg.id) + } case .messageUpdate(let newMsg): guard newMsg.channel_id == ctx.channel?.id else { break } viewModel.updateMessage(newMsg) diff --git a/Swiftcord/Views/Server/ChannelButton.swift b/Swiftcord/Views/Server/ChannelButton.swift index fd304b95..e2048c98 100644 --- a/Swiftcord/Views/Server/ChannelButton.swift +++ b/Swiftcord/Views/Server/ChannelButton.swift @@ -17,15 +17,18 @@ struct ChannelButton: View, Equatable { let channel: Channel @Binding var selectedCh: Channel? + + @EnvironmentObject var gateway: DiscordGateway var body: some View { + let unread = gateway.readState[channel.id]?.last_message_id?.intValue ?? 0 < Int(channel.last_message_id ?? "0") ?? 0 if channel.type == .dm || channel.type == .groupDM { DMButton(dm: channel, selectedCh: $selectedCh) - .buttonStyle(DiscordChannelButton(isSelected: selectedCh?.id == channel.id)) + .buttonStyle(DiscordChannelButton(isSelected: selectedCh?.id == channel.id, unread: unread)) .controlSize(.large) } else { GuildChButton(channel: channel, selectedCh: $selectedCh) - .buttonStyle(DiscordChannelButton(isSelected: selectedCh?.id == channel.id)) + .buttonStyle(DiscordChannelButton(isSelected: selectedCh?.id == channel.id, unread: unread)) } } }