From 223e10691606a8d1885887fd6bb7570e1318e063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Thu, 20 Nov 2025 21:08:44 +0100 Subject: Highlight new messages in conversation history --- src/Erebos/Conversation.hs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'src/Erebos/Conversation.hs') diff --git a/src/Erebos/Conversation.hs b/src/Erebos/Conversation.hs index ff8396c..2c6f967 100644 --- a/src/Erebos/Conversation.hs +++ b/src/Erebos/Conversation.hs @@ -40,12 +40,10 @@ import Erebos.State import Erebos.Storable -data Message = DirectMessageMessage DirectMessage Bool - | ChatroomMessage ChatMessage Bool +data Message = forall conv msg. ConversationType conv msg => Message msg Bool withMessage :: (forall conv msg. ConversationType conv msg => msg -> a) -> Message -> a -withMessage f (DirectMessageMessage msg _) = f msg -withMessage f (ChatroomMessage msg _) = f msg +withMessage f (Message msg _) = f msg messageFrom :: Message -> ComposedIdentity messageFrom = withMessage convMessageFrom @@ -57,14 +55,15 @@ messageText :: Message -> Maybe Text messageText = withMessage convMessageText messageUnread :: Message -> Bool -messageUnread (DirectMessageMessage _ unread) = unread -messageUnread (ChatroomMessage _ unread) = unread +messageUnread (Message _ unread) = unread formatMessage :: TimeZone -> Message -> String formatMessage tzone msg = concat - [ formatTime defaultTimeLocale "[%H:%M] " $ utcToLocalTime tzone $ zonedTimeToUTC $ messageTime msg + [ if messageUnread msg then "\ESC[93m" else "" + , formatTime defaultTimeLocale "[%H:%M] " $ utcToLocalTime tzone $ zonedTimeToUTC $ messageTime msg , maybe "" T.unpack $ idName $ messageFrom msg , maybe "" ((": "<>) . T.unpack) $ messageText msg + , if messageUnread msg then "\ESC[0m" else "" ] @@ -72,6 +71,10 @@ data Conversation = DirectMessageConversation DirectMessageThread | ChatroomConversation ChatroomState +withConversation :: (forall conv msg. ConversationType conv msg => conv -> a) -> Conversation -> a +withConversation f (DirectMessageConversation conv) = f conv +withConversation f (ChatroomConversation conv) = f conv + isSameConversation :: Conversation -> Conversation -> Bool isSameConversation (DirectMessageConversation t) (DirectMessageConversation t') = sameIdentity (msgPeer t) (msgPeer t') @@ -113,8 +116,7 @@ conversationPeer (DirectMessageConversation thread) = Just $ msgPeer thread conversationPeer (ChatroomConversation _) = Nothing conversationHistory :: Conversation -> [ Message ] -conversationHistory (DirectMessageConversation thread) = map (\msg -> DirectMessageMessage msg False) $ dmThreadToList thread -conversationHistory (ChatroomConversation rstate) = map (\msg -> ChatroomMessage msg False) $ roomStateMessages rstate +conversationHistory = withConversation $ map (uncurry Message) . convMessageListSince Nothing sendMessage :: (MonadHead LocalState m, MonadError e m, FromErebosError e) => Conversation -> Text -> m () -- cgit v1.2.3