{-# LANGUAGE TemplateHaskell #-} module Mensam.Client.UI.Spaces where import Mensam.API.Data.Space import Mensam.API.Route.Api.Space qualified as Route.Space import Mensam.Client.Application import Mensam.Client.Application.Event.Class import Mensam.Client.UI.Brick.Draw import Mensam.Client.UI.Brick.Events import Mensam.Client.UI.Brick.Names import Brick import Brick.Forms import Brick.Widgets.Border import Brick.Widgets.Center import Brick.Widgets.List import Control.Monad.Trans.Class import Data.Kind import Data.Sequence qualified as Seq import Data.Text qualified as T import Data.Time.Zones.All qualified as T import Graphics.Vty.Input.Events import Lens.Micro.Platform spacesListInitial :: GenericList ClientName Seq.Seq Space spacesListInitial :: GenericList ClientName Seq Space spacesListInitial = ClientName -> Seq Space -> Int -> GenericList ClientName Seq Space forall (t :: * -> *) n e. Foldable t => n -> t e -> Int -> GenericList n t e list ClientName ClientNameSpacesList Seq Space forall a. Monoid a => a mempty Int 1 type NewSpaceInfo :: Type data NewSpaceInfo = MkLoginInfo { NewSpaceInfo -> Text _newSpaceInfoName :: T.Text , NewSpaceInfo -> TZLabel _newSpaceInfoTimezone :: T.TZLabel , NewSpaceInfo -> VisibilitySpace _newSpaceInfoVisibility :: VisibilitySpace } makeLenses ''NewSpaceInfo newSpaceFormInitial :: Form NewSpaceInfo e ClientName newSpaceFormInitial :: forall e. Form NewSpaceInfo e ClientName newSpaceFormInitial = [NewSpaceInfo -> FormFieldState NewSpaceInfo e ClientName] -> NewSpaceInfo -> Form NewSpaceInfo e ClientName forall s e n. [s -> FormFieldState s e n] -> s -> Form s e n newForm [ (String -> Widget ClientName forall n. String -> Widget n str String "Name: " <+>) (Widget ClientName -> Widget ClientName) -> (NewSpaceInfo -> FormFieldState NewSpaceInfo e ClientName) -> NewSpaceInfo -> FormFieldState NewSpaceInfo e ClientName forall n s e. (Widget n -> Widget n) -> (s -> FormFieldState s e n) -> s -> FormFieldState s e n @@= Lens' NewSpaceInfo Text -> ClientName -> Maybe Int -> NewSpaceInfo -> FormFieldState NewSpaceInfo e ClientName forall n s e. (Ord n, Show n) => Lens' s Text -> n -> Maybe Int -> s -> FormFieldState s e n editTextField (Text -> f Text) -> NewSpaceInfo -> f NewSpaceInfo Lens' NewSpaceInfo Text newSpaceInfoName ClientName ClientNameSpacesNewSpaceName (Int -> Maybe Int forall a. a -> Maybe a Just Int 1) , (String -> Widget ClientName forall n. String -> Widget n str String "Timezone: " <+>) (Widget ClientName -> Widget ClientName) -> (NewSpaceInfo -> FormFieldState NewSpaceInfo e ClientName) -> NewSpaceInfo -> FormFieldState NewSpaceInfo e ClientName forall n s e. (Widget n -> Widget n) -> (s -> FormFieldState s e n) -> s -> FormFieldState s e n @@= Lens' NewSpaceInfo TZLabel -> [(TZLabel, ClientName, Text)] -> NewSpaceInfo -> FormFieldState NewSpaceInfo e ClientName forall n a s e. (Ord n, Show n, Eq a) => Lens' s a -> [(a, n, Text)] -> s -> FormFieldState s e n radioField (TZLabel -> f TZLabel) -> NewSpaceInfo -> f NewSpaceInfo Lens' NewSpaceInfo TZLabel newSpaceInfoTimezone ((TZLabel -> (TZLabel, ClientName, Text)) -> [TZLabel] -> [(TZLabel, ClientName, Text)] forall a b. (a -> b) -> [a] -> [b] map (\TZLabel x -> (TZLabel x, TZLabel -> ClientName ClientNameSpacesNewSpaceTimezone TZLabel x, String -> Text T.pack (String -> Text) -> String -> Text forall a b. (a -> b) -> a -> b $ TZLabel -> String forall a. Show a => a -> String show TZLabel x)) [TZLabel T.Etc__UTC, TZLabel T.Europe__Berlin]) , (String -> Widget ClientName forall n. String -> Widget n str String "Visibility: " <+>) (Widget ClientName -> Widget ClientName) -> (NewSpaceInfo -> FormFieldState NewSpaceInfo e ClientName) -> NewSpaceInfo -> FormFieldState NewSpaceInfo e ClientName forall n s e. (Widget n -> Widget n) -> (s -> FormFieldState s e n) -> s -> FormFieldState s e n @@= Lens' NewSpaceInfo VisibilitySpace -> [(VisibilitySpace, ClientName, Text)] -> NewSpaceInfo -> FormFieldState NewSpaceInfo e ClientName forall n a s e. (Ord n, Show n, Eq a) => Lens' s a -> [(a, n, Text)] -> s -> FormFieldState s e n radioField (VisibilitySpace -> f VisibilitySpace) -> NewSpaceInfo -> f NewSpaceInfo Lens' NewSpaceInfo VisibilitySpace newSpaceInfoVisibility ((VisibilitySpace -> (VisibilitySpace, ClientName, Text)) -> [VisibilitySpace] -> [(VisibilitySpace, ClientName, Text)] forall a b. (a -> b) -> [a] -> [b] map (\VisibilitySpace x -> (VisibilitySpace x, VisibilitySpace -> ClientName ClientNameSpacesNewSpaceVisibility VisibilitySpace x, String -> Text T.pack (String -> Text) -> String -> Text forall a b. (a -> b) -> a -> b $ VisibilitySpace -> String forall a. Show a => a -> String show VisibilitySpace x)) [forall a. Bounded a => a minBound @VisibilitySpace .. VisibilitySpace forall a. Bounded a => a maxBound]) ] MkLoginInfo { _newSpaceInfoName :: Text _newSpaceInfoName = Text "" , _newSpaceInfoTimezone :: TZLabel _newSpaceInfoTimezone = TZLabel T.Etc__UTC , _newSpaceInfoVisibility :: VisibilitySpace _newSpaceInfoVisibility = VisibilitySpace MkVisibilitySpaceVisible } type ScreenSpacesState :: Type data ScreenSpacesState = MkScreenSpacesState { ScreenSpacesState -> GenericList ClientName Seq Space _screenStateSpacesList :: GenericList ClientName Seq.Seq Space , ScreenSpacesState -> Bool _screenStateSpacesShowHelp :: Bool , ScreenSpacesState -> Maybe (Form NewSpaceInfo ClientEvent ClientName) _screenStateSpacesNewSpaceForm :: Maybe (Form NewSpaceInfo ClientEvent ClientName) } makeLenses ''ScreenSpacesState spacesDraw :: ScreenSpacesState -> [Widget ClientName] spacesDraw :: ScreenSpacesState -> [Widget ClientName] spacesDraw = \case s :: ScreenSpacesState s@MkScreenSpacesState {_screenStateSpacesShowHelp :: ScreenSpacesState -> Bool _screenStateSpacesShowHelp = Bool True} -> [ Widget ClientName -> Widget ClientName forall n. Widget n -> Widget n centerLayer (Widget ClientName -> Widget ClientName) -> Widget ClientName -> Widget ClientName forall a b. (a -> b) -> a -> b $ Widget ClientName -> Widget ClientName -> Widget ClientName forall n. Widget n -> Widget n -> Widget n borderWithLabel (Text -> Widget ClientName forall n. Text -> Widget n txt Text "Help") (Widget ClientName -> Widget ClientName) -> Widget ClientName -> Widget ClientName forall a b. (a -> b) -> a -> b $ Int -> Widget ClientName -> Widget ClientName forall n. Int -> Widget n -> Widget n cropRightTo Int 80 (Widget ClientName -> Widget ClientName) -> Widget ClientName -> Widget ClientName forall a b. (a -> b) -> a -> b $ Text -> Widget ClientName forall n. Text -> Widget n txt Text "? - Toggle Help\n\ \r - Refresh Spaces\n\ \c - Create new Space\n\ \Enter - View Desk\n\ \" ] [Widget ClientName] -> [Widget ClientName] -> [Widget ClientName] forall a. Semigroup a => a -> a -> a <> ScreenSpacesState -> [Widget ClientName] spacesDraw ScreenSpacesState s {_screenStateSpacesShowHelp = False} s :: ScreenSpacesState s@MkScreenSpacesState {_screenStateSpacesNewSpaceForm :: ScreenSpacesState -> Maybe (Form NewSpaceInfo ClientEvent ClientName) _screenStateSpacesNewSpaceForm = Just Form NewSpaceInfo ClientEvent ClientName form} -> [ Widget ClientName -> Widget ClientName forall n. Widget n -> Widget n centerLayer (Widget ClientName -> Widget ClientName) -> Widget ClientName -> Widget ClientName forall a b. (a -> b) -> a -> b $ Widget ClientName -> Widget ClientName -> Widget ClientName forall n. Widget n -> Widget n -> Widget n borderWithLabel (Text -> Widget ClientName forall n. Text -> Widget n txt Text "New Space") (Widget ClientName -> Widget ClientName) -> Widget ClientName -> Widget ClientName forall a b. (a -> b) -> a -> b $ Int -> Widget ClientName -> Widget ClientName forall n. Int -> Widget n -> Widget n cropRightTo Int 80 (Widget ClientName -> Widget ClientName) -> Widget ClientName -> Widget ClientName forall a b. (a -> b) -> a -> b $ Form NewSpaceInfo ClientEvent ClientName -> Widget ClientName forall n s e. Eq n => Form s e n -> Widget n renderForm Form NewSpaceInfo ClientEvent ClientName form ] [Widget ClientName] -> [Widget ClientName] -> [Widget ClientName] forall a. Semigroup a => a -> a -> a <> ScreenSpacesState -> [Widget ClientName] spacesDraw (ScreenSpacesState s {_screenStateSpacesNewSpaceForm = Nothing}) MkScreenSpacesState {_screenStateSpacesList :: ScreenSpacesState -> GenericList ClientName Seq Space _screenStateSpacesList = GenericList ClientName Seq Space spaces} -> [ [Widget ClientName] -> Widget ClientName forall n. [Widget n] -> Widget n vBox [ Widget ClientName -> Widget ClientName -> Widget ClientName forall n. Widget n -> Widget n -> Widget n borderWithLabel (Text -> Widget ClientName forall n. Text -> Widget n txt Text "Spaces") (Widget ClientName -> Widget ClientName) -> Widget ClientName -> Widget ClientName forall a b. (a -> b) -> a -> b $ Padding -> Widget ClientName -> Widget ClientName forall n. Padding -> Widget n -> Widget n padBottom Padding Max (Widget ClientName -> Widget ClientName) -> Widget ClientName -> Widget ClientName forall a b. (a -> b) -> a -> b $ Padding -> Widget ClientName -> Widget ClientName forall n. Padding -> Widget n -> Widget n padRight Padding Max (Widget ClientName -> Widget ClientName) -> Widget ClientName -> Widget ClientName forall a b. (a -> b) -> a -> b $ (Bool -> Space -> Widget ClientName) -> Bool -> GenericList ClientName Seq Space -> Widget ClientName forall (t :: * -> *) n e. (Traversable t, Splittable t, Ord n, Show n) => (Bool -> e -> Widget n) -> Bool -> GenericList n t e -> Widget n renderList (\Bool _focus Space space -> Padding -> Widget ClientName -> Widget ClientName forall n. Padding -> Widget n -> Widget n padRight Padding Max (Widget ClientName -> Widget ClientName) -> Widget ClientName -> Widget ClientName forall a b. (a -> b) -> a -> b $ Text -> Widget ClientName forall n. Text -> Widget n txt (Text -> Widget ClientName) -> Text -> Widget ClientName forall a b. (a -> b) -> a -> b $ String -> Text T.pack (String "#" String -> String -> String forall a. Semigroup a => a -> a -> a <> Int64 -> String forall a. Show a => a -> String show (IdentifierSpace -> Int64 unIdentifierSpace (IdentifierSpace -> Int64) -> IdentifierSpace -> Int64 forall a b. (a -> b) -> a -> b $ Space -> IdentifierSpace spaceId Space space) String -> String -> String forall a. Semigroup a => a -> a -> a <> String " ") Text -> Text -> Text forall a. Semigroup a => a -> a -> a <> NameSpace -> Text unNameSpace (Space -> NameSpace spaceName Space space)) Bool True GenericList ClientName Seq Space spaces , Padding -> Widget ClientName -> Widget ClientName forall n. Padding -> Widget n -> Widget n padLeft Padding Max (Widget ClientName -> Widget ClientName) -> Widget ClientName -> Widget ClientName forall a b. (a -> b) -> a -> b $ Text -> Widget ClientName forall n. Text -> Widget n txt Text footerMenuHelp ] ] spacesHandleEvent :: BrickEvent ClientName ClientEvent -> ApplicationT (EventM ClientName ScreenSpacesState) () spacesHandleEvent :: BrickEvent ClientName ClientEvent -> ApplicationT (EventM ClientName ScreenSpacesState) () spacesHandleEvent BrickEvent ClientName ClientEvent event = do ScreenSpacesState s <- EventM ClientName ScreenSpacesState ScreenSpacesState -> ApplicationT (EventM ClientName ScreenSpacesState) ScreenSpacesState forall (m :: * -> *) a. Monad m => m a -> ApplicationT m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift EventM ClientName ScreenSpacesState ScreenSpacesState forall s (m :: * -> *). MonadState s m => m s get case Form NewSpaceInfo ClientEvent ClientName -> NewSpaceInfo forall s e n. Form s e n -> s formState (Form NewSpaceInfo ClientEvent ClientName -> NewSpaceInfo) -> Maybe (Form NewSpaceInfo ClientEvent ClientName) -> Maybe NewSpaceInfo forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ScreenSpacesState -> Maybe (Form NewSpaceInfo ClientEvent ClientName) _screenStateSpacesNewSpaceForm ScreenSpacesState s of Maybe NewSpaceInfo Nothing -> case BrickEvent ClientName ClientEvent event of VtyEvent (EvKey (KChar Char '?') []) -> EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) () forall (m :: * -> *) a. Monad m => m a -> ApplicationT m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) ()) -> EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) () forall a b. (a -> b) -> a -> b $ ScreenSpacesState -> EventM ClientName ScreenSpacesState () forall s (m :: * -> *). MonadState s m => s -> m () put ScreenSpacesState s {_screenStateSpacesShowHelp = not $ _screenStateSpacesShowHelp s} VtyEvent (EvKey (KChar Char 'r') []) -> ClientEvent -> ApplicationT (EventM ClientName ScreenSpacesState) () forall (m :: * -> *). MonadEvent m => ClientEvent -> m () sendEvent ClientEvent ClientEventSwitchToScreenSpaces VtyEvent (EvKey (KChar Char 'c') []) -> EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) () forall (m :: * -> *) a. Monad m => m a -> ApplicationT m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) ()) -> EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) () forall a b. (a -> b) -> a -> b $ (Maybe (Form NewSpaceInfo ClientEvent ClientName) -> Identity (Maybe (Form NewSpaceInfo ClientEvent ClientName))) -> ScreenSpacesState -> Identity ScreenSpacesState Lens' ScreenSpacesState (Maybe (Form NewSpaceInfo ClientEvent ClientName)) screenStateSpacesNewSpaceForm ((Maybe (Form NewSpaceInfo ClientEvent ClientName) -> Identity (Maybe (Form NewSpaceInfo ClientEvent ClientName))) -> ScreenSpacesState -> Identity ScreenSpacesState) -> (Maybe (Form NewSpaceInfo ClientEvent ClientName) -> Maybe (Form NewSpaceInfo ClientEvent ClientName)) -> EventM ClientName ScreenSpacesState () forall s (m :: * -> *) a b. MonadState s m => ASetter s s a b -> (a -> b) -> m () %= Maybe (Form NewSpaceInfo ClientEvent ClientName) -> Maybe (Form NewSpaceInfo ClientEvent ClientName) -> Maybe (Form NewSpaceInfo ClientEvent ClientName) forall a b. a -> b -> a const (Form NewSpaceInfo ClientEvent ClientName -> Maybe (Form NewSpaceInfo ClientEvent ClientName) forall a. a -> Maybe a Just Form NewSpaceInfo ClientEvent ClientName forall e. Form NewSpaceInfo e ClientName newSpaceFormInitial) VtyEvent (EvKey Key KEnter []) -> do case GenericList ClientName Seq Space -> Maybe (Int, Space) forall (t :: * -> *) e n. (Splittable t, Traversable t, Semigroup (t e)) => GenericList n t e -> Maybe (Int, e) listSelectedElement (GenericList ClientName Seq Space -> Maybe (Int, Space)) -> GenericList ClientName Seq Space -> Maybe (Int, Space) forall a b. (a -> b) -> a -> b $ ScreenSpacesState -> GenericList ClientName Seq Space _screenStateSpacesList ScreenSpacesState s of Maybe (Int, Space) Nothing -> () -> ApplicationT (EventM ClientName ScreenSpacesState) () forall a. a -> ApplicationT (EventM ClientName ScreenSpacesState) a forall (f :: * -> *) a. Applicative f => a -> f a pure () Just (Int _index, Space space) -> ClientEvent -> ApplicationT (EventM ClientName ScreenSpacesState) () forall (m :: * -> *). MonadEvent m => ClientEvent -> m () sendEvent (ClientEvent -> ApplicationT (EventM ClientName ScreenSpacesState) ()) -> ClientEvent -> ApplicationT (EventM ClientName ScreenSpacesState) () forall a b. (a -> b) -> a -> b $ Space -> ClientEvent ClientEventSwitchToScreenDesks Space space VtyEvent Event e -> EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) () forall (m :: * -> *) a. Monad m => m a -> ApplicationT m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) ()) -> EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) () forall a b. (a -> b) -> a -> b $ LensLike' (Zoomed (EventM ClientName (GenericList ClientName Seq Space)) ()) ScreenSpacesState (GenericList ClientName Seq Space) -> EventM ClientName (GenericList ClientName Seq Space) () -> EventM ClientName ScreenSpacesState () forall c. LensLike' (Zoomed (EventM ClientName (GenericList ClientName Seq Space)) c) ScreenSpacesState (GenericList ClientName Seq Space) -> EventM ClientName (GenericList ClientName Seq Space) c -> EventM ClientName ScreenSpacesState c forall (m :: * -> *) (n :: * -> *) s t c. Zoom m n s t => LensLike' (Zoomed m c) t s -> m c -> n c zoom (GenericList ClientName Seq Space -> Focusing (StateT (EventState ClientName) IO) () (GenericList ClientName Seq Space)) -> ScreenSpacesState -> Focusing (StateT (EventState ClientName) IO) () ScreenSpacesState LensLike' (Zoomed (EventM ClientName (GenericList ClientName Seq Space)) ()) ScreenSpacesState (GenericList ClientName Seq Space) Lens' ScreenSpacesState (GenericList ClientName Seq Space) screenStateSpacesList (EventM ClientName (GenericList ClientName Seq Space) () -> EventM ClientName ScreenSpacesState ()) -> EventM ClientName (GenericList ClientName Seq Space) () -> EventM ClientName ScreenSpacesState () forall a b. (a -> b) -> a -> b $ Event -> EventM ClientName (GenericList ClientName Seq Space) () forall (t :: * -> *) n e. (Foldable t, Splittable t, Ord n) => Event -> EventM n (GenericList n t e) () handleListEvent Event e BrickEvent ClientName ClientEvent _ -> () -> ApplicationT (EventM ClientName ScreenSpacesState) () forall a. a -> ApplicationT (EventM ClientName ScreenSpacesState) a forall (f :: * -> *) a. Applicative f => a -> f a pure () Just NewSpaceInfo newSpaceInfo -> case BrickEvent ClientName ClientEvent event of VtyEvent (EvKey Key KEnter []) -> ClientEvent -> ApplicationT (EventM ClientName ScreenSpacesState) () forall (m :: * -> *). MonadEvent m => ClientEvent -> m () sendEvent (ClientEvent -> ApplicationT (EventM ClientName ScreenSpacesState) ()) -> ClientEvent -> ApplicationT (EventM ClientName ScreenSpacesState) () forall a b. (a -> b) -> a -> b $ RequestSpaceCreate -> ClientEvent ClientEventSendRequestCreateSpace Route.Space.MkRequestSpaceCreate { requestSpaceCreateName :: NameSpace Route.Space.requestSpaceCreateName = Text -> NameSpace MkNameSpace (Text -> NameSpace) -> Text -> NameSpace forall a b. (a -> b) -> a -> b $ NewSpaceInfo newSpaceInfo NewSpaceInfo -> Getting Text NewSpaceInfo Text -> Text forall s a. s -> Getting a s a -> a ^. Getting Text NewSpaceInfo Text Lens' NewSpaceInfo Text newSpaceInfoName , requestSpaceCreateTimezone :: TZLabel Route.Space.requestSpaceCreateTimezone = NewSpaceInfo newSpaceInfo NewSpaceInfo -> Getting TZLabel NewSpaceInfo TZLabel -> TZLabel forall s a. s -> Getting a s a -> a ^. Getting TZLabel NewSpaceInfo TZLabel Lens' NewSpaceInfo TZLabel newSpaceInfoTimezone , requestSpaceCreateVisibility :: VisibilitySpace Route.Space.requestSpaceCreateVisibility = NewSpaceInfo newSpaceInfo NewSpaceInfo -> Getting VisibilitySpace NewSpaceInfo VisibilitySpace -> VisibilitySpace forall s a. s -> Getting a s a -> a ^. Getting VisibilitySpace NewSpaceInfo VisibilitySpace Lens' NewSpaceInfo VisibilitySpace newSpaceInfoVisibility } BrickEvent ClientName ClientEvent _ -> EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) () forall (m :: * -> *) a. Monad m => m a -> ApplicationT m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) ()) -> EventM ClientName ScreenSpacesState () -> ApplicationT (EventM ClientName ScreenSpacesState) () forall a b. (a -> b) -> a -> b $ LensLike' (Zoomed (EventM ClientName (Form NewSpaceInfo ClientEvent ClientName)) ()) ScreenSpacesState (Form NewSpaceInfo ClientEvent ClientName) -> EventM ClientName (Form NewSpaceInfo ClientEvent ClientName) () -> EventM ClientName ScreenSpacesState () forall c. LensLike' (Zoomed (EventM ClientName (Form NewSpaceInfo ClientEvent ClientName)) c) ScreenSpacesState (Form NewSpaceInfo ClientEvent ClientName) -> EventM ClientName (Form NewSpaceInfo ClientEvent ClientName) c -> EventM ClientName ScreenSpacesState c forall (m :: * -> *) (n :: * -> *) s t c. Zoom m n s t => LensLike' (Zoomed m c) t s -> m c -> n c zoom ((Maybe (Form NewSpaceInfo ClientEvent ClientName) -> Focusing (StateT (EventState ClientName) IO) () (Maybe (Form NewSpaceInfo ClientEvent ClientName))) -> ScreenSpacesState -> Focusing (StateT (EventState ClientName) IO) () ScreenSpacesState Lens' ScreenSpacesState (Maybe (Form NewSpaceInfo ClientEvent ClientName)) screenStateSpacesNewSpaceForm ((Maybe (Form NewSpaceInfo ClientEvent ClientName) -> Focusing (StateT (EventState ClientName) IO) () (Maybe (Form NewSpaceInfo ClientEvent ClientName))) -> ScreenSpacesState -> Focusing (StateT (EventState ClientName) IO) () ScreenSpacesState) -> ((Form NewSpaceInfo ClientEvent ClientName -> Focusing (StateT (EventState ClientName) IO) () (Form NewSpaceInfo ClientEvent ClientName)) -> Maybe (Form NewSpaceInfo ClientEvent ClientName) -> Focusing (StateT (EventState ClientName) IO) () (Maybe (Form NewSpaceInfo ClientEvent ClientName))) -> (Form NewSpaceInfo ClientEvent ClientName -> Focusing (StateT (EventState ClientName) IO) () (Form NewSpaceInfo ClientEvent ClientName)) -> ScreenSpacesState -> Focusing (StateT (EventState ClientName) IO) () ScreenSpacesState forall b c a. (b -> c) -> (a -> b) -> a -> c . (Form NewSpaceInfo ClientEvent ClientName -> Focusing (StateT (EventState ClientName) IO) () (Form NewSpaceInfo ClientEvent ClientName)) -> Maybe (Form NewSpaceInfo ClientEvent ClientName) -> Focusing (StateT (EventState ClientName) IO) () (Maybe (Form NewSpaceInfo ClientEvent ClientName)) forall a a' (f :: * -> *). Applicative f => (a -> f a') -> Maybe a -> f (Maybe a') _Just) (EventM ClientName (Form NewSpaceInfo ClientEvent ClientName) () -> EventM ClientName ScreenSpacesState ()) -> EventM ClientName (Form NewSpaceInfo ClientEvent ClientName) () -> EventM ClientName ScreenSpacesState () forall a b. (a -> b) -> a -> b $ BrickEvent ClientName ClientEvent -> EventM ClientName (Form NewSpaceInfo ClientEvent ClientName) () forall n e s. Eq n => BrickEvent n e -> EventM n (Form s e n) () handleFormEvent BrickEvent ClientName ClientEvent event