module Matterhorn.State.PostListWindow
  ( enterFlaggedPostListMode
  , enterPinnedPostListMode
  , enterSearchResultPostListMode
  , postListJumpToCurrent
  , postListSelectUp
  , postListSelectDown
  , postListUnflagSelected
  , exitPostListMode
  )
where

import           GHC.Exts ( IsList(..) )
import           Prelude ()
import           Matterhorn.Prelude

import qualified Data.Foldable as F
import qualified Data.Text as T
import           Lens.Micro.Platform ( (.=) )
import           Network.Mattermost.Endpoints
import           Network.Mattermost.Types

import           Matterhorn.State.Messages ( jumpToPost )
import           Matterhorn.State.Common
import           Matterhorn.State.MessageSelect
import           Matterhorn.State.Messages ( addObtainedMessages
                                           , asyncFetchMessagesSurrounding )
import           Matterhorn.Types
import           Matterhorn.Types.DirectionalSeq (emptyDirSeq)


-- | Create a PostListWindow with the given content description and
-- with a specified list of messages.
enterPostListMode :: TeamId -> PostListContents -> Messages -> MH ()
enterPostListMode :: TeamId -> PostListContents -> Messages -> MH ()
enterPostListMode TeamId
tId PostListContents
contents Messages
msgs = do
  TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Identity TeamState)
 -> ChatState -> Identity ChatState)
-> ((Messages -> Identity Messages)
    -> TeamState -> Identity TeamState)
-> (Messages -> Identity Messages)
-> ChatState
-> Identity ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Identity PostListWindowState)
-> TeamState -> Identity TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Identity PostListWindowState)
 -> TeamState -> Identity TeamState)
-> ((Messages -> Identity Messages)
    -> PostListWindowState -> Identity PostListWindowState)
-> (Messages -> Identity Messages)
-> TeamState
-> Identity TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Messages -> Identity Messages)
-> PostListWindowState -> Identity PostListWindowState
Lens' PostListWindowState Messages
postListPosts ((Messages -> Identity Messages)
 -> ChatState -> Identity ChatState)
-> Messages -> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Messages
msgs
  let mlatest :: Maybe Message
mlatest = Messages -> Maybe Message
getLatestPostMsg Messages
msgs
      pId :: Maybe PostId
pId = Maybe Message
mlatest Maybe Message -> (Message -> Maybe PostId) -> Maybe PostId
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Message -> Maybe PostId
messagePostId
      cId :: Maybe ChannelId
cId = Maybe Message
mlatest Maybe Message -> (Message -> Maybe ChannelId) -> Maybe ChannelId
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Message
m -> Message
mMessage
-> Getting (Maybe ChannelId) Message (Maybe ChannelId)
-> Maybe ChannelId
forall s a. s -> Getting a s a -> a
^.Getting (Maybe ChannelId) Message (Maybe ChannelId)
Lens' Message (Maybe ChannelId)
mChannelId
  TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Identity TeamState)
 -> ChatState -> Identity ChatState)
-> ((Maybe PostId -> Identity (Maybe PostId))
    -> TeamState -> Identity TeamState)
-> (Maybe PostId -> Identity (Maybe PostId))
-> ChatState
-> Identity ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Identity PostListWindowState)
-> TeamState -> Identity TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Identity PostListWindowState)
 -> TeamState -> Identity TeamState)
-> ((Maybe PostId -> Identity (Maybe PostId))
    -> PostListWindowState -> Identity PostListWindowState)
-> (Maybe PostId -> Identity (Maybe PostId))
-> TeamState
-> Identity TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe PostId -> Identity (Maybe PostId))
-> PostListWindowState -> Identity PostListWindowState
Lens' PostListWindowState (Maybe PostId)
postListSelected ((Maybe PostId -> Identity (Maybe PostId))
 -> ChatState -> Identity ChatState)
-> Maybe PostId -> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Maybe PostId
pId
  TeamId -> Mode -> MH ()
