refactoring with one page per route (wip)

This commit is contained in:
2019-11-27 16:04:26 +01:00
parent 89b22bb07d
commit 32ff8bd2d6
7 changed files with 353 additions and 228 deletions

View File

@@ -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
)