module Matterhorn.Events.ChannelSelect where

import           Prelude ()
import           Matterhorn.Prelude

import           Brick ( BrickEvent(VtyEvent) )
import           Brick.Keybindings
import           Brick.Widgets.Edit ( handleEditorEvent )
import qualified Graphics.Vty as Vty

import           Network.Mattermost.Types ( TeamId )

import           Matterhorn.State.Channels
import           Matterhorn.State.ChannelSelect
import           Matterhorn.State.Editing ( editingKeybindings )
import           Matterhorn.Types
import qualified Matterhorn.Zipper as Z


onEventChannelSelect :: TeamId -> Vty.Event -> MH ()
onEventChannelSelect :: TeamId -> Event -> MH ()
onEventChannelSelect TeamId
tId =
    forall (f :: * -> *) a. Functor f => f a -> f ()
void forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    [Event -> MH Bool] -> Event -> MH Bool
handleEventWith [ (KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH)
-> Event -> MH Bool
mhHandleKeyboardEvent (TeamId -> KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH
channelSelectKeybindings TeamId
tId)
                    , \Event
e -> do
                        forall (f :: * -> *) a. Functor f => f a -> f ()
void forall a b. (a -> b) -> a -> b
$ [Event -> MH Bool] -> Event -> MH Bool
handleEventWith [ (KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH)
-> Event -> MH Bool
mhHandleKeyboardEvent (Lens' ChatState (Editor Text Name)
-> KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH
editingKeybindings (TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)forall b c a. (b -> c) -> (a -> b) -> a -> c
.Lens' TeamState ChannelSelectState
tsChannelSelectStateforall b c a. (b -> c) -> (a -> b) -> a -> c
.Lens' ChannelSelectState (Editor Text Name)
channelSelectInput))
                                               , \Event
ev -> do
                                                   forall b e.
Lens' ChatState b -> (e -> EventM Name b ()) -> e -> MH ()
mhZoom (TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)forall b c a. (b -> c) -> (a -> b) -> a -> c
.Lens' TeamState ChannelSelectState
tsChannelSelectStateforall b c a. (b -> c) -> (a -> b) -> a -> c
.Lens' ChannelSelectState (Editor Text Name)
channelSelectInput) forall n t e.
(Eq n, DecodeUtf8 t, Eq t, GenericTextZipper t) =>
BrickEvent n e -> EventM n (Editor t n) ()
handleEditorEvent (forall n e. Event -> BrickEvent n e
VtyEvent Event
ev)
                                                   forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
                                               ] Event
e
                        TeamId -> MH ()
updateChannelSelectMatches TeamId
tId
                        forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
                    ]

channelSelectKeybindings :: TeamId -> KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH
channelSelectKeybindings :: TeamId -> KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH
channelSelectKeybindings TeamId
tId KeyConfig KeyEvent
kc = forall k (m :: * -> *).
Ord k =>
KeyConfig k -> [KeyEventHandler k m] -> KeyDispatcher k m
unsafeKeyDispatcher KeyConfig KeyEvent
kc (TeamId -> [MHKeyEventHandler]
channelSelectKeyHandlers TeamId
tId)

channelSelectKeyHandlers :: TeamId -> [MHKeyEventHandler]
channelSelectKeyHandlers :: TeamId -> [MHKeyEventHandler]
channelSelectKeyHandlers TeamId
tId =
    [ forall a (m :: * -> *) k.
ToBinding a =>
a -> Text -> m () -> KeyEventHandler k m
onKey (forall a. ToBinding a => a -> Binding
bind Key
Vty.KEnter)
          Text
"Switch to selected channel" forall a b. (a -> b) -> a -> b
$ do
             Zipper ChannelListGroup ChannelSelectMatch
matches <- forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)forall b c a. (b -> c) -> (a -> b) -> a -> c
.Lens' TeamState ChannelSelectState
tsChannelSelectStateforall b c a. (b -> c) -> (a -> b) -> a -> c
.Lens'
  ChannelSelectState (Zipper ChannelListGroup ChannelSelectMatch)
channelSelectMatches)
             case forall a b. Zipper a b -> Maybe b
Z.focus Zipper ChannelListGroup ChannelSelectMatch
matches of
                 Maybe ChannelSelectMatch
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
                 Just ChannelSelectMatch
match -> do
                     TeamId -> MH ()
popMode TeamId
tId
                     TeamId -> ChannelId -> MH ()
setFocus TeamId
tId forall a b. (a -> b) -> a -> b
$ ChannelListEntry -> ChannelId
channelListEntryChannelId forall a b. (a -> b) -> a -> b
$ ChannelSelectMatch -> ChannelListEntry
matchEntry ChannelSelectMatch
match

    , forall k (m :: * -> *). k -> Text -> m () -> KeyEventHandler k m
onEvent KeyEvent
CancelEvent Text
"Cancel channel selection" forall a b. (a -> b) -> a -> b
$ TeamId -> MH ()
popMode TeamId
tId
    , forall k (m :: * -> *). k -> Text -> m () -> KeyEventHandler k m
onEvent KeyEvent
NextChannelEvent Text
"Select next match" forall a b. (a -> b) -> a -> b
$ TeamId -> MH ()
channelSelectNext TeamId
tId
    , forall k (m :: * -> *). k -> Text -> m () -> KeyEventHandler k m
onEvent KeyEvent
PrevChannelEvent Text
"Select previous match" forall a b. (a -> b) -> a -> b
$ TeamId -> MH ()
channelSelectPrevious TeamId
tId
    , forall k (m :: * -> *). k -> Text -> m () -> KeyEventHandler k m
onEvent KeyEvent
NextChannelEventAlternate Text
"Select next match (alternate binding)" forall a b. (a -> b) -> a -> b
$ TeamId -> MH ()
channelSelectNext TeamId
tId
    , forall k (m :: * -> *). k -> Text -> m () -> KeyEventHandler k m
onEvent KeyEvent
PrevChannelEventAlternate Text
"Select previous match (alternate binding)" forall a b. (a -> b) -> a -> b
$ TeamId -> MH ()
channelSelectPrevious TeamId
tId
    ]