2022-03-25 19:03:22 +03:00
|
|
|
module Effect exposing (Effect(..), batch, fromCmd, map, none, perform)
|
|
|
|
|
|
|
|
import Browser.Navigation
|
2022-08-22 18:29:04 +03:00
|
|
|
import Form.FormData exposing (FormData)
|
2022-04-05 02:22:45 +03:00
|
|
|
import Http
|
2022-04-05 18:28:56 +03:00
|
|
|
import Json.Decode as Decode
|
2022-06-29 01:45:36 +03:00
|
|
|
import Pages.Fetcher
|
2022-04-05 02:22:45 +03:00
|
|
|
import Url exposing (Url)
|
2022-03-25 19:03:22 +03:00
|
|
|
|
|
|
|
|
|
|
|
type Effect msg
|
|
|
|
= None
|
|
|
|
| Cmd (Cmd msg)
|
|
|
|
| Batch (List (Effect msg))
|
2022-04-05 18:28:56 +03:00
|
|
|
| GetStargazers (Result Http.Error Int -> msg)
|
2022-06-29 01:45:36 +03:00
|
|
|
| SetField { formId : String, name : String, value : String }
|
|
|
|
| FetchRouteData
|
2022-08-22 18:29:04 +03:00
|
|
|
{ data : Maybe FormData
|
2022-04-05 02:22:45 +03:00
|
|
|
, toMsg : Result Http.Error Url -> msg
|
|
|
|
}
|
2022-06-29 01:45:36 +03:00
|
|
|
| Submit
|
2022-08-22 18:29:04 +03:00
|
|
|
{ values : FormData
|
2022-06-29 01:45:36 +03:00
|
|
|
, toMsg : Result Http.Error Url -> msg
|
|
|
|
}
|
|
|
|
| SubmitFetcher (Pages.Fetcher.Fetcher msg)
|
2022-04-05 02:22:45 +03:00
|
|
|
|
|
|
|
|
|
|
|
type alias RequestInfo =
|
|
|
|
{ contentType : String
|
|
|
|
, body : String
|
|
|
|
}
|
2022-03-25 19:03:22 +03:00
|
|
|
|
|
|
|
|
|
|
|
none : Effect msg
|
|
|
|
none =
|
|
|
|
None
|
|
|
|
|
|
|
|
|
|
|
|
batch : List (Effect msg) -> Effect msg
|
|
|
|
batch =
|
|
|
|
Batch
|
|
|
|
|
|
|
|
|
|
|
|
fromCmd : Cmd msg -> Effect msg
|
|
|
|
fromCmd =
|
|
|
|
Cmd
|
|
|
|
|
|
|
|
|
|
|
|
map : (a -> b) -> Effect a -> Effect b
|
|
|
|
map fn effect =
|
|
|
|
case effect of
|
|
|
|
None ->
|
|
|
|
None
|
|
|
|
|
|
|
|
Cmd cmd ->
|
|
|
|
Cmd (Cmd.map fn cmd)
|
|
|
|
|
|
|
|
Batch list ->
|
|
|
|
Batch (List.map (map fn) list)
|
|
|
|
|
2022-04-05 18:28:56 +03:00
|
|
|
GetStargazers toMsg ->
|
|
|
|
GetStargazers (toMsg >> fn)
|
|
|
|
|
2022-06-29 01:45:36 +03:00
|
|
|
FetchRouteData fetchInfo ->
|
|
|
|
FetchRouteData
|
|
|
|
{ data = fetchInfo.data
|
|
|
|
, toMsg = fetchInfo.toMsg >> fn
|
|
|
|
}
|
|
|
|
|
|
|
|
Submit fetchInfo ->
|
|
|
|
Submit
|
|
|
|
{ values = fetchInfo.values
|
2022-04-05 02:22:45 +03:00
|
|
|
, toMsg = fetchInfo.toMsg >> fn
|
|
|
|
}
|
|
|
|
|
2022-06-29 01:45:36 +03:00
|
|
|
SetField info ->
|
|
|
|
SetField info
|
|
|
|
|
|
|
|
SubmitFetcher fetcher ->
|
|
|
|
fetcher
|
|
|
|
|> Pages.Fetcher.map fn
|
|
|
|
|> SubmitFetcher
|
|
|
|
|
2022-04-05 02:22:45 +03:00
|
|
|
|
|
|
|
perform :
|
|
|
|
{ fetchRouteData :
|
2022-08-22 18:29:04 +03:00
|
|
|
{ data : Maybe FormData
|
2022-04-05 02:22:45 +03:00
|
|
|
, toMsg : Result Http.Error Url -> pageMsg
|
|
|
|
}
|
|
|
|
-> Cmd msg
|
2022-06-29 01:45:36 +03:00
|
|
|
, submit :
|
2022-08-22 18:29:04 +03:00
|
|
|
{ values : FormData
|
2022-06-29 01:45:36 +03:00
|
|
|
, toMsg : Result Http.Error Url -> pageMsg
|
|
|
|
}
|
|
|
|
-> Cmd msg
|
|
|
|
, runFetcher :
|
|
|
|
Pages.Fetcher.Fetcher pageMsg
|
|
|
|
-> Cmd msg
|
2022-04-05 18:28:56 +03:00
|
|
|
, fromPageMsg : pageMsg -> msg
|
|
|
|
, key : Browser.Navigation.Key
|
2022-06-29 01:45:36 +03:00
|
|
|
, setField : { formId : String, name : String, value : String } -> Cmd msg
|
2022-04-05 02:22:45 +03:00
|
|
|
}
|
|
|
|
-> Effect pageMsg
|
|
|
|
-> Cmd msg
|
2022-06-29 01:45:36 +03:00
|
|
|
perform ({ fromPageMsg, key } as helpers) effect =
|
2022-03-25 19:03:22 +03:00
|
|
|
case effect of
|
|
|
|
None ->
|
|
|
|
Cmd.none
|
|
|
|
|
|
|
|
Cmd cmd ->
|
|
|
|
Cmd.map fromPageMsg cmd
|
|
|
|
|
2022-06-29 01:45:36 +03:00
|
|
|
SetField info ->
|
|
|
|
helpers.setField info
|
|
|
|
|
2022-03-25 19:03:22 +03:00
|
|
|
Batch list ->
|
2022-06-29 01:45:36 +03:00
|
|
|
Cmd.batch (List.map (perform helpers) list)
|
2022-04-05 18:28:56 +03:00
|
|
|
|
|
|
|
GetStargazers toMsg ->
|
|
|
|
Http.get
|
2022-06-29 01:45:36 +03:00
|
|
|
{ url =
|
|
|
|
"https://api.github.com/repos/dillonkearns/elm-pages"
|
2022-04-05 18:28:56 +03:00
|
|
|
, expect = Http.expectJson (toMsg >> fromPageMsg) (Decode.field "stargazers_count" Decode.int)
|
|
|
|
}
|
2022-04-05 02:22:45 +03:00
|
|
|
|
2022-06-29 01:45:36 +03:00
|
|
|
FetchRouteData fetchInfo ->
|
|
|
|
helpers.fetchRouteData
|
|
|
|
fetchInfo
|
|
|
|
|
|
|
|
Submit record ->
|
|
|
|
helpers.submit record
|
|
|
|
|
|
|
|
SubmitFetcher record ->
|
|
|
|
helpers.runFetcher record
|