blob: 935916054cca5099c9cb4add29f97df9fa713036 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
module ServerCommunication
( Communication(..)
, sendRequest
, serverCommunications
) where
import Signal
import Task as Task exposing (Task)
import Http
import Json.Decode exposing (..)
import Date
import Model.Message exposing (messageDecoder)
import Model.Payment exposing (PaymentId, perPage, paymentsDecoder)
import Update as U
import Update.SignIn exposing (..)
import Update.Payment as UP
type Communication =
NoCommunication
| SignIn String
| AddPayment String Int
| DeletePayment PaymentId
| UpdatePage Int
| SignOut
serverCommunications : Signal.Mailbox Communication
serverCommunications = Signal.mailbox NoCommunication
sendRequest : Communication -> Task Http.RawError U.Action
sendRequest communication =
case getRequest communication of
Nothing ->
Task.succeed U.NoOp
Just request ->
Http.send Http.defaultSettings request
|> Task.map (communicationToAction communication)
getRequest : Communication -> Maybe Http.Request
getRequest communication =
case communication of
NoCommunication ->
Nothing
SignIn login ->
Just (simple "post" ("/signIn?login=" ++ login))
AddPayment name cost ->
Just (simple "post" ("/payment/add?name=" ++ name ++ "&cost=" ++ (toString cost)))
DeletePayment paymentId ->
Just (simple "post" ("payment/delete?id=" ++ paymentId))
UpdatePage page ->
Just (simple "get" ("payments?page=" ++ toString page ++ "&perPage=" ++ toString perPage))
SignOut ->
Just (simple "post" "/signOut")
simple : String -> String -> Http.Request
simple method url =
{ verb = method
, headers = []
, url = url
, body = Http.empty
}
communicationToAction : Communication -> Http.Response -> U.Action
communicationToAction communication response =
if response.status == 200
then
case communication of
NoCommunication ->
U.NoOp
SignIn login ->
U.UpdateSignIn (ValidLogin login)
AddPayment name cost ->
decodeResponse
response
messageDecoder
(\id -> U.UpdatePayment (UP.AddPayment id name cost))
DeletePayment id ->
U.UpdatePayment (UP.Remove id)
UpdatePage page ->
decodeResponse
response
paymentsDecoder
(\payments -> U.UpdatePayment (UP.UpdatePage page payments))
SignOut ->
U.GoSignInView
else
decodeResponse
response
messageDecoder
(\error ->
case communication of
SignIn _ ->
U.UpdateSignIn (ErrorLogin error)
_ ->
U.NoOp
)
decodeResponse : Http.Response -> Decoder a -> (a -> U.Action) -> U.Action
decodeResponse response decoder responseToAction =
case response.value of
Http.Text text ->
case decodeString decoder text of
Ok x ->
responseToAction x
Err _ ->
U.NoOp
Http.Blob _ ->
U.NoOp
|