1module Matterhorn.State.UrlSelect 2 ( 3 -- * URL selection mode 4 startUrlSelect 5 , stopUrlSelect 6 , openSelectedURL 7 ) 8where 9 10import Prelude () 11import Matterhorn.Prelude 12 13import Brick.Widgets.List ( list, listMoveTo, listSelectedElement ) 14import qualified Data.Vector as V 15import Lens.Micro.Platform ( (.=), to ) 16 17import Matterhorn.State.Links 18import Matterhorn.Types 19import Matterhorn.Util 20 21 22startUrlSelect :: MH () 23startUrlSelect = do 24 urls <- use (csCurrentChannel.to findUrls.to V.fromList) 25 let urlsWithIndexes = V.indexed urls 26 tId <- use csCurrentTeamId 27 setMode UrlSelect 28 csCurrentTeam.tsUrlList .= (listMoveTo (length urls - 1) $ list (UrlList tId) urlsWithIndexes 2) 29 30stopUrlSelect :: MH () 31stopUrlSelect = setMode Main 32 33openSelectedURL :: MH () 34openSelectedURL = whenMode UrlSelect $ do 35 selected <- use (csCurrentTeam.tsUrlList.to listSelectedElement) 36 case selected of 37 Nothing -> setMode Main 38 Just (_, (_, link)) -> do 39 opened <- openLinkTarget (link^.linkTarget) 40 when (not opened) $ do 41 mhError $ ConfigOptionMissing "urlOpenCommand" 42 setMode Main 43 44findUrls :: ClientChannel -> [LinkChoice] 45findUrls chan = 46 let msgs = chan^.ccContents.cdMessages 47 in removeDuplicates $ concat $ toList $ toList <$> msgURLs <$> msgs 48 49removeDuplicates :: [LinkChoice] -> [LinkChoice] 50removeDuplicates = nubOn (\ l -> (l^.linkTarget, l^.linkUser, l^.linkLabel)) 51