{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Matterhorn.Events.ManageAttachments
  ( onEventManageAttachments
  , attachmentListKeybindings
  , attachmentBrowseKeyHandlers
  , attachmentBrowseKeybindings
  , attachmentListKeyHandlers
  )
where

import           Prelude ()
import           Matterhorn.Prelude

import qualified Control.Exception as E
import qualified Brick.Widgets.FileBrowser as FB
import qualified Brick.Widgets.List as L
import qualified Data.ByteString as BS
import qualified Data.Text as T
import qualified Data.Vector as Vector
import qualified Graphics.Vty as V
import           Lens.Micro.Platform ( (?=), (%=), to )

import           Matterhorn.Types
import           Matterhorn.Types.KeyEvents
import           Matterhorn.Events.Keybindings
import           Matterhorn.State.Attachments
import           Matterhorn.State.Common


onEventManageAttachments :: V.Event -> MH ()
onEventManageAttachments :: Event -> MH ()
onEventManageAttachments Event
e = do
    Mode
mode <- Getting Mode ChatState Mode -> MH Mode
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use ((TeamState -> Const Mode TeamState)
-> ChatState -> Const Mode ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const Mode TeamState)
 -> ChatState -> Const Mode ChatState)
-> ((Mode -> Const Mode Mode) -> TeamState -> Const Mode TeamState)
-> Getting Mode ChatState Mode
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Mode -> Const Mode Mode) -> TeamState -> Const Mode TeamState
Lens' TeamState Mode
tsMode)
    case Mode
mode of
        Mode
ManageAttachments -> 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
onEventAttachmentList Event
e
        Mode
ManageAttachmentsBrowseFiles -> Event -> MH ()
onEventBrowseFile Event
e
        Mode
_ -> [Char] -> MH ()
forall a. HasCallStack => [Char] -> a
error [Char]
"BUG: onEventManageAttachments called in invalid mode"

onEventAttachmentList :: V.Event -> MH Bool
onEventAttachmentList :: Event -> MH Bool
onEventAttachmentList =
    (KeyConfig -> KeyHandlerMap)
-> (Event -> MH ()) -> Event -> MH Bool
handleKeyboardEvent KeyConfig -> KeyHandlerMap
attachmentListKeybindings ((Event -> MH ()) -> Event -> MH Bool)
-> (Event -> MH ()) -> Event -> MH Bool
forall a b. (a -> b) -> a -> b
$
        Lens' ChatState (GenericList Name Vector AttachmentData)
-> (Event
    -> GenericList Name Vector AttachmentData
    -> EventM Name (GenericList Name Vector AttachmentData))
-> Event
-> MH ()
forall b e.
Lens' ChatState b -> (e -> b -> EventM Name b) -> e -> MH ()
mhHandleEventLensed ((TeamState -> f TeamState) -> ChatState -> f ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> f TeamState) -> ChatState -> f ChatState)
-> ((GenericList Name Vector AttachmentData
     -> f (GenericList Name Vector AttachmentData))
    -> TeamState -> f TeamState)
-> (GenericList Name Vector AttachmentData
    -> f (GenericList Name Vector AttachmentData))
-> ChatState
-> f ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> f ChatEditState) -> TeamState -> f TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> f ChatEditState) -> TeamState -> f TeamState)
-> ((GenericList Name Vector AttachmentData
     -> f (GenericList Name Vector AttachmentData))
    -> ChatEditState -> f ChatEditState)
-> (GenericList Name Vector AttachmentData
    -> f (GenericList Name Vector AttachmentData))
-> TeamState
-> f TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> f (GenericList Name Vector AttachmentData))
-> ChatEditState -> f ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList) Event
-> GenericList Name Vector AttachmentData
-> EventM Name (GenericList Name Vector AttachmentData)
forall (t :: * -> *) n e.
(Foldable t, Splittable t, Ord n) =>
Event -> GenericList n t e -> EventM n (GenericList n t e)
L.handleListEvent

attachmentListKeybindings :: KeyConfig -> KeyHandlerMap
attachmentListKeybindings :: KeyConfig -> KeyHandlerMap
attachmentListKeybindings = [KeyEventHandler] -> KeyConfig -> KeyHandlerMap
mkKeybindings [KeyEventHandler]
attachmentListKeyHandlers

attachmentListKeyHandlers :: [KeyEventHandler]
attachmentListKeyHandlers :: [KeyEventHandler]
attachmentListKeyHandlers =
    [ KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
CancelEvent Text
"Close attachment list"
          (Mode -> MH ()
setMode Mode
Main)
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
SelectUpEvent Text
"Move cursor up" (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$
          Lens' ChatState (GenericList Name Vector AttachmentData)
-> (Event
    -> GenericList Name Vector AttachmentData
    -> EventM Name (GenericList Name Vector AttachmentData))
-> Event
-> MH ()
forall b e.
Lens' ChatState b -> (e -> b -> EventM Name b) -> e -> MH ()
mhHandleEventLensed ((TeamState -> f TeamState) -> ChatState -> f ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> f TeamState) -> ChatState -> f ChatState)
-> ((GenericList Name Vector AttachmentData
     -> f (GenericList Name Vector AttachmentData))
    -> TeamState -> f TeamState)
-> (GenericList Name Vector AttachmentData
    -> f (GenericList Name Vector AttachmentData))
-> ChatState
-> f ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> f ChatEditState) -> TeamState -> f TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> f ChatEditState) -> TeamState -> f TeamState)
-> ((GenericList Name Vector AttachmentData
     -> f (GenericList Name Vector AttachmentData))
    -> ChatEditState -> f ChatEditState)
-> (GenericList Name Vector AttachmentData
    -> f (GenericList Name Vector AttachmentData))
