orus-io/elm-spa/1.1.0

NOTE: the latest version is 3.0.1

Spa

Create the application

{ init : flags -> Key -> ( shared, Cmd sharedMsg )
, subscriptions : shared -> Sub sharedMsg
, update : sharedMsg -> shared -> ( shared, Cmd sharedMsg )
, defaultView : view
, toRoute : Url -> route
, extractIdentity : shared -> Maybe identity
, protectPage : route -> String
}
-> Builder flags route identity shared sharedMsg view () () ()

Bootstrap a Spa application

Spa.init
    { init = Shared.init
    , subscriptions = Shared.subscriptions
    , update = Shared.update
    , defaultView = View.defaultView
    , toRoute = Route.toRoute
    , extractIdentity = Shared.identity
    , protectPage = Route.toUrl >> Just >> Route.SignIn >> Route.toUrl
    }
initNoShared : (Url -> route) -> view -> Builder () route () () () view () () ()

Bootstrap a Spa application that has no Shared state

Add pages

( ( currentPageMsg
-> Msg sharedMsg (PageMsg currentPageMsg previousPageMsg)
)
-> pageView
-> view
, ( Msg sharedMsg previousPageMsg
-> Msg sharedMsg (PageMsg currentPageMsg previousPageMsg)
)
-> previousView
-> view
)
-> (route -> Maybe pageFlags)
-> ( shared
-> Page
pageFlags
sharedMsg
pageView
currentPageModel
currentPageMsg
)
-> Builder
flags
route
identity
shared
sharedMsg
previousView
prev
prevprev
previousPageMsg
-> Builder
flags
route
identity
shared
sharedMsg
view
currentPageModel
(PageModel prev prevprev)
(PageMsg currentPageMsg previousPageMsg)

Add a public page to the application

( ( currentPageMsg
-> Msg sharedMsg (PageMsg currentPageMsg previousPageMsg)
)
-> pageView
-> view
, ( Msg sharedMsg previousPageMsg
-> Msg sharedMsg (PageMsg currentPageMsg previousPageMsg)
)
-> previousView
-> view
)
-> (route -> Maybe pageFlags)
-> ( shared
-> identity
-> Page
pageFlags
sharedMsg
pageView
currentPageModel
currentPageMsg
)
-> Builder
flags
route
identity
shared
sharedMsg
previousView
prev
prevprev
previousPageMsg
-> Builder
flags
route
identity
shared
sharedMsg
view
currentPageModel
(PageModel prev prevprev)
(PageMsg currentPageMsg previousPageMsg)

Add a protected page to the application

Finalize

Once all the pages are added to the application, we can change it into a record suitable for the Browser.application function.

{ toDocument : shared -> view -> Document (Msg sharedMsg pageMsg) }
-> Builder
flags
route
identity
shared
sharedMsg
view
current
previous
pageMsg
-> { init :
flags
-> Url
-> Key
-> ( Model route shared current previous
, Cmd (Msg sharedMsg pageMsg)
)
, view :
Model route shared current previous
-> Document (Msg sharedMsg pageMsg)
, update :
Msg sharedMsg pageMsg
-> Model route shared current previous
-> ( Model route shared current previous
, Cmd (Msg sharedMsg pageMsg)
)
, subscriptions :
Model route shared current previous
-> Sub (Msg sharedMsg pageMsg)
, onUrlRequest : UrlRequest -> Msg sharedMsg pageMsg
, onUrlChange : Url -> Msg sharedMsg pageMsg
}

Finalize the Spa application into a record suitable for the Browser.application

toDocument is a function that convert a view to a Browser.Document

appWithPages
    |> Spa.application { toDocument = View.toDocument }
    |> Browser.application