module Matterhorn.Events.EditNotifyPrefs
    ( onEventEditNotifyPrefs
    , editNotifyPrefsKeybindings
    , editNotifyPrefsKeyHandlers
    , handleEditNotifyPrefsEvent
    )
where

import           Prelude ()
import           Matterhorn.Prelude

import           Brick
import           Brick.Keybindings
import           Brick.Forms (handleFormEvent, formState)
import           Data.Maybe (fromJust)
import qualified Graphics.Vty as V
import qualified Network.Mattermost.Endpoints as MM
import           Network.Mattermost.Types ( TeamId )

import           Lens.Micro.Platform (_Just, singular)

import           Matterhorn.Types
import           Matterhorn.State.NotifyPrefs
import           Matterhorn.State.Async

onEventEditNotifyPrefs :: TeamId -> V.Event -> MH Bool
onEventEditNotifyPrefs :: TeamId -> Event -> MH Bool
onEventEditNotifyPrefs TeamId
tId =
    [Event -> MH Bool] -> Event -> MH Bool
handleEventWith [ (KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH)
-> Event -> MH Bool
mhHandleKeyboardEvent (TeamId -> KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH
editNotifyPrefsKeybindings TeamId
tId)
                    , TeamId -> BrickEvent Name MHEvent -> MH Bool
handleEditNotifyPrefsEvent TeamId
tId (BrickEvent Name MHEvent -> MH Bool)
-> (Event -> BrickEvent Name MHEvent) -> Event -> MH Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event -> BrickEvent Name MHEvent
forall n e. Event -> BrickEvent n e
VtyEvent
                    ]

handleEditNotifyPrefsEvent :: TeamId -> BrickEvent Name MHEvent -> MH Bool
handleEditNotifyPrefsEvent :: TeamId -> BrickEvent Name MHEvent -> MH Bool
handleEditNotifyPrefsEvent TeamId
tId BrickEvent Name MHEvent
e = do
    Lens' ChatState (Form ChannelNotifyProps MHEvent Name)
-> (BrickEvent Name MHEvent
    -> EventM Name (Form ChannelNotifyProps MHEvent Name) ())
-> BrickEvent Name MHEvent
-> 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)
-> ((Form ChannelNotifyProps MHEvent Name
     -> f (Form ChannelNotifyProps MHEvent Name))
    -> TeamState -> f TeamState)
-> (Form ChannelNotifyProps MHEvent Name
    -> f (Form ChannelNotifyProps MHEvent Name))
-> ChatState
-> f ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe (Form ChannelNotifyProps MHEvent Name)
 -> f (Maybe (Form ChannelNotifyProps MHEvent Name)))
-> TeamState -> f TeamState
Lens' TeamState (Maybe (Form ChannelNotifyProps MHEvent Name))
tsNotifyPrefs((Maybe (Form ChannelNotifyProps MHEvent Name)
  -> f (Maybe (Form ChannelNotifyProps MHEvent Name)))
 -> TeamState -> f TeamState)
-> ((Form ChannelNotifyProps MHEvent Name
     -> f (Form ChannelNotifyProps MHEvent Name))
    -> Maybe (Form ChannelNotifyProps MHEvent Name)
    -> f (Maybe (Form ChannelNotifyProps MHEvent Name)))
-> (Form ChannelNotifyProps MHEvent Name
    -> f (Form ChannelNotifyProps MHEvent Name))
-> TeamState
-> f TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Traversal
  (Maybe (Form ChannelNotifyProps MHEvent Name))
  (Maybe (Form ChannelNotifyProps MHEvent Name))
  (Form ChannelNotifyProps MHEvent Name)
  (Form ChannelNotifyProps MHEvent Name)
-> Lens
     (Maybe (Form ChannelNotifyProps MHEvent Name))
     (Maybe (Form ChannelNotifyProps MHEvent Name))
     (Form ChannelNotifyProps MHEvent Name)
     (Form ChannelNotifyProps MHEvent Name)
forall s t a. HasCallStack => Traversal s t a a -> Lens s t a a
singular (Form ChannelNotifyProps MHEvent Name
 -> f (Form ChannelNotifyProps MHEvent Name))
-> Maybe (Form ChannelNotifyProps MHEvent Name)
-> f (Maybe (Form ChannelNotifyProps MHEvent Name))
forall a a' (f :: * -> *).
Applicative f =>
(a -> f a') -> Maybe a -> f (Maybe a')
Traversal
  (Maybe (Form ChannelNotifyProps MHEvent Name))
  (Maybe (Form ChannelNotifyProps MHEvent Name))
  (Form ChannelNotifyProps MHEvent Name)
  (Form ChannelNotifyProps MHEvent Name)
_Just) BrickEvent Name MHEvent
-> EventM Name (Form ChannelNotifyProps MHEvent Name) ()
forall n e s. Eq n => BrickEvent n e -> EventM n (Form s e n) ()
handleFormEvent BrickEvent Name MHEvent
e
    Bool -> MH Bool