-> TeamState
-> f TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> f (GenericList Name Vector AttachmentData))
-> ChatEditState -> f ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList) Event
-> GenericList Name Vector AttachmentData
-> EventM Name (GenericList Name Vector AttachmentData)
forall (t :: * -> *) n e.
(Foldable t, Splittable t, Ord n) =>
Event -> GenericList n t e -> EventM n (GenericList n t e)
L.handleListEvent (Key -> [Modifier] -> Event
V.EvKey Key
V.KUp [])
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
SelectDownEvent Text
"Move cursor down" (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$
          Lens' ChatState (GenericList Name Vector AttachmentData)
-> (Event
    -> GenericList Name Vector AttachmentData
    -> EventM Name (GenericList Name Vector AttachmentData))
-> Event
-> MH ()
forall b e.
Lens' ChatState b -> (e -> b -> EventM Name b) -> e -> MH ()
mhHandleEventLensed ((TeamState -> f TeamState) -> ChatState -> f ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> f TeamState) -> ChatState -> f ChatState)
-> ((GenericList Name Vector AttachmentData
     -> f (GenericList Name Vector AttachmentData))
    -> TeamState -> f TeamState)
-> (GenericList Name Vector AttachmentData
    -> f (GenericList Name Vector AttachmentData))
-> ChatState
-> f ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> f ChatEditState) -> TeamState -> f TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> f ChatEditState) -> TeamState -> f TeamState)
-> ((GenericList Name Vector AttachmentData
     -> f (GenericList Name Vector AttachmentData))
    -> ChatEditState -> f ChatEditState)
-> (GenericList Name Vector AttachmentData
    -> f (GenericList Name Vector AttachmentData))
-> TeamState
-> f TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> f (GenericList Name Vector AttachmentData))
-> ChatEditState -> f ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList) Event
-> GenericList Name Vector AttachmentData
-> EventM Name (GenericList Name Vector AttachmentData)
forall (t :: * -> *) n e.
(Foldable t, Splittable t, Ord n) =>
Event -> GenericList n t e -> EventM n (GenericList n t e)
L.handleListEvent (Key -> [Modifier] -> Event
V.EvKey Key
V.KDown [])
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
AttachmentListAddEvent Text
"Add a new attachment to the attachment list"
          MH ()
showAttachmentFileBrowser
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
AttachmentOpenEvent Text
"Open the selected attachment using the URL open command"
          MH ()
openSelectedAttachment
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
AttachmentListDeleteEvent Text
"Delete the selected attachment from the attachment list"
          MH ()
deleteSelectedAttachment
    ]

attachmentBrowseKeybindings :: KeyConfig -> KeyHandlerMap
attachmentBrowseKeybindings :: KeyConfig -> KeyHandlerMap
attachmentBrowseKeybindings = [KeyEventHandler] -> KeyConfig -> KeyHandlerMap
mkKeybindings [KeyEventHandler]
attachmentBrowseKeyHandlers

attachmentBrowseKeyHandlers :: [KeyEventHandler]
attachmentBrowseKeyHandlers :: [KeyEventHandler]
attachmentBrowseKeyHandlers =
    [ KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
CancelEvent Text
"Cancel attachment file browse"
      MH ()
cancelAttachmentBrowse
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
AttachmentOpenEvent Text
"Open the selected file using the URL open command"
      MH ()
openSelectedBrowserEntry
    ]

withFileBrowser :: ((FB.FileBrowser Name) -> MH ()) -> MH ()
withFileBrowser :: (FileBrowser Name -> MH ()) -> MH ()
withFileBrowser FileBrowser Name -> MH ()
f = do
    Getting
  (Maybe (FileBrowser Name)) ChatState (Maybe (FileBrowser Name))
-> MH (Maybe (FileBrowser Name))
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use ((TeamState -> Const (Maybe (FileBrowser Name)) TeamState)
-> ChatState -> Const (Maybe (FileBrowser Name)) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const (Maybe (FileBrowser Name)) TeamState)
 -> ChatState -> Const (Maybe (FileBrowser Name)) ChatState)
-> ((Maybe (FileBrowser Name)
     -> Const (Maybe (FileBrowser Name)) (Maybe (FileBrowser Name)))
    -> TeamState -> Const (Maybe (FileBrowser Name)) TeamState)
-> Getting
     (Maybe (FileBrowser Name)) ChatState (Maybe (FileBrowser Name))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> Const (Maybe (FileBrowser Name)) ChatEditState)
-> TeamState -> Const (Maybe (FileBrowser Name)) TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> Const (Maybe (FileBrowser Name)) ChatEditState)
 -> TeamState -> Const (Maybe (FileBrowser Name)) TeamState)
-> ((Maybe (FileBrowser Name)
     -> Const (Maybe (FileBrowser Name)) (Maybe (FileBrowser Name)))
    -> ChatEditState -> Const (Maybe (FileBrowser Name)) ChatEditState)
-> (Maybe (FileBrowser Name)
    -> Const (Maybe (FileBrowser Name)) (Maybe (FileBrowser Name)))
-> TeamState
-> Const (Maybe (FileBrowser Name)) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe (FileBrowser Name)
 -> Const (Maybe (FileBrowser Name)) (Maybe (FileBrowser Name)))
-> ChatEditState -> Const (Maybe (FileBrowser Name)) ChatEditState
Lens' ChatEditState (Maybe (FileBrowser Name))
cedFileBrowser) MH (Maybe (FileBrowser Name))
-> (Maybe (FileBrowser Name) -> MH ()) -> MH ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Maybe (FileBrowser Name)
Nothing -> do
            -- The widget has not been created yet.  This should
            -- normally not occur, because the ManageAttachments
            -- events should not fire when there is no FileBrowser
            -- Widget active to cause Brick to generate these events.
            -- This could therefore be implemented as an `error "BUG:
            -- ..."` handler, but the more benign approach is to
            -- simply create an available FileBrowser at this stage.
            TeamId
