{-# language OverloadedStrings #-}
module UI
(
mkInitialState
, startUI
) where
import Data.Maybe (fromMaybe)
import Brick.AttrMap (AttrMap)
import qualified Brick.AttrMap as Brick
import Brick.Main (App(..), defaultMain)
import Brick.Widgets.Border (borderAttr)
import Brick.Widgets.Edit (editor)
import Brick.Widgets.List (listSelectedFocusedAttr)
import qualified Data.ByteString.Lazy as Lazy (ByteString)
import qualified Network.HTTP.Client as HC
import Data.Text (Text)
import qualified Data.Text as T
import Graphics.Vty.Attributes
( Attr(Attr, attrBackColor, attrForeColor, attrStyle, attrURL)
, MaybeDefault(Default, SetTo)
, currentAttr
, reverseVideo
)
import Graphics.Vty.Image (emptyImage)
import HTTP.Client (Header, UseDefaultHeaders, robustSettings)
import Lib
import Types
attrMap :: AppS -> AttrMap
attrMap :: AppS -> AttrMap
attrMap AppS
_ =
Attr -> [(AttrName, Attr)] -> AttrMap
Brick.attrMap Attr
currentAttr
[ (AttrName
listSelectedFocusedAttr, Attr
currentAttr {attrStyle = SetTo reverseVideo})
, (AttrName
borderAttr, Attr
termDefaults)
]
where
termDefaults :: Attr
termDefaults = Attr
{ attrStyle :: MaybeDefault Style
attrStyle = MaybeDefault Style
forall v. MaybeDefault v
Default
, attrForeColor :: MaybeDefault Color
attrForeColor = MaybeDefault Color
forall v. MaybeDefault v
Default
, attrBackColor :: MaybeDefault Color
attrBackColor = MaybeDefault Color
forall v. MaybeDefault v
Default
, attrURL :: MaybeDefault Text
attrURL = MaybeDefault Text
forall v. MaybeDefault v
Default
}
mkInitialState
:: HC.Manager
-> String
-> UseDefaultHeaders
-> [Header]
-> Maybe Lazy.ByteString
-> Maybe Text
-> AppS
mkInitialState :: Manager
-> Method
-> UseDefaultHeaders
-> [Header]
-> Maybe ByteString
-> Maybe Text
-> AppS
mkInitialState Manager
m Method
method UseDefaultHeaders
useDefault [Header]
custHeaders Maybe ByteString
payloadLbs Maybe Text
uri = AppS
{ focus :: AppR
focus = AppR
UrlEditor
, methodEditor :: Editor Method AppR
methodEditor = AppR -> Maybe Int -> Method -> Editor Method AppR
forall a n.
GenericTextZipper a =>
n -> Maybe Int -> a -> Editor a n
editor AppR
MethodEditor (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
1) Method
method
, overlayState :: Maybe OverlayS
overlayState = Maybe OverlayS
forall a. Maybe a
Nothing
, urlEditor :: Editor Method AppR
urlEditor = AppR -> Maybe Int -> Method -> Editor Method AppR
forall a n.
GenericTextZipper a =>
n -> Maybe Int -> a -> Editor a n
editor AppR
UrlEditor (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
1) (Text -> Method
T.unpack (Text -> Method) -> Text -> Method
forall a b. (a -> b) -> a -> b
$ Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"" Maybe Text
uri)
, lastResponse :: Image
lastResponse = Image
emptyImage
, useDefaultHeaders :: Bool
useDefaultHeaders = Int -> Bool
forall a. Enum a => Int -> a
toEnum (Int -> Bool) -> Int -> Bool
forall a b. (a -> b) -> a -> b
$ UseDefaultHeaders -> Int
forall a. Enum a => a -> Int
fromEnum UseDefaultHeaders
useDefault
, customHeaders :: [(Bool, Header)]
customHeaders = (Header -> (Bool, Header)) -> [Header] -> [(Bool, Header)]
forall a b. (a -> b) -> [a] -> [b]
map (Bool
True,) [Header]
custHeaders
, headerEditor :: Maybe (Editor Text AppR)
headerEditor = Maybe (Editor Text AppR)
forall a. Maybe a
Nothing
, payload :: Maybe ByteString
payload = Maybe ByteString
payloadLbs
, connManager :: Manager
connManager = Manager
m
}
startUI
:: String
-> UseDefaultHeaders
-> [Header]
-> Maybe Lazy.ByteString
-> Maybe Text
-> IO ()
startUI :: Method
-> UseDefaultHeaders
-> [Header]
-> Maybe ByteString
-> Maybe Text
-> IO ()
startUI Method
method UseDefaultHeaders
useDefault [Header]
custHeaders Maybe ByteString
payloadLbs Maybe Text
uri = do
manager <- ManagerSettings -> IO Manager
HC.newManager ManagerSettings
robustSettings
uiState <- case uri of
Maybe Text
Nothing -> AppS -> IO AppS
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AppS -> IO AppS) -> AppS -> IO AppS
forall a b. (a -> b) -> a -> b
$ Manager
-> Method
-> UseDefaultHeaders
-> [Header]
-> Maybe ByteString
-> Maybe Text
-> AppS
mkInitialState Manager
manager Method
method UseDefaultHeaders
useDefault [Header]
custHeaders Maybe ByteString
payloadLbs Maybe Text
uri
Just{} -> AppS -> IO AppS
doRequest (AppS -> IO AppS) -> AppS -> IO AppS
forall a b. (a -> b) -> a -> b
$ Manager
-> Method
-> UseDefaultHeaders
-> [Header]
-> Maybe ByteString
-> Maybe Text
-> AppS
mkInitialState Manager
manager Method
method UseDefaultHeaders
useDefault [Header]
custHeaders Maybe ByteString
payloadLbs Maybe Text
uri
_ <- defaultMain app uiState
pure ()
where
app :: App AppS Void AppR
app = App
{ appDraw :: AppS -> [Widget AppR]
appDraw = AppS -> [Widget AppR]
draw
, appChooseCursor :: AppS -> [CursorLocation AppR] -> Maybe (CursorLocation AppR)
appChooseCursor = AppS -> [CursorLocation AppR] -> Maybe (CursorLocation AppR)
chooseCursor
, appHandleEvent :: BrickEvent AppR Void -> EventM AppR AppS ()
appHandleEvent = BrickEvent AppR Void -> EventM AppR AppS ()
handleEvent
, appStartEvent :: EventM AppR AppS ()
appStartEvent = () -> EventM AppR AppS ()
forall a. a -> EventM AppR AppS a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
, appAttrMap :: AppS -> AttrMap
appAttrMap = AppS -> AttrMap
attrMap
}