aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/Checkout.elm
diff options
context:
space:
mode:
authorAkshay <[email protected]>2020-12-26 05:21:46 +0000
committerAkshay <[email protected]>2020-12-26 05:21:46 +0000
commit8014def1a8da3397d78d1162f9e1b8c3f22d0322 (patch)
tree346e1de0ac6aa4ca973c1b3e5897c2c44948e5a8 /frontend/src/Checkout.elm
parent7c6006e1abc6094b5922ab69ccfa5449b8dbbc99 (diff)
add transactions and quantities
- backend exposes endpoints to perform transactions - frontend introduces a new page to "checkout" cart
Diffstat (limited to 'frontend/src/Checkout.elm')
-rw-r--r--frontend/src/Checkout.elm126
1 files changed, 126 insertions, 0 deletions
diff --git a/frontend/src/Checkout.elm b/frontend/src/Checkout.elm
new file mode 100644
index 0000000..c60da0d
--- /dev/null
+++ b/frontend/src/Checkout.elm
@@ -0,0 +1,126 @@
1module Checkout exposing (..)
2
3import Browser
4import Browser.Navigation as Nav
5import Html exposing (..)
6import Html.Attributes exposing (..)
7import Html.Events exposing (..)
8import Http
9import Json.Decode as D
10import Json.Encode as Encode
11import Tuple exposing (..)
12import Url
13import Url.Parser as P exposing ((</>), Parser, int, oneOf, s, string)
14import Utils exposing (..)
15
16
17type alias Model =
18 { pageStatus : Status
19 , paymentMode : String
20 , cartTotal : Float
21 }
22
23
24type Status
25 = Loading
26 | Loaded
27 | NotLoaded
28
29
30type Msg
31 = CheckoutPressed
32 | CheckoutSuccessful (Result Http.Error ())
33 | AmountLoaded (Result Http.Error Float)
34 | FetchAmount
35 | PaymentModeSelected String
36
37
38init : Model
39init =
40 Model NotLoaded "Cash" 0
41
42
43update : Msg -> Model -> ( Model, Cmd Msg )
44update msg model =
45 case msg of
46 CheckoutPressed ->
47 ( model, tryCheckout model.paymentMode )
48
49 CheckoutSuccessful _ ->
50 ( model, Cmd.none )
51
52 AmountLoaded res ->
53 case res of
54 Ok v ->
55 ( { model | cartTotal = v }, Cmd.none )
56
57 Err _ ->
58 ( { model | pageStatus = NotLoaded }, Cmd.none )
59
60 FetchAmount ->
61 let
62 _ =
63 Debug.log "err" "fetching checkout amount"
64 in
65 ( { model | pageStatus = Loading }, fetchAmount )
66
67 PaymentModeSelected s ->
68 ( { model | paymentMode = s }, Cmd.none )
69
70
71fetchAmount : Cmd Msg
72fetchAmount =
73 Http.riskyRequest
74 { method = "GET"
75 , headers = []
76 , url = "http://127.0.0.1:7878/cart/total"
77 , body = Http.emptyBody
78 , expect = Http.expectJson AmountLoaded D.float
79 , timeout = Nothing
80 , tracker = Nothing
81 }
82
83
84tryCheckout : String -> Cmd Msg
85tryCheckout pm =
86 Http.riskyRequest
87 { method = "POST"
88 , headers = []
89 , url = "http://127.0.0.1:7878/transaction/checkout"
90 , body = Http.stringBody "application/json" pm
91 , expect = Http.expectWhatever CheckoutSuccessful
92 , timeout = Nothing
93 , tracker = Nothing
94 }
95
96
97viewStatus : Status -> String
98viewStatus s =
99 case s of
100 Loading ->
101 "Loading"
102
103 Loaded ->
104 "Ready!"
105
106 NotLoaded ->
107 "Not loaded ..."
108
109
110view : Model -> Html Msg
111view model =
112 case model.pageStatus of
113 Loading ->
114 div [] [ text <| viewStatus Loading ]
115
116 _ ->
117 div []
118 [ div [] [ text <| String.fromFloat <| model.cartTotal ]
119 , select []
120 [ option [ onInput PaymentModeSelected ] [ text "Cash" ]
121 , option [ onInput PaymentModeSelected ] [ text "Debit Card" ]
122 , option [ onInput PaymentModeSelected ] [ text "Credit Card" ]
123 ]
124 , div [] [ a [ href "/cart" ] [ text "Cancel" ] ]
125 , div [] [ button [ onClick CheckoutPressed ] [ text "Confirm and Pay" ] ]
126 ]