tId <- Getting TeamId ChatState TeamId -> MH TeamId
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting TeamId ChatState TeamId
SimpleGetter ChatState TeamId
csCurrentTeamId
            FileBrowser Name
new_b <- IO (FileBrowser Name) -> MH (FileBrowser Name)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (FileBrowser Name) -> MH (FileBrowser Name))
-> IO (FileBrowser Name) -> MH (FileBrowser Name)
forall a b. (a -> b) -> a -> b
$ (FileInfo -> Bool) -> Name -> Maybe [Char] -> IO (FileBrowser Name)
forall n.
(FileInfo -> Bool) -> n -> Maybe [Char] -> IO (FileBrowser n)
FB.newFileBrowser FileInfo -> Bool
FB.selectNonDirectories (TeamId -> Name
AttachmentFileBrowser TeamId
tId) Maybe [Char]
forall a. Maybe a
Nothing
            (TeamState -> Identity TeamState)
-> ChatState -> Identity ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Identity TeamState)
 -> ChatState -> Identity ChatState)
-> ((Maybe (FileBrowser Name)
     -> Identity (Maybe (FileBrowser Name)))
    -> TeamState -> Identity TeamState)
-> (Maybe (FileBrowser Name)
    -> Identity (Maybe (FileBrowser Name)))
-> ChatState
-> Identity ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> Identity ChatEditState)
-> TeamState -> Identity TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> Identity ChatEditState)
 -> TeamState -> Identity TeamState)
-> ((Maybe (FileBrowser Name)
     -> Identity (Maybe (FileBrowser Name)))
    -> ChatEditState -> Identity ChatEditState)
-> (Maybe (FileBrowser Name)
    -> Identity (Maybe (FileBrowser Name)))
-> TeamState
-> Identity TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe (FileBrowser Name) -> Identity (Maybe (FileBrowser Name)))
-> ChatEditState -> Identity ChatEditState
Lens' ChatEditState (Maybe (FileBrowser Name))
cedFileBrowser ((Maybe (FileBrowser Name) -> Identity (Maybe (FileBrowser Name)))
 -> ChatState -> Identity ChatState)
-> FileBrowser Name -> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a (Maybe b) -> b -> m ()
?= FileBrowser Name
new_b
            FileBrowser Name -> MH ()
f FileBrowser Name
new_b
        Just FileBrowser Name
b -> FileBrowser Name -> MH ()
f FileBrowser Name
b

openSelectedAttachment :: MH ()
openSelectedAttachment :: MH ()
openSelectedAttachment = do
    Maybe (Int, AttachmentData)
cur <- Getting
  (Maybe (Int, AttachmentData))
  ChatState
  (Maybe (Int, AttachmentData))
-> MH (Maybe (Int, AttachmentData))
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use ((TeamState -> Const (Maybe (Int, AttachmentData)) TeamState)
-> ChatState -> Const (Maybe (Int, AttachmentData)) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const (Maybe (Int, AttachmentData)) TeamState)
 -> ChatState -> Const (Maybe (Int, AttachmentData)) ChatState)
-> ((Maybe (Int, AttachmentData)
     -> Const
          (Maybe (Int, AttachmentData)) (Maybe (Int, AttachmentData)))
    -> TeamState -> Const (Maybe (Int, AttachmentData)) TeamState)
-> Getting
     (Maybe (Int, AttachmentData))
     ChatState
     (Maybe (Int, AttachmentData))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState
 -> Const (Maybe (Int, AttachmentData)) ChatEditState)
-> TeamState -> Const (Maybe (Int, AttachmentData)) TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState
  -> Const (Maybe (Int, AttachmentData)) ChatEditState)
 -> TeamState -> Const (Maybe (Int, AttachmentData)) TeamState)
-> ((Maybe (Int, AttachmentData)
     -> Const
          (Maybe (Int, AttachmentData)) (Maybe (Int, AttachmentData)))
    -> ChatEditState
    -> Const (Maybe (Int, AttachmentData)) ChatEditState)
-> (Maybe (Int, AttachmentData)
    -> Const
         (Maybe (Int, AttachmentData)) (Maybe (Int, AttachmentData)))
-> TeamState
-> Const (Maybe (Int, AttachmentData)) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Const
      (Maybe (Int, AttachmentData))
      (GenericList Name Vector AttachmentData))
-> ChatEditState
-> Const (Maybe (Int, AttachmentData)) ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList((GenericList Name Vector AttachmentData
  -> Const
       (Maybe (Int, AttachmentData))
       (GenericList Name Vector AttachmentData))
 -> ChatEditState
 -> Const (Maybe (Int, AttachmentData)) ChatEditState)
-> ((Maybe (Int, AttachmentData)
     -> Const
          (Maybe (Int, AttachmentData)) (Maybe (Int, AttachmentData)))
    -> GenericList Name Vector AttachmentData
    -> Const
         (Maybe (Int, AttachmentData))
         (GenericList Name Vector AttachmentData))
-> (Maybe (Int, AttachmentData)
    -> Const
         (Maybe (Int, AttachmentData)) (Maybe (Int, AttachmentData)))
-> ChatEditState
-> Const (Maybe (Int, AttachmentData)) ChatEditState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Maybe (Int, AttachmentData))
-> SimpleGetter
     (GenericList Name Vector AttachmentData)
     (Maybe (Int, AttachmentData))
forall s a. (s -> a) -> SimpleGetter s a
to GenericList Name Vector AttachmentData
-> Maybe (Int, AttachmentData)
forall (t :: * -> *) n e.
(Splittable t, Foldable t) =>
GenericList n t e -> Maybe (Int, e)
L.listSelectedElement)
    case Maybe (Int, AttachmentData)