forall a. a -> MH a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True

editNotifyPrefsKeybindings :: TeamId -> KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH
editNotifyPrefsKeybindings :: TeamId -> KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH
editNotifyPrefsKeybindings 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]
editNotifyPrefsKeyHandlers TeamId
tId)

editNotifyPrefsKeyHandlers :: TeamId -> [MHKeyEventHandler]
editNotifyPrefsKeyHandlers :: TeamId -> [KeyEventHandler KeyEvent MH]
editNotifyPrefsKeyHandlers TeamId
tId =
    [ KeyEvent -> Text -> MH () -> KeyEventHandler KeyEvent MH
forall k (m :: * -> *). k -> Text -> m () -> KeyEventHandler k m
onEvent KeyEvent
CancelEvent Text
"Close channel notification preferences" (MH () -> KeyEventHandler KeyEvent MH)
-> MH () -> KeyEventHandler KeyEvent MH
forall a b. (a -> b) -> a -> b
$
        TeamId -> MH ()
exitEditNotifyPrefsMode TeamId
tId
    , KeyEvent -> Text -> MH () -> KeyEventHandler KeyEvent MH
forall k (m :: * -> *). k -> Text -> m () -> KeyEventHandler k m
onEvent KeyEvent
FormSubmitEvent Text
"Save channel notification preferences" (MH () -> KeyEventHandler KeyEvent MH)
-> MH () -> KeyEventHandler KeyEvent MH
forall a b. (a -> b) -> a -> b
$ do
        ChatState
st <- Getting ChatState ChatState ChatState -> MH ChatState
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting ChatState ChatState ChatState
forall a. a -> a
id
        TeamId -> (ChannelId -> ClientChannel -> MH ()) -> MH ()
withCurrentChannel TeamId
tId ((ChannelId -> ClientChannel -> MH ()) -> MH ())
-> (ChannelId -> ClientChannel -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \ChannelId
cId ClientChannel
_ -> do
            let form :: Form ChannelNotifyProps MHEvent Name
form = Maybe (Form ChannelNotifyProps MHEvent Name)
-> Form ChannelNotifyProps MHEvent Name
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe (Form ChannelNotifyProps MHEvent Name)
 -> Form ChannelNotifyProps MHEvent Name)
-> Maybe (Form ChannelNotifyProps MHEvent Name)
-> Form ChannelNotifyProps MHEvent Name
forall a b. (a -> b) -> a -> b
$ ChatState
stChatState
-> Getting
     (Maybe (Form ChannelNotifyProps MHEvent Name))
     ChatState
     (Maybe (Form ChannelNotifyProps MHEvent Name))
-> Maybe (Form ChannelNotifyProps MHEvent Name)
forall s a. s -> Getting a s a -> a
^.TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState
  -> Const (Maybe (Form ChannelNotifyProps MHEvent Name)) TeamState)
 -> ChatState
 -> Const (Maybe (Form ChannelNotifyProps MHEvent Name)) ChatState)
-> ((Maybe (Form ChannelNotifyProps MHEvent Name)
     -> Const
          (Maybe (Form ChannelNotifyProps MHEvent Name))
          (Maybe (Form ChannelNotifyProps MHEvent Name)))
    -> TeamState
    -> Const (Maybe (Form ChannelNotifyProps MHEvent Name)) TeamState)
-> Getting
     (Maybe (Form ChannelNotifyProps MHEvent Name))
     ChatState
     (Maybe (Form ChannelNotifyProps MHEvent Name))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe (Form ChannelNotifyProps MHEvent Name)
 -> Const
      (Maybe (Form ChannelNotifyProps MHEvent Name))
      (Maybe (Form ChannelNotifyProps MHEvent Name)))
-> TeamState
-> Const (Maybe (Form ChannelNotifyProps MHEvent Name)) TeamState
Lens' TeamState (Maybe (Form ChannelNotifyProps MHEvent Name))
tsNotifyPrefs
            DoAsyncChannelMM ()
forall a. DoAsyncChannelMM a
doAsyncChannelMM AsyncPriority
Preempt ChannelId
cId
              (\Session
s ChannelId
_ -> ChannelId -> UserId -> ChannelNotifyProps -> Session -> IO ()
MM.mmUpdateChannelNotifications ChannelId
cId (ChatState -> UserId
myUserId ChatState
st) (Form ChannelNotifyProps MHEvent Name -> ChannelNotifyProps
forall s e n. Form s e n -> s
formState Form ChannelNotifyProps MHEvent Name
form) Session
s)
              (\ChannelId
_ ()
_ -> Maybe (MH ())
forall a. Maybe a
Nothing)
            TeamId -> MH ()
exitEditNotifyPrefsMode TeamId
tId
    ]