diff options
Diffstat (limited to 'frontend/src/Cart.elm')
-rw-r--r-- | frontend/src/Cart.elm | 76 |
1 files changed, 63 insertions, 13 deletions
diff --git a/frontend/src/Cart.elm b/frontend/src/Cart.elm index a1750f6..58fb72e 100644 --- a/frontend/src/Cart.elm +++ b/frontend/src/Cart.elm | |||
@@ -21,9 +21,15 @@ type alias Product = | |||
21 | } | 21 | } |
22 | 22 | ||
23 | 23 | ||
24 | type alias CartListing = | ||
25 | { productItem : Product | ||
26 | , quantity : Int | ||
27 | } | ||
28 | |||
29 | |||
24 | type alias Model = | 30 | type alias Model = |
25 | { pageStatus : Status | 31 | { pageStatus : Status |
26 | , products : List Product | 32 | , products : List CartListing |
27 | } | 33 | } |
28 | 34 | ||
29 | 35 | ||
@@ -34,10 +40,12 @@ type Status | |||
34 | 40 | ||
35 | 41 | ||
36 | type Msg | 42 | type Msg |
37 | = CartLoaded (Result Http.Error (List Product)) | 43 | = CartLoaded (Result Http.Error (List CartListing)) |
38 | | FetchCartItems | 44 | | FetchCartItems |
39 | | RemoveFromCart Int | 45 | | RemoveFromCart Int |
40 | | CartItemRemoved (Result Http.Error ()) | 46 | | CartItemRemoved (Result Http.Error ()) |
47 | | AddToCartSuccess (Result Http.Error ()) | ||
48 | | AddToCartPressed Int | ||
41 | 49 | ||
42 | 50 | ||
43 | init : Model | 51 | init : Model |
@@ -69,6 +77,12 @@ update msg model = | |||
69 | FetchCartItems -> | 77 | FetchCartItems -> |
70 | ( { model | pageStatus = Loading }, fetchCartItems ) | 78 | ( { model | pageStatus = Loading }, fetchCartItems ) |
71 | 79 | ||
80 | AddToCartPressed id -> | ||
81 | ( model, addToCart id ) | ||
82 | |||
83 | AddToCartSuccess _ -> | ||
84 | ( { model | pageStatus = Loading }, fetchCartItems ) | ||
85 | |||
72 | 86 | ||
73 | decodeProduct : D.Decoder Product | 87 | decodeProduct : D.Decoder Product |
74 | decodeProduct = | 88 | decodeProduct = |
@@ -80,9 +94,13 @@ decodeProduct = | |||
80 | (D.field "description" (D.nullable D.string)) | 94 | (D.field "description" (D.nullable D.string)) |
81 | 95 | ||
82 | 96 | ||
83 | decodeResponse : D.Decoder (List Product) | 97 | decodeResponse : D.Decoder (List CartListing) |
84 | decodeResponse = | 98 | decodeResponse = |
85 | D.list decodeProduct | 99 | D.list |
100 | (D.map2 CartListing | ||
101 | (D.field "product_item" decodeProduct) | ||
102 | (D.field "quantity" D.int) | ||
103 | ) | ||
86 | 104 | ||
87 | 105 | ||
88 | removeProduct : Int -> Cmd Msg | 106 | removeProduct : Int -> Cmd Msg |
@@ -132,15 +150,45 @@ viewStatus s = | |||
132 | "Not loaded ..." | 150 | "Not loaded ..." |
133 | 151 | ||
134 | 152 | ||
135 | viewProduct : Product -> Html Msg | 153 | addToCart : Int -> Cmd Msg |
136 | viewProduct p = | 154 | addToCart id = |
155 | let | ||
156 | _ = | ||
157 | Debug.log "err" <| "adding to cart: " ++ String.fromInt id | ||
158 | in | ||
159 | Http.riskyRequest | ||
160 | { method = "POST" | ||
161 | , headers = [] | ||
162 | , url = "http://127.0.0.1:7878/cart/add" | ||
163 | , body = Http.stringBody "applcation/json" <| String.fromInt <| id | ||
164 | , expect = Http.expectWhatever AddToCartSuccess | ||
165 | , timeout = Nothing | ||
166 | , tracker = Nothing | ||
167 | } | ||
168 | |||
169 | |||
170 | calculateTotal : Model -> Float | ||
171 | calculateTotal model = | ||
172 | let | ||
173 | items = | ||
174 | model.products | ||
175 | in | ||
176 | items | ||
177 | |> List.map (\i -> toFloat i.quantity * i.productItem.price) | ||
178 | |> List.foldl (+) 0 | ||
179 | |||
180 | |||
181 | viewCartItemListing : CartListing -> Html Msg | ||
182 | viewCartItemListing listing = | ||
137 | div [] | 183 | div [] |
138 | [ text p.name | 184 | [ text listing.productItem.name |
139 | , div [] [ text <| Maybe.withDefault "" p.kind ] | 185 | , div [] [ text <| Maybe.withDefault "" listing.productItem.kind ] |
140 | , div [] [ text <| Maybe.withDefault "" p.description ] | 186 | , div [] [ text <| Maybe.withDefault "" listing.productItem.description ] |
141 | , div [] [ text <| String.fromFloat p.price ] | 187 | , div [] [ text <| String.fromFloat listing.productItem.price ] |
142 | , div [] [ button [ onClick (RemoveFromCart p.id) ] [ text "Remove" ] ] | 188 | , div [] [ text <| String.fromInt listing.quantity ] |
143 | , div [] [ a [ href ("/product/" ++ String.fromInt p.id) ] [ text "View Product" ] ] | 189 | , div [] [ button [ onClick (AddToCartPressed listing.productItem.id) ] [ text "Add" ] ] |
190 | , div [] [ button [ onClick (RemoveFromCart listing.productItem.id) ] [ text "Remove" ] ] | ||
191 | , div [] [ a [ href ("/product/" ++ String.fromInt listing.productItem.id) ] [ text "View Product" ] ] | ||
144 | ] | 192 | ] |
145 | 193 | ||
146 | 194 | ||
@@ -154,11 +202,13 @@ view model = | |||
154 | div [] | 202 | div [] |
155 | [ let | 203 | [ let |
156 | cart = | 204 | cart = |
157 | List.map viewProduct model.products | 205 | List.map viewCartItemListing model.products |
158 | in | 206 | in |
159 | if List.isEmpty cart then | 207 | if List.isEmpty cart then |
160 | text "No items in cart" | 208 | text "No items in cart" |
161 | 209 | ||
162 | else | 210 | else |
163 | ul [] cart | 211 | ul [] cart |
212 | , calculateTotal model |> String.fromFloat |> text | ||
213 | , a [ href "/checkout" ] [ text "Checkout" ] | ||
164 | ] | 214 | ] |