packages feed

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))