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