git.iko.soy/horeca-productions/landing
on master help sign in
155 lines 3.3 kB history raw
1module Effect exposing (Effect(..), batch, fromCmd, map, none, perform)
3{-|
5@docs Effect, batch, fromCmd, map, none, perform
7-}
9import Browser.Navigation
10import Form
11import Http
12import Json.Decode as Decode
13import Pages.Fetcher
14import Url exposing (Url)
17{-| -}
18type Effect msg
19 = None
20 | Cmd (Cmd msg)
21 | Batch (List (Effect msg))
22 | GetStargazers (Result Http.Error Int -> msg)
23 | SetField { formId : String, name : String, value : String }
24 | FetchRouteData
25 { data : Maybe FormData
26 , toMsg : Result Http.Error Url -> msg
27 }
28 | Submit
29 { values : FormData
30 , toMsg : Result Http.Error Url -> msg
31 }
32 | SubmitFetcher (Pages.Fetcher.Fetcher msg)
35{-| -}
36type alias RequestInfo =
37 { contentType : String
38 , body : String
39 }
42{-| -}
43none : Effect msg
44none =
45 None
48{-| -}
49batch : List (Effect msg) -> Effect msg
50batch =
51 Batch
54{-| -}
55fromCmd : Cmd msg -> Effect msg
56fromCmd =
57 Cmd
60{-| -}
61map : (a -> b) -> Effect a -> Effect b
62map fn effect =
63 case effect of
64 None ->
65 None
67 Cmd cmd ->
68 Cmd (Cmd.map fn cmd)
70 Batch list ->
71 Batch (List.map (map fn) list)
73 GetStargazers toMsg ->
74 GetStargazers (toMsg >> fn)
76 FetchRouteData fetchInfo ->
77 FetchRouteData
78 { data = fetchInfo.data
79 , toMsg = fetchInfo.toMsg >> fn
80 }
82 Submit fetchInfo ->
83 Submit
84 { values = fetchInfo.values
85 , toMsg = fetchInfo.toMsg >> fn
86 }
88 SetField info ->
89 SetField info
91 SubmitFetcher fetcher ->
92 fetcher
93 |> Pages.Fetcher.map fn
94 |> SubmitFetcher
97{-| -}
98perform :
99 { fetchRouteData :
100 { data : Maybe FormData
101 , toMsg : Result Http.Error Url -> pageMsg
102 }
103 -> Cmd msg
104 , submit :
105 { values : FormData
106 , toMsg : Result Http.Error Url -> pageMsg
107 }
108 -> Cmd msg
109 , runFetcher :
110 Pages.Fetcher.Fetcher pageMsg
111 -> Cmd msg
112 , fromPageMsg : pageMsg -> msg
113 , key : Browser.Navigation.Key
114 , setField : { formId : String, name : String, value : String } -> Cmd msg
115 }
116 -> Effect pageMsg
117 -> Cmd msg
118perform ({ fromPageMsg, key } as helpers) effect =
119 case effect of
120 None ->
121 Cmd.none
123 Cmd cmd ->
124 Cmd.map fromPageMsg cmd
126 SetField info ->
127 helpers.setField info
129 Batch list ->
130 Cmd.batch (List.map (perform helpers) list)
132 GetStargazers toMsg ->
133 Http.get
134 { url =
135 "https://api.github.com/repos/dillonkearns/elm-pages"
136 , expect = Http.expectJson (toMsg >> fromPageMsg) (Decode.field "stargazers_count" Decode.int)
137 }
139 FetchRouteData fetchInfo ->
140 helpers.fetchRouteData
141 fetchInfo
143 Submit record ->
144 helpers.submit record
146 SubmitFetcher record ->
147 helpers.runFetcher record
150type alias FormData =
151 { fields : List ( String, String )
152 , method : Form.Method
153 , action : String
154 , id : Maybe String
155 }