module Matterhorn.Events.MessageSelect where

import           Prelude ()
import           Matterhorn.Prelude

import qualified Data.Text as T
import qualified Graphics.Vty as Vty

import           Matterhorn.Events.Keybindings
import           Matterhorn.State.MessageSelect
import           Matterhorn.State.ReactionEmojiListOverlay
import           Matterhorn.Types


messagesPerPageOperation :: Int
messagesPerPageOperation :: Int
messagesPerPageOperation = Int
10

onEventMessageSelect :: Vty.Event -> MH ()
onEventMessageSelect :: Event -> MH ()
onEventMessageSelect =
  MH Bool -> MH ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (MH Bool -> MH ()) -> (Event -> MH Bool) -> Event -> MH ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (KeyConfig -> KeyHandlerMap)
-> (Event -> MH ()) -> Event -> MH Bool
handleKeyboardEvent KeyConfig -> KeyHandlerMap
messageSelectKeybindings (MH () -> Event -> MH ()
forall a b. a -> b -> a
const (MH () -> Event -> MH ()) -> MH () -> Event -> MH ()
forall a b. (a -> b) -> a -> b
$ () -> MH ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())

onEventMessageSelectDeleteConfirm :: Vty.Event -> MH ()
onEventMessageSelectDeleteConfirm :: Event -> MH ()
onEventMessageSelectDeleteConfirm (Vty.EvKey (Vty.KChar Char
'y') []) = do
    MH ()
deleteSelectedMessage
    Mode -> MH ()
setMode Mode
Main
onEventMessageSelectDeleteConfirm Event
_ =
    Mode -> MH ()
setMode Mode
Main

messageSelectKeybindings :: KeyConfig -> KeyHandlerMap
messageSelectKeybindings :: KeyConfig -> KeyHandlerMap
messageSelectKeybindings = [KeyEventHandler] -> KeyConfig -> KeyHandlerMap
mkKeybindings [KeyEventHandler]
messageSelectKeyHandlers

messageSelectKeyHandlers :: [KeyEventHandler]
messageSelectKeyHandlers :: [KeyEventHandler]
messageSelectKeyHandlers =
    [ KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
CancelEvent Text
"Cancel message selection" (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$
        Mode -> MH ()
setMode Mode
Main

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
SelectUpEvent Text
"Select the previous message" MH ()
messageSelectUp
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
SelectDownEvent Text
"Select the next message" MH ()
messageSelectDown
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
ScrollTopEvent Text
"Scroll to top and select the oldest message"
        MH ()
messageSelectFirst
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
ScrollBottomEvent Text
"Scroll to bottom and select the latest message"
        MH ()
messageSelectLast
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb
        KeyEvent
PageUpEvent
        (String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
"Move the cursor up by " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
messagesPerPageOperation String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" messages")
        (Int -> MH ()
messageSelectUpBy Int
messagesPerPageOperation)
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb
        KeyEvent
PageDownEvent
        (String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
"Move the cursor down by " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
messagesPerPageOperation String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" messages")
        (Int -> MH ()
messageSelectDownBy Int
messagesPerPageOperation)

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
OpenMessageURLEvent Text
"Open all URLs in the selected message"
        MH ()
openSelectedMessageURLs

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
ReplyMessageEvent Text
"Begin composing a reply to the selected message"
         MH ()
beginReplyCompose

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
EditMessageEvent Text
"Begin editing the selected message"
         MH ()
beginEditMessage

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
DeleteMessageEvent Text
"Delete the selected message (with confirmation)"
         MH ()
beginConfirmDeleteSelectedMessage

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
YankMessageEvent Text
"Copy a verbatim section or message to the clipboard"
         MH ()
yankSelectedMessageVerbatim

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
YankWholeMessageEvent Text
"Copy an entire message to the clipboard"
         MH ()
yankSelectedMessage

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
PinMessageEvent Text
"Toggle whether the selected message is pinned"
         MH ()
pinSelectedMessage

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
FlagMessageEvent Text
"Flag the selected message"
         MH ()
flagSelectedMessage

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
ViewMessageEvent Text
"View the selected message"
         MH ()
viewSelectedMessage

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
FillGapEvent Text
"Fetch messages for the selected gap"
         MH ()
fillSelectedGap

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
ReactToMessageEvent Text
"Post a reaction to the selected message"
         MH ()
enterReactionEmojiListOverlayMode

    ]