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 ]