153 lines
3.7 KiB
Elm
153 lines
3.7 KiB
Elm
module Main exposing (..)
|
|
|
|
import Browser exposing (Document)
|
|
import Browser.Navigation as Nav
|
|
import CreatePage
|
|
import Html exposing (Html, text)
|
|
import ShowPage
|
|
import Url exposing (Url)
|
|
import Url.Parser as Parser exposing (Parser)
|
|
|
|
|
|
type alias Model =
|
|
{ origin : String
|
|
, key : Nav.Key
|
|
, page : Page
|
|
}
|
|
|
|
|
|
type Route
|
|
= Create
|
|
| Show String
|
|
|
|
|
|
type Page
|
|
= CreatePage CreatePage.Model
|
|
| ShowPage ShowPage.Model
|
|
|
|
|
|
view : Model -> Document Msg
|
|
view model =
|
|
{ title = "Doglinks"
|
|
, body =
|
|
[ Html.h1 [] [ text "Doglinks" ]
|
|
, Html.p [] [ text "Create your doglinks here" ]
|
|
, case model.page of
|
|
CreatePage page ->
|
|
CreatePage.view page
|
|
|> Html.map CreateMsg
|
|
|
|
ShowPage page ->
|
|
ShowPage.view model.origin page
|
|
|> Html.map ShowMsg
|
|
]
|
|
}
|
|
|
|
|
|
init : String -> Url -> Nav.Key -> ( Model, Cmd Msg )
|
|
init origin url key =
|
|
let
|
|
initialModel =
|
|
{ origin = origin, key = key, page = CreatePage CreatePage.init }
|
|
in
|
|
updateUrl url initialModel
|
|
|
|
|
|
type Msg
|
|
= ClickedLink Browser.UrlRequest
|
|
| ChangedUrl Url
|
|
| CreateMsg CreatePage.Msg
|
|
| ShowMsg ShowPage.Msg
|
|
|
|
|
|
update : Msg -> Model -> ( Model, Cmd Msg )
|
|
update msg model =
|
|
case msg of
|
|
ClickedLink (Browser.Internal url) ->
|
|
( model, Nav.pushUrl model.key <| Url.toString url )
|
|
|
|
ClickedLink _ ->
|
|
( model, Cmd.none )
|
|
|
|
ChangedUrl url ->
|
|
updateUrl url model
|
|
|
|
CreateMsg createMsg ->
|
|
case model.page of
|
|
CreatePage page ->
|
|
let
|
|
( pageModel, pageMsg ) =
|
|
CreatePage.update model.origin model.key createMsg page
|
|
in
|
|
( { model | page = CreatePage pageModel }, Cmd.map CreateMsg pageMsg )
|
|
|
|
_ ->
|
|
( model, Cmd.none )
|
|
|
|
ShowMsg showMsg ->
|
|
case model.page of
|
|
ShowPage page ->
|
|
let
|
|
( pageModel, pageMsg ) =
|
|
ShowPage.update model.key showMsg page
|
|
in
|
|
( { model | page = ShowPage pageModel }, Cmd.map ShowMsg pageMsg )
|
|
|
|
_ ->
|
|
( model, Cmd.none )
|
|
|
|
|
|
updateUrl : Url -> Model -> ( Model, Cmd Msg )
|
|
updateUrl url model =
|
|
case Parser.parse routeParser url of
|
|
Just (Show uuid) ->
|
|
toShow model ( ShowPage.init uuid, Cmd.none )
|
|
|
|
_ ->
|
|
toCreate model ( CreatePage.init, Cmd.none )
|
|
|
|
|
|
toShow : Model -> ( ShowPage.Model, Cmd ShowPage.Msg ) -> ( Model, Cmd Msg )
|
|
toShow model ( showModel, showMsg ) =
|
|
case model.page of
|
|
ShowPage _ ->
|
|
( model, Cmd.none )
|
|
|
|
_ ->
|
|
( { model | page = ShowPage showModel }, Cmd.map ShowMsg showMsg )
|
|
|
|
|
|
toCreate : Model -> ( CreatePage.Model, Cmd CreatePage.Msg ) -> ( Model, Cmd Msg )
|
|
toCreate model ( createModel, createMsg ) =
|
|
case model.page of
|
|
CreatePage _ ->
|
|
( model, Cmd.none )
|
|
|
|
_ ->
|
|
( { model | page = CreatePage createModel }, Cmd.map CreateMsg createMsg )
|
|
|
|
|
|
subscriptions : Model -> Sub Msg
|
|
subscriptions _ =
|
|
Sub.map ShowMsg ShowPage.subscriptions
|
|
|
|
|
|
main : Program String Model Msg
|
|
main =
|
|
Browser.application
|
|
{ init = init
|
|
, subscriptions = subscriptions
|
|
, update = update
|
|
, view = view
|
|
, onUrlRequest = ClickedLink
|
|
, onUrlChange = ChangedUrl
|
|
}
|
|
|
|
|
|
routeParser : Parser (Route -> a) a
|
|
routeParser =
|
|
Parser.oneOf
|
|
[ Parser.map Create Parser.top
|
|
, Parser.map Show Parser.string
|
|
]
|