matterhorn-90000.0.1: src/Matterhorn/State/SaveAttachmentWindow.hs
{-# LANGUAGE RankNTypes #-}
module Matterhorn.State.SaveAttachmentWindow
( openSaveAttachmentWindow
, closeSaveAttachmentWindow
)
where
import Prelude ()
import Matterhorn.Prelude
import Brick ( getName )
import Brick.Widgets.List ( listSelectedElement )
import Lens.Micro.Platform ( Lens', (.=), to )
import Network.Mattermost.Types ( fileInfoName )
import Network.Mattermost.Endpoints ( mmGetMetadataForFile )
import Matterhorn.Types
import Matterhorn.State.Common
import Matterhorn.State.Teams ( newSaveAttachmentDialog )
-- | If the currently selected link in the URL list is for an
-- attachment, open a window to get the user to provide a path to which
-- to save the attachment. If the URL list is empty or if the selected
-- entry is not for an attachment, this returns to the Main mode but
-- otherwise does nothing.
openSaveAttachmentWindow :: Lens' ChatState (MessageInterface Name i) -> MH ()
openSaveAttachmentWindow which = do
selected <- use (which.miUrlList.ulList.to listSelectedElement)
case selected of
Nothing -> return ()
Just (_, (_, link)) ->
case link^.linkTarget of
LinkFileId fId -> do
session <- getSession
doAsyncWith Normal $ do
info <- mmGetMetadataForFile fId session
return $ Just $ Work "openSaveAttachmentWindow" $ do
-- Use the message interface's URL list name
-- as a unique basis for the names of the UI
-- elements in the attachment dialog
listName <- getName <$> use (which.miUrlList.ulList)
which.miSaveAttachmentDialog .= newSaveAttachmentDialog listName (fileInfoName info)
which.miMode .= SaveAttachment link
_ ->
-- The selected link is not for an attachment.
return ()
closeSaveAttachmentWindow :: Lens' ChatState (MessageInterface n i)
-> MH ()
closeSaveAttachmentWindow which =
which.miMode .= Compose