100 lines
2.7 KiB
Haskell
100 lines
2.7 KiB
Haskell
|
{-# LANGUAGE TemplateHaskell #-}
|
||
|
{-# LANGUAGE OverloadedStrings #-}
|
||
|
|
||
|
module Zenith.GUI where
|
||
|
|
||
|
import Control.Exception (throwIO, try)
|
||
|
import Control.Monad.Logger (runNoLoggingT)
|
||
|
import Data.Maybe (fromMaybe, isJust)
|
||
|
import qualified Data.Text as T
|
||
|
import Database.Persist
|
||
|
import Lens.Micro ((&), (+~), (.~), (?~), (^.), set)
|
||
|
import Lens.Micro.TH
|
||
|
import Monomer
|
||
|
import TextShow
|
||
|
import ZcashHaskell.Types
|
||
|
( ZcashNet(..)
|
||
|
, ZebraGetBlockChainInfo(..)
|
||
|
, ZebraGetInfo(..)
|
||
|
)
|
||
|
import Zenith.Core
|
||
|
import Zenith.DB
|
||
|
import Zenith.Types
|
||
|
|
||
|
data AppModel = AppModel
|
||
|
{ _network :: !ZcashNet
|
||
|
, _wallets :: ![Entity ZcashWallet]
|
||
|
, _msg :: !(Maybe T.Text)
|
||
|
} deriving (Eq, Show)
|
||
|
|
||
|
makeLenses ''AppModel
|
||
|
|
||
|
data AppEvent
|
||
|
= AppInit
|
||
|
| ShowMsg !T.Text
|
||
|
| CloseMsg
|
||
|
deriving (Eq, Show)
|
||
|
|
||
|
buildUI ::
|
||
|
WidgetEnv AppModel AppEvent -> AppModel -> WidgetNode AppModel AppEvent
|
||
|
buildUI wenv model = widgetTree
|
||
|
where
|
||
|
widgetTree =
|
||
|
zstack
|
||
|
[ vstack
|
||
|
[ label "Hello World"
|
||
|
, spacer
|
||
|
, hstack [button "Try the overlay" $ ShowMsg "It works!"]
|
||
|
] `styleBasic`
|
||
|
[padding 10]
|
||
|
, msgOverlay `nodeVisible` isJust (model ^. msg)
|
||
|
]
|
||
|
msgOverlay =
|
||
|
alert CloseMsg $
|
||
|
hstack [filler, label $ fromMaybe "" (model ^. msg), filler]
|
||
|
|
||
|
handleEvent ::
|
||
|
WidgetEnv AppModel AppEvent
|
||
|
-> WidgetNode AppModel AppEvent
|
||
|
-> AppModel
|
||
|
-> AppEvent
|
||
|
-> [AppEventResponse AppModel AppEvent]
|
||
|
handleEvent wenv node model evt =
|
||
|
case evt of
|
||
|
AppInit -> []
|
||
|
ShowMsg t -> [Model $ model & msg ?~ t]
|
||
|
CloseMsg -> [Model $ model & msg .~ Nothing]
|
||
|
|
||
|
runZenithGUI :: Config -> IO ()
|
||
|
runZenithGUI config = do
|
||
|
let host = c_zebraHost config
|
||
|
let port = c_zebraPort config
|
||
|
let dbFilePath = c_dbPath config
|
||
|
pool <- runNoLoggingT $ initPool dbFilePath
|
||
|
w <- try $ checkZebra host port :: IO (Either IOError ZebraGetInfo)
|
||
|
case w of
|
||
|
Right zebra -> do
|
||
|
bc <-
|
||
|
try $ checkBlockChain host port :: IO
|
||
|
(Either IOError ZebraGetBlockChainInfo)
|
||
|
case bc of
|
||
|
Left e1 -> throwIO e1
|
||
|
Right chainInfo -> do
|
||
|
initDb dbFilePath
|
||
|
walList <- getWallets pool $ zgb_net chainInfo
|
||
|
let model = AppModel (zgb_net chainInfo) walList Nothing
|
||
|
startApp model handleEvent buildUI params
|
||
|
Left e ->
|
||
|
print $
|
||
|
"No Zebra node available on port " <>
|
||
|
show port <> ". Check your configuration."
|
||
|
where
|
||
|
params =
|
||
|
[ appWindowTitle "Zenith - Zcash Full Node Wallet"
|
||
|
, appTheme darkTheme
|
||
|
, appFontDef "Regular" "./assets/DejaVuSansMono.ttf"
|
||
|
, appFontDef "Bold" "./assets/DejaVuSansMono-Bold.ttf"
|
||
|
, appFontDef "Italic" "./assets/DejaVuSansMono-Oblique.ttf"
|
||
|
, appInitEvent AppInit
|
||
|
]
|