cur of
        Maybe (Int, AttachmentData)
Nothing -> () -> MH ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        Just (Int
_, AttachmentData
entry) -> 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
$ [Char] -> MH Bool
openFilePath (FileInfo -> [Char]
FB.fileInfoFilePath (FileInfo -> [Char]) -> FileInfo -> [Char]
forall a b. (a -> b) -> a -> b
$
                                                AttachmentData -> FileInfo
attachmentDataFileInfo AttachmentData
entry)

openSelectedBrowserEntry :: MH ()
openSelectedBrowserEntry :: MH ()
openSelectedBrowserEntry = (FileBrowser Name -> MH ()) -> MH ()
withFileBrowser ((FileBrowser Name -> MH ()) -> MH ())
-> (FileBrowser Name -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \FileBrowser Name
b ->
    case FileBrowser Name -> Maybe FileInfo
forall n. FileBrowser n -> Maybe FileInfo
FB.fileBrowserCursor FileBrowser Name
b of
        Maybe FileInfo
Nothing -> () -> MH ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        Just FileInfo
entry -> 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
$ [Char] -> MH Bool
openFilePath (FileInfo -> [Char]
FB.fileInfoFilePath FileInfo
entry)

onEventBrowseFile :: V.Event -> MH ()
onEventBrowseFile :: Event -> MH ()
onEventBrowseFile Event
e = do
    (FileBrowser Name -> MH ()) -> MH ()
withFileBrowser ((FileBrowser Name -> MH ()) -> MH ())
-> (FileBrowser Name -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \FileBrowser Name
b -> do
        case FileBrowser Name -> Bool
forall n. FileBrowser n -> Bool
FB.fileBrowserIsSearching FileBrowser Name
b of
            Bool
False ->
                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
$ (KeyConfig -> KeyHandlerMap)
-> (Event -> MH ()) -> Event -> MH Bool
handleKeyboardEvent KeyConfig -> KeyHandlerMap
attachmentBrowseKeybindings Event -> MH ()
handleFileBrowserEvent Event
e
            Bool
True ->
                Event -> MH ()
handleFileBrowserEvent Event
e

    -- n.b. the FileBrowser may have been updated above, so re-acquire it
    (FileBrowser Name -> MH ()) -> MH ()
withFileBrowser ((FileBrowser Name -> MH ()) -> MH ())
-> (FileBrowser Name -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \FileBrowser Name
b -> do
        case FileBrowser Name -> Maybe IOException
forall n. FileBrowser n -> Maybe IOException
FB.fileBrowserException FileBrowser Name
b of
            Maybe IOException
Nothing -> () -> MH ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
            Just IOException
ex -> do
                LogCategory -> Text -> MH ()
mhLog LogCategory
LogError (Text -> MH ()) -> Text -> MH ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack ([Char] -> Text) -> [Char] -> Text
forall a b. (a -> b) -> a -> b
$ [Char]
"FileBrowser exception: " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> IOException -> [Char]
forall a. Show a => a -> [Char]
show IOException
ex

cancelAttachmentBrowse :: MH ()
cancelAttachmentBrowse :: MH ()
cancelAttachmentBrowse = do
    Vector AttachmentData
es <- Getting (Vector AttachmentData) ChatState (Vector AttachmentData)
-> MH (Vector AttachmentData)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use ((TeamState -> Const (Vector AttachmentData) TeamState)
-> ChatState -> Const (Vector AttachmentData) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const (Vector AttachmentData) TeamState)
 -> ChatState -> Const (Vector AttachmentData) ChatState)
-> ((Vector AttachmentData
     -> Const (Vector AttachmentData) (Vector AttachmentData))
    -> TeamState -> Const (Vector AttachmentData) TeamState)
-> Getting
     (Vector AttachmentData) ChatState (Vector AttachmentData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> Const (Vector AttachmentData) ChatEditState)
-> TeamState -> Const (Vector AttachmentData) TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> Const (Vector AttachmentData) ChatEditState)
 -> TeamState -> Const (Vector AttachmentData) TeamState)
-> ((Vector AttachmentData
     -> Const (Vector AttachmentData) (Vector AttachmentData))
    -> ChatEditState -> Const (Vector AttachmentData) ChatEditState)
-> (Vector AttachmentData
    -> Const (Vector AttachmentData) (Vector AttachmentData))
-> TeamState
-> Const (Vector AttachmentData) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Const
      (Vector AttachmentData) (GenericList Name Vector AttachmentData))
-> ChatEditState -> Const (Vector AttachmentData) ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList((GenericList Name Vector AttachmentData
  -> Const
       (Vector AttachmentData) (GenericList Name Vector AttachmentData))
 -> ChatEditState -> Const (Vector AttachmentData) ChatEditState)
-> ((Vector AttachmentData
     -> Const (Vector AttachmentData) (Vector AttachmentData))
    -> GenericList Name Vector AttachmentData
    -> Const
         (Vector AttachmentData) (GenericList Name Vector AttachmentData))
-> (Vector AttachmentData
    -> Const (Vector AttachmentData) (Vector AttachmentData))
-> ChatEditState
-> Const (Vector AttachmentData) ChatEditState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Vector AttachmentData
 -> Const (Vector AttachmentData) (Vector AttachmentData))
-> GenericList Name Vector AttachmentData
-> Const
     (Vector AttachmentData) (GenericList Name Vector AttachmentData)
forall n (t1 :: * -> *) e1 (t2 :: * -> *) e2.
Lens (GenericList n t1 e1) (GenericList n t2 e2) (t1 e1) (t2 e2)
L.listElementsL)
    case Vector AttachmentData -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Vector AttachmentData
es of
        Int
0 -> Mode -> MH ()
setMode Mode
Main
        Int
_ -> Mode -> MH ()
setMode Mode
ManageAttachments

