refactoring with one page per route (wip)
This commit is contained in:
169
src/Main.elm
169
src/Main.elm
@@ -6,6 +6,7 @@ import Html exposing (..)
|
||||
import Html.Attributes exposing (..)
|
||||
import Html.Events exposing (..)
|
||||
import Json.Encode as E
|
||||
import Page exposing (Page)
|
||||
import Page.Admin as Admin
|
||||
import Page.Chest as Chest exposing (Msg)
|
||||
import Route exposing (..)
|
||||
@@ -52,28 +53,6 @@ initNavbar key =
|
||||
Navbar False key
|
||||
|
||||
|
||||
type Page
|
||||
= Chest Chest.Model
|
||||
| Admin Admin.Model
|
||||
| About
|
||||
| Loading
|
||||
|
||||
|
||||
|
||||
{-
|
||||
|
||||
type Page
|
||||
= Dashboard Session
|
||||
| GroupChest Session
|
||||
| Shop Shop.Model
|
||||
| NewLoot Session
|
||||
| About
|
||||
| Loading
|
||||
|
||||
|
||||
-}
|
||||
|
||||
|
||||
type alias HasPage r =
|
||||
{ r | page : Page }
|
||||
|
||||
@@ -83,24 +62,10 @@ setPage page model =
|
||||
{ model | page = page }
|
||||
|
||||
|
||||
|
||||
-- This is not what we really want.
|
||||
-- The flags will be a Maybe Int (id of logged in player), so
|
||||
-- in case there is no player logged in, we need to display
|
||||
-- a "Home" page
|
||||
-- This mean Chest cannot be initiated right away, and many model
|
||||
-- fields are useless.
|
||||
--
|
||||
-- A User can :
|
||||
-- - not be logged in -> See About page
|
||||
-- - just loggend in -> See Loading page then Chest
|
||||
-- - coming back being still logged in -> See Chest (or same as above)
|
||||
|
||||
|
||||
init : () -> Url.Url -> Nav.Key -> ( Model, Cmd Msg )
|
||||
init _ _ key =
|
||||
( { navbar = initNavbar key
|
||||
, page = Loading
|
||||
, page = Page.Loading
|
||||
}
|
||||
, Session.init SessionLoaded key
|
||||
)
|
||||
@@ -114,69 +79,15 @@ view : Model -> Browser.Document Msg
|
||||
view model =
|
||||
let
|
||||
( title, header, content ) =
|
||||
viewPage model.page
|
||||
Page.view model.page
|
||||
in
|
||||
{ title = title
|
||||
, body =
|
||||
viewHeaderBar header.title header.links model.navbar
|
||||
:: content
|
||||
:: List.map (Html.map PageMsg) content
|
||||
}
|
||||
|
||||
|
||||
viewPage page =
|
||||
let
|
||||
( title, content ) =
|
||||
case page of
|
||||
Chest chest ->
|
||||
( "Loot-a-lot", List.map (Html.map GotChestMsg) (Chest.view chest) )
|
||||
|
||||
Admin admin ->
|
||||
( "Administration", List.map (Html.map GotAdminMsg) (Admin.view admin) )
|
||||
|
||||
About ->
|
||||
( "A propos", [ p [] [ text "A propos" ] ] )
|
||||
|
||||
Loading ->
|
||||
( "Veuillez patienter...", [ p [] [ text "Chargement" ] ] )
|
||||
|
||||
navbarTitle =
|
||||
case page of
|
||||
Chest chest ->
|
||||
chest.state.player.name
|
||||
|
||||
Admin _ ->
|
||||
"Administration"
|
||||
|
||||
About ->
|
||||
"Loot-a-lot"
|
||||
|
||||
Loading ->
|
||||
"Loot-a-(...)"
|
||||
|
||||
navbarLinks =
|
||||
case page of
|
||||
Chest chest ->
|
||||
let
|
||||
linkWithGem =
|
||||
navLink "fas fa-gem"
|
||||
in
|
||||
[ navLink "fas fa-store-alt" "Marchand" "/marchand"
|
||||
, if chest.state.player.id == 0 then
|
||||
linkWithGem "Nouveau loot" "/nouveau-tresor"
|
||||
|
||||
else
|
||||
linkWithGem "Coffre de groupe" "/coffre"
|
||||
]
|
||||
|
||||
Admin _ ->
|
||||
[ navLink "fas fa-store-alt" "Marchand" "/marchand" ]
|
||||
|
||||
_ ->
|
||||
[]
|
||||
in
|
||||
( title, { title = navbarTitle, links = navbarLinks }, content )
|
||||
|
||||
|
||||
|
||||
-- HEADER SECTION
|
||||
|
||||
@@ -220,15 +131,10 @@ type Msg
|
||||
= UrlChanged Url.Url
|
||||
| LinkClicked Browser.UrlRequest
|
||||
| SessionLoaded (Maybe Session)
|
||||
| GotChestMsg Chest.Msg
|
||||
| GotAdminMsg Admin.Msg
|
||||
| PageMsg Page.PageMsg
|
||||
| SwitchMenuOpen
|
||||
|
||||
|
||||
|
||||
-- | GotAdminMsg Admin.Msg
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Cmd Msg )
|
||||
update msg model =
|
||||
case ( msg, model.page ) of
|
||||
@@ -236,23 +142,13 @@ update msg model =
|
||||
case session of
|
||||
Just logged ->
|
||||
let
|
||||
navKey =
|
||||
Session.key logged
|
||||
|
||||
user =
|
||||
Session.user logged
|
||||
( page, cmd ) =
|
||||
Page.gotoHome logged
|
||||
in
|
||||
case user of
|
||||
Session.Player playerId ->
|
||||
updatePage Chest GotChestMsg model <|
|
||||
Chest.init navKey playerId
|
||||
|
||||
Session.Admin ->
|
||||
updatePage Admin GotAdminMsg model <|
|
||||
Admin.init logged
|
||||
( model |> setPage page, Cmd.map PageMsg cmd )
|
||||
|
||||
Nothing ->
|
||||
( model |> setPage About, Cmd.none )
|
||||
( model |> setPage Page.About, Cmd.none )
|
||||
|
||||
( LinkClicked urlRequest, _ ) ->
|
||||
case urlRequest of
|
||||
@@ -265,38 +161,37 @@ update msg model =
|
||||
( UrlChanged url, page ) ->
|
||||
-- Handle routing according to current page
|
||||
case ( Route.fromUrl url, page ) of
|
||||
( Just (Route.Home content), Chest chest ) ->
|
||||
( model |> setPage (Chest (Chest.setContent content chest))
|
||||
( Just (Route.Home Route.MerchantLoot), Page.Admin admin ) ->
|
||||
let
|
||||
( shopPage, cmd ) =
|
||||
Page.gotoShop (Admin.getSession admin)
|
||||
in
|
||||
( model |> setPage shopPage, Cmd.map PageMsg cmd )
|
||||
|
||||
( Just (Route.Home content), Page.Chest chest ) ->
|
||||
( model |> setPage (Page.Chest (Chest.setContent content chest))
|
||||
, Cmd.none
|
||||
)
|
||||
|
||||
( Just route, Admin admin ) ->
|
||||
Admin.routeChanged route admin
|
||||
|> updatePage Admin GotAdminMsg model
|
||||
|
||||
{-
|
||||
( Just route, Page.Admin admin ) ->
|
||||
Admin.routeChanged route admin
|
||||
|> updatePage Page.Admin GotAdminMsg model
|
||||
-}
|
||||
_ ->
|
||||
( model |> setPage About, Cmd.none )
|
||||
( model |> setPage Page.About, Cmd.none )
|
||||
|
||||
( SwitchMenuOpen, _ ) ->
|
||||
( { model | navbar = Navbar (not model.navbar.menuOpen) model.navbar.navKey }, Cmd.none )
|
||||
|
||||
( GotChestMsg chestMsg, Chest chest ) ->
|
||||
Chest.update chestMsg chest
|
||||
|> updatePage Chest GotChestMsg model
|
||||
|
||||
( GotAdminMsg adminMsg, Admin adminModel ) ->
|
||||
Admin.update adminMsg adminModel
|
||||
|> updatePage Admin GotAdminMsg model
|
||||
|
||||
( _, _ ) ->
|
||||
( model, Cmd.none )
|
||||
|
||||
|
||||
updatePage : (pageModel -> Page) -> (pageMsg -> Msg) -> Model -> ( pageModel, Cmd pageMsg ) -> ( Model, Cmd Msg )
|
||||
updatePage toPage toMsg model ( pageModel, pageCmd ) =
|
||||
( { model | page = toPage pageModel }
|
||||
, Cmd.map toMsg pageCmd
|
||||
)
|
||||
( PageMsg pageMsg, page ) ->
|
||||
let
|
||||
( newPage, cmd ) =
|
||||
Page.update pageMsg page
|
||||
in
|
||||
( { model | page = newPage }
|
||||
, Cmd.map PageMsg cmd
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user