148 lines
3.1 KiB
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
|
|
}
|