handleFileBrowserEvent :: V.Event -> MH ()
handleFileBrowserEvent :: Event -> MH ()
handleFileBrowserEvent Event
e = do
  let fbHandle :: Event -> t (FileBrowser n) -> EventM n (t (FileBrowser n))
fbHandle Event
ev = t (EventM n (FileBrowser n)) -> EventM n (t (FileBrowser n))
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence (t (EventM n (FileBrowser n)) -> EventM n (t (FileBrowser n)))
-> (t (FileBrowser n) -> t (EventM n (FileBrowser n)))
-> t (FileBrowser n)
-> EventM n (t (FileBrowser n))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((FileBrowser n -> EventM n (FileBrowser n))
-> t (FileBrowser n) -> t (EventM n (FileBrowser n))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Event -> FileBrowser n -> EventM n (FileBrowser n)
forall n.
Ord n =>
Event -> FileBrowser n -> EventM n (FileBrowser n)
FB.handleFileBrowserEvent Event
ev))
  Lens' ChatState (Maybe (FileBrowser Name))
-> (Event
    -> Maybe (FileBrowser Name)
    -> EventM Name (Maybe (FileBrowser Name)))
-> Event
-> MH ()
forall b e.
Lens' ChatState b -> (e -> b -> EventM Name b) -> e -> MH ()
mhHandleEventLensed ((TeamState -> f TeamState) -> ChatState -> f ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> f TeamState) -> ChatState -> f ChatState)
-> ((Maybe (FileBrowser Name) -> f (Maybe (FileBrowser Name)))
    -> TeamState -> f TeamState)
-> (Maybe (FileBrowser Name) -> f (Maybe (FileBrowser Name)))
-> ChatState
-> f ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> f ChatEditState) -> TeamState -> f TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> f ChatEditState) -> TeamState -> f TeamState)
-> ((Maybe (FileBrowser Name) -> f (Maybe (FileBrowser Name)))
    -> ChatEditState -> f ChatEditState)
-> (Maybe (FileBrowser Name) -> f (Maybe (FileBrowser Name)))
-> TeamState
-> f TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe (FileBrowser Name) -> f (Maybe (FileBrowser Name)))
-> ChatEditState -> f ChatEditState
Lens' ChatEditState (Maybe (FileBrowser Name))
cedFileBrowser) Event
-> Maybe (FileBrowser Name)
-> EventM Name (Maybe (FileBrowser Name))
forall (t :: * -> *) n.
(Traversable t, Ord n) =>
Event -> t (FileBrowser n) -> EventM n (t (FileBrowser n))
fbHandle Event
e

  (FileBrowser Name -> MH ()) -> MH ()
withFileBrowser ((FileBrowser Name -> MH ()) -> MH ())
-> (FileBrowser Name -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \FileBrowser Name
b -> do
    -- TODO: Check file browser exception state
    let entries :: [FileInfo]
entries = FileBrowser Name -> [FileInfo]
forall n. FileBrowser n -> [FileInfo]
FB.fileBrowserSelection FileBrowser Name
b
    [FileInfo] -> (FileInfo -> MH ()) -> MH ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [FileInfo]
entries ((FileInfo -> MH ()) -> MH ()) -> (FileInfo -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \FileInfo
entry -> do
        -- Is the entry already present? If so, ignore the selection.
        Vector AttachmentData
es <- Getting (Vector AttachmentData) ChatState (Vector AttachmentData)
-> MH (Vector AttachmentData)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use ((TeamState -> Const (Vector AttachmentData) TeamState)
-> ChatState -> Const (Vector AttachmentData) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const (Vector AttachmentData) TeamState)
 -> ChatState -> Const (Vector AttachmentData) ChatState)
-> ((Vector AttachmentData
     -> Const (Vector AttachmentData) (Vector AttachmentData))
    -> TeamState -> Const (Vector AttachmentData) TeamState)
-> Getting
     (Vector AttachmentData) ChatState (Vector AttachmentData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> Const (Vector AttachmentData) ChatEditState)
-> TeamState -> Const (Vector AttachmentData) TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> Const (Vector AttachmentData) ChatEditState)
 -> TeamState -> Const (Vector AttachmentData) TeamState)
-> ((Vector AttachmentData
     -> Const (Vector AttachmentData) (Vector AttachmentData))
    -> ChatEditState -> Const (Vector AttachmentData) ChatEditState)
-> (Vector AttachmentData
    -> Const (Vector AttachmentData) (Vector AttachmentData))
-> TeamState
-> Const (Vector AttachmentData) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Const
      (Vector AttachmentData) (GenericList Name Vector AttachmentData))
-> ChatEditState -> Const (Vector AttachmentData) ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList((GenericList Name Vector AttachmentData
  -> Const
       (Vector AttachmentData) (GenericList Name Vector AttachmentData))
 -> ChatEditState -> Const (Vector AttachmentData) ChatEditState)
-> ((Vector AttachmentData
     -> Const (Vector AttachmentData) (Vector AttachmentData))
    -> GenericList Name Vector AttachmentData
    -> Const
         (Vector AttachmentData) (GenericList Name Vector AttachmentData))
-> (Vector AttachmentData
    -> Const (Vector AttachmentData) (Vector AttachmentData))
-> ChatEditState
-> Const (Vector AttachmentData) ChatEditState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Vector AttachmentData
 -> Const (Vector AttachmentData) (Vector AttachmentData))
-> GenericList Name Vector AttachmentData
-> Const
     (Vector AttachmentData) (GenericList Name Vector AttachmentData)
forall n (t1 :: * -> *) e1 (t2 :: * -> *) e2.
Lens (GenericList n t1 e1) (GenericList n t2 e2) (t1 e1) (t2 e2)
L.listElementsL)
        let matches :: AttachmentData -> Bool
