matterhorn-50200.16.0: src/Matterhorn/State/NotifyPrefs.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
module Matterhorn.State.NotifyPrefs
( enterEditNotifyPrefsMode
, exitEditNotifyPrefsMode
)
where
import Prelude ()
import Matterhorn.Prelude
import Network.Mattermost.Types ( ChannelNotifyProps
, TeamId
, User(..)
, UserNotifyProps(..)
, Type(..)
, channelNotifyPropsMarkUnread
, channelNotifyPropsIgnoreChannelMentions
, WithDefault(..)
, NotifyOption(..)
)
import Brick
import Brick.Forms
import Lens.Micro.Platform ( Lens', (.=), lens )
import Matterhorn.Types
muteLens :: Lens' ChannelNotifyProps Bool
muteLens = lens (\props -> props^.channelNotifyPropsMarkUnreadL == IsValue NotifyOptionMention)
(\props muted -> props { channelNotifyPropsMarkUnread =
if muted
then IsValue NotifyOptionMention
else IsValue NotifyOptionAll
})
channelMentionLens :: Lens' ChannelNotifyProps Bool
channelMentionLens = lens (\props -> props^.channelNotifyPropsIgnoreChannelMentionsL == IsValue True)
(\props ignoreChannelMentions ->
props { channelNotifyPropsIgnoreChannelMentions = if ignoreChannelMentions
then IsValue True
else Default
})
notifyOptionName :: NotifyOption -> Text
notifyOptionName NotifyOptionAll = "All activity"
notifyOptionName NotifyOptionMention = "Mentions"
notifyOptionName NotifyOptionNone = "Never"
mkNotifyButtons :: ((WithDefault NotifyOption) -> Name)
-> Lens' ChannelNotifyProps (WithDefault NotifyOption)
-> NotifyOption
-> ChannelNotifyProps
-> FormFieldState ChannelNotifyProps e Name
mkNotifyButtons mkName l globalDefault =
let optTuple opt = (IsValue opt, mkName $ IsValue opt, notifyOptionName opt)
defaultField = (Default, mkName Default, "Global default (" <> notifyOptionName globalDefault <> ")")
nonDefault = optTuple <$> [ NotifyOptionAll
, NotifyOptionMention
, NotifyOptionNone
]
in radioField l (defaultField : nonDefault)
notifyPrefsForm :: TeamId -> UserNotifyProps -> ChannelNotifyProps -> Form ChannelNotifyProps e Name
notifyPrefsForm tId globalDefaults =
newForm [ checkboxField muteLens (MuteToggleField tId) "Mute channel"
, (padTop $ Pad 1) @@= checkboxField channelMentionLens (ChannelMentionsField tId) "Ignore channel mentions"
, radioStyle "Desktop notifications" @@=
mkNotifyButtons (DesktopNotificationsField tId) channelNotifyPropsDesktopL (userNotifyPropsDesktop globalDefaults)
, radioStyle "Push notifications" @@=
mkNotifyButtons (PushNotificationsField tId) channelNotifyPropsPushL (userNotifyPropsPush globalDefaults)
]
where radioStyle label = (padTop $ Pad 1 ) . (str label <=>) . (padLeft $ Pad 1)
enterEditNotifyPrefsMode :: TeamId -> MH ()
enterEditNotifyPrefsMode tId =
withCurrentChannel tId $ \_ chan -> do
case chan^.ccInfo.cdType of
Direct -> mhError $ GenericError "Cannot open notification preferences for DM channel."
_ -> do
let props = chan^.ccInfo.cdNotifyProps
user <- use csMe
csTeam(tId).tsNotifyPrefs .= (Just (notifyPrefsForm tId (userNotifyProps user) props))
setMode tId EditNotifyPrefs
exitEditNotifyPrefsMode :: TeamId -> MH ()
exitEditNotifyPrefsMode tId = do
setMode tId Main