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 =
    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
.
    [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
                        MH Bool -> MH ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (MH Bool -> MH ()) -> MH Bool -> MH ()
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)((TeamState -> f TeamState) -> ChatState -> f ChatState)
-> ((Editor Text Name -> f (Editor Text Name))
    -> TeamState -> f TeamState)
-> (Editor Text Name -> f (Editor Text Name))
-> ChatState
-> f ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChannelSelectState -> f ChannelSelectState)
-> TeamState -> f TeamState
Lens' TeamState ChannelSelectState
tsChannelSelectState((ChannelSelectState -> f ChannelSelectState)
 -> TeamState -> f TeamState)
-> ((Editor Text Name -> f (Editor Text Name))
    -> ChannelSelectState -> f ChannelSelectState)
-> (Editor Text Name -> f (Editor Text Name))
-> TeamState
-> f TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Editor Text Name -> f (Editor Text Name))
-> ChannelSelectState -> f ChannelSelectState
Lens' ChannelSelectState (Editor Text Name)
channelSelectInput))
                                               , \Event
ev -> do
                                                   Lens' ChatState (Editor Text Name)
-> (BrickEvent Name Any -> EventM Name (Editor Text Name) ())
-> BrickEvent Name Any
-> MH ()
forall b e.
Lens' ChatState b -> (e -> EventM Name b ()) -> e -> MH ()
mhZoom (TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> f TeamState) -> ChatState -> f ChatState)
-> ((Editor Text Name -> f (Editor Text Name))
    -> TeamState -> f TeamState)
-> (Editor Text Name -> f (Editor Text Name))
-> ChatState
-> f ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChannelSelectState -> f ChannelSelectState)
-> TeamState -> f TeamState
Lens' TeamState ChannelSelectState
tsChannelSelectState((ChannelSelectState -> f ChannelSelectState)
 -> TeamState -> f TeamState)
-> ((Editor Text Name -> f (Editor Text Name))
    -> ChannelSelectState -> f ChannelSelectState)
-> (Editor Text Name -> f (Editor Text Name))
-> TeamState
-> f TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Editor Text Name -> f (Editor Text Name))
-> ChannelSelectState -> f ChannelSelectState
Lens' ChannelSelectState (Editor Text Name)
channelSelectInput) BrickEvent Name Any -> EventM Name (Editor Text Name) ()
forall n t e.
(Eq n, DecodeUtf8 t, Eq t, GenericTextZipper t) =>
BrickEvent n e -> EventM n (Editor t n) ()
handleEditorEvent (Event -> BrickEvent Name Any
forall n e. Event -> BrickEvent n e
VtyEvent Event
ev)
                                                   Bool -> MH Bool
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
                                               ] Event
e
                        TeamId -> MH ()
updateChannelSelectMatches TeamId
tId
                        Bool -> MH Bool
forall a. a -> MH a
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 = KeyConfig KeyEvent
-> [KeyEventHandler KeyEvent MH] -> KeyDispatcher KeyEvent MH
forall k (m :: * -> *).
Ord k =>
KeyConfig k -> [KeyEventHandler k m] -> KeyDispatcher k m
unsafeKeyDispatcher KeyConfig KeyEvent
kc (TeamId -> [KeyEventHandler KeyEvent MH]
channelSelectKeyHandlers TeamId
tId)

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

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