pushMode TeamId
tId (Mode -> MH ()) -> Mode -> MH ()
forall a b. (a -> b) -> a -> b
$ PostListContents -> Mode
PostListWindow PostListContents
contents
  case (Maybe PostId
pId, Maybe ChannelId
cId) of
    (Just PostId
p, Just ChannelId
c) -> ChannelId -> PostId -> MH ()
asyncFetchMessagesSurrounding ChannelId
c PostId
p
    (Maybe PostId, Maybe ChannelId)
_ -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

-- | Clear out the state of a PostListWindow
exitPostListMode :: TeamId -> MH ()
exitPostListMode :: TeamId -> MH ()
exitPostListMode TeamId
tId = do
  TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Identity TeamState)
 -> ChatState -> Identity ChatState)
-> ((Messages -> Identity Messages)
    -> TeamState -> Identity TeamState)
-> (Messages -> Identity Messages)
-> ChatState
-> Identity ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Identity PostListWindowState)
-> TeamState -> Identity TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Identity PostListWindowState)
 -> TeamState -> Identity TeamState)
-> ((Messages -> Identity Messages)
    -> PostListWindowState -> Identity PostListWindowState)
-> (Messages -> Identity Messages)
-> TeamState
-> Identity TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Messages -> Identity Messages)
-> PostListWindowState -> Identity PostListWindowState
Lens' PostListWindowState Messages
postListPosts ((Messages -> Identity Messages)
 -> ChatState -> Identity ChatState)
-> Messages -> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Messages
forall dir a. DirectionalSeq dir a
emptyDirSeq
  TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Identity TeamState)
 -> ChatState -> Identity ChatState)
-> ((Maybe PostId -> Identity (Maybe PostId))
    -> TeamState -> Identity TeamState)
-> (Maybe PostId -> Identity (Maybe PostId))
-> ChatState
-> Identity ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Identity PostListWindowState)
-> TeamState -> Identity TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Identity PostListWindowState)
 -> TeamState -> Identity TeamState)
-> ((Maybe PostId -> Identity (Maybe PostId))
    -> PostListWindowState -> Identity PostListWindowState)
-> (Maybe PostId -> Identity (Maybe PostId))
-> TeamState
-> Identity TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe PostId -> Identity (Maybe PostId))
-> PostListWindowState -> Identity PostListWindowState
Lens' PostListWindowState (Maybe PostId)
postListSelected ((Maybe PostId -> Identity (Maybe PostId))
 -> ChatState -> Identity ChatState)
-> Maybe PostId -> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Maybe PostId
forall a. Maybe a
Nothing
  TeamId -> MH ()
popMode TeamId
tId

createPostList :: TeamId -> PostListContents -> (Session -> IO Posts) -> MH ()
createPostList :: TeamId -> PostListContents -> (Session -> IO Posts) -> MH ()
createPostList TeamId
tId PostListContents
contentsType Session -> IO Posts
fetchOp = do
  Session
session <- MH Session
getSession
  AsyncPriority -> IO (Maybe (MH ())) -> MH ()
doAsyncWith AsyncPriority
Preempt (IO (Maybe (MH ())) -> MH ()) -> IO (Maybe (MH ())) -> MH ()
forall a b. (a -> b) -> a -> b
$ do
    Posts
posts <- Session -> IO Posts
fetchOp Session
session
    Maybe (MH ()) -> IO (Maybe (MH ()))
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (MH ()) -> IO (Maybe (MH ())))
-> Maybe (MH ()) -> IO (Maybe (MH ()))
forall a b. (a -> b) -> a -> b
$ MH () -> Maybe (MH ())
forall a. a -> Maybe a
Just (MH () -> Maybe (MH ())) -> MH () -> Maybe (MH ())
forall a b. (a -> b) -> a -> b
$ do
      Messages
messages <- Maybe TeamId -> Posts -> MH Messages
installMessagesFromPosts (TeamId -> Maybe TeamId
forall a. a -> Maybe a
Just TeamId
tId) Posts
posts
      -- n.b. do not use addNewPostedMessage because these messages
      -- are not new, and so no notifications or channel highlighting
      -- or other post-processing should be performed.
      let plist :: [Post]
plist = HashMap PostId Post -> [Post]
forall a. HashMap PostId a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList (HashMap PostId Post -> [Post]) -> HashMap PostId Post -> [Post]
forall a b. (a -> b) -> a -> b
$ Posts -> HashMap PostId Post
postsPosts Posts
posts
          postsSpec :: Post -> Posts
