exploring...
This commit is contained in:
148
src/Main.elm
148
src/Main.elm
@@ -25,13 +25,19 @@ main =
|
||||
|
||||
-- Model
|
||||
|
||||
type alias Model =
|
||||
{ key : Nav.Key
|
||||
type alias State =
|
||||
{ navKey : Nav.Key
|
||||
, route : Route
|
||||
, error : String
|
||||
, menuOpen : Bool
|
||||
}
|
||||
|
||||
type alias Model =
|
||||
{ state : State
|
||||
, player: Player
|
||||
, loot: Maybe Loot
|
||||
, groupLoot : Maybe Loot
|
||||
, error: String
|
||||
, merchantItems : Maybe Loot
|
||||
}
|
||||
|
||||
init : () -> Url.Url -> Nav.Key -> ( Model, Cmd Msg )
|
||||
@@ -39,9 +45,9 @@ init flags url key =
|
||||
let
|
||||
route = case P.parse routeParser url of
|
||||
Just r -> r
|
||||
Nothing -> GroupLoot
|
||||
Nothing -> PlayerChest
|
||||
in
|
||||
( Model key route blankPlayer Nothing Nothing "", initPlayer 0)
|
||||
( Model (State key route "" False) blankPlayer Nothing Nothing Nothing, initPlayer 0)
|
||||
|
||||
|
||||
-- PLAYER
|
||||
@@ -54,7 +60,7 @@ type alias Player =
|
||||
}
|
||||
|
||||
blankPlayer =
|
||||
Player 0 "Loading" 100 (Wealth 0 0 0 0)
|
||||
Player 0 "Loading" 0 (Wealth 0 0 0 0)
|
||||
|
||||
initPlayer id =
|
||||
Cmd.batch [fetchPlayer id, fetchLoot id]
|
||||
@@ -133,11 +139,12 @@ update msg model =
|
||||
LinkClicked urlRequest ->
|
||||
case urlRequest of
|
||||
Browser.Internal url ->
|
||||
( model, Nav.pushUrl model.key (Url.toString url) )
|
||||
( model, Nav.pushUrl model.state.navKey (Url.toString url) )
|
||||
--( model, Cmd.none )
|
||||
|
||||
Browser.External href ->
|
||||
( { model | error = "Invalid request '" ++ href ++ "'" }, Cmd.none )
|
||||
( setError ("Invalid request '" ++ href ++ "'") model
|
||||
, Cmd.none )
|
||||
|
||||
UrlChanged url ->
|
||||
let
|
||||
@@ -145,14 +152,15 @@ update msg model =
|
||||
in
|
||||
case route of
|
||||
Just page ->
|
||||
( { model | route = page }
|
||||
( let state = model.state in
|
||||
{ model | state = { state | route = page }}
|
||||
, case page of
|
||||
GroupLoot -> Cmd.none
|
||||
a -> Cmd.none
|
||||
)
|
||||
|
||||
Nothing ->
|
||||
( { model | error = "Invalid route" }, Cmd.none )
|
||||
( setError "Invalid route" model, Cmd.none )
|
||||
|
||||
PlayerChanged newId ->
|
||||
( { model | player = blankPlayer }, initPlayer newId )
|
||||
@@ -163,7 +171,10 @@ update msg model =
|
||||
( { model | player = player }
|
||||
, Cmd.none
|
||||
)
|
||||
Err error -> ( { model | error = "Fetching player... " ++ (printError error) }, Cmd.none )
|
||||
Err error ->
|
||||
( setError ("Fetching player... " ++ printError error) model
|
||||
, Cmd.none
|
||||
)
|
||||
|
||||
GotLoot result ->
|
||||
case result of
|
||||
@@ -171,10 +182,22 @@ update msg model =
|
||||
( { model | loot = Just loot}
|
||||
, Cmd.none
|
||||
)
|
||||
Err error -> ( { model | error = "Fetching loot... " ++ (printError error) }, Cmd.none )
|
||||
Err error ->
|
||||
( setError ("Fetching loot... " ++ printError error) model
|
||||
, Cmd.none
|
||||
)
|
||||
|
||||
-- ERRORS
|
||||
|
||||
setError : String -> Model -> Model
|
||||
setError error model =
|
||||
let
|
||||
state = model.state
|
||||
in
|
||||
{ model | state =
|
||||
{ state | error = error }}
|
||||
|
||||
|
||||
printError : Http.Error -> String
|
||||
printError error =
|
||||
case error of
|
||||
@@ -188,26 +211,27 @@ subscriptions _ =
|
||||
Sub.none
|
||||
|
||||
|
||||
-- VIEW
|
||||
--
|
||||
---
|
||||
-- VIEWS
|
||||
---
|
||||
|
||||
view : Model -> Browser.Document Msg
|
||||
view model =
|
||||
{ title = "Loot-a-lot in ELM"
|
||||
, body =
|
||||
[ viewHeaderBar model
|
||||
, viewPlayerWealth model.player
|
||||
, section [class "container"]
|
||||
(case model.route of
|
||||
, viewPlayerBar model.player model.state.route
|
||||
, article [class "section container"]
|
||||
(case model.state.route of
|
||||
PlayerChest ->
|
||||
[ p [] [text "Mon Coffre"]
|
||||
, viewLoot (case model.loot of
|
||||
Just i -> i
|
||||
Nothing -> [])
|
||||
, viewLoot (Maybe.withDefault [] model.loot)
|
||||
]
|
||||
|
||||
GroupLoot ->
|
||||
[ p [] [text "Coffre de groupe"] ]
|
||||
[ p [] [text "Coffre de groupe"]
|
||||
, viewLoot (Maybe.withDefault [] model.groupLoot)
|
||||
]
|
||||
|
||||
Merchant ->
|
||||
[ p [] [text "Acheter des objets"] ]
|
||||
@@ -215,27 +239,32 @@ view model =
|
||||
NewLoot ->
|
||||
[ p [] [text "Nouveau trésor :) "] ]
|
||||
)
|
||||
, hr [] []
|
||||
, section [class "container"] [viewDebugSection model]
|
||||
]
|
||||
}
|
||||
|
||||
-- LOOT Views
|
||||
|
||||
viewLoot : Loot -> Html Msg
|
||||
viewLoot items =
|
||||
table []
|
||||
(List.map viewItemTableRow items)
|
||||
|
||||
viewItemTableRow item =
|
||||
tr [class "table"]
|
||||
[ td [] [p [] [text item.name]]
|
||||
]
|
||||
|
||||
viewLoot : Loot -> Html Msg
|
||||
viewLoot items =
|
||||
table []
|
||||
(List.map viewItemTableRow items)
|
||||
-- DEBUG SECTION
|
||||
|
||||
viewDebugSection : Model -> Html Msg
|
||||
viewDebugSection model =
|
||||
div [class "panel is-danger"]
|
||||
[ p [class "panel-heading"] [text "Debug"]
|
||||
, debugSwitchPlayers
|
||||
, p [class "panel-block has-text-danger"] [text model.error]
|
||||
, p [class "panel-block"] [text ("Route : " ++ Debug.toString model.route)]
|
||||
, p [class "panel-block has-text-danger"] [text model.state.error]
|
||||
, p [class "panel-block"] [text ("Route : " ++ Debug.toString model.state.route)]
|
||||
]
|
||||
|
||||
debugSwitchPlayers : Html Msg
|
||||
@@ -245,15 +274,15 @@ debugSwitchPlayers =
|
||||
, a [ onClick (PlayerChanged 1) ] [text "Lomion"]
|
||||
, a [ onClick (PlayerChanged 2) ] [text "Fefi"]
|
||||
]
|
||||
|
||||
-- HEADER SECTION
|
||||
|
||||
viewHeaderBar : Model -> Html Msg
|
||||
viewHeaderBar model =
|
||||
nav [ class "navbar", class "is-info" ]
|
||||
[ div [ class "navbar-brand" ]
|
||||
[ p [ class "navbar-item"]
|
||||
[ a [ class "navbar-item", href "/"]
|
||||
[ text model.player.name ]
|
||||
|
||||
, a [class "navbar-burger is-active"]
|
||||
[ span [attribute "aria-hidden" "true"] []
|
||||
, span [attribute "aria-hidden" "true"] []
|
||||
@@ -263,34 +292,45 @@ viewHeaderBar model =
|
||||
, div [ class "navbar-menu is-active" ]
|
||||
[ div [class "navbar-end"]
|
||||
[ a [class "navbar-item", href "/marchand"] [text "Marchand"]
|
||||
, a [class "navbar-item", href "/coffre"] [text "Mon coffre"]
|
||||
, a [class "navbar-item", href "/coffre"] [text "Coffre de groupe"]
|
||||
]
|
||||
]
|
||||
|
||||
]
|
||||
|
||||
-- WEALTH
|
||||
--
|
||||
-- PLAYER BAR
|
||||
|
||||
viewPlayerWealth : Player -> Html Msg
|
||||
viewPlayerWealth player =
|
||||
section [ class "level" ]
|
||||
([div [class "level-left box"]
|
||||
([div [ class "level-item" ]
|
||||
[ span [ class "icon is-large" ]
|
||||
[ i [ class "fas fa-2x fa-piggy-bank" ] [] ]]
|
||||
] ++ (showWealth player.wealth))
|
||||
] ++ (if player.debt > 0 then
|
||||
[ div [class "level-right"]
|
||||
[div [class "level-item"]
|
||||
[p [class "heading is-size-4 has-text-danger"]
|
||||
[text ("Dette : " ++ (String.fromInt player.debt) ++ "po")]
|
||||
]
|
||||
]
|
||||
viewPlayerBar : Player -> Route -> Html Msg
|
||||
viewPlayerBar player route =
|
||||
section [ class "level is-mobile box" ]
|
||||
[ div [class "level-left"]
|
||||
([div [ class "level-item" ]
|
||||
[ span [ class "icon is-large" ]
|
||||
[ i [ class "fas fa-2x fa-piggy-bank" ] [] ]]
|
||||
]
|
||||
else
|
||||
[]
|
||||
))
|
||||
++ (showWealth player.wealth)
|
||||
++ (if player.debt > 0 then
|
||||
[div [class "level-item"]
|
||||
[p [class "heading is-size-4 has-text-danger"]
|
||||
[text ("Dette : " ++ (String.fromInt player.debt) ++ "po")]
|
||||
]]
|
||||
else
|
||||
[]
|
||||
)
|
||||
)
|
||||
, div [class "level-right"] (viewPlayerAction player route)
|
||||
]
|
||||
|
||||
actionButton t = button [ class "button" ] [ text t ]
|
||||
|
||||
viewPlayerAction : Player -> Route -> List (Html Msg)
|
||||
viewPlayerAction player route =
|
||||
case route of
|
||||
PlayerChest -> [actionButton "Vendre" ]
|
||||
GroupLoot -> [actionButton "Demander" ]
|
||||
Merchant -> [actionButton "Acheter" ]
|
||||
NewLoot -> [actionButton "Valider" ]
|
||||
|
||||
|
||||
showWealth : Wealth -> List (Html Msg)
|
||||
showWealth wealth =
|
||||
@@ -307,9 +347,9 @@ showWealthField name value =
|
||||
, p [class "heading"] [text name]
|
||||
]
|
||||
|
||||
|
||||
---
|
||||
-- ROUTES
|
||||
--
|
||||
---
|
||||
|
||||
type Route
|
||||
= PlayerChest
|
||||
@@ -320,8 +360,8 @@ type Route
|
||||
routeParser : Parser (Route -> a) a
|
||||
routeParser =
|
||||
oneOf
|
||||
[ P.map GroupLoot P.top
|
||||
, P.map PlayerChest (P.s "coffre")
|
||||
[ P.map GroupLoot (P.s "coffre")
|
||||
, P.map PlayerChest P.top
|
||||
, P.map Merchant (P.s "marchand")
|
||||
, P.map NewLoot (P.s "nouveau-tresor")
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user