lamassu-server/lamassu-admin-elm/src/Transactions.elm
2019-07-25 18:37:19 +01:00

206 lines
6 KiB
Elm

module Transactions exposing (..)
import Html exposing (..)
import Html.Attributes exposing (colspan, href)
import Css.Admin exposing (..)
import Css.Classes as C
import RemoteData exposing (..)
import Http
import HttpBuilder exposing (..)
import Transaction.Decoder exposing (txsDecoder)
import Common.TransactionTypes exposing (..)
import List
import Numeral exposing (format)
import Date.Extra exposing (toFormattedString)
import Maybe.Extra exposing (isJust)
type alias Txs =
List Tx
type alias Model =
RemoteData.WebData Txs
init : Model
init =
NotAsked
loadCmd : Cmd Msg
loadCmd =
getTransactions
load : ( Model, Cmd Msg )
load =
( Loading, loadCmd )
getTransactions : Cmd Msg
getTransactions =
get ("/api/transactions")
|> withExpect (Http.expectJson txsDecoder)
|> send RemoteData.fromResult
|> Cmd.map Load
type Msg
= Load Model
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
Load loadedModel ->
loadedModel ! []
multiplier : CryptoCode -> Float
multiplier code =
case code of
BTC ->
1.0e8
BCH ->
1.0e8
ETH ->
1.0e18
ZEC ->
1.0e8
DASH ->
1.0e8
LTC ->
1.0e8
txLink : String -> Html Msg
txLink txId =
a [ href ("/#transaction/" ++ txId) ] [ text (String.left 8 txId) ]
cryptoCodeDisplay : CryptoCode -> Html Msg
cryptoCodeDisplay code =
let
txt : String
txt = case code of
BTC -> "BTC"
BCH -> "BCH"
ETH -> "ETH"
ZEC -> "ZEC"
DASH -> "DASH"
LTC -> "LTC"
in
text txt
rowView : Tx -> Html Msg
rowView tx =
case tx of
CashInTx cashIn ->
let
rowClasses =
if cashIn.operatorCompleted then
[ C.CashIn, C.TxCancelled ]
else
[ C.CashIn ]
status =
if cashIn.operatorCompleted then
"Cancelled"
else if isJust cashIn.error then
"Error"
else if cashIn.sendConfirmed then
"Sent"
else if cashIn.expired then
"Expired"
else
"Pending"
in
tr [ class rowClasses ]
[ td [] [ txLink cashIn.id ]
, td [] [ text status ]
, td
[ class [ C.NumberColumn ] ]
[ text (toFormattedString "yyyy-MM-dd HH:mm" cashIn.created) ]
, td [] [ text cashIn.machineName ]
, td [ class [ C.NumberColumn ] ]
[ text (format "0,0.000000" ((toFloat cashIn.cryptoAtoms) / multiplier cashIn.cryptoCode))
]
, td [] [ cryptoCodeDisplay cashIn.cryptoCode ]
, td [ class [ C.NumberColumn ] ] [ text (format "0,0.00" cashIn.fiat) ]
, td [ class [ C.NumberColumn ] ] [ text (format "0,0.00" (Maybe.withDefault 0.0 cashIn.commissionPercentage)) ]
, td [ class [ C.NumberColumn ] ] [ text (Maybe.withDefault "" cashIn.phone) ]
, td [ class [ C.TxAddress ] ] [ text cashIn.toAddress ]
]
CashOutTx cashOut ->
let
status =
if isJust cashOut.error then
"Error"
else if cashOut.dispense then
"Success"
else if cashOut.expired then
"Expired"
else
"Pending"
in
tr [ class [ C.CashOut ] ]
[ td [] [ txLink cashOut.id ]
, td [] [ text status ]
, td [ class [ C.NumberColumn, C.DateColumn ] ] [ text (toFormattedString "yyyy-MM-dd HH:mm" cashOut.created) ]
, td [] [ text cashOut.machineName ]
, td [ class [ C.NumberColumn ] ]
[ text (format "0,0.000000" ((toFloat cashOut.cryptoAtoms) / multiplier cashOut.cryptoCode))
]
, td [] [ cryptoCodeDisplay cashOut.cryptoCode ]
, td [ class [ C.NumberColumn ] ] [ text (format "0,0.00" cashOut.fiat) ]
, td [ class [ C.NumberColumn ] ] [ text (format "0,0.00" (Maybe.withDefault 0.0 cashOut.commissionPercentage)) ]
, td [ class [ C.NumberColumn ] ] [ text (Maybe.withDefault "" cashOut.phone) ]
, td [ class [ C.TxAddress ] ] [ text cashOut.toAddress ]
]
tableView : Txs -> Html Msg
tableView txs =
if List.isEmpty txs then
div [] [ text "No activity yet." ]
else
table [ class [ C.TxTable ] ]
[ thead []
[ tr []
[ td [ class [ C.TxId ] ] [ text "Id" ]
, td [] [ text "Status" ]
, td [ class [ C.TxDate ] ] [ text "Time" ]
, td [ class [ C.TxMachine ] ] [ text "Machine" ]
, td [ colspan 2 ] [ text "Crypto" ]
, td [ class [ C.TxAmount ] ] [ text "Fiat" ]
, td [ class [ C.TxAmount ] ] [ text "Commission" ]
, td [ class [ C.TxPhone ] ] [ text "Phone" ]
, td [ class [ C.TxAddress ] ] [ text "To address" ]
]
]
, tbody [] (List.map rowView txs)
]
view : Model -> Html Msg
view model =
case model of
NotAsked ->
div [] []
Loading ->
div [] [ text "Loading..." ]
Failure err ->
div [] [ text (toString err) ]
Success txs ->
div [] [ tableView txs ]