postsSpec Post
p = Posts { postsPosts :: HashMap PostId Post
postsPosts = [Item (HashMap PostId Post)] -> HashMap PostId Post
forall l. IsList l => [Item l] -> l
fromList [(Post -> PostId
postId Post
p, Post
p)]
                              , postsOrder :: Seq PostId
postsOrder = [Item (Seq PostId)] -> Seq PostId
forall l. IsList l => [Item l] -> l
fromList [Post -> PostId
postId Post
p]
                              }
      (Post -> MH PostProcessMessageAdd) -> [Post] -> MH ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\Post
p -> ChannelId -> Int -> Bool -> Posts -> MH PostProcessMessageAdd
addObtainedMessages (Post -> ChannelId
postChannelId Post
p) Int
0 Bool
False (Posts -> MH PostProcessMessageAdd)
-> Posts -> MH PostProcessMessageAdd
forall a b. (a -> b) -> a -> b
$ Post -> Posts
postsSpec Post
p) [Post]
plist
      TeamId -> PostListContents -> Messages -> MH ()
enterPostListMode TeamId
tId PostListContents
contentsType Messages
messages


-- | Create a PostListWindow with flagged messages from the server.
enterFlaggedPostListMode :: TeamId -> MH ()
enterFlaggedPostListMode :: TeamId -> MH ()
enterFlaggedPostListMode TeamId
tId = do
    TeamId -> PostListContents -> (Session -> IO Posts) -> MH ()
createPostList TeamId
tId PostListContents
PostListFlagged ((Session -> IO Posts) -> MH ()) -> (Session -> IO Posts) -> MH ()
forall a b. (a -> b) -> a -> b
$
        UserParam -> FlaggedPostsQuery -> Session -> IO Posts
mmGetListOfFlaggedPosts UserParam
UserMe FlaggedPostsQuery
defaultFlaggedPostsQuery

-- | Create a PostListWindow with pinned messages from the server for
-- the current channel.
enterPinnedPostListMode :: TeamId -> MH ()
enterPinnedPostListMode :: TeamId -> MH ()
enterPinnedPostListMode TeamId
tId =
    TeamId -> (ChannelId -> ClientChannel -> MH ()) -> MH ()
withCurrentChannel TeamId
tId ((ChannelId -> ClientChannel -> MH ()) -> MH ())
-> (ChannelId -> ClientChannel -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \ChannelId
cId ClientChannel
_ -> do
        TeamId -> PostListContents -> (Session -> IO Posts) -> MH ()
createPostList TeamId
tId (ChannelId -> PostListContents
PostListPinned ChannelId
cId) ((Session -> IO Posts) -> MH ()) -> (Session -> IO Posts) -> MH ()
forall a b. (a -> b) -> a -> b
$ ChannelId -> Session -> IO Posts
mmGetChannelPinnedPosts ChannelId
cId

-- | Create a PostListWindow with post search result messages from the
-- server.
enterSearchResultPostListMode :: TeamId -> Text -> MH ()
enterSearchResultPostListMode :: TeamId -> Text -> MH ()
enterSearchResultPostListMode TeamId
tId Text
terms
  | Text -> Bool
T.null (Text -> Text
T.strip Text
terms) = Text -> MH ()
postInfoMessage Text
"Search command requires at least one search term."
  | Bool
otherwise = do
      TeamId -> PostListContents -> Messages -> MH ()
enterPostListMode TeamId
tId (Text -> Bool -> PostListContents
PostListSearch Text
terms Bool
True) Messages
noMessages
      TeamId -> PostListContents -> (Session -> IO Posts) -> MH ()
createPostList TeamId
tId (Text -> Bool -> PostListContents
PostListSearch Text
terms Bool
False) ((Session -> IO Posts) -> MH ()) -> (Session -> IO Posts) -> MH ()
forall a b. (a -> b) -> a -> b
$
        TeamId -> SearchPosts -> Session -> IO Posts
mmSearchForTeamPosts TeamId
tId (Text -> Bool -> SearchPosts
SearchPosts Text
terms Bool
False)


-- | Move the selection up in the PostListWindow, which corresponds
-- to finding a chronologically /newer/ message.
postListSelectDown :: TeamId -> MH ()
postListSelectDown :: TeamId -> MH ()
postListSelectDown TeamId
tId = do
  Maybe PostId
selId <- Getting (Maybe PostId) ChatState (Maybe PostId)
-> MH (Maybe PostId)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Const (Maybe PostId) TeamState)
 -> ChatState -> Const (Maybe PostId) ChatState)