matches = ([Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== (FileInfo -> [Char]
FB.fileInfoFilePath FileInfo
entry)) ([Char] -> Bool)
-> (AttachmentData -> [Char]) -> AttachmentData -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                      FileInfo -> [Char]
FB.fileInfoFilePath (FileInfo -> [Char])
-> (AttachmentData -> FileInfo) -> AttachmentData -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                      AttachmentData -> FileInfo
attachmentDataFileInfo
        case (AttachmentData -> Bool)
-> Vector AttachmentData -> Maybe AttachmentData
forall a. (a -> Bool) -> Vector a -> Maybe a
Vector.find AttachmentData -> Bool
matches Vector AttachmentData
es of
            Just AttachmentData
_ -> () -> MH ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
            Maybe AttachmentData
Nothing -> do
                let path :: [Char]
path = FileInfo -> [Char]
FB.fileInfoFilePath FileInfo
entry
                Either SomeException ByteString
readResult <- IO (Either SomeException ByteString)
-> MH (Either SomeException ByteString)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either SomeException ByteString)
 -> MH (Either SomeException ByteString))
-> IO (Either SomeException ByteString)
-> MH (Either SomeException ByteString)
forall a b. (a -> b) -> a -> b
$ IO ByteString -> IO (Either SomeException ByteString)
forall e a. Exception e => IO a -> IO (Either e a)
E.try (IO ByteString -> IO (Either SomeException ByteString))
-> IO ByteString -> IO (Either SomeException ByteString)
forall a b. (a -> b) -> a -> b
$ [Char] -> IO ByteString
BS.readFile [Char]
path
                case Either SomeException ByteString
readResult of
                    Left (SomeException
_::E.SomeException) ->
                        -- TODO: report the error
                        () -> MH ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
                    Right ByteString
bytes -> do
                        let a :: AttachmentData
a = AttachmentData :: FileInfo -> ByteString -> AttachmentData
AttachmentData { attachmentDataFileInfo :: FileInfo
attachmentDataFileInfo = FileInfo
entry
                                               , attachmentDataBytes :: ByteString
attachmentDataBytes = ByteString
bytes
                                               }
                        Maybe Int
oldIdx <- Getting (Maybe Int) ChatState (Maybe Int) -> MH (Maybe Int)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use ((TeamState -> Const (Maybe Int) TeamState)
-> ChatState -> Const (Maybe Int) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const (Maybe Int) TeamState)
 -> ChatState -> Const (Maybe Int) ChatState)
-> ((Maybe Int -> Const (Maybe Int) (Maybe Int))
    -> TeamState -> Const (Maybe Int) TeamState)
-> Getting (Maybe Int) ChatState (Maybe Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> Const (Maybe Int) ChatEditState)
-> TeamState -> Const (Maybe Int) TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> Const (Maybe Int) ChatEditState)
 -> TeamState -> Const (Maybe Int) TeamState)
-> ((Maybe Int -> Const (Maybe Int) (Maybe Int))
    -> ChatEditState -> Const (Maybe Int) ChatEditState)
-> (Maybe Int -> Const (Maybe Int) (Maybe Int))
-> TeamState
-> Const (Maybe Int) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Const (Maybe Int) (GenericList Name Vector AttachmentData))
-> ChatEditState -> Const (Maybe Int) ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList((GenericList Name Vector AttachmentData
  -> Const (Maybe Int) (GenericList Name Vector AttachmentData))
 -> ChatEditState -> Const (Maybe Int) ChatEditState)
-> ((Maybe Int -> Const (Maybe Int) (Maybe Int))
    -> GenericList Name Vector AttachmentData
    -> Const (Maybe Int) (GenericList Name Vector AttachmentData))
-> (Maybe Int -> Const (Maybe Int) (Maybe Int))
-> ChatEditState
-> Const (Maybe Int) ChatEditState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe Int -> Const (Maybe Int) (Maybe Int))
-> GenericList Name Vector AttachmentData
-> Const (Maybe Int) (GenericList Name Vector AttachmentData)
forall n (t :: * -> *) e. Lens' (GenericList n t e) (Maybe Int)
L.listSelectedL)
                        let newIdx :: Maybe Int
newIdx = if Vector AttachmentData -> Bool
forall a. Vector a -> Bool
Vector.null Vector AttachmentData
es
                                     then Int -> Maybe Int
forall a. a -> Maybe a
Just Int
0
                                     else Maybe Int
oldIdx
                        (TeamState -> Identity TeamState)
-> ChatState -> Identity ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Identity TeamState)
 -> ChatState -> Identity ChatState)
-> ((GenericList Name Vector AttachmentData
     -> Identity (GenericList Name Vector AttachmentData))
    -> TeamState -> Identity TeamState)
-> (GenericList Name Vector AttachmentData
    -> Identity (GenericList Name Vector AttachmentData))
-> ChatState
-> Identity ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> Identity ChatEditState)
-> TeamState -> Identity TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> Identity ChatEditState)
 -> TeamState -> Identity TeamState)
-> ((GenericList Name Vector AttachmentData
     -> Identity (GenericList Name Vector AttachmentData))
    -> ChatEditState -> Identity ChatEditState)
-> (GenericList Name Vector AttachmentData
    -> Identity (GenericList Name Vector AttachmentData))
-> TeamState
-> Identity TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Identity (GenericList Name Vector AttachmentData))
-> ChatEditState -> Identity ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList ((GenericList Name Vector AttachmentData
  -> Identity (GenericList Name Vector AttachmentData))
 -> ChatState -> Identity ChatState)
-> (GenericList Name Vector AttachmentData
    -> GenericList Name Vector AttachmentData)
-> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= Vector AttachmentData
-> Maybe Int
-> GenericList Name Vector AttachmentData
-> GenericList Name Vector AttachmentData
forall (t :: * -> *) e n.
(Foldable t, Splittable t) =>
t e -> Maybe Int -> GenericList n t e -> GenericList n t e
L.listReplace (Vector AttachmentData -> AttachmentData -> Vector AttachmentData
forall a. Vector a -> a -> Vector a
Vector.snoc Vector AttachmentData
es AttachmentData
a) Maybe Int
newIdx

    Bool -> MH () -> MH ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [FileInfo] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [FileInfo]
entries) (MH () -> MH ()) -> MH () -> MH ()
forall a b. (a -> b) -> a -> b
$ Mode -> MH ()
setMode Mode
Main

deleteSelectedAttachment :: MH ()
deleteSelectedAttachment :: MH ()
deleteSelectedAttachment = do
    Vector AttachmentData
es <- Getting (Vector AttachmentData) ChatState (Vector AttachmentData)
-> MH (Vector AttachmentData)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use ((TeamState -> Const (Vector AttachmentData) TeamState)
-> ChatState -> Const (Vector AttachmentData) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const (Vector AttachmentData) TeamState)
 -> ChatState -> Const (Vector AttachmentData) ChatState)
-> ((Vector AttachmentData
     -> Const (Vector AttachmentData) (Vector AttachmentData))
    -> TeamState -> Const (Vector AttachmentData) TeamState)
-> Getting
     (Vector AttachmentData) ChatState (Vector AttachmentData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> Const (Vector AttachmentData) ChatEditState)
-> TeamState -> Const (Vector AttachmentData) TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> Const (Vector AttachmentData) ChatEditState)
 -> TeamState -> Const (Vector AttachmentData) TeamState)
-> ((Vector AttachmentData
     -> Const (Vector AttachmentData) (Vector AttachmentData))
    -> ChatEditState -> Const (Vector AttachmentData) ChatEditState)
-> (Vector AttachmentData
    -> Const (Vector AttachmentData) (Vector AttachmentData))
-> TeamState
-> Const (Vector AttachmentData) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Const
      (Vector AttachmentData) (GenericList Name Vector AttachmentData))
-> ChatEditState -> Const (Vector AttachmentData) ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList((GenericList Name Vector AttachmentData
  -> Const
       (Vector AttachmentData) (GenericList Name Vector AttachmentData))
 -> ChatEditState -> Const (Vector AttachmentData) ChatEditState)
-> ((Vector AttachmentData
     -> Const (Vector AttachmentData) (Vector AttachmentData))
    -> GenericList Name Vector AttachmentData
    -> Const
         (Vector AttachmentData) (GenericList Name Vector AttachmentData))
-> (Vector AttachmentData
    -> Const (Vector AttachmentData) (Vector AttachmentData))
-> ChatEditState
-> Const (Vector AttachmentData) ChatEditState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Vector AttachmentData
 -> Const (Vector AttachmentData) (Vector AttachmentData))
-> GenericList Name Vector AttachmentData
-> Const
     (Vector AttachmentData) (GenericList Name Vector AttachmentData)
forall n (t1 :: * -> *) e1 (t2 :: * -> *) e2.
Lens (GenericList n t1 e1) (GenericList n t2 e2) (t1 e1) (t2 e2)
L.listElementsL)
    Maybe (Int, AttachmentData)
mSel <- Getting
  (Maybe (Int, AttachmentData))
  ChatState
  (Maybe (Int, AttachmentData))
-> MH (Maybe (Int, AttachmentData))
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use ((TeamState -> Const (Maybe (Int, AttachmentData)) TeamState)
-> ChatState -> Const (Maybe (Int, AttachmentData)) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const (Maybe (Int, AttachmentData)) TeamState)
 -> ChatState -> Const (Maybe (Int, AttachmentData)) ChatState)
-> ((Maybe (Int, AttachmentData)
     -> Const
          (Maybe (Int, AttachmentData)) (Maybe (Int, AttachmentData)))
    -> TeamState -> Const (Maybe (Int, AttachmentData)) TeamState)
-> Getting
     (Maybe (Int, AttachmentData))
     ChatState
     (Maybe (Int, AttachmentData))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState
 -> Const (Maybe (Int, AttachmentData)) ChatEditState)
-> TeamState -> Const (Maybe (Int, AttachmentData)) TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState
  -> Const (Maybe (Int, AttachmentData)) ChatEditState)
 -> TeamState -> Const (Maybe (Int, AttachmentData)) TeamState)
-> ((Maybe (Int, AttachmentData)
     -> Const
          (Maybe (Int, AttachmentData)) (Maybe (Int, AttachmentData)))
    -> ChatEditState
    -> Const (Maybe (Int, AttachmentData)) ChatEditState)
-> (Maybe (Int, AttachmentData)
    -> Const
         (Maybe (Int, AttachmentData)) (Maybe (Int, AttachmentData)))
-> TeamState
-> Const (Maybe (Int, AttachmentData)) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Const
      (Maybe (Int, AttachmentData))
      (GenericList Name Vector AttachmentData))
-> ChatEditState
-> Const (Maybe (Int, AttachmentData)) ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList((GenericList Name Vector AttachmentData
  -> Const
       (Maybe (Int, AttachmentData))
       (GenericList Name Vector AttachmentData))
 -> ChatEditState
 -> Const (Maybe (Int, AttachmentData)) ChatEditState)
-> ((Maybe (Int, AttachmentData)
     -> Const
          (Maybe (Int, AttachmentData)) (Maybe (Int, AttachmentData)))
    -> GenericList Name Vector AttachmentData
    -> Const
         (Maybe (Int, AttachmentData))
         (GenericList Name Vector AttachmentData))
-> (Maybe (Int, AttachmentData)
    -> Const
         (Maybe (Int, AttachmentData)) (Maybe (Int, AttachmentData)))
