Bot-Man-Toe/elm/Main.elm

148 lines
3.1 KiB
Elm

module Main exposing (main)
import Api
import Browser
import Element exposing (Element)
import Element.Background
import GameList exposing (Game, GameList)
import Http
import ScreenSize exposing (ScreenSize)
import Theme
main : Program () Model Msg
main =
Browser.document
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
-- MODEL
type alias Model =
{ baseUrl : String
, flavor : Theme.Flavor
, games : GameList
, screen : Screen
, size : ScreenSize
}
type Screen
= ViewCreateGame
| ViewGameSelectionMenu
| ViewGame Game
type Msg
= OnGameList GameList.Msg
| OnScreen Screen
| OnScreenSize ScreenSize
init : () -> ( Model, Cmd Msg )
init () =
let
( gmdl, gmsg ) =
GameList.init {}
in
( { baseUrl = "http://localhost:5000"
, flavor = Theme.Latte
, games = gmdl
, screen = ViewGameSelectionMenu
, size = ScreenSize.init
}
, Cmd.batch
[ ScreenSize.updateScreenSize OnScreenSize
, Cmd.map OnGameList gmsg
]
)
-- UPDATE
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
OnGameList m ->
case GameList.update m model.games of
( newMdl, newM ) ->
( { model | games = newMdl }, Cmd.map OnGameList newM )
OnScreen screen ->
( { model | screen = screen }, Cmd.none )
OnScreenSize size ->
( { model | size = size }, Cmd.none )
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.batch
[ ScreenSize.onResize OnScreenSize
, Sub.map OnGameList (GameList.subscriptions model.games)
]
-- VIEW
view : Model -> Browser.Document Msg
view model =
{ title =
case model.screen of
ViewCreateGame ->
"Create Game | Bot-Man-Toe"
ViewGameSelectionMenu ->
"Menu | Bot-Man-Toe"
ViewGame _ ->
"Replay | Bot-Man-Toe"
, body =
viewScreen model
|> Element.layout
[ Element.Background.color (Theme.baseUI model.flavor)
]
|> List.singleton
}
viewScreen : Model -> Element Msg
viewScreen model =
case model.screen of
ViewCreateGame ->
Element.text "Create game menu!"
ViewGameSelectionMenu ->
GameList.viewSelection
{ flavor = model.flavor
, height = model.size.height
, model = model.games
, onCreateGame = OnScreen ViewCreateGame
, onNavigateToGame = OnScreen << ViewGame
, width = model.size.width
}
ViewGame game ->
GameList.viewGame
{ flavor = model.flavor
, game = game
, height = model.size.height
, onNavigateBack = OnScreen ViewGameSelectionMenu
, toMsg = OnGameList
, width = model.size.width
}