-> ((Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
    -> TeamState -> Const (Maybe PostId) TeamState)
-> Getting (Maybe PostId) ChatState (Maybe PostId)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Const (Maybe PostId) PostListWindowState)
-> TeamState -> Const (Maybe PostId) TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Const (Maybe PostId) PostListWindowState)
 -> TeamState -> Const (Maybe PostId) TeamState)
-> ((Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
    -> PostListWindowState -> Const (Maybe PostId) PostListWindowState)
-> (Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
-> TeamState
-> Const (Maybe PostId) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
-> PostListWindowState -> Const (Maybe PostId) PostListWindowState
Lens' PostListWindowState (Maybe PostId)
postListSelected)
  Messages
posts <- Getting Messages ChatState Messages -> MH Messages
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Const Messages TeamState)
 -> ChatState -> Const Messages ChatState)
-> ((Messages -> Const Messages Messages)
    -> TeamState -> Const Messages TeamState)
-> Getting Messages ChatState Messages
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Const Messages PostListWindowState)
-> TeamState -> Const Messages TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Const Messages PostListWindowState)
 -> TeamState -> Const Messages TeamState)
-> ((Messages -> Const Messages Messages)
    -> PostListWindowState -> Const Messages PostListWindowState)
-> (Messages -> Const Messages Messages)
-> TeamState
-> Const Messages TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Messages -> Const Messages Messages)
-> PostListWindowState -> Const Messages PostListWindowState
Lens' PostListWindowState Messages
postListPosts)
  let nextMsg :: Maybe Message
nextMsg = Maybe MessageId -> Messages -> Maybe Message
getNextMessage (PostId -> MessageId
MessagePostId (PostId -> MessageId) -> Maybe PostId -> Maybe MessageId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe PostId
selId) Messages
posts
  case Maybe Message
nextMsg of
    Maybe Message
Nothing -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
    Just Message
m -> do
      let pId :: Maybe PostId
pId = Message
mMessage
-> Getting (Maybe MessageId) Message (Maybe MessageId)
-> Maybe MessageId
forall s a. s -> Getting a s a -> a
^.Getting (Maybe MessageId) Message (Maybe MessageId)
Lens' Message (Maybe MessageId)
mMessageId Maybe MessageId -> (MessageId -> Maybe PostId) -> Maybe PostId
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= MessageId -> Maybe PostId
messageIdPostId
      TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Identity TeamState)
 -> ChatState -> Identity ChatState)
-> ((Maybe PostId -> Identity (Maybe PostId))
    -> TeamState -> Identity TeamState)
-> (Maybe PostId -> Identity (Maybe PostId))
-> ChatState
-> Identity ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Identity PostListWindowState)
-> TeamState -> Identity TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Identity PostListWindowState)
 -> TeamState -> Identity TeamState)
-> ((Maybe PostId -> Identity (Maybe PostId))
    -> PostListWindowState -> Identity PostListWindowState)
-> (Maybe PostId -> Identity (Maybe PostId))
-> TeamState
-> Identity TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe PostId -> Identity (Maybe PostId))
-> PostListWindowState -> Identity PostListWindowState
Lens' PostListWindowState (Maybe PostId)
postListSelected ((Maybe PostId -> Identity (Maybe PostId))
 -> ChatState -> Identity ChatState)
-> Maybe PostId -> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Maybe PostId
pId
      case (Message
mMessage
-> Getting (Maybe ChannelId) Message (Maybe ChannelId)
-> Maybe ChannelId
forall s a. s -> Getting a s a -> a
^.Getting (Maybe ChannelId) Message (Maybe ChannelId)
Lens' Message (Maybe ChannelId)
mChannelId, Maybe PostId
pId) of
        (Just ChannelId
c, Just PostId
p) -> ChannelId -> PostId -> MH ()
asyncFetchMessagesSurrounding ChannelId
c PostId
p
        (Maybe ChannelId, Maybe PostId)
