mirror of
https://github.com/ryannhg/elm-spa.git
synced 2024-11-22 09:44:55 +03:00
pick a lane, you swervin
This commit is contained in:
parent
c74cda90fc
commit
3796bbff10
@ -9,10 +9,11 @@ view : Html msg
|
||||
view =
|
||||
header [ Attr.class "navbar" ]
|
||||
(List.map viewLink
|
||||
[ ( "Homepage", Route.Homepage )
|
||||
, ( "Counter", Route.Counter )
|
||||
, ( "Random", Route.Random )
|
||||
[ ( "Homepage", Route.Homepage () )
|
||||
, ( "Counter", Route.Counter () )
|
||||
, ( "Random", Route.Random () )
|
||||
, ( "My user", Route.Users_Slug "ryan" )
|
||||
, ( "My user's post", Route.Users_Slug_Posts_Slug { user = "ryan", post = 123 } )
|
||||
]
|
||||
)
|
||||
|
||||
|
@ -7,7 +7,8 @@ import Pages.Counter as Counter
|
||||
import Pages.Homepage as Homepage
|
||||
import Pages.NotFound as NotFound
|
||||
import Pages.Random as Random
|
||||
import Pages.Users.Slug_ as Users_Slug
|
||||
import Pages.Users.Slug as Users_Slug
|
||||
import Pages.Users.Slug.Posts.Slug as Users_Slug_Posts_Slug
|
||||
|
||||
|
||||
type Model
|
||||
@ -16,6 +17,7 @@ type Model
|
||||
| RandomModel Random.Model
|
||||
| NotFoundModel NotFound.Model
|
||||
| Users_SlugModel Users_Slug.Model
|
||||
| Users_Slug_Posts_SlugModel Users_Slug_Posts_Slug.Model
|
||||
|
||||
|
||||
type Msg
|
||||
@ -24,9 +26,10 @@ type Msg
|
||||
| RandomMsg Random.Msg
|
||||
| NotFoundMsg NotFound.Msg
|
||||
| Users_SlugMsg Users_Slug.Msg
|
||||
| Users_Slug_Posts_SlugMsg Users_Slug_Posts_Slug.Msg
|
||||
|
||||
|
||||
homepage : Application.Recipe Homepage.Model Homepage.Msg Model Msg
|
||||
homepage : Application.Recipe Homepage.Params Homepage.Model Homepage.Msg Model Msg
|
||||
homepage =
|
||||
Homepage.page
|
||||
{ toModel = HomepageModel
|
||||
@ -34,7 +37,7 @@ homepage =
|
||||
}
|
||||
|
||||
|
||||
counter : Application.Recipe Counter.Model Counter.Msg Model Msg
|
||||
counter : Application.Recipe Counter.Params Counter.Model Counter.Msg Model Msg
|
||||
counter =
|
||||
Counter.page
|
||||
{ toModel = CounterModel
|
||||
@ -42,7 +45,7 @@ counter =
|
||||
}
|
||||
|
||||
|
||||
random : Application.Recipe Random.Model Random.Msg Model Msg
|
||||
random : Application.Recipe Random.Params Random.Model Random.Msg Model Msg
|
||||
random =
|
||||
Random.page
|
||||
{ toModel = RandomModel
|
||||
@ -50,7 +53,7 @@ random =
|
||||
}
|
||||
|
||||
|
||||
notFound : Application.Recipe NotFound.Model NotFound.Msg Model Msg
|
||||
notFound : Application.Recipe NotFound.Params NotFound.Model NotFound.Msg Model Msg
|
||||
notFound =
|
||||
NotFound.page
|
||||
{ toModel = NotFoundModel
|
||||
@ -58,7 +61,7 @@ notFound =
|
||||
}
|
||||
|
||||
|
||||
users_slug : Application.RecipeWithParams Users_Slug.Model Users_Slug.Msg Model Msg String
|
||||
users_slug : Application.Recipe Users_Slug.Params Users_Slug.Model Users_Slug.Msg Model Msg
|
||||
users_slug =
|
||||
Users_Slug.page
|
||||
{ toModel = Users_SlugModel
|
||||
@ -66,23 +69,34 @@ users_slug =
|
||||
}
|
||||
|
||||
|
||||
users_slug_posts_slug : Application.Recipe Users_Slug_Posts_Slug.Params Users_Slug_Posts_Slug.Model Users_Slug_Posts_Slug.Msg Model Msg
|
||||
users_slug_posts_slug =
|
||||
Users_Slug_Posts_Slug.page
|
||||
{ toModel = Users_Slug_Posts_SlugModel
|
||||
, toMsg = Users_Slug_Posts_SlugMsg
|
||||
}
|
||||
|
||||
|
||||
init : Route -> ( Model, Cmd Msg )
|
||||
init route =
|
||||
case route of
|
||||
Route.Homepage ->
|
||||
homepage.init
|
||||
Route.Homepage params ->
|
||||
homepage.init params
|
||||
|
||||
Route.Counter ->
|
||||
counter.init
|
||||
Route.Counter params ->
|
||||
counter.init params
|
||||
|
||||
Route.Random ->
|
||||
random.init
|
||||
Route.Random params ->
|
||||
random.init params
|
||||
|
||||
Route.NotFound ->
|
||||
notFound.init
|
||||
Route.NotFound params ->
|
||||
notFound.init params
|
||||
|
||||
Route.Users_Slug slug ->
|
||||
users_slug.init slug
|
||||
Route.Users_Slug params ->
|
||||
users_slug.init params
|
||||
|
||||
Route.Users_Slug_Posts_Slug params ->
|
||||
users_slug_posts_slug.init params
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Cmd Msg )
|
||||
@ -118,6 +132,12 @@ update appMsg appModel =
|
||||
( Users_SlugMsg _, _ ) ->
|
||||
Application.keep appModel
|
||||
|
||||
( Users_Slug_Posts_SlugMsg msg, Users_Slug_Posts_SlugModel model ) ->
|
||||
users_slug_posts_slug.update msg model
|
||||
|
||||
( Users_Slug_Posts_SlugMsg _, _ ) ->
|
||||
Application.keep appModel
|
||||
|
||||
|
||||
bundle : Model -> { view : Html Msg, subscriptions : Sub Msg }
|
||||
bundle appModel =
|
||||
@ -136,3 +156,6 @@ bundle appModel =
|
||||
|
||||
Users_SlugModel model ->
|
||||
users_slug.bundle model
|
||||
|
||||
Users_Slug_Posts_SlugModel model ->
|
||||
users_slug_posts_slug.bundle model
|
||||
|
@ -1,44 +1,64 @@
|
||||
module Generated.Route exposing (Route(..), fromUrl, toPath)
|
||||
|
||||
import Url exposing (Url)
|
||||
import Url.Parser as Parser exposing ((</>))
|
||||
import Url.Parser as Parser exposing ((</>), Parser)
|
||||
|
||||
|
||||
type Route
|
||||
= Homepage
|
||||
| Counter
|
||||
| Random
|
||||
= Homepage ()
|
||||
| Counter ()
|
||||
| Random ()
|
||||
| Users_Slug String
|
||||
| NotFound
|
||||
| Users_Slug_Posts_Slug UserPostInfo
|
||||
| NotFound ()
|
||||
|
||||
|
||||
type alias UserPostInfo =
|
||||
{ user : String
|
||||
, post : Int
|
||||
}
|
||||
|
||||
|
||||
fromUrl : Url -> Route
|
||||
fromUrl =
|
||||
Parser.parse
|
||||
(Parser.oneOf
|
||||
[ Parser.map Homepage Parser.top
|
||||
, Parser.map Counter (Parser.s "counter")
|
||||
, Parser.map Random (Parser.s "random")
|
||||
, Parser.map Users_Slug (Parser.s "users" </> Parser.string)
|
||||
]
|
||||
)
|
||||
>> Maybe.withDefault NotFound
|
||||
(Parser.oneOf routes)
|
||||
>> Maybe.withDefault (NotFound ())
|
||||
|
||||
|
||||
routes : List (Parser (Route -> Route) Route)
|
||||
routes =
|
||||
[ Parser.top
|
||||
|> Parser.map (Homepage ())
|
||||
, Parser.s "counter"
|
||||
|> Parser.map (Counter ())
|
||||
, Parser.s "random"
|
||||
|> Parser.map (Random ())
|
||||
, (Parser.s "users" </> Parser.string)
|
||||
|> Parser.map Users_Slug
|
||||
, (Parser.s "users" </> Parser.string </> Parser.s "posts" </> Parser.int)
|
||||
|> Parser.map UserPostInfo
|
||||
|> Parser.map Users_Slug_Posts_Slug
|
||||
]
|
||||
|
||||
|
||||
toPath : Route -> String
|
||||
toPath route =
|
||||
case route of
|
||||
Homepage ->
|
||||
Homepage _ ->
|
||||
"/"
|
||||
|
||||
Counter ->
|
||||
Counter _ ->
|
||||
"/counter"
|
||||
|
||||
Random ->
|
||||
Random _ ->
|
||||
"/random"
|
||||
|
||||
NotFound ->
|
||||
NotFound _ ->
|
||||
"/not-found"
|
||||
|
||||
Users_Slug slug ->
|
||||
"/users/" ++ slug
|
||||
|
||||
Users_Slug_Posts_Slug { user, post } ->
|
||||
"/users/" ++ user ++ "/posts/" ++ String.fromInt post
|
||||
|
@ -1,4 +1,9 @@
|
||||
module Pages.Counter exposing (Model, Msg, page)
|
||||
module Pages.Counter exposing
|
||||
( Model
|
||||
, Msg
|
||||
, Params
|
||||
, page
|
||||
)
|
||||
|
||||
import Application
|
||||
import Html exposing (..)
|
||||
@ -15,10 +20,14 @@ type Msg
|
||||
| Decrement
|
||||
|
||||
|
||||
page : Application.Page Model Msg model msg
|
||||
type alias Params =
|
||||
()
|
||||
|
||||
|
||||
page : Application.Page Params Model Msg model msg
|
||||
page =
|
||||
Application.sandbox
|
||||
{ init = init
|
||||
{ init = always init
|
||||
, update = update
|
||||
, view = view
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
module Pages.Homepage exposing
|
||||
( Model
|
||||
, Msg
|
||||
, Params
|
||||
, page
|
||||
)
|
||||
|
||||
@ -16,7 +17,11 @@ type alias Msg =
|
||||
Never
|
||||
|
||||
|
||||
page : Application.Page Model Msg model msg
|
||||
type alias Params =
|
||||
()
|
||||
|
||||
|
||||
page : Application.Page Params Model Msg model msg
|
||||
page =
|
||||
Application.static
|
||||
{ view = view
|
||||
|
@ -1,4 +1,9 @@
|
||||
module Pages.NotFound exposing (Model, Msg, page)
|
||||
module Pages.NotFound exposing
|
||||
( Model
|
||||
, Msg
|
||||
, Params
|
||||
, page
|
||||
)
|
||||
|
||||
import Application
|
||||
import Html exposing (..)
|
||||
@ -12,7 +17,11 @@ type alias Msg =
|
||||
Never
|
||||
|
||||
|
||||
page : Application.Page Model Msg model msg
|
||||
type alias Params =
|
||||
()
|
||||
|
||||
|
||||
page : Application.Page Params Model Msg model msg
|
||||
page =
|
||||
Application.static
|
||||
{ view = view
|
||||
|
@ -1,4 +1,9 @@
|
||||
module Pages.Random exposing (Model, Msg, page)
|
||||
module Pages.Random exposing
|
||||
( Model
|
||||
, Msg
|
||||
, Params
|
||||
, page
|
||||
)
|
||||
|
||||
import Application as Application
|
||||
import Html exposing (..)
|
||||
@ -18,10 +23,14 @@ type Msg
|
||||
| CatResponded (Result Http.Error String)
|
||||
|
||||
|
||||
page : Application.Page Model Msg model msg
|
||||
type alias Params =
|
||||
()
|
||||
|
||||
|
||||
page : Application.Page Params Model Msg model msg
|
||||
page =
|
||||
Application.element
|
||||
{ init = init
|
||||
{ init = always init
|
||||
, update = update
|
||||
, view = view
|
||||
, subscriptions = subscriptions
|
||||
|
@ -1,4 +1,4 @@
|
||||
module Pages.Users.Slug_ exposing (Model, Msg, page)
|
||||
module Pages.Users.Slug exposing (Model, Msg, Params, page)
|
||||
|
||||
import Application
|
||||
import Html exposing (..)
|
||||
@ -13,9 +13,13 @@ type Msg
|
||||
= Msg
|
||||
|
||||
|
||||
page : Application.PageWithParams Model Msg a b String
|
||||
type alias Params =
|
||||
String
|
||||
|
||||
|
||||
page : Application.Page Params Model Msg a b
|
||||
page =
|
||||
Application.elementWithParams
|
||||
Application.element
|
||||
{ init = init
|
||||
, update = update
|
||||
, view = view
|
||||
@ -23,7 +27,7 @@ page =
|
||||
}
|
||||
|
||||
|
||||
init : String -> ( Model, Cmd Msg )
|
||||
init : Params -> ( Model, Cmd Msg )
|
||||
init slug =
|
||||
( Model slug, Cmd.none )
|
||||
|
52
example/src/Pages/Users/Slug/Posts/Slug.elm
Normal file
52
example/src/Pages/Users/Slug/Posts/Slug.elm
Normal file
@ -0,0 +1,52 @@
|
||||
module Pages.Users.Slug.Posts.Slug exposing (Model, Msg, Params, page)
|
||||
|
||||
import Application
|
||||
import Html exposing (..)
|
||||
|
||||
|
||||
type alias Model =
|
||||
{ user : String
|
||||
, post : Int
|
||||
}
|
||||
|
||||
|
||||
type Msg
|
||||
= Msg
|
||||
|
||||
|
||||
type alias Params =
|
||||
{ user : String
|
||||
, post : Int
|
||||
}
|
||||
|
||||
|
||||
page : Application.Page Params Model Msg a b
|
||||
page =
|
||||
Application.element
|
||||
{ init = init
|
||||
, update = update
|
||||
, view = view
|
||||
, subscriptions = subscriptions
|
||||
}
|
||||
|
||||
|
||||
init : Params -> ( Model, Cmd Msg )
|
||||
init params =
|
||||
( params, Cmd.none )
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Cmd Msg )
|
||||
update msg model =
|
||||
case msg of
|
||||
Msg ->
|
||||
( model, Cmd.none )
|
||||
|
||||
|
||||
subscriptions : Model -> Sub Msg
|
||||
subscriptions model =
|
||||
Sub.none
|
||||
|
||||
|
||||
view : Model -> Html Msg
|
||||
view model =
|
||||
h1 [] [ text ("Post " ++ String.fromInt model.post ++ " for user: " ++ model.user) ]
|
@ -1,12 +1,10 @@
|
||||
module Application exposing
|
||||
( Application, create
|
||||
, Page, Recipe
|
||||
, PageWithParams, RecipeWithParams
|
||||
, Bundle, keep
|
||||
, Static, static
|
||||
, Sandbox, sandbox
|
||||
, Element, element
|
||||
, ElementWithParams, elementWithParams
|
||||
)
|
||||
|
||||
{-|
|
||||
@ -14,7 +12,6 @@ module Application exposing
|
||||
@docs Application, create
|
||||
|
||||
@docs Page, Recipe
|
||||
@docs PageWithParams, RecipeWithParams
|
||||
@docs Bundle, keep
|
||||
|
||||
@docs Static, static
|
||||
@ -23,6 +20,8 @@ module Application exposing
|
||||
|
||||
@docs Element, element
|
||||
|
||||
@docs PageWithParams, RecipeWithParams
|
||||
|
||||
@docs ElementWithParams, elementWithParams
|
||||
|
||||
-}
|
||||
@ -195,20 +194,12 @@ view config model =
|
||||
-- PAGE API
|
||||
|
||||
|
||||
type alias Page pageModel pageMsg model msg =
|
||||
Page.Page pageModel pageMsg model msg
|
||||
type alias Page params pageModel pageMsg model msg =
|
||||
Page.Page params pageModel pageMsg model msg
|
||||
|
||||
|
||||
type alias Recipe pageModel pageMsg model msg =
|
||||
Page.Recipe pageModel pageMsg model msg
|
||||
|
||||
|
||||
type alias PageWithParams pageModel pageMsg model msg arg =
|
||||
Page.PageWithParams pageModel pageMsg model msg arg
|
||||
|
||||
|
||||
type alias RecipeWithParams pageModel pageMsg model msg arg =
|
||||
Page.RecipeWithParams pageModel pageMsg model msg arg
|
||||
type alias Recipe params pageModel pageMsg model msg =
|
||||
Page.Recipe params pageModel pageMsg model msg
|
||||
|
||||
|
||||
type alias Bundle msg =
|
||||
@ -226,39 +217,28 @@ type alias Static =
|
||||
|
||||
static :
|
||||
Static
|
||||
-> Page () Never model msg
|
||||
-> Page params () Never model msg
|
||||
static =
|
||||
Page.static
|
||||
|
||||
|
||||
type alias Sandbox pageModel pageMsg =
|
||||
Page.Sandbox pageModel pageMsg
|
||||
type alias Sandbox pageModel pageMsg params =
|
||||
Page.Sandbox pageModel pageMsg params
|
||||
|
||||
|
||||
sandbox :
|
||||
Sandbox pageModel pageMsg
|
||||
-> Page pageModel pageMsg model msg
|
||||
Sandbox pageModel pageMsg params
|
||||
-> Page params pageModel pageMsg model msg
|
||||
sandbox =
|
||||
Page.sandbox
|
||||
|
||||
|
||||
type alias Element pageModel pageMsg =
|
||||
Page.Element pageModel pageMsg
|
||||
type alias Element pageModel pageMsg params =
|
||||
Page.Element pageModel pageMsg params
|
||||
|
||||
|
||||
element :
|
||||
Element pageModel pageMsg
|
||||
-> Page pageModel pageMsg model msg
|
||||
Element pageModel pageMsg params
|
||||
-> Page params pageModel pageMsg model msg
|
||||
element =
|
||||
Page.element
|
||||
|
||||
|
||||
type alias ElementWithParams pageModel pageMsg arg =
|
||||
Page.ElementWithParams pageModel pageMsg arg
|
||||
|
||||
|
||||
elementWithParams :
|
||||
ElementWithParams pageModel pageMsg arg
|
||||
-> PageWithParams pageModel pageMsg model msg arg
|
||||
elementWithParams =
|
||||
Page.elementWithParams
|
||||
|
@ -1,19 +1,15 @@
|
||||
module Internals.Page exposing
|
||||
( Page, Recipe
|
||||
, PageWithParams, RecipeWithParams
|
||||
, Bundle
|
||||
, Static, static
|
||||
, Sandbox, sandbox
|
||||
, Element, element
|
||||
, ElementWithParams, elementWithParams
|
||||
)
|
||||
|
||||
{-|
|
||||
|
||||
@docs Page, Recipe
|
||||
|
||||
@docs PageWithParams, RecipeWithParams
|
||||
|
||||
@docs Bundle
|
||||
|
||||
@docs Static, static
|
||||
@ -22,22 +18,20 @@ module Internals.Page exposing
|
||||
|
||||
@docs Element, element
|
||||
|
||||
@docs ElementWithParams, elementWithParams
|
||||
|
||||
-}
|
||||
|
||||
import Html exposing (Html)
|
||||
|
||||
|
||||
type alias Page pageModel pageMsg model msg =
|
||||
type alias Page params pageModel pageMsg model msg =
|
||||
{ toModel : pageModel -> model
|
||||
, toMsg : pageMsg -> msg
|
||||
}
|
||||
-> Recipe pageModel pageMsg model msg
|
||||
-> Recipe params pageModel pageMsg model msg
|
||||
|
||||
|
||||
type alias Recipe pageModel pageMsg model msg =
|
||||
{ init : ( model, Cmd msg )
|
||||
type alias Recipe params pageModel pageMsg model msg =
|
||||
{ init : params -> ( model, Cmd msg )
|
||||
, update : pageMsg -> pageModel -> ( model, Cmd msg )
|
||||
, bundle : pageModel -> Bundle msg
|
||||
}
|
||||
@ -60,9 +54,9 @@ type alias Static =
|
||||
|
||||
static :
|
||||
Static
|
||||
-> Page () Never model msg
|
||||
-> Page params () Never model msg
|
||||
static page { toModel, toMsg } =
|
||||
{ init = ( toModel (), Cmd.none )
|
||||
{ init = \_ -> ( toModel (), Cmd.none )
|
||||
, update = \_ model -> ( toModel model, Cmd.none )
|
||||
, bundle =
|
||||
\_ ->
|
||||
@ -76,18 +70,18 @@ static page { toModel, toMsg } =
|
||||
-- SANDBOX
|
||||
|
||||
|
||||
type alias Sandbox pageModel pageMsg =
|
||||
{ init : pageModel
|
||||
type alias Sandbox pageModel pageMsg params =
|
||||
{ init : params -> pageModel
|
||||
, update : pageMsg -> pageModel -> pageModel
|
||||
, view : pageModel -> Html pageMsg
|
||||
}
|
||||
|
||||
|
||||
sandbox :
|
||||
Sandbox pageModel pageMsg
|
||||
-> Page pageModel pageMsg model msg
|
||||
Sandbox pageModel pageMsg params
|
||||
-> Page params pageModel pageMsg model msg
|
||||
sandbox page { toModel, toMsg } =
|
||||
{ init = ( toModel page.init, Cmd.none )
|
||||
{ init = \params -> ( toModel (page.init params), Cmd.none )
|
||||
, update =
|
||||
\msg model ->
|
||||
( page.update msg model |> toModel
|
||||
@ -105,8 +99,8 @@ sandbox page { toModel, toMsg } =
|
||||
-- ELEMENT
|
||||
|
||||
|
||||
type alias Element pageModel pageMsg =
|
||||
{ init : ( pageModel, Cmd pageMsg )
|
||||
type alias Element pageModel pageMsg params =
|
||||
{ init : params -> ( pageModel, Cmd pageMsg )
|
||||
, update : pageMsg -> pageModel -> ( pageModel, Cmd pageMsg )
|
||||
, view : pageModel -> Html pageMsg
|
||||
, subscriptions : pageModel -> Sub pageMsg
|
||||
@ -114,53 +108,9 @@ type alias Element pageModel pageMsg =
|
||||
|
||||
|
||||
element :
|
||||
Element pageModel pageMsg
|
||||
-> Page pageModel pageMsg model msg
|
||||
Element pageModel pageMsg params
|
||||
-> Page params pageModel pageMsg model msg
|
||||
element page { toModel, toMsg } =
|
||||
{ init =
|
||||
page.init |> Tuple.mapBoth toModel (Cmd.map toMsg)
|
||||
, update =
|
||||
\msg model ->
|
||||
page.update msg model
|
||||
|> Tuple.mapBoth toModel (Cmd.map toMsg)
|
||||
, bundle =
|
||||
\model ->
|
||||
{ view = page.view model |> Html.map toMsg
|
||||
, subscriptions = Sub.none
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
-- ELEMENT WITH PARAMS
|
||||
|
||||
|
||||
type alias ElementWithParams pageModel pageMsg arg =
|
||||
{ init : arg -> ( pageModel, Cmd pageMsg )
|
||||
, update : pageMsg -> pageModel -> ( pageModel, Cmd pageMsg )
|
||||
, view : pageModel -> Html pageMsg
|
||||
, subscriptions : pageModel -> Sub pageMsg
|
||||
}
|
||||
|
||||
|
||||
type alias RecipeWithParams pageModel pageMsg model msg arg =
|
||||
{ init : arg -> ( model, Cmd msg )
|
||||
, update : pageMsg -> pageModel -> ( model, Cmd msg )
|
||||
, bundle : pageModel -> Bundle msg
|
||||
}
|
||||
|
||||
|
||||
type alias PageWithParams pageModel pageMsg model msg arg =
|
||||
{ toModel : pageModel -> model
|
||||
, toMsg : pageMsg -> msg
|
||||
}
|
||||
-> RecipeWithParams pageModel pageMsg model msg arg
|
||||
|
||||
|
||||
elementWithParams :
|
||||
ElementWithParams pageModel pageMsg arg
|
||||
-> PageWithParams pageModel pageMsg model msg arg
|
||||
elementWithParams page { toModel, toMsg } =
|
||||
{ init =
|
||||
page.init >> Tuple.mapBoth toModel (Cmd.map toMsg)
|
||||
, update =
|
||||
|
Loading…
Reference in New Issue
Block a user