example-spa-elm-app/frontend/src/Main.elm

94 lines
2.4 KiB
Elm
Raw Normal View History

2024-12-29 02:09:53 +00:00
module Main exposing (main)
-- external imports
2024-12-29 02:09:53 +00:00
import Browser
import Url
import Html exposing (Html)
import Element exposing (Element, el, text, column)
import String exposing (right)
import Browser.Navigation
import Browser exposing (UrlRequest)
2024-12-29 02:09:53 +00:00
import Html exposing (header)
2025-01-01 06:48:55 +00:00
import Ports
2024-12-29 02:09:53 +00:00
-- internal imports
import Body
import Header
2024-12-29 02:09:53 +00:00
type Msg
= Header Header.Msg
| Body Body.Msg
| UrlChanged Url.Url
| UrlRequest Browser.UrlRequest
2024-12-29 02:09:53 +00:00
type alias Model =
{ key : Browser.Navigation.Key
, url : Url.Url
, page : Body.Model
2024-12-29 02:09:53 +00:00
, header : Header.Model}
init : () -> Url.Url -> Browser.Navigation.Key -> ( Model, Cmd Msg )
init flags url key =
let
page = Body.init flags
2024-12-29 02:09:53 +00:00
header = Header.init flags
model =
{ key = key
, url = url
2025-01-01 01:50:26 +00:00
, page = Body.handleRoute url.path
2024-12-29 02:09:53 +00:00
, header = header
}
in
(model, Ports.socketOpen)
2024-12-29 02:09:53 +00:00
2025-01-01 01:50:26 +00:00
2024-12-29 02:09:53 +00:00
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Body bodyMsg ->
2024-12-29 02:09:53 +00:00
let
(newPage, cmd) = Body.update bodyMsg model.page
2024-12-29 02:09:53 +00:00
in
( {model | page = newPage}, cmd |> Cmd.map Body )
UrlChanged url ->
2025-01-01 01:50:26 +00:00
let
newModel = {model | page = Body.handleRoute url.path, url = url}
2025-01-01 01:50:26 +00:00
in
( newModel, Cmd.none )
UrlRequest (Browser.Internal url) ->
( model, Browser.Navigation.pushUrl model.key (Url.toString url) )
2024-12-29 02:09:53 +00:00
_ -> (model, Cmd.none)
subscriptions : Model -> Sub Msg
subscriptions _ =
Sub.none
view : Model -> Browser.Document Msg
view model =
let
header = Header.view model.header |> Element.map Header
body = Body.view model.page |> Element.map Body
2024-12-29 02:09:53 +00:00
page =
Element.column
[ Element.width Element.fill
, Element.height Element.fill
, Element.centerX]
[ header
, body]
2024-12-29 02:09:53 +00:00
in
{ title = "Example Spa Elm App"
, body = [ Element.layout [] page ]}
main =
Browser.application {
init = init
,view = view
,update = update
,subscriptions = subscriptions
-- when a link is clicked, first UrlRequest is issued
,onUrlRequest = UrlRequest
-- then UrlChanged is issued
,onUrlChange = UrlChanged
2024-12-29 02:09:53 +00:00
}