o -> LogCategory -> Text -> MH ()
mhLog LogCategory
LogError
             (String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
"postListSelectDown" String -> String -> String
forall a. Semigroup a => a -> a -> a
<>
              String
" unable to get channel or post ID: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> (Maybe ChannelId, Maybe PostId) -> String
forall a. Show a => a -> String
show (Maybe ChannelId, Maybe PostId)
o)

-- | Move the selection down in the PostListWindow, which corresponds
-- to finding a chronologically /old/ message.
postListSelectUp :: TeamId -> MH ()
postListSelectUp :: TeamId -> MH ()
postListSelectUp TeamId
tId = do
  Maybe PostId
selId <- Getting (Maybe PostId) ChatState (Maybe PostId)
-> MH (Maybe PostId)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Const (Maybe PostId) TeamState)
 -> ChatState -> Const (Maybe PostId) ChatState)
-> ((Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
    -> TeamState -> Const (Maybe PostId) TeamState)
-> Getting (Maybe PostId) ChatState (Maybe PostId)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Const (Maybe PostId) PostListWindowState)
-> TeamState -> Const (Maybe PostId) TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Const (Maybe PostId) PostListWindowState)
 -> TeamState -> Const (Maybe PostId) TeamState)
-> ((Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
    -> PostListWindowState -> Const (Maybe PostId) PostListWindowState)
-> (Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
-> TeamState
-> Const (Maybe PostId) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
-> PostListWindowState -> Const (Maybe PostId) PostListWindowState
Lens' PostListWindowState (Maybe PostId)
postListSelected)
  Messages
posts <- Getting Messages ChatState Messages -> MH Messages
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Const Messages TeamState)
 -> ChatState -> Const Messages ChatState)
-> ((Messages -> Const Messages Messages)
    -> TeamState -> Const Messages TeamState)
-> Getting Messages ChatState Messages
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Const Messages PostListWindowState)
-> TeamState -> Const Messages TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Const Messages PostListWindowState)
 -> TeamState -> Const Messages TeamState)
-> ((Messages -> Const Messages Messages)
    -> PostListWindowState -> Const Messages PostListWindowState)
-> (Messages -> Const Messages Messages)
-> TeamState
-> Const Messages TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Messages -> Const Messages Messages)
-> PostListWindowState -> Const Messages PostListWindowState
Lens' PostListWindowState Messages
postListPosts)
  let prevMsg :: Maybe Message
prevMsg = Maybe MessageId -> Messages -> Maybe Message
getPrevMessage (PostId -> MessageId
MessagePostId (PostId -> MessageId) -> Maybe PostId -> Maybe MessageId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe PostId
selId) Messages
posts
  case Maybe Message
prevMsg of
    Maybe Message
Nothing -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
    Just Message
m -> do
      let pId :: Maybe PostId
pId = Message
mMessage
-> Getting (Maybe MessageId) Message (Maybe MessageId)
-> Maybe MessageId
forall s a. s -> Getting a s a -> a
^.Getting (Maybe MessageId) Message (Maybe MessageId)
Lens' Message (Maybe MessageId)
mMessageId Maybe MessageId -> (MessageId -> Maybe PostId) -> Maybe PostId
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= MessageId -> Maybe PostId
messageIdPostId
      TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Identity TeamState)
 -> ChatState -> Identity ChatState)
-> ((Maybe PostId -> Identity (Maybe PostId))
    -> TeamState -> Identity TeamState)
-> (Maybe PostId -> Identity (Maybe PostId))
-> ChatState
-> Identity ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Identity PostListWindowState)
-> TeamState -> Identity TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Identity PostListWindowState)
 -> TeamState -> Identity TeamState)
-> ((Maybe PostId -> Identity (Maybe PostId))
    -> PostListWindowState -> Identity PostListWindowState)
