|
|
|
port 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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
port wsout : String -> Cmd msg
|
|
|
|
|
|
|
|
|
|
|
|
port wsin : (String -> msg) -> Sub msg
|
|
|
|
|
|
|
|
|
|
|
|
{-| 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 _ =
|
|
|
|
wsin WsIn
|
|
|
|
|
|
|
|
|
|
|
|
type Msg
|
|
|
|
= UrlChanged Url.Url
|
|
|
|
| LinkClicked Browser.UrlRequest
|
|
|
|
| WsIn String
|
|
|
|
| WsOut String
|
|
|
|
|
|
|
|
|
|
|
|
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 )
|
|
|
|
|
|
|
|
WsOut wsmsg ->
|
|
|
|
( model, wsout wsmsg )
|
|
|
|
|
|
|
|
WsIn wsmsg ->
|
|
|
|
Debug.log wsmsg ( model, 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 =
|
|
|
|
[]
|