-> ChatEditState
-> Const (Maybe (Int, AttachmentData)) ChatEditState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Maybe (Int, AttachmentData))
-> SimpleGetter
     (GenericList Name Vector AttachmentData)
     (Maybe (Int, AttachmentData))
forall s a. (s -> a) -> SimpleGetter s a
to GenericList Name Vector AttachmentData
-> Maybe (Int, AttachmentData)
forall (t :: * -> *) n e.
(Splittable t, Foldable t) =>
GenericList n t e -> Maybe (Int, e)
L.listSelectedElement)
    case Maybe (Int, AttachmentData)
mSel of
        Maybe (Int, AttachmentData)
Nothing ->
            () -> MH ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        Just (Int
pos, AttachmentData
_) -> do
            Maybe Int
oldIdx <- Getting (Maybe Int) ChatState (Maybe Int) -> MH (Maybe Int)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use ((TeamState -> Const (Maybe Int) TeamState)
-> ChatState -> Const (Maybe Int) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const (Maybe Int) TeamState)
 -> ChatState -> Const (Maybe Int) ChatState)
-> ((Maybe Int -> Const (Maybe Int) (Maybe Int))
    -> TeamState -> Const (Maybe Int) TeamState)
-> Getting (Maybe Int) ChatState (Maybe Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> Const (Maybe Int) ChatEditState)
-> TeamState -> Const (Maybe Int) TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> Const (Maybe Int) ChatEditState)
 -> TeamState -> Const (Maybe Int) TeamState)
-> ((Maybe Int -> Const (Maybe Int) (Maybe Int))
    -> ChatEditState -> Const (Maybe Int) ChatEditState)
-> (Maybe Int -> Const (Maybe Int) (Maybe Int))
-> TeamState
-> Const (Maybe Int) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Const (Maybe Int) (GenericList Name Vector AttachmentData))
-> ChatEditState -> Const (Maybe Int) ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList((GenericList Name Vector AttachmentData
  -> Const (Maybe Int) (GenericList Name Vector AttachmentData))
 -> ChatEditState -> Const (Maybe Int) ChatEditState)
-> ((Maybe Int -> Const (Maybe Int) (Maybe Int))
    -> GenericList Name Vector AttachmentData
    -> Const (Maybe Int) (GenericList Name Vector AttachmentData))
-> (Maybe Int -> Const (Maybe Int) (Maybe Int))
-> ChatEditState
-> Const (Maybe Int) ChatEditState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe Int -> Const (Maybe Int) (Maybe Int))
-> GenericList Name Vector AttachmentData
-> Const (Maybe Int) (GenericList Name Vector AttachmentData)
forall n (t :: * -> *) e. Lens' (GenericList n t e) (Maybe Int)
L.listSelectedL)
            let idx :: Maybe Int
idx = if Vector AttachmentData -> Int
forall a. Vector a -> Int
Vector.length Vector AttachmentData
es Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1
                      then Maybe Int
forall a. Maybe a
Nothing
                      else case Maybe Int
oldIdx of
                          Maybe Int
Nothing -> Int -> Maybe Int
forall a. a -> Maybe a
Just Int
0
                          Just Int
old -> if Int
pos Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
old
                                      then Int -> Maybe Int
forall a. a -> Maybe a
Just (Int -> Maybe Int) -> Int -> Maybe Int
forall a b. (a -> b) -> a -> b
$ Int
pos Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
                                      else Int -> Maybe Int
forall a. a -> Maybe a
Just Int
pos
            (TeamState -> Identity TeamState)
-> ChatState -> Identity ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Identity TeamState)
 -> ChatState -> Identity ChatState)
-> ((GenericList Name Vector AttachmentData
     -> Identity (GenericList Name Vector AttachmentData))
    -> TeamState -> Identity TeamState)
-> (GenericList Name Vector AttachmentData
    -> Identity (GenericList Name Vector AttachmentData))
-> ChatState
-> Identity ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> Identity ChatEditState)
-> TeamState -> Identity TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> Identity ChatEditState)
 -> TeamState -> Identity TeamState)
-> ((GenericList Name Vector AttachmentData
     -> Identity (GenericList Name Vector AttachmentData))
    -> ChatEditState -> Identity ChatEditState)
-> (GenericList Name Vector AttachmentData
    -> Identity (GenericList Name Vector AttachmentData))
-> TeamState
-> Identity TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Identity (GenericList Name Vector AttachmentData))
-> ChatEditState -> Identity ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList ((GenericList Name Vector AttachmentData
  -> Identity (GenericList Name Vector AttachmentData))
 -> ChatState -> Identity ChatState)
-> (GenericList Name Vector AttachmentData
    -> GenericList Name Vector AttachmentData)
-> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= Vector AttachmentData
-> Maybe Int
-> GenericList Name Vector AttachmentData
-> GenericList Name Vector AttachmentData
forall (t :: * -> *) e n.
(Foldable t, Splittable t) =>
t e -> Maybe Int -> GenericList n t e -> GenericList n t e
L.listReplace (Int -> Vector AttachmentData -> Vector AttachmentData
forall a. Int -> Vector a -> Vector a
deleteAt Int
pos Vector AttachmentData
es) Maybe Int
idx

deleteAt :: Int -> Vector.Vector a -> Vector.Vector a
deleteAt :: Int -> Vector a -> Vector a
deleteAt Int
p Vector a
as | Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Vector a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Vector a
as = Vector a
as
              | Bool
otherwise = Int -> Vector a -> Vector a
forall a. Int -> Vector a -> Vector a
Vector.take Int
p Vector a
as Vector a -> Vector a -> Vector a
forall a. Semigroup a => a -> a -> a
<> Int -> Vector a -> Vector a
forall a. Int -> Vector a -> Vector a
Vector.drop (Int
p Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Vector a
as