2024-12-29 02:09:53 +00:00
|
|
|
module Main exposing (main)
|
|
|
|
|
2024-12-30 23:04:52 +00:00
|
|
|
-- 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
|
2024-12-30 23:04:52 +00:00
|
|
|
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
|
|
|
|
2024-12-30 23:04:52 +00:00
|
|
|
-- internal imports
|
|
|
|
import Body
|
|
|
|
import Header
|
2024-12-29 02:09:53 +00:00
|
|
|
|
2024-12-30 23:04:52 +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
|
2024-12-30 23:04:52 +00:00
|
|
|
, 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
|
2024-12-30 23:04:52 +00:00
|
|
|
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
|
2025-01-01 23:51:17 +00:00
|
|
|
(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
|
2024-12-30 23:04:52 +00:00
|
|
|
Body bodyMsg ->
|
2024-12-29 02:09:53 +00:00
|
|
|
let
|
2024-12-30 23:04:52 +00:00
|
|
|
(newPage, cmd) = Body.update bodyMsg model.page
|
2024-12-29 02:09:53 +00:00
|
|
|
in
|
2024-12-30 23:04:52 +00:00
|
|
|
( {model | page = newPage}, cmd |> Cmd.map Body )
|
|
|
|
UrlChanged url ->
|
2025-01-01 01:50:26 +00:00
|
|
|
let
|
2025-01-01 02:21:28 +00:00
|
|
|
newModel = {model | page = Body.handleRoute url.path, url = url}
|
2025-01-01 01:50:26 +00:00
|
|
|
in
|
2025-01-01 02:21:28 +00:00
|
|
|
( 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
|
2024-12-30 23:04:52 +00:00
|
|
|
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]
|
2024-12-30 23:04:52 +00:00
|
|
|
[ header
|
|
|
|
, body]
|
2024-12-29 02:09:53 +00:00
|
|
|
in
|
|
|
|
{ title = "Example Spa Elm App"
|
|
|
|
, body = [ Element.layout [] page ]}
|
|
|
|
|
|
|
|
main =
|
|
|
|
Browser.application {
|
2024-12-30 23:04:52 +00:00
|
|
|
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
|
|
|
}
|