matterhorn-50200.16.0: src/Matterhorn/State/UrlSelect.hs
module Matterhorn.State.UrlSelect
(
-- * URL selection mode
startUrlSelect
, stopUrlSelect
, openSelectedURL
)
where
import Prelude ()
import Matterhorn.Prelude
import Brick.Widgets.List ( list, listMoveTo, listSelectedElement )
import qualified Data.Vector as V
import Lens.Micro.Platform ( (.=), to )
import Network.Mattermost.Types ( TeamId )
import Matterhorn.State.Links
import Matterhorn.Types
import Matterhorn.Util
startUrlSelect :: TeamId -> MH ()
startUrlSelect tId = do
withCurrentChannel tId $ \_ chan -> do
let urls = V.fromList $ findUrls chan
urlsWithIndexes = V.indexed urls
setMode tId UrlSelect
csTeam(tId).tsUrlList .= (listMoveTo (length urls - 1) $ list (UrlList tId) urlsWithIndexes 2)
stopUrlSelect :: TeamId -> MH ()
stopUrlSelect tId = do
setMode tId Main
openSelectedURL :: TeamId -> MH ()
openSelectedURL tId = whenMode tId UrlSelect $ do
selected <- use (csTeam(tId).tsUrlList.to listSelectedElement)
case selected of
Nothing -> return ()
Just (_, (_, link)) -> openLinkTarget (link^.linkTarget)
setMode tId Main
findUrls :: ClientChannel -> [LinkChoice]
findUrls chan =
let msgs = filterMessages (not . _mDeleted) $ chan^.ccContents.cdMessages
in removeDuplicates $ concat $ toList $ toList <$> msgURLs <$> msgs
removeDuplicates :: [LinkChoice] -> [LinkChoice]
removeDuplicates = nubOn (\ l -> (l^.linkTarget, l^.linkUser, l^.linkLabel))