-> (Maybe PostId -> Identity (Maybe PostId))
-> TeamState
-> Identity TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe PostId -> Identity (Maybe PostId))
-> PostListWindowState -> Identity PostListWindowState
Lens' PostListWindowState (Maybe PostId)
postListSelected ((Maybe PostId -> Identity (Maybe PostId))
 -> ChatState -> Identity ChatState)
-> Maybe PostId -> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Maybe PostId
pId
      case (Message
mMessage
-> Getting (Maybe ChannelId) Message (Maybe ChannelId)
-> Maybe ChannelId
forall s a. s -> Getting a s a -> a
^.Getting (Maybe ChannelId) Message (Maybe ChannelId)
Lens' Message (Maybe ChannelId)
mChannelId, Maybe PostId
pId) of
        (Just ChannelId
c, Just PostId
p) -> ChannelId -> PostId -> MH ()
asyncFetchMessagesSurrounding ChannelId
c PostId
p
        (Maybe ChannelId, Maybe PostId)
o -> LogCategory -> Text -> MH ()
mhLog LogCategory
LogError
             (String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
"postListSelectUp" String -> String -> String
forall a. Semigroup a => a -> a -> a
<>
              String
" unable to get channel or post ID: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> (Maybe ChannelId, Maybe PostId) -> String
forall a. Show a => a -> String
show (Maybe ChannelId, Maybe PostId)
o)

-- | Unflag the post currently selected in the PostListWindow, if any
postListUnflagSelected :: TeamId -> MH ()
postListUnflagSelected :: TeamId -> MH ()
postListUnflagSelected TeamId
tId = do
  Maybe PostId
msgId <- Getting (Maybe PostId) ChatState (Maybe PostId)
-> MH (Maybe PostId)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Const (Maybe PostId) TeamState)
 -> ChatState -> Const (Maybe PostId) ChatState)
-> ((Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
    -> TeamState -> Const (Maybe PostId) TeamState)
-> Getting (Maybe PostId) ChatState (Maybe PostId)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Const (Maybe PostId) PostListWindowState)
-> TeamState -> Const (Maybe PostId) TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Const (Maybe PostId) PostListWindowState)
 -> TeamState -> Const (Maybe PostId) TeamState)
-> ((Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
    -> PostListWindowState -> Const (Maybe PostId) PostListWindowState)
-> (Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
-> TeamState
-> Const (Maybe PostId) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
-> PostListWindowState -> Const (Maybe PostId) PostListWindowState
Lens' PostListWindowState (Maybe PostId)
postListSelected)
  case Maybe PostId
msgId of
    Maybe PostId
Nothing  -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
    Just PostId
pId -> PostId -> Bool -> MH ()
flagMessage PostId
pId Bool
False


-- | Jumps to the specified message in the message's main channel
-- display and changes to MessageSelectState.
postListJumpToCurrent :: TeamId -> MH ()
postListJumpToCurrent :: TeamId -> MH ()
postListJumpToCurrent TeamId
tId = do
  Maybe PostId
msgId <- Getting (Maybe PostId) ChatState (Maybe PostId)
-> MH (Maybe PostId)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Const (Maybe PostId) TeamState)
 -> ChatState -> Const (Maybe PostId) ChatState)
-> ((Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
    -> TeamState -> Const (Maybe PostId) TeamState)
-> Getting (Maybe PostId) ChatState (Maybe PostId)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(PostListWindowState -> Const (Maybe PostId) PostListWindowState)
-> TeamState -> Const (Maybe PostId) TeamState
Lens' TeamState PostListWindowState
tsPostListWindow((PostListWindowState -> Const (Maybe PostId) PostListWindowState)
 -> TeamState -> Const (Maybe PostId) TeamState)
-> ((Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
    -> PostListWindowState -> Const (Maybe PostId) PostListWindowState)
-> (Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
-> TeamState
-> Const (Maybe PostId) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe PostId -> Const (Maybe PostId) (Maybe PostId))
-> PostListWindowState -> Const (Maybe PostId) PostListWindowState
Lens' PostListWindowState (Maybe PostId)
postListSelected)
  case Maybe PostId
msgId of
    Maybe PostId
Nothing  -> () -> MH ()
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
    Just PostId
pId -> PostId -> MH ()
jumpToPost PostId
pId