module Main exposing (main) import Browser import Browser.Navigation as Nav import Html exposing (..) import Html.Attributes exposing (..) import Model exposing (Model) import Navigation import Url import Url.Parser main = Browser.application { init = init , onUrlChange = UrlChanged , onUrlRequest = LinkClicked , subscriptions = subscriptions , update = update , view = view } {-| currently no flags are needed that's the reason for the generic type and \_ as param name -} init : { userUuid : String } -> Url.Url -> Nav.Key -> ( Model, Cmd Msg ) init flags url key = let route : Navigation.Route route = Url.Parser.parse Navigation.routeParser url |> Maybe.withDefault Navigation.Home initInfo : Model.InitInfo initInfo = Model.InitInfo key route url flags.userUuid model : Model model = Model.initialModel initInfo in routeChanged route model subscriptions : Model -> Sub Msg subscriptions _ = Sub.none type Msg = UrlChanged Url.Url | LinkClicked Browser.UrlRequest update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of -- Navigation based messages LinkClicked urlRequest -> Navigation.linkClicked urlRequest model.key model UrlChanged url -> case Url.Parser.parse Navigation.routeParser url of Just route -> routeChanged route model Nothing -> -- TODO error reporting ( { model | route = Navigation.Home }, Cmd.none ) routeChanged : Navigation.Route -> Model -> ( Model, Cmd Msg ) routeChanged route model = case route of Navigation.Home -> ( { model | route = route } , Cmd.none ) view : Model -> Browser.Document Msg view model = { title = "Open-Retro" , body = [ nav [] [ h1 [ class "app-title" ] [ text "Open-Retro" ] , ul [] [ li [] [ input [ class "board-search-input", placeholder "Board ID..." ] [] ] , li [] [ text "⊕ New board" ] ] ] , main_ [] (appContent model) , node "link" [ rel "stylesheet", href "/compiled/css/style.css" ] [] ] } appContent : Model -> List (Html Msg) appContent model = case model.route of Navigation.Home -> homePage model homePage : Model -> List (Html Msg) homePage model = []