matterhorn-50200.17.0: src/Matterhorn/State/UrlSelect.hs
{-# LANGUAGE RankNTypes #-}
module Matterhorn.State.UrlSelect
(
-- * URL selection mode
startUrlSelect
, stopUrlSelect
, openSelectedURL
)
where
import Prelude ()
import Matterhorn.Prelude
import Brick.Widgets.List ( listSelectedElement, listReplace )
import qualified Data.Vector as V
import Lens.Micro.Platform ( (.=), (%=), to, Lens' )
import Matterhorn.State.Links
import Matterhorn.Types
import Matterhorn.Util
startUrlSelect :: Lens' ChatState (MessageInterface n i)
-> MH ()
startUrlSelect which = do
msgs <- use (which.miMessages)
src <- use (which.miUrlListSource)
let urls = V.fromList $ findUrls msgs
urlsWithIndexes = V.indexed urls
which.miMode .= ShowUrlList
which.miUrlList.ulList %= listReplace urlsWithIndexes (Just $ length urls - 1)
which.miUrlList.ulSource .= Just src
stopUrlSelect :: Lens' ChatState (MessageInterface n i)
-> MH ()
stopUrlSelect which = do
which.miMode .= Compose
openSelectedURL :: Lens' ChatState (MessageInterface n i) -> MH ()
openSelectedURL which = do
selected <- use (which.miUrlList.ulList.to listSelectedElement)
case selected of
Nothing -> return ()
Just (_, (_, link)) -> openLinkTarget (link^.linkTarget)
stopUrlSelect which
findUrls :: Messages -> [LinkChoice]
findUrls ms =
let msgs = filterMessages (not . _mDeleted) ms
in removeDuplicates $ concat $ toList $ toList <$> msgURLs <$> msgs
removeDuplicates :: [LinkChoice] -> [LinkChoice]
removeDuplicates = nubOn (\ l -> (l^.linkTarget, l^.linkUser, l^.linkLabel))