diff --git a/src/Zenith/CLI.hs b/src/Zenith/CLI.hs index 41994e8..5aaf8fc 100644 --- a/src/Zenith/CLI.hs +++ b/src/Zenith/CLI.hs @@ -100,6 +100,7 @@ import Zenith.Types , HexStringDB(..) , PhraseDB(..) , PrivacyPolicy(..) + , ShieldDeshieldOp(..) , UnifiedAddressDB(..) , ZcashNetDB(..) , ZenithStatus(..) @@ -108,6 +109,7 @@ import Zenith.Utils ( displayTaz , displayZec , isRecipientValid + , isRecipientValidGUI , jsonNumber , parseAddressUA , showAddress @@ -132,6 +134,10 @@ data Name | PrivacyLowField | PrivacyMediumField | PrivacyFullField + | ShieldField + | DeshieldField + | TotalTranspField + | TotalShieldedField deriving (Eq, Show, Ord) data DialogInput = DialogInput @@ -156,6 +162,15 @@ data AdrBookEntry = AdrBookEntry makeLenses ''AdrBookEntry +data ShDshEntry = ShDshEntry + { _totalTransparent :: !Float + , _totalShielded :: !Float + , _shieldOp :: !ShieldDeshieldOp + , _shAmt :: !Float + } deriving (Show) + +makeLenses ''ShDshEntry + data DialogType = WName | AName @@ -168,6 +183,7 @@ data DialogType | AdrBookForm | AdrBookUpdForm | AdrBookDelForm + | ShieldDeshieldForm data DisplayType = AddrDisplay @@ -216,6 +232,7 @@ data State = State , _abCurAdrs :: !T.Text -- used for address book CRUD operations , _sentTx :: !(Maybe HexString) , _unconfBalance :: !Integer + , _shdshForm :: !(Form ShDshEntry () Name) } makeLenses ''State @@ -263,17 +280,23 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] (C.hCenter (str ("Last block seen: " ++ show (st ^. syncBlock) ++ "\n")) <=> listTxBox " Transactions " (st ^. network) (st ^. transactions))) <=> - C.hCenter - (hBox - [ capCommand "W" "allets" - , capCommand "A" "ccounts" - , capCommand "V" "iew address" - , capCommand "S" "end Tx" - , capCommand2 "Address " "B" "ook" - , capCommand "Q" "uit" - , capCommand "?" " Help" - , str $ show (st ^. timer) - ]) + (vBox + [ C.hCenter + (hBox + [ capCommand "W" "allets" + , capCommand "A" "ccounts" + , capCommand "V" "iew address" + , capCommand3 "" "S" "end Tx" + ]) + , C.hCenter + (hBox + [ capCommand2 "Address " "B" "ook" + , capCommand2 "Shield/" "D" "eshield" + , capCommand "Q" "uit" + , capCommand "?" " Help" + , str $ show (st ^. timer) + ]) + ]) listBox :: Show e => String -> L.List Name e -> Widget Name listBox titleLabel l = C.vCenter $ @@ -339,7 +362,7 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] else emptyWidget where keyList = - map (C.hCenter . str) ["?", "Esc", "w", "a", "v", "s", "b", "q"] + map (C.hCenter . str) ["?", "Esc", "w", "a", "v", "s", "b", "d", "q"] actionList = map (hLimit 40 . str) @@ -350,6 +373,7 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] , "View address" , "Send Tx" , "Address Book" + , "Shield/De-Shield" , "Quit" ] inputDialog :: State -> Widget Name @@ -396,6 +420,12 @@ drawUI s = [splashDialog s, helpDialog s, displayDialog s, inputDialog s, ui s] (renderForm (st ^. txForm) <=> C.hCenter (hBox [capCommand "↲ " "Send", capCommand " " "Cancel"])) + ShieldDeshieldForm -> + D.renderDialog + (D.dialog (Just (str " Shield / De-Shield ")) Nothing 50) + (renderForm (st ^. shdshForm) <=> + C.hCenter + (hBox [capCommand "P" "roceed", capCommand " " "Cancel"])) Blank -> emptyWidget -- Address Book List AdrBook -> @@ -639,6 +669,34 @@ mkSendForm bal = label s w = padBottom (Pad 1) $ vLimit 1 (hLimit 15 $ str s <+> fill ' ') <+> w +mkshieldDeshieldForm :: Integer -> ShDshEntry -> Form ShDshEntry e Name +mkshieldDeshieldForm bal = + newForm + [ label "Total Transp. : " @@= + editShowableFieldWithValidate + totalTransparent + TotalTranspField + (isAmountValid bal) + , label "Total Shielded : " @@= + editShowableFieldWithValidate + totalShielded + TotalShieldedField + (isAmountValid bal) + , label "Select :" @@= + radioField + shieldOp + [ (Shield, ShieldField, "Shield") + , (Deshield, DeshieldField, "De-Shield") + ] + , label "Amount: " @@= + editShowableFieldWithValidate shAmt AmtField (isAmountValid bal) + ] + where + isAmountValid :: Integer -> Float -> Bool + isAmountValid b i = (fromIntegral b / 100000000.0) >= i + label s w = + padBottom (Pad 1) $ vLimit 1 (hLimit 15 $ str s <+> fill ' ') <+> w + mkNewABForm :: AdrBookEntry -> Form AdrBookEntry e Name mkNewABForm = newForm @@ -902,6 +960,7 @@ appEvent (BT.AppEvent t) = do AdrBookForm -> return () AdrBookUpdForm -> return () AdrBookDelForm -> return () + ShieldDeshieldForm -> return () Blank -> do if s ^. timer == 90 then do @@ -1148,8 +1207,15 @@ appEvent (BT.VtyEvent e) = do fs <- BT.gets formState BT.modify $ setFieldValid - (isRecipientValid (fs ^. sendTo)) + (isRecipientValidGUI + (fs ^. policyField) + (fs ^. sendTo)) RecField + ShieldDeshieldForm -> do + case e of + V.EvKey V.KEsc [] -> BT.modify $ set dialogBox Blank + ev -> + BT.zoom shdshForm $ do handleFormEvent (BT.VtyEvent ev) AdrBook -> do case e of V.EvKey (V.KChar 'x') [] -> @@ -1359,6 +1425,8 @@ appEvent (BT.VtyEvent e) = do BT.modify $ set dialogBox SendTx V.EvKey (V.KChar 'b') [] -> BT.modify $ set dialogBox AdrBook + V.EvKey (V.KChar 'd') [] -> + BT.modify $ set dialogBox ShieldDeshieldForm ev -> case r of Just AList -> @@ -1373,6 +1441,8 @@ appEvent (BT.VtyEvent e) = do printMsg s = BT.modify $ updateMsg s updateMsg :: String -> State -> State updateMsg = set msg +-- fs <- BT.gets formState +-- ev -> BT.zoom shdshForm $ L.handleListEvent ev appEvent _ = return () theMap :: A.AttrMap @@ -1497,6 +1567,7 @@ runZenithTUI config = do "" Nothing uBal + (mkshieldDeshieldForm 0 (ShDshEntry 0 0 Shield 0.0)) Left _e -> do print $ "No Zebra node available on port " <> diff --git a/src/Zenith/Types.hs b/src/Zenith/Types.hs index 48d19b8..49f1c84 100644 --- a/src/Zenith/Types.hs +++ b/src/Zenith/Types.hs @@ -268,6 +268,11 @@ data TransactionType | Deshielding deriving (Eq, Prelude.Show) +data ShieldDeshieldOp + = Shield + | Deshield + deriving (Eq, Show, Read, Ord) + -- ** `zebrad` -- | Type for modeling the tree state response data ZebraTreeInfo = ZebraTreeInfo diff --git a/src/Zenith/Utils.hs b/src/Zenith/Utils.hs index c5d9395..b9355f0 100644 --- a/src/Zenith/Utils.hs +++ b/src/Zenith/Utils.hs @@ -170,10 +170,8 @@ isRecipientValidGUI p a = do Unified ua -> True Sapling sa -> True Transparent ta -> True - Exchange ea -> True _ -> False Nothing -> False - None -> case adr of Just a -> case a of